} // generatePaySelect /// <summary> /// Create Check /// </summary> /// <param name="ctx"></param> /// <param name="line"></param> /// <param name="_list"></param> private void CreateCheck(Ctx ctx, MPaySelectionLine line, List <MPaySelectionCheck> _list) { string _PaymentRule = "S"; if (_PaymentRule != null && _PaymentRule.Equals(X_C_Order.PAYMENTRULE_DirectDebit)) { _PaymentRule = null; } //// Try to find one for (int i = 0; i < _list.Count; i++) { MPaySelectionCheck check = (MPaySelectionCheck)_list[i]; // Add to existing if (check.GetC_BPartner_ID() == line.GetInvoice().GetC_BPartner_ID()) { check.AddLine(line); if (!check.Save()) { throw new Exception("Cannot save MPaySelectionCheck"); } line.SetC_PaySelectionCheck_ID(check.GetC_PaySelectionCheck_ID()); line.SetProcessed(true); if (!line.Save()) { throw new Exception("Cannot save MPaySelectionLine"); } return; } } //// Create new String PaymentRule = line.GetPaymentRule(); if (_PaymentRule != null && _PaymentRule != " ") { if (!X_C_Order.PAYMENTRULE_DirectDebit.Equals(PaymentRule)) { PaymentRule = _PaymentRule; } } MPaySelectionCheck check1 = new MPaySelectionCheck(line, PaymentRule); if (!check1.IsValid()) { int C_BPartner_ID = check1.GetC_BPartner_ID(); MBPartner bp = MBPartner.Get(ctx, C_BPartner_ID); String msg = "@NotFound@ @C_BP_BankAccount@: " + bp.GetName(); throw new Exception(msg); } if (!check1.Save()) { throw new Exception("Cannot save MPaySelectionCheck"); } line.SetC_PaySelectionCheck_ID(check1.GetC_PaySelectionCheck_ID()); line.SetProcessed(true); if (!line.Save()) { throw new Exception("Cannot save MPaySelectionLine"); } _list.Add(check1); }
/// <summary> /// Allocate Individual Payments with _payment references /// </summary> /// <returns>number of allocations</returns> private int allocateBPPaymentWithInfo() { int _count = 0; //**** See if there is a direct link (Invoice or Pay Selection) for (int p = 0; p < _payments.Length; p++) { MPayment _payment = _payments[p]; if (_payment.IsAllocated()) { continue; } Decimal _allocatedAmt = Utility.Util.GetValueOfDecimal(_payment.GetAllocatedAmt()); log.Info(_payment + ", Allocated=" + _allocatedAmt); if (Env.Signum(_allocatedAmt) != 0) { continue; } Decimal _availableAmt = Decimal.Add(Decimal.Add(Decimal.Add(_payment.GetPayAmt(), _payment.GetDiscountAmt()), _payment.GetWriteOffAmt()), _payment.GetOverUnderAmt()); if (!_payment.IsReceipt()) { _availableAmt = Decimal.Negate(_availableAmt); } log.Fine("Available=" + _availableAmt); // if (_payment.GetC_Invoice_ID() != 0) { for (int i = 0; i < _invoices.Length; i++) { MInvoice _invoice = _invoices[i]; if (_invoice.IsPaid()) { continue; } // log.fine("allocateIndividualPayments - " + _invoice); if (_payment.GetC_Invoice_ID() == _invoice.GetC_Invoice_ID()) { if (_payment.GetC_Currency_ID() == _invoice.GetC_Currency_ID()) { Decimal _openAmt = Utility.Util.GetValueOfDecimal(_invoice.GetOpenAmt(true, null)); if (!_invoice.IsSOTrx()) { _openAmt = Decimal.Negate(_openAmt); } log.Fine(_invoice + ", Open=" + _openAmt); // With Discount, etc. if (_availableAmt.CompareTo(_openAmt) == 0) { if (_payment.AllocateIt()) { AddLog(0, _payment.GetDateAcct(), _openAmt, _payment.GetDocumentNo() + " [1]"); _count++; } break; } } else // Mixed Currency { } } // _invoice found } // for all invoices } // _payment has _invoice else // No direct _invoice { MPaySelectionCheck psCheck = MPaySelectionCheck.GetOfPayment(GetCtx(), _payment.GetC_Payment_ID(), Get_Trx()); if (psCheck == null) { continue; } // Decimal _totalInvoice = Env.ZERO; MPaySelectionLine[] _psLines = psCheck.GetPaySelectionLines(false); for (int i = 0; i < _psLines.Length; i++) { MPaySelectionLine _line = _psLines[i]; MInvoice _invoice = _line.GetInvoice(); if (_payment.GetC_Currency_ID() == _invoice.GetC_Currency_ID()) { Decimal _invoiceAmt = Utility.Util.GetValueOfDecimal((_invoice.GetOpenAmt(true, null))); Decimal _overUnder = Decimal.Subtract(Decimal.Subtract(Decimal.Subtract(_line.GetOpenAmt(), _line.GetPayAmt()), _line.GetDiscountAmt()), _line.GetDifferenceAmt()); _invoiceAmt = Decimal.Subtract(Decimal.Subtract(Decimal.Subtract(_invoiceAmt, _line.GetDiscountAmt()), _line.GetDifferenceAmt()), _overUnder); if (!_invoice.IsSOTrx()) { _invoiceAmt = Decimal.Negate(_invoiceAmt); } log.Fine(_invoice + ", Invoice=" + _invoiceAmt); _totalInvoice = Decimal.Add(_totalInvoice, _invoiceAmt); } else // Multi-Currency { } } if (_availableAmt.CompareTo(_totalInvoice) == 0) { if (_payment.AllocateIt()) { AddLog(0, _payment.GetDateAcct(), _availableAmt, _payment.GetDocumentNo() + " [n]"); _count++; } } } // No direct _invoice } // See if there is a direct link return(_count); } // allocateIndividualPayments