public virtual IActionResult _ContractPaymentAdd(int Id = 0)
        {
            var item  = new PaymentExpenditure();
            var model = new PaymentExpenditureModel()
            {
                Id = Id
            };

            if (Id > 0)
            {
                item  = _contractService.GetPaymentExpenditureById(Id);
                model = item.ToModel <PaymentExpenditureModel>();
            }

            return(PartialView(model));
        }
        public virtual IActionResult Create(Guid ExpenditureGuid, int AdvanceId = 0, int AcceptanceId = 0)
        {
            if (!_permissionService.Authorize(StandardPermissionProvider.ManagePaymentExpenditureCreate))
            {
                return(AccessDeniedView());
            }
            var model = new PaymentExpenditureModel
            {
                ExpenditureGuid = ExpenditureGuid
            };

            if (AdvanceId > 0)
            {
                model.TypeId = (int)PaymentExpenditureType.Advance;
                var Advance = _paymentAdvanceService.GetPaymentAdvanceById(AdvanceId);
                model.UnitName         = Advance.unit.Name;
                model.PaymentAdvanceId = AdvanceId;
                model.UnitId           = (int)Advance.UnitId;
                model.TotalMoney       = _priceFormatter.FormatPrice(Advance.TotalReceive.GetValueOrDefault(), true, Advance.currency);
                var acceptances = _contractService.getAllContractAcceptanceByAdvanceId(AdvanceId: AdvanceId);
                model.lstContractPayment = acceptances.Select(c => preparePaymentbyContractAcceptance(c)).ToList();
            }
            else if (AcceptanceId > 0)
            {
                var acceptances = _contractService.getContractAcceptancebyId(Id: AcceptanceId);
                model.UnitId       = (int)acceptances.UnitId;
                model.UnitName     = acceptances.unit.Name;
                model.AcceptanceId = AcceptanceId;
                model.TotalMoney   = acceptances.TotalAmount.ToVNStringNumber();
                var AcceptanceSub = _contractService.GetallContractAcceptanceSubs(AcceptanceId: acceptances.Id, TypeId: (int)ContractAcceptancesType.NoiBo);
                model.lstContractPayment = AcceptanceSub.Select(c => preparePaymentbyContractAcceptanceSub(c)).ToList();
            }
            else
            {
                var paymentExpenditure = _contractService.GetPaymentExpenditureByGuid(model.ExpenditureGuid);
                model                    = paymentExpenditure.ToModel <PaymentExpenditureModel>();
                model.TotalMoney         = model.TotalAmount.ToVNStringNumber();
                model.lstContractPayment = _contractPaymentService.GetAllContractPaymentsByExpenditureId(model.Id).Select(c => c.ToModel <ContractPaymentModel>()).ToList();
            };
            model.AvailableCurrency = _currencyService.GetAllCurrencies().Select(c => new SelectListItem
            {
                Text     = c.Name,
                Value    = c.Id.ToString(),
                Selected = c.Id == model.CurrencyId
            }).ToList();
            return(View(model));
        }
        public virtual IActionResult Create(PaymentExpenditureModel model)
        {
            if (!_permissionService.Authorize(StandardPermissionProvider.ManagePaymentExpenditureCreate))
            {
                return(AccessDeniedView());
            }
            if (ModelState.IsValid && model.lstContractPayment.Count() > 0)
            {
                var noti = "admin.common.Added";
                var item = new PaymentExpenditure();
                if (model.Id > 0)
                {
                    item = _contractService.GetPaymentExpenditureById(model.Id);
                }
                _contractModelFactory.PreparePaymentExpenditure(model, item);
                if (model.PaymentAdvanceId > 0)
                {
                    item.PaymentAdvanceId = model.PaymentAdvanceId;
                    item.AcceptanceId     = null;
                }
                if (model.AcceptanceId > 0)
                {
                    item.AcceptanceId     = model.AcceptanceId;
                    item.PaymentAdvanceId = null;
                }
                if (model.Id > 0)
                {
                    _contractPaymentService.DeleteContractPaymentsByExpenditureId(item.Id);
                    _contractService.UpdatePaymentExpenditure(item);
                    noti = "admin.common.Updated";
                }
                else
                {
                    _contractService.InsertPaymentExpenditure(item);
                }
                foreach (ContractPaymentModel paymentModel in model.lstContractPayment)
                {
                    var payment = new ContractPayment
                    {
                        CreatorId    = _workContext.CurrentCustomer.Id,
                        ApprovedDate = DateTime.Now,
                        CreatedDate  = DateTime.Now,
                        IsReceipts   = false,
                        StatusId     = (int)ContractPaymentStatus.Approved,
                    };
                    var task = _workTaskService.GetTaskById(paymentModel.TaskId);
                    payment.ExpenditureId = item.Id;
                    payment.Description   = item.Name + " " + task.Name;
                    payment.Code          = item.Code + task.Code;
                    payment.TaskId        = paymentModel.TaskId;
                    payment.ContractId    = task.ContractId;
                    if (task.UnitId > 0)
                    {
                        payment.UnitId = (int)task.UnitId;
                    }
                    else
                    {
                        payment.UnitId = null;
                    }
                    if (task.CurrencyId > 0)
                    {
                        payment.CurrencyId = (int)task.CurrencyId;
                    }
                    else
                    {
                        payment.CurrencyId = (int)item.CurrencyId;
                    }
                    payment.Amount = paymentModel.Amount.ToNumber();
                    payment.TypeId = item.TypeId;
                    _contractPaymentService.InsertContractPayment(payment);
                }
                return(JsonSuccessMessage(_localizationService.GetResource(noti), item.ToModel <PaymentExpenditureModel>()));
            }
            var list = ModelState.Values.Where(c => c.Errors.Count > 0).ToList();

            return(JsonErrorMessage("Error", list));
        }