public async Task SendEmailToSupplierDetailingPaymentAsync(inv_invoice invoice, int phase)
        {
            EmailMessageObj em = new EmailMessageObj {
                ToAddresses = new List <EmailAddressObj>()
            };
            var supplier = await _dataContext.cor_supplier.FindAsync(invoice.SupplierId);

            if (supplier != null)
            {
                em.ToAddresses.Add(new EmailAddressObj {
                    Address = supplier.Email, Name = supplier.Name
                });
            }

            var path = $"#/main/lpos";

            var path2 = $"{_uRIs.SelfClient}/{path}";

            em.Subject = $"Phase {phase} Payment";
            em.Content = $"Dear Supplier <br> Invoice Number '{invoice.InvoiceNumber}' Phase '{phase}'" +
                         $" has successfully been paid for." +
                         $"<br>Please click <a href='{path2}'> here </a> to see details of Payment";
            em.FromAddresses = new List <EmailAddressObj>();
            em.SendIt        = true;
            em.SaveIt        = false;
            em.Template      = (int)EmailTemplate.Default;

            await _serverRequest.SendMessageAsync(em);
        }
        public async Task <bool> CreateUpdateInvoiceAsync(inv_invoice model)
        {
            if (model.InvoiceId > 0)
            {
                var itemToUpdate = await _dataContext.inv_invoice.FindAsync(model.InvoiceId);

                _dataContext.Entry(itemToUpdate).CurrentValues.SetValues(model);
            }
            else
            {
                await _dataContext.inv_invoice.AddAsync(model);
            }
            return(await _dataContext.SaveChangesAsync() > 0);
        }
        public List <FinancialTransaction> BuildTaxEntryRequestObject(inv_invoice invoice)
        {
            var supplierType = new cor_suppliertype();
            List <cor_taxsetup>         tx  = new List <cor_taxsetup>();
            List <FinancialTransaction> fts = new List <FinancialTransaction>();
            var supplierDetail = _suprepo.GetSupplierAsync(invoice.SupplierId).Result;

            if (supplierDetail != null)
            {
                var phase = _dataContext.cor_paymentterms.FirstOrDefault(d => d.PaymentTermId == invoice.PaymentTermId);
                var lpo   = _dataContext.purch_plpo.FirstOrDefault(r => r.PLPOId == phase.LPOId);
                supplierType = _dataContext.cor_suppliertype.FirstOrDefault(rt => rt.SupplierTypeId == supplierDetail.SupplierTypeId);
                if (!string.IsNullOrEmpty(lpo.Taxes))
                {
                    var applicableTax = lpo.Taxes.Split(',').Select(int.Parse).ToList();
                    tx = _dataContext.cor_taxsetup.Where(q => applicableTax.Contains(q.TaxSetupId)).ToList();
                }
            }
            if (tx.Count() > 0)
            {
                var banks        = _financeServer.GetAllBanksAsync().Result;
                var creditGl     = banks.bank.FirstOrDefault(q => q.BankGlId == invoice.PaymentBankId).SubGl;
                var currentPhase = _dataContext.cor_paymentterms.FirstOrDefault(q => q.PaymentTermId == invoice.PaymentTermId);
                foreach (var tax in tx)
                {
                    var entryobj = new FinancialTransaction
                    {
                        Amount          = currentPhase.Amount / 100 * Convert.ToDecimal(tax.Percentage),
                        ApprovedBy      = "staff",
                        ApprovedDate    = DateTime.Now,
                        CompanyId       = invoice.CompanyId,
                        CreditGL        = tax.SubGL,
                        DebitGL         = supplierType.CreditGL,
                        CurrencyId      = 0,
                        ReferenceNo     = invoice.InvoiceNumber,
                        Description     = $"Invoice {invoice.InvoiceNumber} {tax.TaxName} Tax",
                        OperationId     = (int)OperationsEnum.PaymentApproval,
                        TransactionDate = DateTime.Now,
                    };
                    fts.Add(entryobj);
                }
                return(fts);
            }
            return(new List <FinancialTransaction>());
        }
        public FinancialTransaction BuildSupplierSecondEntryRequestObject(inv_invoice invoice)
        {
            var banks        = _financeServer.GetAllBanksAsync().Result;
            var creditGl     = banks.bank.FirstOrDefault(q => q.BankGlId == invoice.PaymentBankId).SubGl;
            var currentPhase = _dataContext.cor_paymentterms.FirstOrDefault(q => q.PaymentTermId == invoice.PaymentTermId);

            return(new FinancialTransaction
            {
                Amount = currentPhase.Amount,
                ApprovedBy = "staff",
                ApprovedDate = DateTime.Now,
                CompanyId = invoice.CompanyId,
                CreditGL = creditGl,
                DebitGL = invoice.CreditGl,
                CurrencyId = 0,
                ReferenceNo = invoice.InvoiceNumber,
                Description = $"Invoice {invoice.InvoiceNumber}",
                OperationId = (int)OperationsEnum.PaymentApproval,
                TransactionDate = DateTime.Now,
            });
        }
        public FinancialTransaction BuildSupplierFirstEntryRequestObject(cor_paymentterms request, inv_invoice invoice)
        {
            cor_suppliertype suppliertype = new cor_suppliertype();
            var lpo            = _repo.GetLPOsAsync(request.LPOId).Result;
            var supplierDetail = _suprepo.GetSupplierAsync(lpo.WinnerSupplierId).Result;

            if (supplierDetail != null)
            {
                suppliertype = _suprepo.GetSupplierTypeAsync(supplierDetail.SupplierTypeId).Result;
            }
            return(new FinancialTransaction
            {
                Amount = request.NetAmount,
                ApprovedBy = "staff",
                ApprovedDate = DateTime.Now,
                CompanyId = lpo.CompanyId,
                CreditGL = suppliertype.CreditGL,
                DebitGL = suppliertype.DebitGL,
                CurrencyId = 0,
                ReferenceNo = invoice.InvoiceNumber,
                Description = $"Proposal Phase {request.Phase}",
                OperationId = (int)OperationsEnum.PaymentApproval,
                TransactionDate = DateTime.Now,
            });
        }
        public async Task <PaymentTermsRegRespObj> TransferPaymentAsync(inv_invoice invoice)
        {
            var paymentResponse = new PaymentTermsRegRespObj {
                Status = new APIResponseStatus {
                    IsSuccessful = false, Message = new APIResponseMessage()
                }
            };

            try
            {
                var banks = await _financeServer.GetAllBanksAsync();

                var currencies = await _serverRequest.GetSingleCurrencyAsync(invoice.CurrencyId);

                var CurrencyCode       = currencies.commonLookups.FirstOrDefault(q => q.LookupId == invoice.CurrencyId)?.code;
                var suplierBankDetails = _dataContext.cor_bankaccountdetail.Where(d => d.SupplierId == invoice.SupplierId).ToList();
                if (suplierBankDetails.Count() == 0)
                {
                    paymentResponse.Status.Message.FriendlyMessage = "UnIdentified Supplier Bank Details";
                    return(paymentResponse);
                }
                var singlesupbnDet = suplierBankDetails.FirstOrDefault(a => invoice.SupplierBankId == a.BankAccountDetailId);
                if (singlesupbnDet == null)
                {
                    paymentResponse.Status.Message.FriendlyMessage = "Unable to find Supplier Bank Details";
                    return(paymentResponse);
                }
                if (string.IsNullOrEmpty(CurrencyCode))
                {
                    paymentResponse.Status.Message.FriendlyMessage = "UnIdentified Currency";
                    return(paymentResponse);
                }
                if (banks.bank.Count() > 0)
                {
                    if (!banks.bank.Select(w => w.BankGlId).Contains(singlesupbnDet.Bank))
                    {
                        paymentResponse.Status.Message.FriendlyMessage = "UnIdentified Supplier Bank Details";
                        return(paymentResponse);
                    }
                    var trans = new TransferObj();

                    trans.account_bank   = banks.bank.FirstOrDefault(q => q.BankGlId == invoice.PaymentBankId)?.BankCode;
                    trans.account_number = singlesupbnDet.AccountNumber;
                    trans.amount         = Convert.ToInt64(invoice.Amount);
                    trans.currency       = CurrencyCode;
                    trans.debit_currency = CurrencyCode;
                    trans.narration      = $"'{invoice.Description}' Payment";
                    trans.reference      = invoice.InvoiceNumber;
                    var res = await _financeServer.MakePaymentsAsync(trans);

                    if (res.status == null || !res.status.Contains("success"))
                    {
                        paymentResponse.Status.Message.FriendlyMessage = res.message;
                        //return paymentResponse;
                    }

                    var entryRequest1 = BuildSupplierSecondEntryRequestObject(invoice);
                    var invoiceentry  = await _financeServer.PassEntryAsync(entryRequest1);

                    if (!invoiceentry.Status.IsSuccessful)
                    {
                        paymentResponse.Status.IsSuccessful            = false;
                        paymentResponse.Status.Message.FriendlyMessage = $"Unable to pass invoice entry : '{invoiceentry.Status.Message.FriendlyMessage}'";
                        _logger.Information(invoiceentry.Status.Message.FriendlyMessage);
                        return(paymentResponse);
                    }
                    var entryRequest2 = BuildTaxEntryRequestObject(invoice);
                    if (entryRequest2.Count() > 0)
                    {
                        foreach (var tx in entryRequest2)
                        {
                            var taxEntry = await _financeServer.PassEntryAsync(tx);

                            if (!taxEntry.Status.IsSuccessful)
                            {
                                paymentResponse.Status.IsSuccessful            = false;
                                paymentResponse.Status.Message.FriendlyMessage = $"Unable to pass tax entry : '{taxEntry.Status.Message.FriendlyMessage}'";
                                _logger.Information(taxEntry.Status.Message.FriendlyMessage);
                                return(paymentResponse);
                            }
                        }
                    }
                    paymentResponse.Status.IsSuccessful = true;
                    return(paymentResponse);
                }
                else
                {
                    paymentResponse.Status.Message.FriendlyMessage = "No bank Found";
                    return(paymentResponse);
                }
            }
            catch (Exception ex)
            {
                paymentResponse.Status.Message.FriendlyMessage = ex?.Message;
                return(paymentResponse);
            }
        }
        private cor_approvaldetail BuildApprovalDetailObject(PaymentRequestStaffApprovalCommand request, inv_invoice currentItem, int staffId)
        {
            var approvalDeatil = new cor_approvaldetail();
            var previousDetail = _detailService.GetApprovalDetailsAsync(request.TargetId, currentItem.WorkflowToken).Result;

            approvalDeatil.ArrivalDate = currentItem.CreatedOn ?? DateTime.Now;

            if (previousDetail.Count() > 0)
            {
                approvalDeatil.ArrivalDate = previousDetail.OrderByDescending(s => s.ApprovalDetailId).FirstOrDefault().Date;
            }

            approvalDeatil.Comment         = request.ApprovalComment;
            approvalDeatil.Date            = DateTime.Today;
            approvalDeatil.StatusId        = request.ApprovalStatus;
            approvalDeatil.TargetId        = request.TargetId;
            approvalDeatil.StaffId         = staffId;
            approvalDeatil.ReferredStaffId = request.ReferredStaffId;
            approvalDeatil.WorkflowToken   = currentItem.WorkflowToken;
            return(approvalDeatil);
        }