using AutoMapper; using Complex.Application.Services.Basic; using Complex.Application.Utility; using Complex.Common.Dto; using Complex.Domain.Entities; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Text; using System.Threading.Tasks; namespace Complex.Application.Complex { public interface IUnitService { /// /// ثبت توسط مدیر ساختمان /// /// /// ResultDto InsertUnit(string adminUserId, UnitDto unitDto); /// /// ویرایش توسط مدیر ساختمان /// /// /// ResultDto AdminEditUnit(string adminUserId, UnitDto unitDto); /// /// ویرایش توسط مالک /// /// /// ResultDto OwnerEditUnit(string UserId, UnitDto unitDto); /// /// ویرایش توسط مستاجر /// /// /// ResultDto TenantEditUnit(string UserId, UnitDto unitDto); ResultDto> UnitList(string userId, UnitRequestList unitRequest); } public class UnitService : IUnitService { private readonly IComplexDBContext _complexDBContext; private readonly CostService _costService; private IMapper _mapper; public UnitService(IComplexDBContext complexDBContext, IMapper mapper, CostService costService) { _complexDBContext = complexDBContext; _costService = costService; _mapper = mapper; } public ResultDto> UnitList(string userId, UnitRequestList unitRequest) { var today = PersianDate.GetToday(); var IsUserInComplex = _complexDBContext.Units.Where(u => u.ComplexId == unitRequest.ComplexId && (u.OwnerId == userId || u.TenantId == userId)) .Select(a => a.ComplexId) .Union(_complexDBContext.ComplexManagers.Where(cm => cm.ComplexId == unitRequest.ComplexId && string.Compare(cm.EndDate, today) >= 0 && string.Compare(cm.StartDate, today) <= 0) .Where(u => u.ManagerMobileNumberId == userId) .Select(u => u.ComplexId)); if (IsUserInComplex.Count() == 0) return new ResultDto> { Data = null, IsSuccess = false, Message = "درخواست نامعتبر" }; var units = from u in _complexDBContext.Units.Include(u => u.Owner).Include(u => u.Tenant) .Include(u => u.State) where u.ComplexId == unitRequest.ComplexId select u; if (unitRequest.Id.HasValue) units = units.Where(u => u.Id == unitRequest.Id); if (unitRequest.OwnerId.IsNotNullOrEmpty()) units = units.Where(u => u.OwnerId == unitRequest.OwnerId); if (unitRequest.TenantId.IsNotNullOrEmpty()) units = units.Where(u => u.TenantId == unitRequest.TenantId); var unitObjs = units.ToList().Select(u => new UnitDto { ComplexId = u.ComplexId, UnitName = u.UnitName, Id = u.Id, AreaMeter = u.AreaMeter, TenantId = u.TenantId, EmergencyTels = u.EmergencyTels, Floor = u.Floor, InsertTime = Convert.ToDateTime(_complexDBContext.Entry(u).Property("InsertTime").CurrentValue), UpdateTime = Convert.ToDateTime(_complexDBContext.Entry(u).Property("UpdateTime").CurrentValue), //InsertTime = u.InsertTime, IsActive = u.IsActive, ManagerDescription = u.ManagerDescription, ParkingAreaMeter = u.ParkingAreaMeter, PublicState = u.PublicState, StateTitle = u.StateId.HasValue ? u.State.Title : "", StateId = u.StateId, YardMeter = u.YardMeter, TenantNameFamily = u.TenantId != null ? u.Tenant.FirstName + " " + u.Tenant.LastName : "", OwnerNameFamily = u.OwnerId != null ? u.Owner.FirstName + " " + u.Owner.LastName : "", OwnerId = u.OwnerId, }); try { return new ResultDto> { Data = unitObjs.ToList(), IsSuccess = true, //RowCount = }; } catch (Exception ex) { return new ResultDto> { Message = ex.InnerException != null ? ex.InnerException.Message + Environment.NewLine + ex.InnerException.Data : ex.Message + Environment.NewLine + ex.Data, IsSuccess = false }; } } public ResultDto InsertUnit(string adminUserId, UnitDto unitDto) { var unit = _mapper.Map(unitDto); var complexManager = _complexDBContext.ComplexManagers.Where(c => c.ComplexId == unit.ComplexId) .Select(cm => cm.ManagerMobileNumberId).ToList(); if (!complexManager.Any(m => m == adminUserId)) return new ResultDto { Message = "عدم دسترسی", IsSuccess = false }; //unit.InsertTime = DateTime.Now; _complexDBContext.Units.Add(unit); _complexDBContext.SaveChanges(); //محاسبه شارژهای اون یونیت var nowDate = DateOnly.FromDateTime(DateTime.Now); //وقتی واحد تازه ثبت شده پس در مدیریت شارژ قابلیت ثبت اختصاصی برای خودش نداشته پس باید شارژ عمومی برایش تعریف شود // اگر خواست میتواند برایش به صورت اختصاصی هم ثبت کند که اون موقع برایش محاسبه مجدد خواهد شد var costCycleDto = _costService.CostCyclsList(unit.ComplexId, nowDate, nowDate, null).Data .FirstOrDefault(c => c.UnitIds == null); if (costCycleDto != null) { //var costCycle = new CostCycle //{ // Amount=costCycleDto.Amount, //}; var costCycle=_mapper.Map(costCycleDto); _costService.DefineUnitCharge(unit.Id, costCycle, true); } // return new ResultDto { Data = unit.Id, IsSuccess = true, Message = "ثبت با موفقیت انجام شد" }; } public ResultDto AdminEditUnit(string adminUserId, UnitDto unitDto) { var unit = _complexDBContext.Units.Include(u => u.Complex).ThenInclude(c => c.ComplexManagers).FirstOrDefault(u => u.Id == unitDto.Id); if (unit == null) return new ResultDto { Message = "مشکل در یافتن واحد", IsSuccess = false }; var today = PersianDate.GetToday(); var complex = unit.Complex; if (complex.ComplexManagers == null || !complex.ComplexManagers.Any(m => m.ManagerMobileNumberId == adminUserId && string.Compare(m.EndDate, today) >= 0)) return new ResultDto { Message = "عدم دسترسی", IsSuccess = false }; var oldUnitState = unit.PublicState; unit = _mapper.Map(unitDto); unit.PublicState = oldUnitState; _complexDBContext.SaveChanges(); //oldPayment را باید چه کار کرد؟؟؟؟!!!!!!!!!!!!!!!!!!!!!!!!!! return new ResultDto { Message = "ویرایش با موفقیت انجام شد", IsSuccess = true }; } public ResultDto OwnerEditUnit(string UserId, UnitDto unitDto) { var unit = _complexDBContext.Units.FirstOrDefault(u => u.Id == unitDto.Id); if (unit == null) return new ResultDto { Message = "مشکل در یافتن واحد", IsSuccess = false }; if (unit.OwnerId != UserId) return new ResultDto { Message = "عدم دسترسی", IsSuccess = false }; unit.AreaMeter = unitDto.AreaMeter; unit.YardMeter = unitDto.YardMeter; unit.ParkingAreaMeter = unitDto.ParkingAreaMeter; unit.EmergencyTels = unitDto.EmergencyTels; unit.Floor = unitDto.Floor; unit.ParkingAreaMeter = unitDto.ParkingAreaMeter; unit.PublicState = unitDto.PublicState; unit.YardMeter = unitDto.YardMeter; _complexDBContext.SaveChanges(); return new ResultDto { Message = "ویرایش با موفقیت انجام شد", IsSuccess = true }; } public ResultDto TenantEditUnit(string UserId, UnitDto unitDto) { var unit = _complexDBContext.Units.FirstOrDefault(u => u.Id == unitDto.Id); if (unit == null) return new ResultDto { Message = "مشکل در یافتن واحد", IsSuccess = false }; if (unit.TenantId != UserId) return new ResultDto { Message = "عدم دسترسی", IsSuccess = false }; unit.PublicState = unitDto.PublicState; _complexDBContext.SaveChanges(); return new ResultDto { Message = "ویرایش با موفقیت انجام شد", IsSuccess = true }; } } public class UnitRequestList { public Guid? Id { set; get; } public Guid ComplexId { set; get; } public string? OwnerId { set; get; } public string? TenantId { set; get; } } public class UnitDto { public Guid Id { get; set; } public Guid ComplexId { set; get; } public string UnitName { set; get; } public ComplexEntity Complex { set; get; } /// /// ساکن /// public string? OwnerId { set; get; } /// /// شماره مستاجر /// public string? TenantId { set; get; } public bool IsActive { set; get; } /// /// متراژ کل /// public int? AreaMeter { set; get; } public string? EmergencyTels { set; get; } public int? ParkingAreaMeter { set; get; } /// /// متراژ حیاط /// public int? YardMeter { set; get; } public string? PublicState { set; get; } public int? StateId { set; get; } public string StateTitle { set; get; } public int? Floor { set; get; } //public string? UnitId { set; get; } public string? ManagerDescription { set; get; } //----------------------------------------- /// /// نام و نام خانوادگی مالک /// public string OwnerNameFamily { set; get; } /// /// نام و نام خانوادگی مستاجر /// public string TenantNameFamily { set; get; } //public string StateByManager { set; get; } public DateTime? InsertTime { get; set; } public DateTime? UpdateTime { get; set; } } }