using Church.Net.Entity; using Church.Net.Utility; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System; using WebAPI.Logics.Core; using WebAPI.Logics.Interface; using System.Linq; using Microsoft.Extensions.DependencyInjection; using System.Text.RegularExpressions; using Church.Net.DAL.EFCoreDBF.Interface; namespace WebAPI.Logics { public class PastoralDomainLogic : LogicBase, ICrudLogic { string[] weekTopics = new string[] { "真幸福", "真相大白", "萬世巨星", "幸福連線", "當上帝來敲門", "十字架的勝利", "釋放與自由", "幸福的教會" }; private readonly IServiceScopeFactory serviceScopeFactory; private readonly ICrudDAL eventCrudDAL; private readonly ICrudDAL memberCrudDAL; private readonly ICrudDAL addressCrudDAL; private readonly ICombinedKeyCrudDAL pastoralDomainMemberDAL; private readonly ICrudDAL weekCrudDAL; private readonly ICrudDAL bestCrudDAL; private readonly ICrudDAL weekTaskCrudDAL; private readonly ICrudDAL happinessCostCrudDAL; private readonly ICrudDAL contributionCrudDAL; public PastoralDomainLogic( IServiceScopeFactory serviceScopeFactory, LogicService logicService, ICrudDAL crudDAL, ICrudDAL eventCrudDAL, ICrudDAL memberCrudDAL, ICrudDAL addressCrudDAL, ICombinedKeyCrudDAL pastoralDomainMemberDAL, ICrudDAL weekCrudDAL, ICrudDAL bestCrudDAL, ICrudDAL weekTaskCrudDAL, ICrudDAL contributionCrudDALL, ICrudDAL happinessCostCrudDAL ) : base(logicService, crudDAL) { this.serviceScopeFactory = serviceScopeFactory; this.eventCrudDAL = eventCrudDAL; this.memberCrudDAL = memberCrudDAL; this.addressCrudDAL = addressCrudDAL; this.pastoralDomainMemberDAL = pastoralDomainMemberDAL; this.weekCrudDAL = weekCrudDAL; this.bestCrudDAL = bestCrudDAL; this.weekTaskCrudDAL = weekTaskCrudDAL; this.happinessCostCrudDAL = happinessCostCrudDAL; this.contributionCrudDAL = contributionCrudDALL; } #region override public override IEnumerable GetAll(Func filter = null) { var list = base.GetAll(filter); foreach (var group in list) { if (!string.IsNullOrEmpty(group.ServiceAddressId)) { group.ServiceAddress = addressCrudDAL.GetById(group.ServiceAddressId); } else { group.ServiceAddress = new AddressInfo(); } if (group.Type == DomainType.HappinessGroup) { GetHappinessGroupInfo(group); } group.FamilyMembers = memberCrudDAL.GetAllById( pastoralDomainMemberDAL.GetAll(d => d.PastoralDomainId == group.Id).Select(d => d.FamilyMemberId).ToList() ).ToList(); group.Contributions = contributionCrudDAL.GetAll(d => d.GroupId == group.Id).ToList(); } return list; } public override void BeforeCreate(PastoralDomain entity) { addressCrudDAL.CreateOrUpdate(entity.ServiceAddress); entity.ServiceAddressId = entity.ServiceAddress.Id; } public override void BeforeUpdate(PastoralDomain entity) { addressCrudDAL.CreateOrUpdate(entity.ServiceAddress); entity.ServiceAddressId = entity.ServiceAddress.Id; } #endregion public CellGroupRoutineEvent GetComingEvent(string domainId = null) { PastoralDomain cellGroup; if (domainId == null) { cellGroup = GetCurrentUserCellGroup(); if (cellGroup != null) { domainId = cellGroup.Id; //var _event = eventCrudDAL.GetDbSet().OrderByDescending(e => e.Time) // .Include(e => e.Attendees).Include(e => e.Prayers) // .Where(e => e.PastoralDomainId == domainId).FirstOrDefault(); //return _event; } } else { cellGroup= crudDAL.GetById(domainId); } if (domainId != null) { var _event = eventCrudDAL.GetDbSet().Where(e => e.PastoralDomainId == domainId && e.Time >= DateTime.UtcNow) .Include(e => e.Attendees).Include(e => e.Prayers).FirstOrDefault(); if (_event == null) { var serviceLocalTime = cellGroup.ServiceTime.Value.ToUniversalTime().ToLocal(cellGroup.TimeZone); var serviceWeekDay = serviceLocalTime.DayOfWeek; var nextServiceTime = DateTimeHelper.GetNextWeekday(DateTimeHelper.Today(cellGroup.TimeZone), DayOfWeek.Friday) .AddHours(serviceLocalTime.Hour).AddMinutes(serviceLocalTime.Minute); _event = new CellGroupRoutineEvent() { Id = Format.Get33BaseGuid(), Time = nextServiceTime.ToUtc(cellGroup.TimeZone), Address = "1881 Forest Dr., Azusa, CA 91702", Attendees = new List(), PastoralDomainId = domainId }; eventCrudDAL.Create(_event); } return _event; } return null; } public CellGroupRoutineEvent GetLastEvent(string domainId = null) { if (domainId == null) { var cellGroup = GetCurrentUserCellGroup(); if (cellGroup != null) { domainId = cellGroup.Id; var _event = eventCrudDAL.GetDbSet().OrderByDescending(e => e.Time) .Include(e => e.Attendees).Include(e => e.Prayers) .Where(e => e.PastoralDomainId == domainId).FirstOrDefault(); return _event; } } if (domainId != null) { var _event = eventCrudDAL.GetDbSet().OrderByDescending(e => e.Time) .Include(e => e.Attendees).Include(e => e.Prayers) .Where(e => e.PastoralDomainId == domainId).FirstOrDefault(); return _event; } return null; } public string GetMemberFirstNameById(string memberId) { return memberCrudDAL.GetById(memberId)?.FirstName; } public IEnumerable GetCurrentUserPastoralDomain() { if (!string.IsNullOrWhiteSpace(logicService.CurrentUserId)) { var ids = pastoralDomainMemberDAL.GetAll(p => p.FamilyMemberId == logicService.CurrentUserId).Select(p => p.PastoralDomainId); var list = crudDAL.GetAll(p => ids.Contains(p.Id)); foreach (var group in list) { if (group.Type == DomainType.HappinessGroup) { GetHappinessGroupInfo(group); } group.Contributions = contributionCrudDAL.GetAll(d => d.GroupId == group.Id).ToList(); } return list; } return null; } public PastoralDomain GetCurrentUserCellGroup() { if (!string.IsNullOrWhiteSpace(logicService.CurrentUserId)) { var ids = pastoralDomainMemberDAL.GetAll(p => p.FamilyMemberId == logicService.CurrentUserId).Select(p => p.PastoralDomainId); return crudDAL.GetAll(p => ids.Contains(p.Id) && p.Type == DomainType.CellGroup).FirstOrDefault(); } return null; } public int UpdateWeekInfo(HappinessWeek value) { if (value.UpdateRestWeekDate) { var list = weekCrudDAL.GetAll(week => week.SEQ >= value.SEQ && week.GroupId == value.GroupId).OrderBy(w => w.SEQ).ToList(); var tempDate = new DateTime(value.Date.Year, value.Date.Month, value.Date.Day, value.Date.Hour, value.Date.Minute, value.Date.Second); int count = 0; foreach (var week in list) { week.Date = tempDate.AddDays(count * 7); week.Address = value.Address; week.CityAndZipCode = value.CityAndZipCode; week.InvitationText = value.InvitationText; count++; } return weekCrudDAL.UpdateRange(list); } return weekCrudDAL.CreateOrUpdate(value); } private HappinessWeek GetHappinessWeek(PastoralDomain group, int weekNo) { return new HappinessWeek() { GroupId = group.Id, Address = group.ServiceAddress.Address, CityAndZipCode = group.ServiceAddress.GetCSZ(), Date = group.ServiceTime.Value.AddDays(7 * (weekNo - 1)), SEQ = weekNo }; } public void GetHappinessGroupInfo(PastoralDomain group) { group.HappinessWeeks = weekCrudDAL.GetAll(w => w.GroupId == group.Id).OrderBy(w => w.SEQ).ToList(); if (group.HappinessWeeks == null || group.HappinessWeeks.Count() == 0) { group.HappinessWeeks = new List(); for (int i = 1; i <= 8; i++) { var week = GetHappinessWeek(group, i); group.HappinessWeeks.Add(week); weekCrudDAL.CreateOrUpdate(week); } } foreach (var week in group.HappinessWeeks) { week.Topic = weekTopics[week.SEQ - 1]; week.Tasks = weekTaskCrudDAL.GetAll(t => t.WeekId == week.Id).OrderBy(t => t.Type).ToList(); week.Costs = happinessCostCrudDAL.GetAll(t => t.WeekId == week.Id).ToList(); } group.Bests = bestCrudDAL.GetAll(b => b.GroupId == group.Id).OrderBy(b => b.Name).ToList(); } } }