/// <summary> /// Get Commitment Release. /// Called from MatchInv for accrual and Allocation for Cash Based /// </summary> /// <param name="as1">accounting schema</param> /// <param name="doc">doc</param> /// <param name="Qty">qty invoiced/matched</param> /// <param name="C_InvoiceLine_ID">line</param> /// <param name="multiplier">1 for accrual</param> /// <returns>Fact</returns> public static Fact GetCommitmentRelease(MAcctSchema as1, Doc doc, Decimal Qty, int C_InvoiceLine_ID, Decimal multiplier) { Fact fact = new Fact(doc, as1, Fact.POST_Commitment); DocLine[] commitments = Doc_Order.GetCommitments(doc, Qty, C_InvoiceLine_ID); Decimal total = Env.ZERO; int C_Currency_ID = -1; for (int i = 0; i < commitments.Length; i++) { DocLine line = commitments[i]; if (C_Currency_ID == -1) { C_Currency_ID = line.GetC_Currency_ID(); } else if (C_Currency_ID != line.GetC_Currency_ID()) { doc._error = "Different Currencies of Order Lines"; _log.Log(Level.SEVERE, doc._error); return(null); } Decimal cost = Decimal.Multiply(line.GetAmtSource(), multiplier); total = Decimal.Add(total, cost); // Account MAccount expense = line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1); fact.CreateLine(line, expense, C_Currency_ID, null, cost); } // Offset MAccount offset = doc.GetAccount(ACCTTYPE_CommitmentOffset, as1); if (offset == null) { doc._error = "@NotFound@ @CommitmentOffset_Acct@"; _log.Log(Level.SEVERE, doc._error); return(null); } fact.CreateLine(null, offset, C_Currency_ID, total, null); return(fact); }
/// <summary> /// Get Commitments /// </summary> /// <param name="doc">document</param> /// <param name="maxQty">Qty invoiced/matched</param> /// <param name="C_InvoiceLine_ID">invoice line</param> /// <returns>commitments (order lines)</returns> protected static DocLine[] GetCommitments(Doc doc, Decimal maxQty, int C_InvoiceLine_ID) { int precision = -1; // List <DocLine> list = new List <DocLine>(); String sql = "SELECT * FROM C_OrderLine ol " + "WHERE EXISTS " + "(SELECT * FROM C_InvoiceLine il " + "WHERE il.C_OrderLine_ID=ol.C_OrderLine_ID" + " AND il.C_InvoiceLine_ID=" + C_InvoiceLine_ID + ")" + " OR EXISTS " + "(SELECT * FROM M_MatchPO po " + "WHERE po.C_OrderLine_ID=ol.C_OrderLine_ID" + " AND po.C_InvoiceLine_ID=" + C_InvoiceLine_ID + ")"; IDataReader idr = null; try { idr = DataBase.DB.ExecuteReader(sql, null, null); while (idr.Read()) { if (Env.Signum(maxQty) == 0) { continue; } MOrderLine line = new MOrderLine(doc.GetCtx(), idr, null); DocLine docLine = new DocLine(line, doc); // Currency if (precision == -1) { doc.SetC_Currency_ID(docLine.GetC_Currency_ID()); precision = MCurrency.GetStdPrecision(doc.GetCtx(), docLine.GetC_Currency_ID()); } // Qty Decimal Qty = Math.Max(line.GetQtyOrdered(), maxQty); docLine.SetQty(Qty, false); // Decimal PriceActual = line.GetPriceActual(); Decimal PriceCost = line.GetPriceCost(); Decimal?LineNetAmt = null; if (Env.Signum(PriceCost) != 0) { LineNetAmt = Decimal.Multiply(Qty, PriceCost); } else if (Qty.Equals(maxQty)) { LineNetAmt = line.GetLineNetAmt(); } else { LineNetAmt = Decimal.Multiply(Qty, PriceActual); } maxQty = Decimal.Subtract(maxQty, Qty); docLine.SetAmount(LineNetAmt); // DR Decimal PriceList = line.GetPriceList(); int C_Tax_ID = docLine.GetC_Tax_ID(); // Correct included Tax if (C_Tax_ID != 0 && line.GetParent().IsTaxIncluded()) { MTax tax = MTax.Get(doc.GetCtx(), C_Tax_ID); if (!tax.IsZeroTax()) { Decimal LineNetAmtTax = tax.CalculateTax(LineNetAmt.Value, true, precision); _log.Fine("LineNetAmt=" + LineNetAmt + " - Tax=" + LineNetAmtTax); LineNetAmt = Decimal.Subtract(LineNetAmt.Value, LineNetAmtTax); Decimal PriceListTax = tax.CalculateTax(PriceList, true, precision); PriceList = Decimal.Subtract(PriceList, PriceListTax); } } // correct included Tax docLine.SetAmount(LineNetAmt, PriceList, Qty); list.Add(docLine); } idr.Close(); } catch (Exception e) { if (idr != null) { idr.Close(); idr = null; } _log.Log(Level.SEVERE, sql, e); } // Return Array DocLine[] dl = new DocLine[list.Count]; dl = list.ToArray(); return(dl); }