Пример #1
0
        public async Task <HttpResponseMessage> SaveReceiveAndPay([FromBody] PayRecevie payRecevie)
        {
            try
            {
                var organId = Convert.ToInt32(SecurityManager.CurrentUserContext.OrganizationId);

                FinanYearRule finanYearRule = new FinanYearRule();
                var           finanYerar    = await finanYearRule.GetCurrentFinanYear(organId);

                var documentNumber   = 0;
                int payRecevieNumber = 0;

                if (payRecevie.ID > 0)
                {
                    PayRecevie temp = new PayRecevie();
                    temp = payRecevie;
                    PayRecevieRule payRecevieRule = new PayRecevieRule();
                    payRecevieRule.Delete(payRecevie.ID);

                    documentNumber   = payRecevie.Document.Number;
                    payRecevieNumber = payRecevie.Number;

                    await payRecevieRule.SaveChangesAsync();
                }

                payRecevie.ID = -1;

                if (payRecevie.Contact != null)
                {
                    payRecevie.ContactId           = payRecevie.Contact.ID;
                    payRecevie.Contact.ObjectState = OMF.Common.Enums.ObjectState.Unchanged;
                }


                if (payRecevie.Invoice != null)
                {
                    payRecevie.InvoiceId           = payRecevie.Invoice.ID;
                    payRecevie.Invoice.ObjectState = OMF.Common.Enums.ObjectState.Unchanged;
                }

                if (payRecevie.Cost != null)
                {
                    payRecevie.CostId           = payRecevie.Cost.ID;
                    payRecevie.Cost.ObjectState = OMF.Common.Enums.ObjectState.Unchanged;
                }


                payRecevie.OrganId = organId;

                payRecevie.Type        = payRecevie.Type;
                payRecevie.Date        = PersianDateUtils.ToDateTime(payRecevie.DisplayDate);
                payRecevie.DisplayDate = payRecevie.DisplayDate;
                // payRecevie.Date = DateTime.Now;
                //payRecevie.DisplayDate = Utilities.PersianDateUtils.ToPersianDate(DateTime.Now);
                decimal amount = 0;
                foreach (var item in payRecevie.Items)
                {
                    amount += item.Amount;

                    if (item.Cash != null)
                    {
                        item.CashId = item.Cash.ID;
                    }
                    else if (item.Bank != null)
                    {
                        item.BankId = item.Bank.ID;
                    }
                    else if (item.Cheque != null && item.Type == ZhivarEnums.DetailPayReceiveType.Cheque)
                    {
                        Cheque cheque = new Cheque()
                        {
                            Amount       = item.Amount,
                            BankBranch   = item.Cheque.BankBranch,
                            BankName     = item.Cheque.BankName,
                            ChequeNumber = item.Cheque.ChequeNumber,
                            Contact      = payRecevie.Contact,
                            ContactId    = payRecevie.Contact.ID,
                            Date         = PersianDateUtils.ToDateTime(item.Cheque.DisplayDate),
                            OrganId      = organId,
                            Status       = ZhivarEnums.ChequeStatus.Normal,
                            DisplayDate  = item.Cheque.DisplayDate,
                        };

                        if (payRecevie.IsReceive)
                        {
                            cheque.Type = ZhivarEnums.ChequeType.Dareaftani;
                        }
                        else
                        {
                            cheque.Type = ZhivarEnums.ChequeType.Pardakhtani;
                        }

                        if (item.Cheque.ReceiptDate != null)
                        {
                            cheque.ReceiptDate = item.Cheque.ReceiptDate;
                        }


                        item.Cheque             = cheque;
                        item.ChequeId           = item.Cheque.ID;
                        item.Cheque.ObjectState = OMF.Common.Enums.ObjectState.Added;

                        if (!payRecevie.IsReceive)
                        {
                            var temp = item.ChequeBank.ID;

                            item.ChequeBank = new ChequeBank()
                            {
                                BankId   = temp,
                                ChequeId = item.Cheque.ID,
                                OrganId  = organId
                            };

                            item.ChequeBank.ObjectState = OMF.Common.Enums.ObjectState.Added;
                            item.ChequeBankId           = item.ChequeBank.ID;
                        }

                        item.ObjectState = OMF.Common.Enums.ObjectState.Added;
                    }

                    if (item.Type == ZhivarEnums.DetailPayReceiveType.KharjCheque)
                    {
                        ChequeRule chequeRule = new ChequeRule();
                        var        cheque     = await chequeRule.FindAsync(item.Cheque.ID);

                        cheque.Status = ZhivarEnums.ChequeStatus.Sold;
                        chequeRule.Update(cheque);
                        await chequeRule.SaveChangesAsync();

                        item.Cheque.ContactId = item.Cheque.Contact.ID;
                    }

                    item.ObjectState = OMF.Common.Enums.ObjectState.Added;
                }

                payRecevie.Amount = amount;

                if (payRecevie.Invoice != null)
                {
                    //if (payRecevie.Invoice.Contact != null)
                    payRecevie.Invoice.ContactId = payRecevie.Invoice.ContactId;

                    //payRecevie.Invoice.FinanYear = finanYerar;
                    //payRecevie.Invoice.FinanYearId = finanYerar.ID;
                    var invoice = payRecevie.Invoice;
                    invoice.Rest -= amount;
                    invoice.Paid += amount;
                    if (invoice.Rest <= 0)
                    {
                        invoice.Status = ZhivarEnums.NoeInsertFactor.Received;
                    }
                    this.BusinessRule.UnitOfWork.RepositoryAsync <Invoice>().Update(invoice);
                }

                if (payRecevie.Cost != null)
                {
                    //if (payRecevie.Cost.Contact != null)
                    payRecevie.Cost.ContactId = payRecevie.Cost.ContactId;


                    var cost = payRecevie.Cost;
                    cost.Rest -= amount;
                    cost.Paid += amount;
                    if (cost.Rest <= 0)
                    {
                        cost.Status = ZhivarEnums.CostStatus.Paid;
                    }


                    this.BusinessRule.UnitOfWork.RepositoryAsync <Cost>().Update(cost);
                }

                payRecevie.Document = await createDocument(payRecevie, organId, documentNumber);

                if (payRecevieNumber > 0)
                {
                    payRecevie.Number = payRecevieNumber;
                }
                else
                {
                    var payRecevies = await Rule.GetAllByOrganIdAsync(organId);

                    var lastPayRecevies = payRecevies.OrderByDescending(x => x.ID).FirstOrDefault();

                    if (lastPayRecevies != null)
                    {
                        payRecevie.Number = lastPayRecevies.Number + 1;
                    }
                    else
                    {
                        payRecevie.Number = 1;
                    }
                }

                foreach (var transaction in payRecevie.Document.Transactions)
                {
                    transaction.ObjectState = OMF.Common.Enums.ObjectState.Added;
                    //if (transaction.AccDocument != null)
                    //    transaction.AccDocument.ObjectState = OMF.Common.Enums.ObjectState.Unchanged;

                    if (transaction.Account != null)
                    {
                        transaction.Account.ObjectState = OMF.Common.Enums.ObjectState.Unchanged;
                    }

                    // transaction.Transactions = null;
                }
                payRecevie.Document.ObjectState = OMF.Common.Enums.ObjectState.Added;

                payRecevie.ObjectState = OMF.Common.Enums.ObjectState.Added;
                this.BusinessRule.UnitOfWork.RepositoryAsync <PayRecevie>().InsertOrUpdateGraph(payRecevie);

                await this.BusinessRule.UnitOfWork.SaveChangesAsync();

                return(Request.CreateResponse(HttpStatusCode.OK, new { resultCode = (int)ZhivarEnums.ResultCode.Successful, data = payRecevie }));
            }
            catch (Exception ex)
            {
                throw;
            }
        }