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); } }
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--; } } }