/// <summary> /// Perrform Process. /// </summary> /// <returns>Message (clear text)</returns> protected override String DoIt() { //log.info ("C_InvoicePaySchedule_ID=" + getRecord_ID()); MInvoicePaySchedule[] schedule = MInvoicePaySchedule.GetInvoicePaySchedule(GetCtx(), 0, GetRecord_ID(), null); if (schedule.Length == 0) { throw new ArgumentException("InvoicePayScheduleValidate - No Schedule"); } // Get Invoice MInvoice invoice = new MInvoice(GetCtx(), schedule[0].GetC_Invoice_ID(), null); if (invoice.Get_ID() == 0) { throw new ArgumentException("InvoicePayScheduleValidate - No Invoice"); } // Decimal total = Env.ZERO; for (int i = 0; i < schedule.Length; i++) { Decimal due = schedule[i].GetDueAmt(); if (due != 0) { total = Decimal.Add(total, due); } } bool valid = invoice.GetGrandTotal().CompareTo(total) == 0; invoice.SetIsPayScheduleValid(valid); invoice.Save(); // Schedule for (int i = 0; i < schedule.Length; i++) { if (schedule[i].IsValid() != valid) { schedule[i].SetIsValid(valid); schedule[i].Save(); } } String msg = "@OK@"; if (!valid) { msg = "@GrandTotal@ = " + invoice.GetGrandTotal() + " <> @Total@ = " + total + " - @Difference@ = " + Decimal.Subtract(invoice.GetGrandTotal(), total); } return(Msg.ParseTranslation(GetCtx(), msg)); }
/** * Apply Payment Term with schedule to Invoice * @param invoice invoice * @return true if payment schedule is valid */ private bool ApplySchedule(MInvoice invoice) { DeleteInvoicePaySchedule(invoice.GetC_Invoice_ID(), invoice.Get_TrxName()); // Create Schedule MInvoicePaySchedule ips = null; Decimal remainder = invoice.GetGrandTotal(); for (int i = 0; i < _schedule.Length; i++) { ips = new MInvoicePaySchedule(invoice, _schedule[i]); ips.Save(invoice.Get_TrxName()); log.Fine(ips.ToString()); remainder = Decimal.Subtract(remainder, ips.GetDueAmt()); } // for all schedules // Remainder - update last if (remainder.CompareTo(Env.ZERO) != 0 && ips != null) { ips.SetDueAmt(Decimal.Add(ips.GetDueAmt(), remainder)); ips.Save(invoice.Get_TrxName()); log.Fine("Remainder=" + remainder + " - " + ips); } // updateInvoice if (invoice.GetC_PaymentTerm_ID() != GetC_PaymentTerm_ID()) { invoice.SetC_PaymentTerm_ID(GetC_PaymentTerm_ID()); } return(invoice.ValidatePaySchedule()); }
/// <summary> /// Complete Invoice /// </summary> /// <param name="invoice">invoice</param> private void CompleteInvoice(MInvoice invoice, MTimeExpense te) { if (invoice == null) { return; } invoice.SetDocAction(DocActionVariables.ACTION_PREPARE); invoice.ProcessIt(DocActionVariables.ACTION_COMPLETE); if (!invoice.Save()) { //Added By Siddheshwar if (!IncompleteInvoice.Contains(te.GetS_TimeExpense_ID())) { IncompleteInvoice.Add(te.GetS_TimeExpense_ID()); if (string.IsNullOrEmpty(bpNameInvoice)) { bpNameInvoice = te.GetDocumentNo(); } else { bpNameInvoice += te.GetDocumentNo() + ", "; } } new Exception(invoice + "Cannot save Invoice"); Rollback(); } else { Commit(); _noInvoices++; AddLog(invoice.Get_ID(), invoice.GetDateInvoiced(), invoice.GetGrandTotal(), invoice.GetDocumentNo()); } } // completeInvoice
} // doIt /// <summary> /// Complete Invoice /// </summary> private void CompleteInvoice() { if (_invoice == null) { return; } _invoice.SetDocAction(_DocAction); _invoice.ProcessIt(_DocAction); _invoice.Save(); AddLog(0, _invoice.GetDateInvoiced(), _invoice.GetGrandTotal(), _invoice.GetDocumentNo()); _count++; _invoice = null; } // completeInvoice
} // doIt /// <summary> /// Complete Invoice /// </summary> /// <param name="invoice">invoice</param> private void CompleteInvoice(MInvoice invoice) { if (invoice == null) { return; } invoice.SetDocAction(DocActionVariables.ACTION_PREPARE); invoice.ProcessIt(DocActionVariables.ACTION_PREPARE); if (!invoice.Save()) { new Exception("Cannot save Invoice"); } // _noInvoices++; AddLog(invoice.Get_ID(), invoice.GetDateInvoiced(), invoice.GetGrandTotal(), invoice.GetDocumentNo()); } // completeInvoice
/// <summary> /// Load Specific Document Details /// </summary> /// <returns>error message or null</returns> public override String LoadDocumentDetails() { MInvoice invoice = (MInvoice)GetPO(); SetDateDoc(invoice.GetDateInvoiced()); SetIsTaxIncluded(invoice.IsTaxIncluded()); // Amounts SetAmount(Doc.AMTTYPE_Gross, invoice.GetGrandTotal()); SetAmount(Doc.AMTTYPE_Net, invoice.GetTotalLines()); SetAmount(Doc.AMTTYPE_Charge, invoice.GetChargeAmt()); // Contained Objects _taxes = LoadTaxes(); _lines = LoadLines(invoice); log.Fine("Lines=" + _lines.Length + ", Taxes=" + _taxes.Length); return(null); }
/// <summary> /// Set Invoice - no discount /// </summary> /// <param name="invoice">Invoice</param> public void SetInvoice(MInvoice invoice) { Decimal amt = 0; SetC_Invoice_ID(invoice.GetC_Invoice_ID()); SetCashType(CASHTYPE_Invoice); SetC_BPartner_ID(invoice.GetC_BPartner_ID()); // JID_0687: System is not updating the Location on cash journal line in cases of POS order and payment method cash SetC_BPartner_Location_ID(invoice.GetC_BPartner_Location_ID()); SetC_Currency_ID(invoice.GetC_Currency_ID()); // Amount MDocType dt = MDocType.Get(GetCtx(), invoice.GetC_DocType_ID()); if (invoice.GetRef_C_Invoice_ID() > 0) { //amt = Decimal.Negate(Util.GetValueOfDecimal(DB.ExecuteScalar("SELECT SUM(Al.Amount) FROM c_allocationline al INNER JOIN c_allocationhdr alhdr ON alhdr.c_allocationhdr_ID=al.c_allocationhdr_ID " // + " WHERE alhdr.isactive ='Y' AND Alhdr.Docstatus IN ('CO','CL') and al.c_invoice_id=" + invoice.GetRef_C_Invoice_ID()))); // get amount against invoice wheether cash journal is completed or not // Done by Vivek on 01/03/2016 amt = Decimal.Negate(Util.GetValueOfDecimal(DB.ExecuteScalar("SELECT SUM(cl.Amount) FROM C_CashLine cl INNER JOIN C_Cash cs ON cs.C_Cash_ID=CL.C_CASH_ID WHERE cl.C_Invoice_ID=" + invoice.GetRef_C_Invoice_ID() + " AND cs.DocStatus NOT IN ('VO') "))); } else { amt = invoice.GetGrandTotal(); } if (MDocBaseType.DOCBASETYPE_APINVOICE.Equals(dt.GetDocBaseType()) || MDocBaseType.DOCBASETYPE_ARCREDITMEMO.Equals(dt.GetDocBaseType())) { amt = Decimal.Negate(amt); // set payment type according to invoice document type SetVSS_PAYMENTTYPE("P"); } else { // set payment type according to invoice document type SetVSS_PAYMENTTYPE("R"); } SetAmount(amt); // SetDiscountAmt(Env.ZERO); SetWriteOffAmt(Env.ZERO); SetIsGenerated(true); _invoice = invoice; }
/// <summary> /// Perrform Process. /// </summary> /// <returns>Message (clear text)</returns> protected override String DoIt() { log.Info("C_Order_ID=" + _C_Order_ID + ", C_Invoice_ID=" + _C_Invoice_ID); if (_C_Order_ID == 0 && _C_Invoice_ID == 0) { throw new Exception("Nothing to do"); } String retValue = ""; if (_C_Order_ID != 0) { MOrder order = new MOrder(GetCtx(), _C_Order_ID, Get_TrxName()); Decimal oldPrice = order.GetGrandTotal(); MOrderLine[] lines = order.GetLines(); for (int i = 0; i < lines.Length; i++) { lines[i].SetPrice(order.GetM_PriceList_ID()); lines[i].Save(); } order = new MOrder(GetCtx(), _C_Order_ID, Get_TrxName()); Decimal newPrice = order.GetGrandTotal(); retValue = order.GetDocumentNo() + ": " + oldPrice + " -> " + newPrice; } if (_C_Invoice_ID != 0) { MInvoice invoice = new MInvoice(GetCtx(), _C_Invoice_ID, null); Decimal oldPrice = invoice.GetGrandTotal(); MInvoiceLine[] lines = invoice.GetLines(false); for (int i = 0; i < lines.Length; i++) { lines[i].SetPrice(invoice.GetM_PriceList_ID(), invoice.GetC_BPartner_ID()); lines[i].Save(); } invoice = new MInvoice(GetCtx(), _C_Invoice_ID, null); Decimal newPrice = invoice.GetGrandTotal(); if (retValue.Length > 0) { retValue += Env.NL; } retValue += invoice.GetDocumentNo() + ": " + oldPrice + " -> " + newPrice; } // return(retValue); }
} // doIt /// <summary> /// Done with Invoice /// </summary> private void InvoiceDone() { // Close Old if (_m_invoice != null) { if (_m_linecount == 0) { _m_invoice.Delete(false); } else { //_m_invoice.ProcessIt(MInvoice.ACTION_Prepare); _m_invoice.ProcessIt(DocActionVariables.ACTION_PREPARE); _m_invoice.Save(); AddLog(0, null, _m_invoice.GetGrandTotal(), _m_invoice.GetDocumentNo()); } } _m_invoice = null; } // invoiceDone
/// <summary> /// Set Invoice /// </summary> /// <param name="invoice">The invoice to set.</param> public void SetInvoice(MInvoice invoice) { _invoice = invoice; if (invoice != null) { _C_CurrencyFrom_ID = invoice.GetC_Currency_ID(); SetAmt(invoice.GetGrandTotal()); SetOpenAmt(GetAmt()); // not correct SetConvertedAmt(MConversionRate.Convert(GetCtx(), GetOpenAmt(), GetC_CurrencyFrom_ID(), GetC_CurrencyTo_ID(), GetAD_Client_ID(), GetAD_Org_ID())); } else { _C_CurrencyFrom_ID = 0; SetAmt(Env.ZERO); SetOpenAmt(Env.ZERO); SetConvertedAmt(Env.ZERO); } }
/** * Set Invoice - no discount * @param invoice invoice */ public void SetInvoice(MInvoice invoice) { SetC_Invoice_ID(invoice.GetC_Invoice_ID()); SetCashType(CASHTYPE_Invoice); SetC_Currency_ID(invoice.GetC_Currency_ID()); // Amount MDocType dt = MDocType.Get(GetCtx(), invoice.GetC_DocType_ID()); Decimal amt = invoice.GetGrandTotal(); if (MDocBaseType.DOCBASETYPE_APINVOICE.Equals(dt.GetDocBaseType()) || MDocBaseType.DOCBASETYPE_ARCREDITMEMO.Equals(dt.GetDocBaseType())) { amt = Decimal.Negate(amt); } SetAmount(amt); // SetDiscountAmt(Env.ZERO); SetWriteOffAmt(Env.ZERO); SetIsGenerated(true); _invoice = invoice; }
/** * Parent Constructor * @param invoice invoice * @param paySchedule payment schedule */ public MInvoicePaySchedule(MInvoice invoice, MPaySchedule paySchedule) : base(invoice.GetCtx(), 0, invoice.Get_TrxName()) { _parent = invoice; SetClientOrg(invoice); SetC_Invoice_ID(invoice.GetC_Invoice_ID()); SetC_PaySchedule_ID(paySchedule.GetC_PaySchedule_ID()); // Amounts int scale = MCurrency.GetStdPrecision(GetCtx(), invoice.GetC_Currency_ID()); Decimal due = invoice.GetGrandTotal(); if (due.CompareTo(Env.ZERO) == 0) { SetDueAmt(Env.ZERO); SetDiscountAmt(Env.ZERO); SetIsValid(false); } else { //due = due.multiply(paySchedule.getPercentage()).divide(HUNDRED, scale, Decimal.ROUND_HALF_UP); due = Decimal.Multiply(due, Decimal.Divide(paySchedule.GetPercentage(), Decimal.Round(HUNDRED, scale, MidpointRounding.AwayFromZero))); SetDueAmt(due); Decimal discount = Decimal.Multiply(due, Decimal.Divide(paySchedule.GetDiscount(), Decimal.Round(HUNDRED, scale, MidpointRounding.AwayFromZero))); SetDiscountAmt(discount); SetIsValid(true); } // Dates DateTime dueDate = TimeUtil.AddDays(invoice.GetDateInvoiced(), paySchedule.GetNetDays()); SetDueDate(dueDate); DateTime discountDate = TimeUtil.AddDays(invoice.GetDateInvoiced(), paySchedule.GetDiscountDays()); SetDiscountDate(discountDate); }
/** * Apply Payment Term without schedule to Invoice * @param invoice invoice * @return false as no payment schedule */ #region Advance Payment by Vivek on 16/06/2016 private bool ApplyNoSchedule(MInvoice invoice) { int _CountVA009 = Util.GetValueOfInt(DB.ExecuteScalar("SELECT COUNT(AD_MODULEINFO_ID) FROM AD_MODULEINFO WHERE PREFIX='VA009_' AND IsActive = 'Y'")); if (_CountVA009 > 0) { DeleteInvoicePaySchedule(invoice.GetC_Invoice_ID(), invoice.Get_TrxName()); StringBuilder _sql = new StringBuilder(); MInvoicePaySchedule schedule = null; MPaymentTerm payterm = new MPaymentTerm(GetCtx(), invoice.GetC_PaymentTerm_ID(), invoice.Get_TrxName()); Decimal remainder = invoice.GetGrandTotal(); int BaseCurrency = 0; if (Util.GetValueOfInt(DB.ExecuteScalar("Select Count(*) From C_PaySchedule Where C_PaymentTerm_ID=" + invoice.GetC_PaymentTerm_ID())) > 1) { for (int i = 0; i < _schedule.Length; i++) { MPaySchedule _sch = new MPaySchedule(GetCtx(), _schedule[i].GetC_PaySchedule_ID(), Get_TrxName()); #region IsAdvance true on Payment Schedule if (_sch.IsVA009_Advance()) { #region Copy Order Schedules String sql = "SELECT * FROM VA009_OrderPaySchedule WHERE C_Order_ID=" + invoice.GetC_Order_ID() + " AND VA009_IsPaid='Y' ORDER BY Created"; DataSet _ds = new DataSet(); _ds = DB.ExecuteDataset(sql, null); if (_ds.Tables[0].Rows.Count > 0 && _ds.Tables[0].Rows != null) { for (int j = 0; j < _ds.Tables[0].Rows.Count; j++) { schedule = new MInvoicePaySchedule(GetCtx(), 0, invoice.Get_TrxName()); Boolean _isPaid = false; if (Util.GetValueOfString(_ds.Tables[0].Rows[j]["VA009_IsPaid"]) == "Y") { _isPaid = true; } schedule.SetAD_Client_ID(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["AD_Client_ID"])); schedule.SetAD_Org_ID(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["AD_Org_ID"])); schedule.SetC_Invoice_ID(invoice.GetC_Invoice_ID()); schedule.SetC_DocType_ID(invoice.GetC_DocType_ID()); schedule.SetC_PaymentTerm_ID(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["C_PaymentTerm_ID"])); schedule.SetVA009_GrandTotal(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["VA009_GrandTotal"])); schedule.SetVA009_PaymentMethod_ID(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["VA009_PaymentMethod_ID"])); schedule.SetDueDate(invoice.GetDateInvoiced()); schedule.SetDueAmt(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["DueAmt"])); schedule.SetDiscountDate(Util.GetValueOfDateTime(_ds.Tables[0].Rows[j]["DiscountDate"])); schedule.SetDiscountAmt(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["DiscountAmt"])); schedule.SetVA009_IsPaid(_isPaid); schedule.SetC_Payment_ID(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["C_Payment_ID"])); schedule.SetDiscountDays2(Util.GetValueOfDateTime(_ds.Tables[0].Rows[j]["DiscountDays2"])); schedule.SetDiscount2(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["Discount2"])); schedule.SetVA009_PlannedDueDate(Util.GetValueOfDateTime(_ds.Tables[0].Rows[j]["VA009_PlannedDueDate"])); schedule.SetVA009_OpenAmnt(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["VA009_OpenAmnt"])); schedule.SetC_Currency_ID(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["C_Currency_ID"])); schedule.SetVA009_BseCurrncy(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["VA009_bseCurrncy"])); schedule.SetVA009_OpnAmntInvce(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["VA009_OpnAmntInvce"])); schedule.SetC_BPartner_ID(Util.GetValueOfInt(_ds.Tables[0].Rows[j]["C_Bpartner_ID"])); schedule.SetVA009_FollowupDate(Util.GetValueOfDateTime(_ds.Tables[0].Rows[j]["VA009_FollowUpDate"])); schedule.SetVA009_PaymentMode(Util.GetValueOfString(_ds.Tables[0].Rows[j]["va009_paymentmode"])); schedule.SetVA009_PaymentType(Util.GetValueOfString(_ds.Tables[0].Rows[j]["va009_paymenttype"])); schedule.SetVA009_PaymentTrigger(Util.GetValueOfString(_ds.Tables[0].Rows[j]["va009_paymenttrigger"])); schedule.SetVA009_ExecutionStatus(Util.GetValueOfString(_ds.Tables[0].Rows[j]["VA009_ExecutionStatus"])); schedule.SetProcessed(true); if (!schedule.Save(invoice.Get_TrxName())) { return(false); } } } #endregion } #endregion #region IsAdvance false on Payment Schedule else { schedule = new MInvoicePaySchedule(invoice, _schedule[i]); schedule.SetVA009_ExecutionStatus("A"); schedule.SetAD_Client_ID(invoice.GetAD_Client_ID()); schedule.SetAD_Org_ID(invoice.GetAD_Org_ID()); schedule.SetC_Invoice_ID(invoice.GetC_Invoice_ID()); schedule.SetC_DocType_ID(invoice.GetC_DocType_ID()); MOrder _Order = new MOrder(GetCtx(), invoice.GetC_Order_ID(), Get_TrxName()); schedule.SetVA009_PaymentMethod_ID(invoice.GetVA009_PaymentMethod_ID()); schedule.SetC_PaymentTerm_ID(invoice.GetC_PaymentTerm_ID()); schedule.SetVA009_GrandTotal(invoice.GetGrandTotal()); MPaymentTerm paytrm = new MPaymentTerm(GetCtx(), invoice.GetC_PaymentTerm_ID(), Get_TrxName()); int _graceDay = paytrm.GetGraceDays(); //DateTime? _followUpDay = GetDueDate(invoice); schedule.SetVA009_FollowupDate(schedule.GetDueDate().Value.AddDays(_graceDay)); //schedule.SetVA009_PlannedDueDate(GetDueDate(invoice)); schedule.SetVA009_PlannedDueDate(schedule.GetDueDate()); //schedule.SetDueDate(GetDueDate(invoice)); //change by amit 25-11-2015 StringBuilder _sqlBsCrrncy = new StringBuilder(); _sql.Clear(); _sqlBsCrrncy.Append(@"SELECT UNIQUE asch.C_Currency_ID FROM c_acctschema asch INNER JOIN ad_clientinfo ci ON ci.c_acctschema1_id = asch.c_acctschema_id INNER JOIN ad_client c ON c.ad_client_id = ci.ad_client_id INNER JOIN c_invoice i ON c.ad_client_id = i.ad_client_id WHERE i.ad_client_id = " + invoice.GetAD_Client_ID()); BaseCurrency = Util.GetValueOfInt(DB.ExecuteScalar(_sqlBsCrrncy.ToString(), null, null)); if (BaseCurrency != invoice.GetC_Currency_ID()) { _sqlBsCrrncy.Clear(); _sqlBsCrrncy.Append(@"SELECT multiplyrate FROM c_conversion_rate WHERE AD_Client_ID = " + invoice.GetAD_Client_ID() + " AND c_currency_id = " + invoice.GetC_Currency_ID() + " AND c_currency_to_id = " + BaseCurrency + " AND " + GlobalVariable.TO_DATE(invoice.GetDateAcct(), true) + " BETWEEN ValidFrom AND ValidTo"); decimal multiplyRate = Util.GetValueOfDecimal(DB.ExecuteScalar(_sqlBsCrrncy.ToString(), null, null)); if (multiplyRate == 0) { _sqlBsCrrncy.Clear(); _sqlBsCrrncy.Append(@"SELECT dividerate FROM c_conversion_rate WHERE AD_Client_ID = " + invoice.GetAD_Client_ID() + " AND c_currency_id = " + BaseCurrency + " AND c_currency_to_id = " + invoice.GetC_Currency_ID() + " AND " + GlobalVariable.TO_DATE(invoice.GetDateAcct(), true) + " BETWEEN ValidFrom AND ValidTo"); multiplyRate = Util.GetValueOfDecimal(DB.ExecuteScalar(_sqlBsCrrncy.ToString(), null, null)); } schedule.SetVA009_OpenAmnt(schedule.GetDueAmt() * multiplyRate); } else { schedule.SetVA009_OpenAmnt(schedule.GetDueAmt()); } schedule.SetC_Currency_ID(invoice.GetC_Currency_ID()); schedule.SetVA009_BseCurrncy(BaseCurrency); schedule.SetVA009_OpnAmntInvce(schedule.GetDueAmt()); schedule.SetC_BPartner_ID(invoice.GetC_BPartner_ID()); //end string _sqlPaymentMthd = "Select va009_paymentmode, va009_paymenttype, va009_paymenttrigger From va009_paymentmethod where va009_paymentmethod_ID=" + invoice.GetVA009_PaymentMethod_ID() + " AND IsActive = 'Y' AND AD_Client_ID = " + invoice.GetAD_Client_ID(); DataSet dsPayMthd = new DataSet(); dsPayMthd = DB.ExecuteDataset(_sqlPaymentMthd); if (dsPayMthd.Tables != null && dsPayMthd.Tables.Count > 0 && dsPayMthd.Tables[0].Rows.Count > 0) { for (int j = 0; j < dsPayMthd.Tables[0].Rows.Count; j++) { schedule.SetVA009_PaymentMode(Util.GetValueOfString(dsPayMthd.Tables[0].Rows[j]["va009_paymentmode"])); schedule.SetVA009_PaymentType(Util.GetValueOfString(dsPayMthd.Tables[0].Rows[j]["va009_paymenttype"])); schedule.SetVA009_PaymentTrigger(Util.GetValueOfString(dsPayMthd.Tables[0].Rows[j]["va009_paymenttrigger"])); schedule.SetVA009_ExecutionStatus("A"); } } schedule.SetProcessed(true); if (!schedule.Save(invoice.Get_TrxName())) { return(false); } } } #endregion if (invoice.GetC_PaymentTerm_ID() != GetC_PaymentTerm_ID()) { invoice.SetC_PaymentTerm_ID(GetC_PaymentTerm_ID()); } return(invoice.ValidatePaySchedule()); } else if (Util.GetValueOfInt(DB.ExecuteScalar("Select Count(*) From C_PaySchedule Where C_PaymentTerm_ID=" + invoice.GetC_PaymentTerm_ID())) <= 1) { schedule = new MInvoicePaySchedule(GetCtx(), 0, Get_TrxName()); schedule.SetAD_Client_ID(invoice.GetAD_Client_ID()); schedule.SetAD_Org_ID(invoice.GetAD_Org_ID()); schedule.SetC_Invoice_ID(invoice.GetC_Invoice_ID()); schedule.SetC_DocType_ID(invoice.GetC_DocType_ID()); schedule.SetC_PaymentTerm_ID(invoice.GetC_PaymentTerm_ID()); schedule.SetVA009_GrandTotal(invoice.GetGrandTotal()); schedule.SetVA009_PaymentMethod_ID(invoice.GetVA009_PaymentMethod_ID()); schedule.SetDueDate(GetDueDate(invoice)); schedule.SetDueAmt(invoice.GetGrandTotal()); schedule.SetDiscountDate(invoice.GetDateInvoiced().Value.AddDays(Util.GetValueOfInt(payterm.GetDiscountDays()))); schedule.SetDiscountAmt((Util.GetValueOfDecimal((invoice.GetGrandTotal() * payterm.GetDiscount()) / 100))); schedule.SetDiscountDays2(invoice.GetDateInvoiced().Value.AddDays(Util.GetValueOfInt(payterm.GetDiscountDays2()))); schedule.SetDiscount2((Util.GetValueOfDecimal((invoice.GetGrandTotal() * payterm.GetDiscount2()) / 100))); schedule.SetVA009_PlannedDueDate(GetDueDate(invoice)); _sql.Clear(); _sql.Append(@"SELECT UNIQUE asch.C_Currency_ID FROM c_acctschema asch INNER JOIN ad_clientinfo ci ON ci.c_acctschema1_id = asch.c_acctschema_id INNER JOIN ad_client c ON c.ad_client_id = ci.ad_client_id INNER JOIN c_invoice i ON c.ad_client_id = i.ad_client_id WHERE i.ad_client_id = " + invoice.GetAD_Client_ID()); BaseCurrency = Util.GetValueOfInt(DB.ExecuteScalar(_sql.ToString(), null, null)); if (BaseCurrency != invoice.GetC_Currency_ID()) { // change by amit _sql.Clear(); _sql.Append(@"SELECT multiplyrate FROM c_conversion_rate WHERE AD_Client_ID = " + GetCtx().GetAD_Client_ID() + " AND c_currency_id = " + invoice.GetC_Currency_ID() + " AND c_currency_to_id = " + BaseCurrency + " AND " + GlobalVariable.TO_DATE(invoice.GetDateAcct(), true) + " BETWEEN ValidFrom AND ValidTo"); decimal multiplyRate = Util.GetValueOfDecimal(DB.ExecuteScalar(_sql.ToString(), null, null)); if (multiplyRate == 0) { _sql.Clear(); _sql.Append(@"SELECT dividerate FROM c_conversion_rate WHERE AD_Client_ID = " + GetCtx().GetAD_Client_ID() + " AND c_currency_id = " + BaseCurrency + " AND c_currency_to_id = " + invoice.GetC_Currency_ID() + " AND " + GlobalVariable.TO_DATE(invoice.GetDateAcct(), true) + " BETWEEN ValidFrom AND ValidTo"); multiplyRate = Util.GetValueOfDecimal(DB.ExecuteScalar(_sql.ToString(), null, null)); } schedule.SetVA009_OpenAmnt(invoice.GetGrandTotal() * multiplyRate); } else { schedule.SetVA009_OpenAmnt(invoice.GetGrandTotal()); } schedule.SetC_Currency_ID(invoice.GetC_Currency_ID()); schedule.SetVA009_BseCurrncy(BaseCurrency); schedule.SetVA009_OpnAmntInvce(invoice.GetGrandTotal()); schedule.SetC_BPartner_ID(invoice.GetC_BPartner_ID()); MOrder _Order = new MOrder(GetCtx(), invoice.GetC_Order_ID(), Get_TrxName()); //schedule.SetVA009_PaymentMethod_ID(_Order.GetVA009_PaymentMethod_ID()); //schedule.SetC_PaymentTerm_ID(_Order.GetC_PaymentTerm_ID()); int _graceDay = payterm.GetGraceDays(); DateTime?_followUpDay = GetDueDate(invoice); schedule.SetVA009_FollowupDate(_followUpDay.Value.AddDays(_graceDay)); _sql.Clear(); _sql.Append("Select va009_paymentmode, va009_paymenttype, va009_paymenttrigger From va009_paymentmethod where va009_paymentmethod_ID=" + invoice.GetVA009_PaymentMethod_ID() + " AND IsActive = 'Y' AND AD_Client_ID = " + invoice.GetAD_Client_ID()); DataSet ds = new DataSet(); ds = DB.ExecuteDataset(_sql.ToString()); if (ds.Tables != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) { for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { schedule.SetVA009_PaymentMode(Util.GetValueOfString(ds.Tables[0].Rows[i]["va009_paymentmode"])); schedule.SetVA009_PaymentType(Util.GetValueOfString(ds.Tables[0].Rows[i]["va009_paymenttype"])); schedule.SetVA009_PaymentTrigger(Util.GetValueOfString(ds.Tables[0].Rows[i]["va009_paymenttrigger"])); schedule.SetVA009_ExecutionStatus("A"); } } if (!schedule.Save()) { return(false); } if (invoice.GetC_PaymentTerm_ID() != GetC_PaymentTerm_ID()) { invoice.SetC_PaymentTerm_ID(GetC_PaymentTerm_ID()); } return(invoice.ValidatePaySchedule()); } } return(true); }
/// <summary> /// Create actual Payment /// </summary> /// <param name="C_Invoice_ID">invoice</param> /// <param name="C_BPartner_ID">partner ignored when invoice exists</param> /// <param name="C_Currency_ID">currency</param> /// <param name="StmtAmt">statement amount</param> /// <param name="TrxAmt">transaction amt</param> /// <param name="C_BankAccount_ID">bank account</param> /// <param name="DateTrx">transaction date</param> /// <param name="DateAcct">accounting date</param> /// <param name="Description">description</param> /// <param name="AD_Org_ID"></param> /// <returns>payment</returns> private MPayment CreatePayment(int C_Invoice_ID, int C_BPartner_ID, int C_Currency_ID, Decimal stmtAmt, Decimal trxAmt, int C_BankAccount_ID, DateTime?dateTrx, DateTime?dateAcct, String description, int AD_Org_ID) { // Trx Amount = Payment overwrites Statement Amount if defined Decimal payAmt = trxAmt; if (Env.ZERO.CompareTo(payAmt) == 0) { payAmt = stmtAmt; } if (C_Invoice_ID == 0 && (Env.ZERO.CompareTo(payAmt) == 0)) { throw new Exception("@PayAmt@ = 0"); } //if (payAmt == null) //{ // payAmt = Env.ZERO; //} // MPayment payment = new MPayment(GetCtx(), 0, Get_Trx()); payment.SetAD_Org_ID(AD_Org_ID); payment.SetC_BankAccount_ID(C_BankAccount_ID); payment.SetTenderType(MPayment.TENDERTYPE_Check); if (dateTrx != null) { payment.SetDateTrx(dateTrx); } else if (dateAcct != null) { payment.SetDateTrx(dateAcct); } if (dateAcct != null) { payment.SetDateAcct(dateAcct); } else { payment.SetDateAcct(payment.GetDateTrx()); } payment.SetDescription(description); // if (C_Invoice_ID != 0) { MInvoice invoice = new MInvoice(GetCtx(), C_Invoice_ID, null); payment.SetC_DocType_ID(invoice.IsSOTrx()); // Receipt payment.SetC_Invoice_ID(invoice.GetC_Invoice_ID()); payment.SetC_BPartner_ID(invoice.GetC_BPartner_ID()); if (Env.Signum(payAmt) != 0) // explicit Amount { payment.SetC_Currency_ID(C_Currency_ID); if (invoice.IsSOTrx()) { payment.SetPayAmt(payAmt); } else // payment is likely to be negative { payment.SetPayAmt(Decimal.Negate(payAmt)); } payment.SetOverUnderAmt(Decimal.Subtract(invoice.GetGrandTotal(true), payment.GetPayAmt())); } else // set Pay Amout from Invoice { payment.SetC_Currency_ID(invoice.GetC_Currency_ID()); payment.SetPayAmt(invoice.GetGrandTotal(true)); } } else if (C_BPartner_ID != 0) { payment.SetC_BPartner_ID(C_BPartner_ID); payment.SetC_Currency_ID(C_Currency_ID); if (Env.Signum(payAmt) < 0) // Payment { payment.SetPayAmt(Math.Abs(payAmt)); payment.SetC_DocType_ID(false); } else // Receipt { payment.SetPayAmt(payAmt); payment.SetC_DocType_ID(true); } } else { return(null); } payment.Save(); // payment.ProcessIt(MPayment.DOCACTION_Complete); payment.Save(); return(payment); }
/** * Apply Payment Term with schedule to Invoice * @param invoice invoice * @return true if payment schedule is valid */ private bool ApplySchedule(MInvoice invoice) { DeleteInvoicePaySchedule(invoice.GetC_Invoice_ID(), invoice.Get_TrxName()); // Create Schedule MInvoicePaySchedule ips = null; Decimal remainder = invoice.GetGrandTotal(); for (int i = 0; i < _schedule.Length; i++) { ips = new MInvoicePaySchedule(invoice, _schedule[i]); //int _CountVA009 = Util.GetValueOfInt(DB.ExecuteScalar("SELECT COUNT(AD_MODULEINFO_ID) FROM AD_MODULEINFO WHERE PREFIX='VA009_' AND IsActive = 'Y'")); //if (_CountVA009 > 0) //{ // ips.SetVA009_ExecutionStatus("A"); // ips.SetC_DocType_ID(invoice.GetC_DocType_ID()); //} int _CountVA009 = Util.GetValueOfInt(DB.ExecuteScalar("SELECT COUNT(AD_MODULEINFO_ID) FROM AD_MODULEINFO WHERE PREFIX='VA009_' AND IsActive = 'Y'")); if (_CountVA009 > 0) { ips.SetVA009_ExecutionStatus("A"); ips.SetC_DocType_ID(invoice.GetC_DocType_ID()); MOrder _Order = new MOrder(GetCtx(), invoice.GetC_Order_ID(), Get_TrxName()); ips.SetVA009_PaymentMethod_ID(invoice.GetVA009_PaymentMethod_ID()); ips.SetC_PaymentTerm_ID(invoice.GetC_PaymentTerm_ID()); ips.SetVA009_GrandTotal(invoice.GetGrandTotal()); MPaymentTerm payterm = new MPaymentTerm(GetCtx(), invoice.GetC_PaymentTerm_ID(), Get_TrxName()); int _graceDay = payterm.GetGraceDays(); //DateTime? _followUpDay = GetDueDate(invoice); ips.SetVA009_FollowupDate(ips.GetDueDate().Value.AddDays(_graceDay)); //ips.SetVA009_PlannedDueDate(GetDueDate(invoice)); ips.SetVA009_PlannedDueDate(ips.GetDueDate()); //ips.SetDueDate(GetDueDate(invoice)); //change by amit 25-11-2015 StringBuilder _sql = new StringBuilder(); _sql.Clear(); _sql.Append(@"SELECT UNIQUE asch.C_Currency_ID FROM c_acctschema asch INNER JOIN ad_clientinfo ci ON ci.c_acctschema1_id = asch.c_acctschema_id INNER JOIN ad_client c ON c.ad_client_id = ci.ad_client_id INNER JOIN c_invoice i ON c.ad_client_id = i.ad_client_id WHERE i.ad_client_id = " + invoice.GetAD_Client_ID()); int BaseCurrency = Util.GetValueOfInt(DB.ExecuteScalar(_sql.ToString(), null, null)); if (BaseCurrency != invoice.GetC_Currency_ID()) { _sql.Clear(); _sql.Append(@"SELECT multiplyrate FROM c_conversion_rate WHERE AD_Client_ID = " + invoice.GetAD_Client_ID() + " AND c_currency_id = " + invoice.GetC_Currency_ID() + " AND c_currency_to_id = " + BaseCurrency + " AND " + GlobalVariable.TO_DATE(invoice.GetDateAcct(), true) + " BETWEEN ValidFrom AND ValidTo"); decimal multiplyRate = Util.GetValueOfDecimal(DB.ExecuteScalar(_sql.ToString(), null, null)); if (multiplyRate == 0) { _sql.Clear(); _sql.Append(@"SELECT dividerate FROM c_conversion_rate WHERE AD_Client_ID = " + invoice.GetAD_Client_ID() + " AND c_currency_id = " + BaseCurrency + " AND c_currency_to_id = " + invoice.GetC_Currency_ID() + " AND " + GlobalVariable.TO_DATE(invoice.GetDateAcct(), true) + " BETWEEN ValidFrom AND ValidTo"); multiplyRate = Util.GetValueOfDecimal(DB.ExecuteScalar(_sql.ToString(), null, null)); } ips.SetVA009_OpenAmnt(ips.GetDueAmt() * multiplyRate); } else { ips.SetVA009_OpenAmnt(ips.GetDueAmt()); } ips.SetC_Currency_ID(invoice.GetC_Currency_ID()); ips.SetVA009_BseCurrncy(BaseCurrency); ips.SetVA009_OpnAmntInvce(ips.GetDueAmt()); ips.SetC_BPartner_ID(invoice.GetC_BPartner_ID()); //end string sql = "Select va009_paymentmode, va009_paymenttype, va009_paymenttrigger From va009_paymentmethod where va009_paymentmethod_ID=" + invoice.GetVA009_PaymentMethod_ID() + " AND IsActive = 'Y' AND AD_Client_ID = " + invoice.GetAD_Client_ID(); DataSet ds = new DataSet(); ds = DB.ExecuteDataset(sql); if (ds.Tables != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) { for (int j = 0; j < ds.Tables[0].Rows.Count; j++) { ips.SetVA009_PaymentMode(Util.GetValueOfString(ds.Tables[0].Rows[j]["va009_paymentmode"])); ips.SetVA009_PaymentType(Util.GetValueOfString(ds.Tables[0].Rows[j]["va009_paymenttype"])); ips.SetVA009_PaymentTrigger(Util.GetValueOfString(ds.Tables[0].Rows[j]["va009_paymenttrigger"])); ips.SetVA009_ExecutionStatus("A"); } } } ips.Save(invoice.Get_TrxName()); log.Fine(ips.ToString()); remainder = Decimal.Subtract(remainder, ips.GetDueAmt()); } // for all schedules // Remainder - update last if (remainder.CompareTo(Env.ZERO) != 0 && ips != null) { ips.SetDueAmt(Decimal.Add(ips.GetDueAmt(), remainder)); ips.Save(invoice.Get_TrxName()); log.Fine("Remainder=" + remainder + " - " + ips); } // updateInvoice if (invoice.GetC_PaymentTerm_ID() != GetC_PaymentTerm_ID()) { invoice.SetC_PaymentTerm_ID(GetC_PaymentTerm_ID()); } return(invoice.ValidatePaySchedule()); }
/** * Apply Payment Term without schedule to Invoice * @param invoice invoice * @return false as no payment schedule */ private bool ApplyNoSchedule(MInvoice invoice) { DeleteInvoicePaySchedule(invoice.GetC_Invoice_ID(), invoice.Get_TrxName()); // updateInvoice if (invoice.GetC_PaymentTerm_ID() != GetC_PaymentTerm_ID()) { invoice.SetC_PaymentTerm_ID(GetC_PaymentTerm_ID()); } if (invoice.IsPayScheduleValid()) { invoice.SetIsPayScheduleValid(false); } //----------------Anuj------11/09/2015------------------------ int _CountVA009 = Util.GetValueOfInt(DB.ExecuteScalar("SELECT COUNT(AD_MODULEINFO_ID) FROM AD_MODULEINFO WHERE PREFIX='VA009_' AND IsActive = 'Y'")); if (_CountVA009 > 0) { StringBuilder _sql = new StringBuilder(); MInvoicePaySchedule schedule = new MInvoicePaySchedule(GetCtx(), 0, Get_TrxName()); MPaymentTerm payterm = new MPaymentTerm(GetCtx(), invoice.GetC_PaymentTerm_ID(), Get_TrxName()); schedule.SetAD_Client_ID(invoice.GetAD_Client_ID()); schedule.SetAD_Org_ID(invoice.GetAD_Org_ID()); schedule.SetC_Invoice_ID(invoice.GetC_Invoice_ID()); schedule.SetC_DocType_ID(invoice.GetC_DocType_ID()); schedule.SetC_PaymentTerm_ID(invoice.GetC_PaymentTerm_ID()); schedule.SetVA009_GrandTotal(invoice.GetGrandTotal()); schedule.SetVA009_PaymentMethod_ID(invoice.GetVA009_PaymentMethod_ID()); schedule.SetDueDate(GetDueDate(invoice)); schedule.SetDueAmt(invoice.GetGrandTotal()); schedule.SetDiscountDate(invoice.GetDateInvoiced().Value.AddDays(Util.GetValueOfInt(payterm.GetDiscountDays()))); schedule.SetDiscountAmt((Util.GetValueOfDecimal((invoice.GetGrandTotal() * payterm.GetDiscount()) / 100))); schedule.SetDiscountDays2(invoice.GetDateInvoiced().Value.AddDays(Util.GetValueOfInt(payterm.GetDiscountDays2()))); schedule.SetDiscount2((Util.GetValueOfDecimal((invoice.GetGrandTotal() * payterm.GetDiscount2()) / 100))); schedule.SetVA009_PlannedDueDate(GetDueDate(invoice)); _sql.Clear(); _sql.Append(@"SELECT UNIQUE asch.C_Currency_ID FROM c_acctschema asch INNER JOIN ad_clientinfo ci ON ci.c_acctschema1_id = asch.c_acctschema_id INNER JOIN ad_client c ON c.ad_client_id = ci.ad_client_id INNER JOIN c_invoice i ON c.ad_client_id = i.ad_client_id WHERE i.ad_client_id = " + invoice.GetAD_Client_ID()); int BaseCurrency = Util.GetValueOfInt(DB.ExecuteScalar(_sql.ToString(), null, null)); if (BaseCurrency != invoice.GetC_Currency_ID()) { // change by amit _sql.Clear(); _sql.Append(@"SELECT multiplyrate FROM c_conversion_rate WHERE AD_Client_ID = " + GetCtx().GetAD_Client_ID() + " AND c_currency_id = " + invoice.GetC_Currency_ID() + " AND c_currency_to_id = " + BaseCurrency + " AND " + GlobalVariable.TO_DATE(invoice.GetDateAcct(), true) + " BETWEEN ValidFrom AND ValidTo"); decimal multiplyRate = Util.GetValueOfDecimal(DB.ExecuteScalar(_sql.ToString(), null, null)); if (multiplyRate == 0) { _sql.Clear(); _sql.Append(@"SELECT dividerate FROM c_conversion_rate WHERE AD_Client_ID = " + GetCtx().GetAD_Client_ID() + " AND c_currency_id = " + BaseCurrency + " AND c_currency_to_id = " + invoice.GetC_Currency_ID() + " AND " + GlobalVariable.TO_DATE(invoice.GetDateAcct(), true) + " BETWEEN ValidFrom AND ValidTo"); multiplyRate = Util.GetValueOfDecimal(DB.ExecuteScalar(_sql.ToString(), null, null)); } schedule.SetVA009_OpenAmnt(invoice.GetGrandTotal() * multiplyRate); } else { schedule.SetVA009_OpenAmnt(invoice.GetGrandTotal()); } schedule.SetC_Currency_ID(invoice.GetC_Currency_ID()); schedule.SetVA009_BseCurrncy(BaseCurrency); schedule.SetVA009_OpnAmntInvce(invoice.GetGrandTotal()); schedule.SetC_BPartner_ID(invoice.GetC_BPartner_ID()); MOrder _Order = new MOrder(GetCtx(), invoice.GetC_Order_ID(), Get_TrxName()); //schedule.SetVA009_PaymentMethod_ID(_Order.GetVA009_PaymentMethod_ID()); //schedule.SetC_PaymentTerm_ID(_Order.GetC_PaymentTerm_ID()); int _graceDay = payterm.GetGraceDays(); DateTime?_followUpDay = GetDueDate(invoice); schedule.SetVA009_FollowupDate(_followUpDay.Value.AddDays(_graceDay)); _sql.Clear(); _sql.Append("Select va009_paymentmode, va009_paymenttype, va009_paymenttrigger From va009_paymentmethod where va009_paymentmethod_ID=" + invoice.GetVA009_PaymentMethod_ID() + " AND IsActive = 'Y' AND AD_Client_ID = " + invoice.GetAD_Client_ID()); DataSet ds = new DataSet(); ds = DB.ExecuteDataset(_sql.ToString()); if (ds.Tables != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) { for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { schedule.SetVA009_PaymentMode(Util.GetValueOfString(ds.Tables[0].Rows[i]["va009_paymentmode"])); schedule.SetVA009_PaymentType(Util.GetValueOfString(ds.Tables[0].Rows[i]["va009_paymenttype"])); schedule.SetVA009_PaymentTrigger(Util.GetValueOfString(ds.Tables[0].Rows[i]["va009_paymenttrigger"])); schedule.SetVA009_ExecutionStatus("A"); } } if (!schedule.Save()) { return(false); } return(true); } else { return(false); } }
/** * Parent Constructor * @param invoice invoice * @param paySchedule payment schedule */ public MInvoicePaySchedule(MInvoice invoice, MPaySchedule paySchedule) : base(invoice.GetCtx(), 0, invoice.Get_TrxName()) { _parent = invoice; SetClientOrg(invoice); SetC_Invoice_ID(invoice.GetC_Invoice_ID()); SetC_PaySchedule_ID(paySchedule.GetC_PaySchedule_ID()); // Amounts int scale = MCurrency.GetStdPrecision(GetCtx(), invoice.GetC_Currency_ID()); // distribute schedule based on GrandTotalAfterWithholding which is (GrandTotal – WithholdingAmount) Decimal due = (invoice.Get_ColumnIndex("GrandTotalAfterWithholding") > 0 && invoice.GetGrandTotalAfterWithholding() != 0 ? invoice.GetGrandTotalAfterWithholding() : invoice.GetGrandTotal()); if (due.CompareTo(Env.ZERO) == 0) { SetDueAmt(Env.ZERO); SetDiscountAmt(Env.ZERO); SetIsValid(false); } else { //due = due.multiply(paySchedule.getPercentage()).divide(HUNDRED, scale, Decimal.ROUND_HALF_UP); due = Decimal.Multiply(due, Decimal.Divide(paySchedule.GetPercentage(), Decimal.Round(HUNDRED, scale, MidpointRounding.AwayFromZero))); SetDueAmt(due); Decimal discount = Decimal.Multiply(due, Decimal.Divide(paySchedule.GetDiscount(), Decimal.Round(HUNDRED, scale, MidpointRounding.AwayFromZero))); SetDiscountAmt(discount); SetIsValid(true); } /** Adhoc Payment - Setting DueDate for an InvoicePaySchedule ** Dt: 18/01/2021 ** Modified By: Kumar **/ // Dates DateTime?dueDate = (invoice.Get_ColumnIndex("DueDate") >= 0 && invoice.GetDueDate() >= invoice.GetDateInvoiced()) ? invoice.GetDueDate() : TimeUtil.AddDays(invoice.GetDateInvoiced(), paySchedule.GetNetDays()); SetDueDate(dueDate); DateTime discountDate = TimeUtil.AddDays(invoice.GetDateInvoiced(), paySchedule.GetDiscountDays()); SetDiscountDate(discountDate); }