Example #1
0
        public async Task <ResponseDTO <PPDetailSearchByContractPeriodDTO> > CalculateOnAccountByContractAndPeriodAsync(PaymentPeriodSearchByContractPeriodRequest search)
        {
            Expression <Func <PPSearchByContractPeriodDTO, bool> > queryFilter = c => true;

            if (search.PeriodId.HasValue)
            {
                queryFilter = queryFilter.And(p => p.PeriodId == search.PeriodId);
            }
            if (search.ContractId.HasValue)
            {
                queryFilter = queryFilter.And(p => p.ContractId == search.ContractId);
            }

            var header = await _paymentPeriodSearchByContractDataAccess.FirstOrDefaultAsync(queryFilter);

            var onAccountPaymenType = await _generalTableApplicationService.GetGeneralTableByEntityAndCodeAsync(Constants.GeneralTableName.PaymentType, Constants.GeneralTableCode.PaymentType.OnAccount);

            var concept = await _conceptApplicationService.GetConceptByCodeAsync(Constants.ConceptCode.OnAccount);

            var entityStatusPayment = await _entityStatusApplicationService.GetEntityStatusByEntityAndCodeAsync(Constants.EntityCode.PaymentPeriod, Constants.EntityStatus.PaymentPeriod.Pending);

            var onAccountDetail = new PPDetailSearchByContractPeriodDTO();

            if (header != null)
            {
                if (header != null)
                {
                    onAccountDetail.PaymentPeriodId         = -2;
                    onAccountDetail.ContractId              = header.ContractId;
                    onAccountDetail.PeriodId                = header.PeriodId;
                    onAccountDetail.PaymentAmount           = 0;
                    onAccountDetail.PaymentTypeId           = onAccountPaymenType.GeneralTableId;
                    onAccountDetail.PaymentTypeValue        = onAccountPaymenType.Value;
                    onAccountDetail.PaymentTypeCode         = onAccountPaymenType.Code;
                    onAccountDetail.PaymentTypeName         = onAccountPaymenType.Code;
                    onAccountDetail.PaymentPeriodStatusCode = Constants.EntityStatus.PaymentPeriod.Pending;
                    onAccountDetail.PaymentPeriodStatusId   = entityStatusPayment.EntityStatusId;
                    onAccountDetail.IsRequired              = false;
                    onAccountDetail.IsSelected              = false;
                    onAccountDetail.TableStatus             = DTOs.Requests.Common.ObjectStatus.Added;
                    onAccountDetail.PaymentDescription      = onAccountPaymenType.Value;
                    onAccountDetail.ConceptId               = concept.Data.ConceptId;
                    onAccountDetail.TenantId                = header.TenantId;
                    onAccountDetail.PaymentPeriodStatusName = Constants.EntityStatus.PaymentPeriodStatusName.Pending;
                    return(ResponseBuilder.Correct(onAccountDetail));
                }
            }
            return(null);
        }
Example #2
0
        public async Task <ResponseDTO <PPDetailSearchByContractPeriodDTO> > CalculateLateFeeByContractAndPeriodAsync(PaymentPeriodSearchByContractPeriodRequest search)
        {
            Expression <Func <PPSearchByContractPeriodDTO, bool> > queryFilter = c => true;

            if (search.PeriodId.HasValue)
            {
                queryFilter = queryFilter.And(p => p.PeriodId == search.PeriodId);
            }
            if (search.ContractId.HasValue)
            {
                queryFilter = queryFilter.And(p => p.ContractId == search.ContractId);
            }

            var header = await _paymentPeriodSearchByContractDataAccess.FirstOrDefaultAsync(queryFilter);

            var lateFeePaymenType = await _generalTableApplicationService.GetGeneralTableByEntityAndCodeAsync(Constants.GeneralTableName.PaymentType, Constants.GeneralTableCode.PaymentType.LateFee);

            var concept = await _conceptApplicationService.GetConceptByCodeAsync(Constants.ConceptCode.LateFee);

            var entityStatusPayment = await _entityStatusApplicationService.GetEntityStatusByEntityAndCodeAsync(Constants.EntityCode.PaymentPeriod, Constants.EntityStatus.PaymentPeriod.Pending);

            var lateFeeDetail = new PPDetailSearchByContractPeriodDTO();

            if (header != null)
            {
                //var header = paymentsPeriod.FirstOrDefault();
                var delayDays = DateTime.Today.Subtract(header.PeriodDueDate.Value).TotalDays;

                queryFilter = queryFilter.And(p => p.PaymentTypeCode == Constants.GeneralTableCode.PaymentType.LateFee);
                var existLateFeeInDB = await _paymentPeriodSearchByContractDataAccess.FirstOrDefaultAsync(queryFilter);

                if (header != null)
                {
                    if (existLateFeeInDB == null && delayDays > 0)
                    {
                        lateFeeDetail.PaymentPeriodId         = -1;
                        lateFeeDetail.ContractId              = header.ContractId;
                        lateFeeDetail.PeriodId                = header.PeriodId;
                        lateFeeDetail.PaymentAmount           = 25 * (decimal?)delayDays;
                        lateFeeDetail.PaymentTypeId           = lateFeePaymenType.GeneralTableId;
                        lateFeeDetail.PaymentTypeValue        = lateFeePaymenType.Value;
                        lateFeeDetail.PaymentTypeCode         = lateFeePaymenType.Code;
                        lateFeeDetail.PaymentTypeName         = lateFeePaymenType.Code;
                        lateFeeDetail.PaymentPeriodStatusCode = Constants.EntityStatus.PaymentPeriod.Pending;
                        lateFeeDetail.PaymentPeriodStatusId   = entityStatusPayment.EntityStatusId;
                        lateFeeDetail.IsRequired              = false;
                        lateFeeDetail.IsSelected              = false;
                        lateFeeDetail.TableStatus             = DTOs.Requests.Common.ObjectStatus.Added;
                        lateFeeDetail.PaymentDescription      = lateFeePaymenType.Value;
                        lateFeeDetail.ConceptId               = concept.Data.ConceptId;
                        lateFeeDetail.TenantId                = header.TenantId;
                        lateFeeDetail.PaymentPeriodStatusName = Constants.EntityStatus.PaymentPeriodStatusName.Pending;
                        return(ResponseBuilder.Correct(lateFeeDetail));
                    }
                    else if (existLateFeeInDB != null)
                    {
                        var entity = _mapper.Map <PPSearchByContractPeriodDTO, PPDetailSearchByContractPeriodDTO>(existLateFeeInDB);
                        entity.PaymentAmount = 25 * (decimal?)delayDays;
                        entity.TableStatus   = DTOs.Requests.Common.ObjectStatus.Modified;
                        return(ResponseBuilder.Correct(entity));
                    }
                }
            }
            return(null);
        }
Example #3
0
        public async Task <ResponseDTO <PPHeaderSearchByContractPeriodDTO> > SearchPaymentPeriodByContractAsync(PaymentPeriodSearchByContractPeriodRequest search)
        {
            Expression <Func <PPSearchByContractPeriodDTO, bool> > queryFilter = c => true;

            if (search.PeriodId.HasValue)
            {
                queryFilter = queryFilter.And(p => p.PeriodId == search.PeriodId);
            }

            if (search.ContractId.HasValue)
            {
                queryFilter = queryFilter.And(p => p.ContractId == search.ContractId);
            }

            var paymentsPeriod = await _paymentPeriodSearchByContractDataAccess.ListAsync(queryFilter);

            var lateFeePaymenType = await _generalTableApplicationService.GetGeneralTableByEntityAndCodeAsync(Constants.GeneralTableName.PaymentType, Constants.GeneralTableCode.PaymentType.LateFee);

            var entityStatusPayment = await _entityStatusApplicationService.GetEntityStatusByEntityAndCodeAsync(Constants.EntityCode.PaymentPeriod, Constants.EntityStatus.PaymentPeriod.Pending);

            var concept = await _conceptApplicationService.GetConceptByCodeAsync(Constants.ConceptCode.LateFee);

            var ppHeaderSearchByContractPeriodDTO = new PPHeaderSearchByContractPeriodDTO();

            if (paymentsPeriod.Any())
            {
                var header = paymentsPeriod.FirstOrDefault();
                ppHeaderSearchByContractPeriodDTO.HouseName      = header.HouseName;
                ppHeaderSearchByContractPeriodDTO.PeriodCode     = header.PeriodCode;
                ppHeaderSearchByContractPeriodDTO.PeriodId       = header.PeriodId;
                ppHeaderSearchByContractPeriodDTO.TenantFullName = header.TenantFullName;
                ppHeaderSearchByContractPeriodDTO.ContractId     = header.ContractId;
                ppHeaderSearchByContractPeriodDTO.DueDate        = header.DueDate;
                ppHeaderSearchByContractPeriodDTO.Email          = header.Email;

                var detailList        = new List <PPDetailSearchByContractPeriodDTO>();
                var lateFeeDetail     = new PPDetailSearchByContractPeriodDTO();
                var delayDays         = DateTime.Today.Subtract(header.PeriodDueDate.Value).TotalDays;
                var isLateFeeIncluded = false;
                var existLateFeeInDB  = paymentsPeriod.Any(q => q.PaymentTypeCode == Constants.GeneralTableCode.PaymentType.LateFee);

                foreach (var item in paymentsPeriod)
                {
                    var detail = new PPDetailSearchByContractPeriodDTO();
                    detail.ContractId              = item.ContractId;
                    detail.PaymentPeriodId         = item.PaymentPeriodId;
                    detail.PaymentTypeValue        = item.PaymentTypeValue;
                    detail.PaymentAmount           = item.PaymentAmount;
                    detail.PaymentDescription      = item.PaymentDescription;
                    detail.PaymentPeriodStatusCode = item.PaymentPeriodStatusCode;
                    detail.PaymentPeriodStatusName = item.PaymentPeriodStatusName;
                    detail.IsRequired              = item.IsRequired;
                    detail.PaymentTypeCode         = item.PaymentTypeCode;
                    detail.IsSelected              = item.IsRequired.Value && item.PaymentPeriodStatusCode == Constants.EntityStatus.PaymentPeriod.Pending ? true : false;
                    detail.InvoiceDetailId         = item.InvoiceDetailId;
                    detail.InvoiceId   = item.InvoiceId;
                    detail.InvoiceNo   = item.InvoiceNo;
                    detail.InvoiceDate = item.InvoiceDate;
                    detailList.Add(detail);

                    if (!existLateFeeInDB &&
                        delayDays > 0 &&
                        detail.PaymentTypeCode == Constants.GeneralTableCode.PaymentType.Rent)
                    {
                        lateFeeDetail.PaymentPeriodId         = -1;
                        lateFeeDetail.ContractId              = header.ContractId;
                        lateFeeDetail.PeriodId                = header.PeriodId;
                        lateFeeDetail.PaymentAmount           = 25 * (decimal?)delayDays;
                        lateFeeDetail.PaymentTypeId           = lateFeePaymenType.GeneralTableId;
                        lateFeeDetail.PaymentTypeValue        = lateFeePaymenType.Value;
                        lateFeeDetail.PaymentTypeCode         = lateFeePaymenType.Code;
                        lateFeeDetail.PaymentTypeName         = lateFeePaymenType.Code;
                        lateFeeDetail.PaymentPeriodStatusCode = Constants.EntityStatus.PaymentPeriod.Pending;
                        lateFeeDetail.PaymentPeriodStatusId   = entityStatusPayment.EntityStatusId;
                        lateFeeDetail.IsRequired              = false;
                        lateFeeDetail.IsSelected              = false;
                        lateFeeDetail.TableStatus             = DTOs.Requests.Common.ObjectStatus.Added;
                        lateFeeDetail.PaymentDescription      = lateFeePaymenType.Value;
                        lateFeeDetail.ConceptId               = concept.Data.ConceptId;
                        lateFeeDetail.TenantId                = header.TenantId;
                        lateFeeDetail.PaymentPeriodStatusName = Constants.EntityStatus.PaymentPeriodStatusName.Pending;

                        if (item.PaymentTypeSequence + 1 == lateFeePaymenType.Sequence)
                        {
                            //Inserting at Final
                            detailList.Add(lateFeeDetail);
                            isLateFeeIncluded = true;
                        }
                    }
                }

                //Inserting at Final
                if (!isLateFeeIncluded && lateFeeDetail.PaymentPeriodId.HasValue)
                {
                    detailList.Add(lateFeeDetail);
                }


                ppHeaderSearchByContractPeriodDTO.PPDetail = detailList;
            }

            return(ResponseBuilder.Correct(ppHeaderSearchByContractPeriodDTO));
        }
        public async Task <ResponseDTO <PPDetailSearchByContractPeriodDTO> > CalculateOnAccountByContractAndPeriod([FromUri] PaymentPeriodSearchByContractPeriodRequest search)
        {
            var resp = await _paymentPeriodApplicationService.CalculateOnAccountByContractAndPeriodAsync(search);

            return(resp);
        }
        public async Task <ResponseDTO <PPHeaderSearchByContractPeriodDTO> > SearchCriteriaByContract([FromUri] PaymentPeriodSearchByContractPeriodRequest search)
        {
            var resp = await _paymentPeriodApplicationService.SearchPaymentPeriodByContractAsync(search);

            return(resp);
        }
        public async Task <ResponseDTO> SendPaymentNotificationEMail([FromUri] PaymentPeriodSearchRequest search)
        {
            var resp = await _paymentPeriodApplicationService.SearchPaymentPeriodAsync(search);

            MailConfiguration mailConfig = new MailConfiguration();
            var fromEmail = System.Configuration.ConfigurationManager.AppSettings["fromEmail"];
            var userName  = System.Configuration.ConfigurationManager.AppSettings["userName"];
            var password  = System.Configuration.ConfigurationManager.AppSettings["password"];
            var msg       = new StringBuilder();

            foreach (var header in resp.Data.Items.ToList())
            {
                var searchByContractAndPeriod = new PaymentPeriodSearchByContractPeriodRequest();
                searchByContractAndPeriod.ContractId = header.ContractId;
                searchByContractAndPeriod.PeriodId   = header.PeriodId;

                var paymentPeriod = await _paymentPeriodApplicationService.SearchPaymentPeriodByContractAsync(searchByContractAndPeriod);

                var template = File.ReadAllText(System.Web.Hosting.HostingEnvironment.MapPath("~/Templates/PayNotificationTemplate.html"));

                var data = JsonConvert.DeserializeObject <Dictionary <string, object> >(JsonConvert.SerializeObject(paymentPeriod.Data));
                var paymentDetailHtml = string.Empty;
                if (paymentPeriod.Data.PPDetail.Any())
                {
                    try
                    {
                        if (paymentPeriod.Data.Email == null)
                        {
                            msg.AppendLine(string.Format("Email for: {0} is null {1}", paymentPeriod.Data.TenantFullName, Environment.NewLine));
                            continue;
                        }

                        var toEmail = paymentPeriod.Data.Email;
                        paymentDetailHtml = await CreatePaymentDetailHtml(paymentPeriod.Data.PPDetail);

                        data.Add("PaymentPeriodDetail", paymentDetailHtml);
                        var emailBody = ProcessTemplate(template, data);
                        var mail      = new MailMessage
                        {
                            From       = new MailAddress(fromEmail),
                            Subject    = string.Format("Payment Notification - Renta AmigoTenant - Periodo: {0}", header.PeriodCode),
                            Body       = emailBody,
                            IsBodyHtml = true
                        };

                        mail.To.Add(toEmail);

                        var client = new SmtpClient("smtp.gmail.com")
                        {
                            Port        = 587,
                            Credentials = new System.Net.NetworkCredential(userName, password),
                            EnableSsl   = true
                        };

                        client.Send(mail);
                    }
                    catch (Exception ex)
                    {
                        msg.AppendLine(string.Format("ERROR trying to send email for: {0}{1}{2}", paymentPeriod.Data.TenantFullName, Environment.NewLine, ex.StackTrace.ToString()));
                    }
                }
            }

            var response = new ResponseDTO()
            {
                IsValid  = string.IsNullOrEmpty(msg.ToString()),
                Messages = new List <ApplicationMessage>()
            };

            response.Messages.Add(new ApplicationMessage()
            {
                Key     = string.IsNullOrEmpty(msg.ToString()) ? "Ok" : "Error",
                Message = msg.ToString()
            });

            return(response);
        }