package org.compiere.acct; import java.math.BigDecimal; import java.sql.ResultSet; import java.util.ArrayList; import org.compiere.model.I_C_Project; import org.compiere.model.I_C_Project_Acct; import org.compiere.model.MAccount; import org.compiere.model.MAcctSchema; import org.compiere.model.MAssetAcct; import org.compiere.model.MAssetAddition; import org.compiere.model.MCharge; import org.compiere.model.MDocType; import org.compiere.model.MProject; import org.compiere.model.ProductCost; import org.compiere.model.X_C_Project_Acct; import org.compiere.util.DB; import org.compiere.util.Env; /** * Posting for {@link MAssetAddition} document. DOCBASETYPE_GLDocument. * @author Teo_Sarca, SC ARHIPAC SERVICE SRL */ public class Doc_AssetAddition extends Doc { /** * @param as * @param rs * @param trxName */ public Doc_AssetAddition (MAcctSchema as, ResultSet rs, String trxName) { super(as, MAssetAddition.class, rs, MDocType.DOCBASETYPE_GLDocument, trxName); } @Override protected String loadDocumentDetails() { return null; } @Override public BigDecimal getBalance() { return Env.ZERO; } /** * Produce posting: *
	 *	20.., 21..[A_Asset_Acct]			=	23..[P_Asset_Acct/Project Acct]
	 * 
* @param as * @return facts */ @Override public ArrayList createFacts(MAcctSchema as) { MAssetAddition assetAdd = getAssetAddition(); ArrayList facts = new ArrayList(); Fact fact = new Fact(this, as, assetAdd.getPostingType()); facts.add(fact); // if (MAssetAddition.A_SOURCETYPE_Imported.equals(assetAdd.getA_SourceType()) || MAssetAddition.A_CAPVSEXP_Expense.equals(assetAdd.getA_CapvsExp())) //@win prevent create journal if expense addition { // no accounting if is imported record return facts; } // BigDecimal assetValueAmt = assetAdd.getAssetSourceAmt(); FactLine[] fls = FactUtil.createSimpleOperation(fact, null, getA_Asset_Acct(as), getP_Asset_Acct(as), getC_Currency_ID(), assetValueAmt, false); // Set BPartner and C_Project dimension for "Imobilizari in curs / Property Being" final int invoiceBP_ID = getInvoicePartner_ID(); final int invoiceProject_ID = getInvoiceProject_ID(); if (invoiceBP_ID > 0) { fls[1].setC_BPartner_ID(invoiceBP_ID); } if (invoiceProject_ID >0) { fls[1].setC_Project_ID(invoiceProject_ID); } // return facts; } /** * @return MAssetAddition */ private MAssetAddition getAssetAddition() { return (MAssetAddition)getPO(); } /** * @param as * @return account for credit side (project, charge or expense) */ private MAccount getP_Asset_Acct(MAcctSchema as) { MAssetAddition assetAdd = getAssetAddition(); // Source Account MAccount pAssetAcct = null; if (MAssetAddition.A_SOURCETYPE_Project.equals(assetAdd.getA_SourceType())) { I_C_Project prj = assetAdd.getC_Project(); return getProjectAcct(prj, as); } else if (MAssetAddition.A_SOURCETYPE_Manual.equals(assetAdd.getA_SourceType()) && getC_Charge_ID() > 0) // backward compatibility: only if charge defined; if not fallback to product account { pAssetAcct = MCharge.getAccount(getC_Charge_ID(), as); return pAssetAcct; } else if (MAssetAddition.A_SOURCETYPE_Invoice.equals(assetAdd.getA_SourceType()) && assetAdd.getC_InvoiceLine().getC_Project_ID() > 0) { I_C_Project prj = assetAdd.getC_InvoiceLine().getC_Project(); return getProjectAcct(prj, as); } else { pAssetAcct = getP_Expense_Acct(assetAdd.getM_Product_ID(), as); } // return pAssetAcct; } /** * @param M_Product_ID * @param as * @return expense account */ public MAccount getP_Expense_Acct(int M_Product_ID, MAcctSchema as) { ProductCost pc = new ProductCost(getCtx(), M_Product_ID, 0, null); return pc.getAccount(ProductCost.ACCTTYPE_P_Expense, as); } /** * @param prj * @param as * @return project wip or asset account */ private MAccount getProjectAcct(I_C_Project prj, MAcctSchema as) { // TODO: keep in sync with org.compiere.acct.Doc_ProjectIssue.createFacts(MAcctSchema) logic String projectCategory = prj.getProjectCategory(); String acctName = X_C_Project_Acct.COLUMNNAME_PJ_WIP_Acct; if (MProject.PROJECTCATEGORY_AssetProject.equals(projectCategory)) acctName = X_C_Project_Acct.COLUMNNAME_PJ_Asset_Acct; // String sql = "SELECT "+acctName + " FROM "+I_C_Project_Acct.Table_Name + " WHERE "+I_C_Project_Acct.COLUMNNAME_C_Project_ID+"=?" +" AND "+I_C_Project_Acct.COLUMNNAME_C_AcctSchema_ID+"=?" ; int acct_id = DB.getSQLValueEx(getTrxName(), sql, prj.getC_Project_ID(), as.get_ID()); return MAccount.get(getCtx(), acct_id); } /** * @param as * @return asset account */ private MAccount getA_Asset_Acct(MAcctSchema as) { MAssetAddition assetAdd = getAssetAddition(); int acct_id = MAssetAcct .forA_Asset_ID(getCtx(), as.get_ID(), assetAdd.getA_Asset_ID(), assetAdd.getPostingType(), assetAdd.getDateAcct(), assetAdd.get_TrxName()) .getA_Asset_Acct(); return MAccount.get(getCtx(), acct_id); } /** * @return C_BPartner_ID from invoice or 0 */ public int getInvoicePartner_ID() { MAssetAddition assetAdd = getAssetAddition(); if (MAssetAddition.A_SOURCETYPE_Invoice.equals(assetAdd.getA_SourceType()) && assetAdd.getC_Invoice_ID() > 0) { return assetAdd.getC_Invoice().getC_BPartner_ID(); } else { return 0; } } /** * @return C_Project_ID from invoice line or 0 */ public int getInvoiceProject_ID() { MAssetAddition assetAdd = getAssetAddition(); if (MAssetAddition.A_SOURCETYPE_Invoice.equals(assetAdd.getA_SourceType()) && assetAdd.getC_Invoice_ID() > 0) { return assetAdd.getC_InvoiceLine().getC_Project_ID(); } else { return 0; } } }