/// <summary> /// Create Facts (the accounting logic) for /// PJI /// <pre> /// Issue /// ProjectWIP DR /// Inventory CR /// </pre> /// Project Account is either Asset or WIP depending on Project Type /// </summary> /// <param name="?"></param> /// <returns>fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); MProject project = new MProject(GetCtx(), _issue.GetC_Project_ID(), null); String ProjectCategory = project.GetProjectCategory(); MProduct product = MProduct.Get(GetCtx(), _issue.GetM_Product_ID()); // Line pointers FactLine dr = null; FactLine cr = null; // Issue Cost Decimal?cost = null; if (_issue.GetM_InOutLine_ID() != 0) { cost = GetPOCost(as1); } else if (_issue.GetS_TimeExpenseLine_ID() != 0) { cost = GetLaborCost(as1); } if (cost == null) // standard Product Costs { cost = _line.GetProductCosts(as1, GetAD_Org_ID(), false); } // Project DR int acctType = ACCTTYPE_ProjectWIP; if (MProject.PROJECTCATEGORY_AssetProject.Equals(ProjectCategory)) { acctType = ACCTTYPE_ProjectAsset; } dr = fact.CreateLine(_line, GetAccount(acctType, as1), as1.GetC_Currency_ID(), cost, null); dr.SetQty((Decimal?)Decimal.Negate(Utility.Util.GetValueOfDecimal(_line.GetQty()))); // Inventory CR acctType = ProductCost.ACCTTYPE_P_Asset; if (product.IsService()) { acctType = ProductCost.ACCTTYPE_P_Expense; } cr = fact.CreateLine(_line, _line.GetAccount(acctType, as1), as1.GetC_Currency_ID(), null, cost); cr.SetM_Locator_ID(_line.GetM_Locator_ID()); cr.SetLocationFromLocator(_line.GetM_Locator_ID(), true); // from Loc // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }
/// <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> /// Create Facts (the accounting logic) for POR. /// <pre> /// Reservation /// Expense CR /// Offset DR /// </pre> /// </summary> /// <param name="as1"></param> /// <returns>fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { List <Fact> facts = new List <Fact>(); Fact fact = new Fact(this, as1, Fact.POST_Reservation); SetC_Currency_ID(as1.GetC_Currency_ID()); // // Decimal grossAmt = GetAmount(Doc.AMTTYPE_Gross); // Commitment if (as1.IsCreateReservation()) { Decimal total = Env.ZERO; for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; Decimal cost = line.GetAmtSource(); total = Decimal.Add(total, cost); // Account MAccount expense = line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1); // fact.CreateLine(line, expense, as1.GetC_Currency_ID(), cost, null); } // Offset MAccount offset = GetAccount(ACCTTYPE_CommitmentOffset, as1); if (offset == null) { _error = "@NotFound@ @CommitmentOffset_Acct@"; log.Log(Level.SEVERE, _error); return(null); } fact.CreateLine(null, offset, GetC_Currency_ID(), null, total); facts.Add(fact); } return(facts); }
/// <summary> /// Create Facts (the accounting logic) for /// MMM. /// <pre> /// Movement /// Inventory DR CR /// InventoryTo DR CR /// </pre> /// </summary> /// <param name="as1"></param> /// <returns>Fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); // Line pointers FactLine dr = null; FactLine cr = null; for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; Decimal costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); // ** Inventory DR CR dr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), Decimal.Negate(costs)); // from (-) CR if (dr == null) { continue; } dr.SetM_Locator_ID(line.GetM_Locator_ID()); dr.SetQty(Decimal.Negate(line.GetQty().Value)); // outgoing // ** InventoryTo DR CR cr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), costs); // to (+) DR if (cr == null) { continue; } cr.SetM_Locator_ID(line.GetM_LocatorTo_ID()); cr.SetQty(line.GetQty()); // Only for between-org movements if (dr.GetAD_Org_ID() != cr.GetAD_Org_ID()) { String costingLevel = as1.GetCostingLevel(); MProductCategoryAcct pca = MProductCategoryAcct.Get(GetCtx(), line.GetProduct().GetM_Product_Category_ID(), as1.GetC_AcctSchema_ID(), GetTrx()); if (pca.GetCostingLevel() != null) { costingLevel = pca.GetCostingLevel(); } if (!MAcctSchema.COSTINGLEVEL_Organization.Equals(costingLevel)) { continue; } // String description = line.GetDescription(); if (description == null) { description = ""; } if (!IsPosted()) { // Cost Detail From MCostDetail.CreateMovement(as1, dr.GetAD_Org_ID(), // locator org line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, Decimal.Negate(costs), Decimal.Negate(line.GetQty().Value), true, description + "(|->)", GetTrx(), GetRectifyingProcess()); // Cost Detail To MCostDetail.CreateMovement(as1, cr.GetAD_Org_ID(), // locator org line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, costs, line.GetQty().Value, false, description + "(|<-)", GetTrx(), GetRectifyingProcess()); } } } // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }
/// <summary> /// Create Fact Cash Based (i.e. only revenue/expense) /// </summary> /// <param name="as1">accounting schema</param> /// <param name="fact">fact to add lines to</param> /// <param name="multiplier">source amount multiplier</param> /// <returns>accounted amount</returns> public Decimal CreateFactCash(MAcctSchema as1, Fact fact, Decimal multiplier) { bool creditMemo = GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_ARCREDITMEMO) || GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APCREDITMEMO); bool payables = GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APINVOICE) || GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APCREDITMEMO); Decimal acctAmt = Env.ZERO; FactLine fl = null; // Revenue/Cost for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; bool landedCost = false; if (payables) { landedCost = LandedCost(as1, fact, line, false); } if (landedCost && as1.IsExplicitCostAdjustment()) { fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), null, line.GetAmtSource()); // fl = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), line.GetAmtSource(), null); String desc = line.GetDescription(); if (desc == null) { desc = "100%"; } else { desc += " 100%"; } fl.SetDescription(desc); } if (!landedCost) { MAccount acct = line.GetAccount( payables ? ProductCost.ACCTTYPE_P_Expense : ProductCost.ACCTTYPE_P_Revenue, as1); if (payables) { // if Fixed Asset if (line.IsItem()) { acct = line.GetAccount(ProductCost.ACCTTYPE_P_InventoryClearing, as1); } } Decimal?amt = (Decimal?)Decimal.Multiply(line.GetAmtSource(), multiplier); Decimal?amt2 = null; if (creditMemo) { amt2 = amt; amt = null; } if (payables) // Vendor = DR { fl = fact.CreateLine(line, acct, GetC_Currency_ID(), amt, amt2); } else // Customer = CR { fl = fact.CreateLine(line, acct, GetC_Currency_ID(), amt2, amt); } if (fl != null) { acctAmt = Decimal.Add(acctAmt, fl.GetAcctBalance()); } } } // Tax for (int i = 0; i < _taxes.Length; i++) { Decimal?amt = (Decimal?)_taxes[i].GetAmount(); Decimal?amt2 = null; if (creditMemo) { amt2 = amt; amt = null; } FactLine tl = null; if (payables) { tl = fact.CreateLine(null, _taxes[i].GetAccount(_taxes[i].GetAPTaxType(), as1), GetC_Currency_ID(), amt, amt2); } else { tl = fact.CreateLine(null, _taxes[i].GetAccount(DocTax.ACCTTYPE_TaxDue, as1), GetC_Currency_ID(), amt2, amt); } if (tl != null) { tl.SetC_Tax_ID(_taxes[i].GetC_Tax_ID()); } } // Set Locations FactLine[] fLines = fact.GetLines(); for (int i = 0; i < fLines.Length; i++) { if (fLines[i] != null) { if (payables) { fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), false); // to Loc } else { fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), true); // from Loc fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc } } } return(acctAmt); }
/// <summary> /// Create Facts (the accounting logic) for /// ARI, ARC, ARF, API, APC. /// <pre> /// ARI, ARF /// Receivables DR /// Charge CR /// TaxDue CR ///Revenue CR /// ARC /// Receivables CR /// Charge DR /// TaxDue DR /// Revenue RR /// /// API /// Payables CR /// Charge DR /// TaxCredit DR /// Expense DR /// /// APC /// Payables DR /// Charge CR /// TaxCredit CR /// Expense CR /// </pre> /// </summary> /// <param name="as1">accounting schema</param> /// <returns> Fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // List <Fact> facts = new List <Fact>(); // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); // Cash based accounting if (!as1.IsAccrual()) { return(facts); } // ** ARI, ARF if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_ARINVOICE) || GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_ARPROFORMAINVOICE)) { Decimal grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; Decimal serviceAmt = Env.ZERO; // Header Charge CR Decimal amt = GetAmount(Doc.AMTTYPE_Charge).Value; if (Env.Signum(amt) != 0) { fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_Charge, as1), GetC_Currency_ID(), null, amt); } // TaxDue CR for (int i = 0; i < _taxes.Length; i++) { amt = _taxes[i].GetAmount(); if (Env.Signum(amt) != 0) { FactLine tl = fact.CreateLine(null, _taxes[i].GetAccount(DocTax.ACCTTYPE_TaxDue, as1), GetC_Currency_ID(), null, amt); if (tl != null) { tl.SetC_Tax_ID(_taxes[i].GetC_Tax_ID()); } } } // Revenue CR for (int i = 0; i < _lines.Length; i++) { amt = _lines[i].GetAmtSource(); Decimal?dAmt = null; if (as1.IsTradeDiscountPosted()) { Decimal discount = _lines[i].GetDiscount(); if (Env.Signum(discount) != 0) { amt = Decimal.Add(amt, discount); dAmt = discount; } } fact.CreateLine(_lines[i], _lines[i].GetAccount(ProductCost.ACCTTYPE_P_Revenue, as1), GetC_Currency_ID(), dAmt, amt); if (!_lines[i].IsItem()) { grossAmt = Decimal.Subtract(grossAmt, amt); serviceAmt = Decimal.Add(serviceAmt, amt); } } // Set Locations FactLine[] fLines = fact.GetLines(); for (int i = 0; i < fLines.Length; i++) { if (fLines[i] != null) { fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), true); // from Loc fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc } } // Receivables DR int receivables_ID = GetValidCombination_ID(Doc.ACCTTYPE_C_Receivable, as1); int receivablesServices_ID = GetValidCombination_ID(Doc.ACCTTYPE_C_Receivable_Services, as1); if (_allLinesItem || !as1.IsPostServices() || receivables_ID == receivablesServices_ID) { grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; serviceAmt = Env.ZERO; } else if (_allLinesService) { serviceAmt = GetAmount(Doc.AMTTYPE_Gross).Value; grossAmt = Env.ZERO; } if (Env.Signum(grossAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), receivables_ID), GetC_Currency_ID(), grossAmt, null); } if (Env.Signum(serviceAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), receivablesServices_ID), GetC_Currency_ID(), serviceAmt, null); } } // ARC else if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_ARCREDITMEMO)) { Decimal grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; Decimal serviceAmt = Env.ZERO; // Header Charge DR Decimal amt = GetAmount(Doc.AMTTYPE_Charge).Value; if (Env.Signum(amt) != 0) { fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_Charge, as1), GetC_Currency_ID(), amt, null); } // TaxDue DR for (int i = 0; i < _taxes.Length; i++) { amt = _taxes[i].GetAmount(); if (Env.Signum(amt) != 0) { FactLine tl = fact.CreateLine(null, _taxes[i].GetAccount(DocTax.ACCTTYPE_TaxDue, as1), GetC_Currency_ID(), amt, null); if (tl != null) { tl.SetC_Tax_ID(_taxes[i].GetC_Tax_ID()); } } } // Revenue CR for (int i = 0; i < _lines.Length; i++) { amt = _lines[i].GetAmtSource(); Decimal?dAmt = null; if (as1.IsTradeDiscountPosted()) { Decimal discount = _lines[i].GetDiscount(); if (Env.Signum(discount) != 0) { amt = Decimal.Add(amt, discount); dAmt = discount; } } fact.CreateLine(_lines[i], _lines[i].GetAccount(ProductCost.ACCTTYPE_P_Revenue, as1), GetC_Currency_ID(), amt, dAmt); if (!_lines[i].IsItem()) { grossAmt = Decimal.Subtract(grossAmt, amt); serviceAmt = Decimal.Add(serviceAmt, amt); } } // Set Locations FactLine[] fLines = fact.GetLines(); for (int i = 0; i < fLines.Length; i++) { if (fLines[i] != null) { fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), true); // from Loc fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc } } // Receivables CR int receivables_ID = GetValidCombination_ID(Doc.ACCTTYPE_C_Receivable, as1); int receivablesServices_ID = GetValidCombination_ID(Doc.ACCTTYPE_C_Receivable_Services, as1); if (_allLinesItem || !as1.IsPostServices() || receivables_ID == receivablesServices_ID) { grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; serviceAmt = Env.ZERO; } else if (_allLinesService) { serviceAmt = GetAmount(Doc.AMTTYPE_Gross).Value; grossAmt = Env.ZERO; } if (Env.Signum(grossAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), receivables_ID), GetC_Currency_ID(), null, grossAmt); } if (Env.Signum(serviceAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), receivablesServices_ID), GetC_Currency_ID(), null, serviceAmt); } } // ** API else if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APINVOICE)) { Decimal grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; Decimal serviceAmt = Env.ZERO; // Charge DR fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_Charge, as1), GetC_Currency_ID(), GetAmount(Doc.AMTTYPE_Charge), null); // TaxCredit DR for (int i = 0; i < _taxes.Length; i++) { FactLine tl = fact.CreateLine(null, _taxes[i].GetAccount(_taxes[i].GetAPTaxType(), as1), GetC_Currency_ID(), _taxes[i].GetAmount(), null); if (tl != null) { tl.SetC_Tax_ID(_taxes[i].GetC_Tax_ID()); } } // Expense DR for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; bool landedCost = LandedCost(as1, fact, line, true); if (landedCost && as1.IsExplicitCostAdjustment()) { fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), line.GetAmtSource(), null); // FactLine fl = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), null, line.GetAmtSource()); String desc = line.GetDescription(); if (desc == null) { desc = "100%"; } else { desc += " 100%"; } fl.SetDescription(desc); } if (!landedCost) { MAccount expense = line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1); if (line.IsItem()) { expense = line.GetAccount(ProductCost.ACCTTYPE_P_InventoryClearing, as1); } Decimal amt = line.GetAmtSource(); Decimal?dAmt = null; if (as1.IsTradeDiscountPosted() && !line.IsItem()) { Decimal discount = line.GetDiscount(); if (Env.Signum(discount) != 0) { amt = Decimal.Add(amt, discount); dAmt = discount; } } fact.CreateLine(line, expense, GetC_Currency_ID(), amt, dAmt); if (!line.IsItem()) { grossAmt = Decimal.Subtract(grossAmt, amt); serviceAmt = Decimal.Add(serviceAmt, amt); } // if (line.GetM_Product_ID() != 0 && line.GetProduct().IsService()) // otherwise Inv Matching { if (!IsPosted()) { MCostDetail.CreateInvoice(as1, line.GetAD_Org_ID(), line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, // No Cost Element line.GetAmtSource(), line.GetQty().Value, line.GetDescription(), GetTrx(), GetRectifyingProcess()); } } } } // Set Locations FactLine[] fLines = fact.GetLines(); for (int i = 0; i < fLines.Length; i++) { if (fLines[i] != null) { fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), false); // to Loc } } // Liability CR int payables_ID = GetValidCombination_ID(Doc.ACCTTYPE_V_Liability, as1); int payablesServices_ID = GetValidCombination_ID(Doc.ACCTTYPE_V_Liability_Services, as1); if (_allLinesItem || !as1.IsPostServices() || payables_ID == payablesServices_ID) { grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; serviceAmt = Env.ZERO; } else if (_allLinesService) { serviceAmt = GetAmount(Doc.AMTTYPE_Gross).Value; grossAmt = Env.ZERO; } if (Env.Signum(grossAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), payables_ID), GetC_Currency_ID(), null, grossAmt); } if (Env.Signum(serviceAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), payablesServices_ID), GetC_Currency_ID(), null, serviceAmt); } // UpdateProductPO(as1); // Only API } // APC else if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_APCREDITMEMO)) { Decimal grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; Decimal serviceAmt = Env.ZERO; // Charge CR fact.CreateLine(null, GetAccount(Doc.ACCTTYPE_Charge, as1), GetC_Currency_ID(), null, GetAmount(Doc.AMTTYPE_Charge)); // TaxCredit CR for (int i = 0; i < _taxes.Length; i++) { FactLine tl = fact.CreateLine(null, _taxes[i].GetAccount(_taxes[i].GetAPTaxType(), as1), GetC_Currency_ID(), null, _taxes[i].GetAmount()); if (tl != null) { tl.SetC_Tax_ID(_taxes[i].GetC_Tax_ID()); } } // Expense CR for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; bool landedCost = LandedCost(as1, fact, line, false); if (landedCost && as1.IsExplicitCostAdjustment()) { fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), null, line.GetAmtSource()); // FactLine fl = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1), GetC_Currency_ID(), line.GetAmtSource(), null); String desc = line.GetDescription(); if (desc == null) { desc = "100%"; } else { desc += " 100%"; } fl.SetDescription(desc); } if (!landedCost) { MAccount expense = line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1); if (line.IsItem()) { expense = line.GetAccount(ProductCost.ACCTTYPE_P_InventoryClearing, as1); } Decimal amt = line.GetAmtSource(); Decimal?dAmt = null; if (as1.IsTradeDiscountPosted() && !line.IsItem()) { Decimal discount = line.GetDiscount(); if (Env.Signum(discount) != 0) { amt = Decimal.Add(amt, discount); dAmt = discount; } } fact.CreateLine(line, expense, GetC_Currency_ID(), dAmt, amt); if (!line.IsItem()) { grossAmt = Decimal.Subtract(grossAmt, amt); serviceAmt = Decimal.Add(serviceAmt, amt); } // if (line.GetM_Product_ID() != 0 && line.GetProduct().IsService()) // otherwise Inv Matching { if (!IsPosted()) { MCostDetail.CreateInvoice(as1, line.GetAD_Org_ID(), line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, // No Cost Element Decimal.Negate(line.GetAmtSource()), line.GetQty().Value, line.GetDescription(), GetTrx(), GetRectifyingProcess()); } } } } // Set Locations FactLine[] fLines = fact.GetLines(); for (int i = 0; i < fLines.Length; i++) { if (fLines[i] != null) { fLines[i].SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc fLines[i].SetLocationFromOrg(fLines[i].GetAD_Org_ID(), false); // to Loc } } // Liability DR int payables_ID = GetValidCombination_ID(Doc.ACCTTYPE_V_Liability, as1); int payablesServices_ID = GetValidCombination_ID(Doc.ACCTTYPE_V_Liability_Services, as1); if (_allLinesItem || !as1.IsPostServices() || payables_ID == payablesServices_ID) { grossAmt = GetAmount(Doc.AMTTYPE_Gross).Value; serviceAmt = Env.ZERO; } else if (_allLinesService) { serviceAmt = GetAmount(Doc.AMTTYPE_Gross).Value; grossAmt = Env.ZERO; } if (Env.Signum(grossAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), payables_ID), GetC_Currency_ID(), grossAmt, null); } if (Env.Signum(serviceAmt) != 0) { fact.CreateLine(null, MAccount.Get(GetCtx(), payablesServices_ID), GetC_Currency_ID(), serviceAmt, null); } } else { _error = "DocumentType unknown: " + GetDocumentType(); log.Log(Level.SEVERE, _error); fact = null; } // facts.Add(fact); return(facts); }
public override List <Fact> CreateFacts(MAcctSchema as1) { List <Fact> facts = new List <Fact>(); MProductCategoryAcct pca = null; String costingMethodOfSchema = as1.GetCostingMethod(); String costingLevelOfSchema = as1.GetCostingLevel(); // Get the costing method and the costing level of the product Category for the current accounting schema. if (mpc != null) { pca = MProductCategoryAcct.Get(GetCtx(), mpc.GetM_Product_Category_ID(), as1.GetC_AcctSchema_ID(), null); if (pca.GetCostingMethod() != null) { costingMethod = pca.GetCostingMethod(); } else { costingMethod = costingMethodOfSchema; } if (pca.GetCostingLevel() != null) { costingLevel = pca.GetCostingLevel(); } else { costingLevel = costingLevelOfSchema; } // proceed only if the costing method is standard if (!costingMethod.Equals(X_C_AcctSchema.COSTINGMETHOD_StandardCosting)) { return(facts); } } Fact fact = new Fact(this, as1, Fact.POST_Actual); FactLine dr = null; FactLine cr = null; for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; if (mpc == null) { pca = MProductCategoryAcct.Get(GetCtx(), MProduct.Get(GetCtx(), line.GetM_Product_ID()). GetM_Product_Category_ID(), as1.GetC_AcctSchema_ID(), null); if (pca.GetCostingMethod() != null) { costingMethod = pca.GetCostingMethod(); } else { costingMethod = costingMethodOfSchema; } if (pca.GetCostingLevel() != null) { costingLevel = pca.GetCostingLevel(); } else { costingLevel = costingLevelOfSchema; } // proceed only if the costing method is standard if (!costingMethod.Equals(X_C_AcctSchema.COSTINGMETHOD_StandardCosting)) { return(facts); } } Decimal currentCost = Env.ZERO; Decimal oldCost = Env.ZERO; Decimal Qty = Env.ZERO; String sql = " SELECT Sum(CurrentCostPrice), Sum(LastCostPrice), Sum(CurrentQty)" + " FROM M_Cost WHERE M_Product_ID = " + line.GetM_Product_ID() + " AND C_AcctSchema_ID = " + as1.GetC_AcctSchema_ID() + " AND M_CostElement_ID = " + m_ce.GetM_CostElement_ID() + " AND M_CostType_ID = " + as1.GetM_CostType_ID() + " AND AD_Client_ID = " + GetAD_Client_ID(); if (costingLevel.Equals(X_C_AcctSchema.COSTINGLEVEL_Client)) { sql += " AND AD_Org_ID = 0" + " AND M_AttributeSetInstance_ID = 0"; } else if (costingLevel.Equals(X_C_AcctSchema.COSTINGLEVEL_Organization)) { sql += " AND M_AttributeSetInstance_ID = 0"; } else if (costingLevel.Equals(X_C_AcctSchema.COSTINGLEVEL_BatchLot)) { sql += " AND AD_Org_ID = 0"; } IDataReader idr = null; try { idr = DB.ExecuteReader(sql, null, GetTrx()); while (idr.Read()) { currentCost = Util.GetValueOfDecimal(idr[0]); oldCost = Util.GetValueOfDecimal(idr[1]); Qty = Util.GetValueOfDecimal(idr[2]); line.SetQty(Qty, costupdate.IsSOTrx()); Decimal PriceCost = Decimal.Subtract(currentCost, oldCost); Decimal amt = Env.ZERO; if (Env.Signum(PriceCost) != 0) { amt = Decimal.Multiply(Qty, PriceCost); } line.SetAmount(amt); if (Env.Signum(amt) == 0) { continue; } MAccount db_acct, cr_acct; /* Decide the Credit and Debit Accounts */ if (Env.Signum(amt) == 1) { db_acct = line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1); cr_acct = line.GetAccount(ProductCost.ACCTTYPE_P_CostAdjustment, as1); } else { cr_acct = line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1); db_acct = line.GetAccount(ProductCost.ACCTTYPE_P_CostAdjustment, as1); } /* Create Credit and Debit lines*/ dr = fact.CreateLine(line, db_acct, as1.GetC_Currency_ID(), Math.Abs(amt), null); if (dr == null) { log.SaveError("NoProductCosts", "No Product Costs"); return(null); } cr = fact.CreateLine(line, cr_acct, as1.GetC_Currency_ID(), null, Math.Abs(amt)); if (cr == null) { log.SaveError("NoProductCosts", "No Product Costs"); return(null); } } idr.Close(); } catch (Exception e) { log.Log(Level.SEVERE, sql, e); } finally { if (idr != null) { idr.Close(); idr = null; } } } facts.Add(fact); return(facts); }
/// <summary> /// Create Facts (the accounting logic) for /// MMS, MMR. /// <pre> /// Shipment /// CoGS (RevOrg) DR /// Inventory CR /// Shipment of Project Issue /// CoGS DR /// Project CR /// Receipt /// Inventory DR /// NotInvoicedReceipt CR /// </pre> /// </summary> /// <param name="as1">accounting schema</param> /// <returns>Fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); // Line pointers FactLine dr = null; FactLine cr = null; // *** Sales - Shipment if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_MATERIALDELIVERY)) { for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; MInOutLine sLine = new MInOutLine(GetCtx(), line.Get_ID(), null); Decimal costs = 0; if (sLine.GetA_Asset_ID() > 0) { costs = Util.GetValueOfDecimal(DB.ExecuteScalar(@"SELECT cost.CUrrentcostPrice FROM m_cost cost INNER JOIN A_Asset ass ON(ass.a_asset_ID=cost.a_asset_ID) INNER JOIN M_InOutLine IOL ON(IOL.A_Asset_ID =ass.A_Asset_ID) WHERE IOL.M_InOutLine_ID=" + sLine.GetM_InOutLine_ID() + @" ORDER By cost.created desc")); // Change if Cost not found against Asset then get Product Cost if (Env.Signum(costs) == 0) // zero costs OK { costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), true); } } else { costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), true); } if (Env.Signum(costs) == 0) // zero costs OK { MProduct product = line.GetProduct(); if (product.IsStocked()) { _error = "No Costs for " + line.GetProduct().GetName(); log.Log(Level.WARNING, _error); return(null); } else // ignore service { continue; } } if (!IsReturnTrx()) { // CoGS DR dr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Cogs, as1), as1.GetC_Currency_ID(), costs, null); if (dr == null) { _error = "FactLine DR not created: " + line; log.Log(Level.WARNING, _error); return(null); } dr.SetM_Locator_ID(line.GetM_Locator_ID()); dr.SetLocationFromLocator(line.GetM_Locator_ID(), true); // from Loc dr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc dr.SetAD_Org_ID(line.GetOrder_Org_ID()); // Revenue X-Org dr.SetQty(Decimal.Negate(line.GetQty().Value)); // Inventory CR cr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), null, costs); if (cr == null) { _error = "FactLine CR not created: " + line; log.Log(Level.WARNING, _error); return(null); } cr.SetM_Locator_ID(line.GetM_Locator_ID()); cr.SetLocationFromLocator(line.GetM_Locator_ID(), true); // from Loc cr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc } else // Reverse accounting entries for returns { // CoGS CR cr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Cogs, as1), as1.GetC_Currency_ID(), null, costs); if (cr == null) { _error = "FactLine CR not created: " + line; log.Log(Level.WARNING, _error); return(null); } cr.SetM_Locator_ID(line.GetM_Locator_ID()); cr.SetLocationFromLocator(line.GetM_Locator_ID(), true); // from Loc cr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc cr.SetAD_Org_ID(line.GetOrder_Org_ID()); // Revenue X-Org cr.SetQty(Decimal.Negate(line.GetQty().Value)); // Inventory DR dr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), costs, null); if (dr == null) { _error = "FactLine DR not created: " + line; log.Log(Level.WARNING, _error); return(null); } dr.SetM_Locator_ID(line.GetM_Locator_ID()); dr.SetLocationFromLocator(line.GetM_Locator_ID(), true); // from Loc dr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), false); // to Loc } // if (line.GetM_Product_ID() != 0) { if (!IsPosted()) { MCostDetail.CreateShipment(as1, line.GetAD_Org_ID(), line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, costs, IsReturnTrx() ? Decimal.Negate(line.GetQty().Value) : line.GetQty().Value, line.GetDescription(), true, GetTrx(), GetRectifyingProcess()); } } } // for all lines if (!IsPosted()) { UpdateProductInfo(as1.GetC_AcctSchema_ID()); // only for SO! } } // Shipment // *** Purchasing - Receipt else if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_MATERIALRECEIPT)) { for (int i = 0; i < _lines.Length; i++) { Decimal costs = 0; DocLine line = _lines[i]; MProduct product = line.GetProduct(); /***********************************************************/ //05,Sep,2011 //Special Check to restic Price varience posting in case of //AvarageInvoice Selected on product Category.Then Neglact the AverageInvoice Cost MProductCategoryAcct pca = MProductCategoryAcct.Get(product.GetCtx(), product.GetM_Product_Category_ID(), as1.GetC_AcctSchema_ID(), null); try { if (as1.IsNotPostPOVariance() && line.GetC_OrderLine_ID() > 0) { MOrderLine oLine = new MOrderLine(product.GetCtx(), line.GetC_OrderLine_ID(), null); MOrder order = new MOrder(product.GetCtx(), oLine.GetC_Order_ID(), null); Decimal convertedCost = MConversionRate.Convert(product.GetCtx(), oLine.GetPriceEntered(), order.GetC_Currency_ID(), as1.GetC_Currency_ID(), line.GetDateAcct(), order.GetC_ConversionType_ID(), oLine.GetAD_Client_ID(), line.GetAD_Org_ID()); costs = Decimal.Multiply(convertedCost, oLine.GetQtyEntered()); } else { costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); // non-zero costs } } catch (Exception ex) { log.SaveError("AccountSchemaColumnError", ex); costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); // non-zero costs } /***********************************************************/ //Decimal costs = costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); // non-zero costs if (Env.Signum(costs) == 0) { _error = "Resubmit - No Costs for " + product.GetName(); log.Log(Level.WARNING, _error); return(null); } // Inventory/Asset DR MAccount assets = line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1); if (product.IsService()) { assets = line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1); } if (!IsReturnTrx()) { // Inventory/Asset DR dr = fact.CreateLine(line, assets, as1.GetC_Currency_ID(), costs, null); if (dr == null) { _error = "DR not created: " + line; log.Log(Level.WARNING, _error); return(null); } dr.SetM_Locator_ID(line.GetM_Locator_ID()); dr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc dr.SetLocationFromLocator(line.GetM_Locator_ID(), false); // to Loc // NotInvoicedReceipt CR cr = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_NotInvoicedReceipts, as1), as1.GetC_Currency_ID(), null, costs); if (cr == null) { _error = "CR not created: " + line; log.Log(Level.WARNING, _error); return(null); } cr.SetM_Locator_ID(line.GetM_Locator_ID()); cr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc cr.SetLocationFromLocator(line.GetM_Locator_ID(), false); // to Loc cr.SetQty(Decimal.Negate(line.GetQty().Value)); } else // reverse accounting entries for returns { // Inventory/Asset CR cr = fact.CreateLine(line, assets, as1.GetC_Currency_ID(), null, costs); if (cr == null) { _error = "CR not created: " + line; log.Log(Level.WARNING, _error); return(null); } cr.SetM_Locator_ID(line.GetM_Locator_ID()); cr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc cr.SetLocationFromLocator(line.GetM_Locator_ID(), false); // to Loc // NotInvoicedReceipt DR dr = fact.CreateLine(line, GetAccount(Doc.ACCTTYPE_NotInvoicedReceipts, as1), as1.GetC_Currency_ID(), costs, null); if (dr == null) { _error = "DR not created: " + line; log.Log(Level.WARNING, _error); return(null); } dr.SetM_Locator_ID(line.GetM_Locator_ID()); dr.SetLocationFromBPartner(GetC_BPartner_Location_ID(), true); // from Loc dr.SetLocationFromLocator(line.GetM_Locator_ID(), false); // to Loc dr.SetQty(Decimal.Negate(line.GetQty().Value)); } } } // Receipt else { _error = "DocumentType unknown: " + GetDocumentType(); log.Log(Level.SEVERE, _error); return(null); } // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }
/// <summary> /// Create Facts (the accounting logic) for /// MMP. /// <pre> /// Production /// Inventory DR CR /// </pre> /// </summary> /// <param name="as1"></param> /// <returns>fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); // Line pointer FactLine fl = null; for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; // Calculate Costs Decimal?costs = null; if (line.IsProductionBOM()) { // Get BOM Cost - Sum of individual lines Decimal bomCost = Env.ZERO; for (int ii = 0; ii < _lines.Length; ii++) { DocLine line0 = _lines[ii]; if (line0.GetM_ProductionPlan_ID() != line.GetM_ProductionPlan_ID()) { continue; } if (!line0.IsProductionBOM()) { bomCost = Decimal.Add(bomCost, line0.GetProductCosts(as1, line.GetAD_Org_ID(), false)); } } costs = Decimal.Negate(bomCost); } else { costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); } // Inventory DR CR fl = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), costs); if (fl == null) { _error = "No Costs for Line " + line.GetLine() + " - " + line; return(null); } fl.SetM_Locator_ID(line.GetM_Locator_ID()); fl.SetQty(line.GetQty()); // Cost Detail String description = line.GetDescription(); if (description == null) { description = ""; } if (line.IsProductionBOM()) { description += "(*)"; } if (!IsPosted()) { MCostDetail.CreateProduction(as1, line.GetAD_Org_ID(), line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, Utility.Util.GetValueOfInt(costs), line.GetQty().Value, description, GetTrx(), GetRectifyingProcess()); } } // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }
/// <summary> /// Create Facts (the accounting logic) for /// SOO, POO. /// <pre> /// Reservation (release) /// Expense DR /// Offset CR /// Commitment /// (to be released by Invoice Matching) /// Expense CR /// Offset DR /// </pre> /// </summary> /// <param name="as1">accounting schema</param> /// <returns>Fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { List <Fact> facts = new List <Fact>(); // Purchase Order if (GetDocumentType().Equals(MDocBaseType.DOCBASETYPE_PURCHASEORDER)) { UpdateProductPO(as1); // Decimal grossAmt = getAmount(Doc.AMTTYPE_Gross); // Commitment if (as1.IsCreateCommitment()) { Fact fact = new Fact(this, as1, Fact.POST_Commitment); Decimal total = Env.ZERO; for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; Decimal cost = line.GetAmtSource(); total = Decimal.Add(total, cost); // Account MAccount expense = line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1); fact.CreateLine(line, expense, GetC_Currency_ID(), cost, null); } // Offset MAccount offset = GetAccount(ACCTTYPE_CommitmentOffset, as1); if (offset == null) { _error = "@NotFound@ @CommitmentOffset_Acct@"; log.Log(Level.SEVERE, _error); return(null); } fact.CreateLine(null, offset, GetC_Currency_ID(), null, total); // facts.Add(fact); } // Reverse Reservation if (as1.IsCreateReservation()) { Fact fact = new Fact(this, as1, Fact.POST_Reservation); Decimal total = Env.ZERO; if (_requisitions == null) { _requisitions = LoadRequisitions(); } for (int i = 0; i < _requisitions.Length; i++) { DocLine line = _requisitions[i]; Decimal cost = line.GetAmtSource(); total = Decimal.Add(total, cost); // Account MAccount expense = line.GetAccount(ProductCost.ACCTTYPE_P_Expense, as1); fact.CreateLine(line, expense, GetC_Currency_ID(), null, cost); } // Offset MAccount offset = GetAccount(ACCTTYPE_CommitmentOffset, as1); if (offset == null) { _error = "@NotFound@ @CommitmentOffset_Acct@"; log.Log(Level.SEVERE, _error); return(null); } fact.CreateLine(null, offset, GetC_Currency_ID(), total, null); // facts.Add(fact); } // reservations } // SO return(facts); }
/// <summary> /// Create Facts (the accounting logic) for /// MMI. /// <pre> /// Inventory /// Inventory DR CR /// InventoryDiff DR CR (or Charge) /// </pre> /// </summary> /// <param name="?"></param> /// <returns> Fact</returns> public override List <Fact> CreateFacts(MAcctSchema as1) { // create Fact Header Fact fact = new Fact(this, as1, Fact.POST_Actual); SetC_Currency_ID(as1.GetC_Currency_ID()); // Line pointers FactLine dr = null; FactLine cr = null; for (int i = 0; i < _lines.Length; i++) { DocLine line = _lines[i]; Decimal costs = line.GetProductCosts(as1, line.GetAD_Org_ID(), false); if (Env.Signum(costs) == 0) { _error = "No Costs for " + line.GetProduct().GetName(); return(null); } // Inventory DR CR dr = fact.CreateLine(line, line.GetAccount(ProductCost.ACCTTYPE_P_Asset, as1), as1.GetC_Currency_ID(), costs); // may be zero difference - no line created. if (dr == null) { continue; } dr.SetM_Locator_ID(line.GetM_Locator_ID()); // InventoryDiff DR CR // or Charge MAccount invDiff = line.GetChargeAccount(as1, Decimal.Negate(costs)); if (invDiff == null) { invDiff = GetAccount(Doc.ACCTTYPE_InvDifferences, as1); } cr = fact.CreateLine(line, invDiff, as1.GetC_Currency_ID(), Decimal.Negate(costs)); if (cr == null) { continue; } cr.SetM_Locator_ID(line.GetM_Locator_ID()); cr.SetQty(Decimal.Negate(line.GetQty().Value)); if (line.GetC_Charge_ID() != 0) // explicit overwrite for charge { cr.SetAD_Org_ID(line.GetAD_Org_ID()); } if (!IsPosted()) { // Cost Detail MCostDetail.CreateInventory(as1, line.GetAD_Org_ID(), line.GetM_Product_ID(), line.GetM_AttributeSetInstance_ID(), line.Get_ID(), 0, costs, line.GetQty().Value, line.GetDescription(), GetTrx(), GetRectifyingProcess()); } } // List <Fact> facts = new List <Fact>(); facts.Add(fact); return(facts); }