示例#1
0
        public void CommitAdvance()
        {
            bool isNew = id < 0;

            using (DbTransaction transaction = new DbTransaction(BusinessDomain.DataAccessProvider)) {
                transaction.SnapshotObject(this);
                if (isNew)
                {
                    mode          = PaymentMode.Paid;
                    userId        = BusinessDomain.LoggedUser.Id;
                    operationType = (int)Data.OperationType.AdvancePayment;
                    sign          = 1;
                    locationId    = Location.DefaultId;
                }

                BusinessDomain.DataAccessProvider.AddAdvancePayment(this);

                if (isNew && Type.BaseType == BasePaymentType.Cash)
                {
                    CashBookEntry cashBookEntry = new CashBookEntry(this)
                    {
                        OperationNumber     = OperationId,
                        PartnerName         = PartnerName,
                        TurnoverType        = TurnoverType.IncomeAdvance,
                        DescriptionTemplate = Translator.GetString("Advance Payment No. {0}, {1}")
                    };
                    cashBookEntry.CommitChanges();
                }
                transaction.Complete();
            }

            if (isNew)
            {
                BusinessDomain.OnPaymentCommited(this);
            }
        }
示例#2
0
        private static void DistributeAdvances(IList <Payment> advances, IList <Payment> duePayments, ICollection <Payment> payments)
        {
            for (int i = 0; i < advances.Count; i++)
            {
                Payment advance = advances [i];
                foreach (Payment duePayment in duePayments)
                {
                    if (duePayment.Quantity.IsZero() || duePayment.Sign != advance.Sign)
                    {
                        continue;
                    }

                    Payment payment = (Payment)duePayment.Clone();
                    payment.Id                = -1;
                    payment.Mode              = PaymentMode.Paid;
                    payment.Date              = advance.Date;
                    payment.Quantity          = Math.Min(advance.Quantity, duePayment.Quantity);
                    payment.TypeId            = advance.TypeId;
                    payment.TransactionNumber = advance.TransactionNumber;
                    payment.CommitChanges();
                    payments.Add(payment);

                    if (payment.Type.BaseType == BasePaymentType.Cash)
                    {
                        CashBookEntry entry = new CashBookEntry(payment)
                        {
                            OperationNumber = payment.OperationId,
                            PartnerName     = payment.PartnerName,
                            LocationId      = payment.LocationId,
                            Description     = string.Format("{0} No. {1}, {2}",
                                                            Translator.GetOperationTypeGlobalName((OperationType)payment.OperationType),
                                                            Operation.GetFormattedOperationNumber(payment.OperationId),
                                                            payment.PartnerName)
                        };
                        if (payment.Sign > 0)
                        {
                            entry.PaymentDirection = TurnoverDirection.Income;
                            entry.TurnoverType     = TurnoverType.IncomeOther;
                        }
                        else
                        {
                            entry.PaymentDirection = TurnoverDirection.Expense;
                            entry.TurnoverType     = TurnoverType.ExpenseOther;
                        }
                        entry.CommitChanges();
                    }

                    advance.Quantity    -= payment.Quantity;
                    duePayment.Quantity -= payment.Quantity;

                    if (advance.Id > 0)
                    {
                        advance.CommitChanges();
                    }

                    if (advance.Quantity.IsZero())
                    {
                        break;
                    }
                }

                if (advance.Quantity.IsZero())
                {
                    advances.RemoveAt(i);
                    i--;
                }
            }
        }