public void UpdateAndResolveOverapplied() { decimal amountRemaining = AmountRemaining(); if (Math.Round(amountRemaining,2) < 0) { Query invoiceTransfersAppliedQuery = new Query(new And(new Q(InvoiceTransfer.Columns.TransferK, this.K), new Q(Invoice.Columns.Type, Invoice.Types.Invoice))); invoiceTransfersAppliedQuery.TableElement = new Join(InvoiceTransfer.Columns.InvoiceK, Invoice.Columns.K); invoiceTransfersAppliedQuery.OrderBy = new OrderBy(Invoice.Columns.DueDateTime, OrderBy.OrderDirection.Ascending); InvoiceTransferSet invoiceTransferSet = new InvoiceTransferSet(invoiceTransfersAppliedQuery); string transferNote = "Transfer overapplied by " + ((double)(-1 * amountRemaining)).ToString("c") + "."; decimal amountToUnApply = 0; for (int i = invoiceTransferSet.Count - 1; i >= 0; i--) { if (Math.Round(amountRemaining,2) < 0) { Invoice invoice = new Invoice(invoiceTransferSet[i].InvoiceK); if (invoiceTransferSet[i].Amount <= -1 * amountRemaining) { amountToUnApply = invoiceTransferSet[i].Amount; invoiceTransferSet[i].Delete(); } else { amountToUnApply = -1 * amountRemaining; invoiceTransferSet[i].Amount -= amountToUnApply; invoiceTransferSet[i].Amount = Math.Round(invoiceTransferSet[i].Amount, 2); invoiceTransferSet[i].Update(); } transferNote += string.Format("\nAutomatically unapplied {0} from invoice #{1}.", amountToUnApply.ToString("c"), invoice.K); amountRemaining += amountToUnApply; //if (this.Method == Methods.TicketSales) // BankExport.GenerateBankExportForTicketFundsUsed(this, -1 * amountToUnApply, new Invoice(invoiceTransferSet[i].InvoiceK)); invoice.AddNote(string.Format("Transfer #{0} was overapplied. {1} has been unapplied from transfer #{0}.", this.K, amountToUnApply.ToString("c")), "System"); invoice.UpdateAndSetPaidStatus(); } } this.AddNote(transferNote, "System"); if (Math.Round(amountRemaining, 2) == 0) this.IsFullyApplied = true; else this.IsFullyApplied = false; this.Update(); } }