Asset Movement and Upload TPB

--HG--
branch : EDII
This commit is contained in:
hodianto 2019-02-11 13:42:19 +07:00
parent 241dc41d33
commit 2b1c10a816
9 changed files with 379 additions and 8 deletions

View File

@ -0,0 +1,272 @@
/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package andromedia.midsuit.doc;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.logging.Level;
import org.compiere.acct.Doc;
import org.compiere.acct.DocLine;
import org.compiere.acct.Fact;
import org.compiere.acct.FactLine;
import org.compiere.model.MAcctSchema;
import org.compiere.model.MCostDetail;
import org.compiere.model.MMovement;
import org.compiere.model.MMovementLine;
import org.compiere.model.MMovementLineMA;
import org.compiere.model.MProduct;
import org.compiere.model.ProductCost;
import org.compiere.util.Env;
/**
* Post Invoice Documents.
* <pre>
* Table: M_Movement (323)
* Document Types: MMM
* </pre>
* @author Jorg Janke
* @author Armen Rizal, Goodwill Consulting
* <li>BF [ 1745154 ] Cost in Reversing Material Related Docs
* @version $Id: Doc_Movement.java,v 1.3 2006/07/30 00:53:33 jjanke Exp $
*/
public class MID_DocMovement extends Doc
{
private int m_Reversal_ID = 0;
@SuppressWarnings("unused")
private String m_DocStatus = "";
/**
* Constructor
* @param as accounting schema
* @param rs record
* @param trxName trx
*/
public MID_DocMovement (MAcctSchema as, ResultSet rs, String trxName)
{
super (as, MMovement.class, rs, DOCTYPE_MatMovement, trxName);
} // Doc_Movement
/**
* Load Document Details
* @return error message or null
*/
protected String loadDocumentDetails()
{
setC_Currency_ID(NO_CURRENCY);
MMovement move = (MMovement)getPO();
setDateDoc (move.getMovementDate());
setDateAcct(move.getMovementDate());
m_Reversal_ID = move.getReversal_ID();//store original (voided/reversed) document
m_DocStatus = move.getDocStatus();
// Contained Objects
p_lines = loadLines(move);
if (log.isLoggable(Level.FINE)) log.fine("Lines=" + p_lines.length);
return null;
} // loadDocumentDetails
/**
* Load Invoice Line
* @param move move
* @return document lines (DocLine_Material)
*/
private DocLine[] loadLines(MMovement move)
{
ArrayList<DocLine> list = new ArrayList<DocLine>();
MMovementLine[] lines = move.getLines(false);
if(move.get_ValueAsBoolean("IsAsset"))
return new DocLine[0];
for (int i = 0; i < lines.length; i++)
{
MMovementLine line = lines[i];
DocLine docLine = new DocLine (line, this);
docLine.setQty(line.getMovementQty(), false);
docLine.setReversalLine_ID(line.getReversalLine_ID());
if (log.isLoggable(Level.FINE)) log.fine(docLine.toString());
list.add (docLine);
}
// Return Array
DocLine[] dls = new DocLine[list.size()];
list.toArray(dls);
return dls;
} // loadLines
/**
* Get Balance
* @return balance (ZERO) - always balanced
*/
public BigDecimal getBalance()
{
BigDecimal retValue = Env.ZERO;
return retValue;
} // getBalance
/**
* Create Facts (the accounting logic) for
* MMM.
* <pre>
* Movement
* Inventory DR CR
* InventoryTo DR CR
* </pre>
* @param as account schema
* @return Fact
*/
public ArrayList<Fact> createFacts (MAcctSchema as)
{
// create Fact Header
Fact fact = new Fact(this, as, Fact.POST_Actual);
setC_Currency_ID(as.getC_Currency_ID());
// Line pointers
FactLine dr = null;
FactLine cr = null;
for (int i = 0; i < p_lines.length; i++)
{
DocLine line = p_lines[i];
BigDecimal costs = null;
if (!isReversal(line))
{
MProduct product = (MProduct) line.getProduct();
String costingLevel = product.getCostingLevel(as);
if (MAcctSchema.COSTINGLEVEL_BatchLot.equals(costingLevel) )
{
if (line.getM_AttributeSetInstance_ID() == 0 )
{
MMovementLine mLine = (MMovementLine) line.getPO();
MMovementLineMA mas[] = MMovementLineMA.get(getCtx(), mLine.get_ID(), getTrxName());
if (mas != null && mas.length > 0 )
{
costs = BigDecimal.ZERO;
for (int j = 0; j < mas.length; j++)
{
MMovementLineMA ma = mas[j];
BigDecimal QtyMA = ma.getMovementQty();
ProductCost pc = line.getProductCost();
pc.setQty(QtyMA);
pc.setM_M_AttributeSetInstance_ID(ma.getM_AttributeSetInstance_ID());
BigDecimal maCosts = line.getProductCosts(as, line.getAD_Org_ID(), true, "M_MovementLine_ID=? AND IsSOTrx='N'");
costs = costs.add(maCosts);
}
}
}
else
{
costs = line.getProductCosts(as, line.getAD_Org_ID(), true, "M_MovementLine_ID=? AND IsSOTrx='N'");
}
}
else
{
// MZ Goodwill
// if Inventory Move CostDetail exist then get Cost from Cost Detail
costs = line.getProductCosts(as, line.getAD_Org_ID(), true, "M_MovementLine_ID=? AND IsSOTrx='N'");
// end MZ
}
}
else
{
costs = BigDecimal.ZERO;
}
// ** Inventory DR CR
dr = fact.createLine(line,
line.getAccount(ProductCost.ACCTTYPE_P_Asset, as),
as.getC_Currency_ID(), costs.negate()); // from (-) CR
if (dr == null)
continue;
dr.setM_Locator_ID(line.getM_Locator_ID());
dr.setQty(line.getQty().negate()); // outgoing
if (isReversal(line))
{
// Set AmtAcctDr from Original Movement
if (!dr.updateReverseLine (MMovement.Table_ID,
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
{
p_Error = "Original Inventory Move not posted yet";
return null;
}
}
// ** InventoryTo DR CR
cr = fact.createLine(line,
line.getAccount(ProductCost.ACCTTYPE_P_Asset, as),
as.getC_Currency_ID(), costs); // to (+) DR
if (cr == null)
continue;
cr.setM_Locator_ID(line.getM_LocatorTo_ID());
cr.setQty(line.getQty());
if (isReversal(line))
{
// Set AmtAcctCr from Original Movement
if (!cr.updateReverseLine (MMovement.Table_ID,
m_Reversal_ID, line.getReversalLine_ID(),Env.ONE))
{
p_Error = "Original Inventory Move not posted yet";
return null;
}
costs = cr.getAcctBalance(); //get original cost
}
// Only for between-org movements
if (dr.getAD_Org_ID() != cr.getAD_Org_ID())
{
String costingLevel = line.getProduct().getCostingLevel(as);
if (!MAcctSchema.COSTINGLEVEL_Organization.equals(costingLevel))
continue;
//
String description = line.getDescription();
if (description == null)
description = "";
// Cost Detail From
if (!MCostDetail.createMovement(as, dr.getAD_Org_ID(), // locator org
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
line.get_ID(), 0,
costs.negate(), line.getQty().negate(), true,
description + "(|->)", getTrxName()))
{
p_Error = "Failed to create cost detail record";
return null;
}
// Cost Detail To
if (!MCostDetail.createMovement(as, cr.getAD_Org_ID(), // locator org
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
line.get_ID(), 0,
costs, line.getQty(), false,
description + "(|<-)", getTrxName()))
{
p_Error = "Failed to create cost detail record";
return null;
}
}
}
//
ArrayList<Fact> facts = new ArrayList<Fact>();
facts.add(fact);
return facts;
} // createFact
private boolean isReversal(DocLine line) {
return m_Reversal_ID !=0 && line.getReversalLine_ID() != 0;
}
} // Doc_Movement

View File

@ -19,7 +19,9 @@ import andromedia.midsuit.doc.MID_DocDDOrder;
import andromedia.midsuit.doc.MID_DocInvoice;
import andromedia.midsuit.doc.MID_DocMRPPPO;
import andromedia.midsuit.doc.MID_DocMidRequsiition;
import andromedia.midsuit.doc.MID_DocMovement;
import andromedia.midsuit.model.MID_Analysis;
import andromedia.midsuit.model.MID_MMovement;
import andromedia.midsuit.model.MID_MRequisitionTrx;
import andromedia.midsuit.model.MID_PPO;
@ -69,7 +71,8 @@ public class MID_DocFactory implements IDocFactory{
}
if(tableName.equals(MDDOrder.Table_Name))
return new MID_DocDDOrder(as, rs, trxName);
if(tableName.equals(MID_MMovement.Table_Name))
return new MID_DocMovement(as, rs, trxName);
return null;
}

View File

@ -7,6 +7,7 @@ import java.util.Properties;
import org.adempiere.base.IModelFactory;
import org.compiere.model.MMovement;
import org.compiere.model.MMovementLine;
import org.compiere.model.PO;
import org.compiere.util.Env;
@ -69,6 +70,7 @@ public class MID_ModelFactory implements IModelFactory{
mapTableModels.put(MID_UnrealizedRateLine.Table_Name, "andromedia.midsuit.model.MID_UnrealizedRateLine");
mapTableModels.put(MID_MOrder.Table_Name, "andromedia.midsuit.model.MID_MOrder");
mapTableModels.put(MMovement.Table_Name, "andromedia.midsuit.model.MID_MMovement");
mapTableModels.put(MMovementLine.Table_Name, "andromedia.midsuit.model.MID_MMovementLine");
mapTableModels.put(X_MID_UploadPEBLine.Table_Name, "andromedia.midsuit.model.X_MID_UploadPEBLine");
mapTableModels.put(X_MID_UploadPEB.Table_Name, "andromedia.midsuit.model.X_MID_UploadPEB");
mapTableModels.put(X_MID_UploadTPB.Table_Name, "andromedia.midsuit.model.X_MID_UploadTPB");

View File

@ -5,6 +5,7 @@ import java.util.Properties;
import org.compiere.model.MMovement;
import org.compiere.model.X_M_Movement;
import org.compiere.process.DocAction;
import org.compiere.util.DB;
public class MID_MMovement extends MMovement{
@ -22,7 +23,26 @@ public class MID_MMovement extends MMovement{
super(ctx, rs, trxName);
// TODO Auto-generated constructor stub
}
@Override
public String prepareIt() {
if(get_ValueAsBoolean("IsAsset")) {
setDocAction(DOCACTION_Complete);
return DocAction.STATUS_InProgress;
}
return super.prepareIt();
}
@Override
public String completeIt() {
if(get_ValueAsBoolean("IsAsset")) {
setProcessed(true);
setDocAction(DOCACTION_Close);
return DocAction.STATUS_Completed;
}
return super.completeIt();
}
@Override
protected boolean beforeSave(boolean newRecord) {
if(!newRecord)

View File

@ -0,0 +1,46 @@
package andromedia.midsuit.model;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.util.Properties;
import org.compiere.model.MMovement;
import org.compiere.model.MMovementLine;
import org.compiere.util.DB;
public class MID_MMovementLine extends MMovementLine{
/**
*
*/
private static final long serialVersionUID = 1884915669018246342L;
public MID_MMovementLine(MMovement parent) {
super(parent);
// TODO Auto-generated constructor stub
}
public MID_MMovementLine(Properties ctx, int M_MovementLine_ID, String trxName) {
super(ctx, M_MovementLine_ID, trxName);
// TODO Auto-generated constructor stub
}
public MID_MMovementLine(Properties ctx, ResultSet rs, String trxName) {
super(ctx, rs, trxName);
// TODO Auto-generated constructor stub
}
@Override
protected boolean afterSave(boolean newRecord, boolean success) {
if(success) {
BigDecimal totalLines = DB.getSQLValueBD(get_TrxName(), "SELECT COALESCE(SUM(Price),0) FROM M_MovementLine WHERE M_Movement_ID =?", new Object[] { getM_Movement_ID() });
int no = DB.executeUpdateEx("UPDATE M_Movement SET TotalLines =? WHERE M_Movement_ID =?", new Object[] { totalLines, getM_Movement_ID()},get_TrxName());
}
return super.afterSave(newRecord, success);
}
@Override
protected boolean afterDelete(boolean success) {
if(success) {
BigDecimal totalLines = DB.getSQLValueBD(get_TrxName(), "SELECT COALESCE(SUM(Price),0) FROM M_MovementLine WHERE M_Movement_ID =?", new Object[] { getM_Movement_ID() });
int no = DB.executeUpdateEx("UPDATE M_Movement SET TotalLines =? WHERE M_Movement_ID =?", new Object[] { totalLines, getM_Movement_ID()},get_TrxName());
}
return super.afterDelete(success);
}
}

View File

@ -43,9 +43,11 @@ public class MID_TPBUpdateOrder extends SvrProcess{
if(line.getM_Requisition_ID()>0 && !isRetur) {
MOrder order = createPurchaseOrder(line);
createPurchaseOrderLine(line, order);
line.setC_Order_ID(order.get_ID());
}else if (line.getM_RMA_ID()>0 && isRetur) {
MRMA RMA = createCustomerRMA(line);
createCustomerRMALine(line, RMA);
line.setM_RMA_ID(RMA.get_ID());
}else {
continue;
}
@ -112,8 +114,11 @@ public class MID_TPBUpdateOrder extends SvrProcess{
retValue.setC_BPartner_Location_ID(line.getC_BPartner_Location_ID());
retValue.setC_Currency_ID(line.getC_Currency_ID());
retValue.setSalesRep_ID(line.getSalesRep_ID());
retValue.setPOReference(line.getM_Requisition().getDocumentNo());
retValue.set_ValueNoCheck("M_Requisition_ID", line.getM_Requisition_ID());
retValue.setM_Warehouse_ID(line.getM_Warehouse_ID());
retValue.setC_DocTypeTarget_ID(line.getC_DocTypeTarget_ID());
retValue.setIsSOTrx(false);
retValue.setM_PriceList_ID(line.getM_PriceList_ID());
retValue.saveEx();
String message = Msg.parseTranslation(getCtx(), "@PurchaseOrderCreated@ " + retValue.getDocumentNo());

View File

@ -36,9 +36,11 @@ public class MID_TPBUpdateOrderLine extends SvrProcess{
if(tpbLine.getM_Requisition_ID()>0 && !isRetur) {
MOrder order = createPurchaseOrder(tpbLine);
createPurchaseOrderLine(tpbLine, order);
tpbLine.setC_Order_ID(order.get_ID());
}else if (tpbLine.getM_RMA_ID()>0 && isRetur) {
MRMA RMA = createCustomerRMA(tpbLine);
createCustomerRMALine(tpbLine, RMA);
tpbLine.setM_RMA_ID(RMA.get_ID());
}else {
throw new AdempiereException("Requisition / RMA Wajib diisi !!!");
}
@ -101,12 +103,15 @@ public class MID_TPBUpdateOrderLine extends SvrProcess{
retValue.set_ValueNoCheck("RegisterDate", line.getRegisterDate());
retValue.set_ValueNoCheck("RegisterNo", line.getRegisterNo());
retValue.set_ValueNoCheck("MID_AJUDocumentType_ID", line.getMID_AJUDocumentType_ID());
retValue.setPOReference(line.getM_Requisition().getDocumentNo());
retValue.setC_BPartner_ID(line.getC_BPartner_ID());
retValue.setC_BPartner_Location_ID(line.getC_BPartner_Location_ID());
retValue.set_ValueNoCheck("M_Requisition_ID", line.getM_Requisition_ID());
retValue.setC_Currency_ID(line.getC_Currency_ID());
retValue.setSalesRep_ID(line.getSalesRep_ID());
retValue.setM_Warehouse_ID(line.getM_Warehouse_ID());
retValue.setC_DocTypeTarget_ID(line.getC_DocTypeTarget_ID());
retValue.setIsSOTrx(false);
retValue.setM_PriceList_ID(line.getM_PriceList_ID());
retValue.saveEx();
String message = Msg.parseTranslation(getCtx(), "@PurchaseOrderCreated@ " + retValue.getDocumentNo());

View File

@ -61,7 +61,11 @@ public class MID_UploadTPB extends SvrProcess{
X_MID_UploadTPBLine line = createTPBDocumentLine(row);
Sheet Barang = workbook.getSheet("Barang");
Sheet Barang = null;
if(AJU_DocType_Value.equals("27a") || AJU_DocType_Value.equals("27b"))
Barang = workbook.getSheet("BahanBaku");
else
Barang = workbook.getSheet("Barang");
Iterator<Row> rowsBarang = Barang.rowIterator();
int rowBarangNum = 0;
while(rowsBarang.hasNext()){
@ -126,6 +130,9 @@ public class MID_UploadTPB extends SvrProcess{
if(C_Currency_ID <=0)
throw new AdempiereException("Currency Not Found "+dataRow.getCell(88).getStringCellValue()+" !!!");
tpbLine.setC_BPartner_ID(C_BPartner_ID);
if(MBPartnerLocation.getForBPartner(getCtx(), C_BPartner_ID, get_TrxName())[0].getC_BPartner_Location_ID()==0) {
throw new AdempiereException("No Location for this Business Partner !!!");
}
tpbLine.setC_BPartner_Location_ID(MBPartnerLocation.getForBPartner(getCtx(), C_BPartner_ID, get_TrxName())[0].getC_BPartner_Location_ID());
tpbLine.setC_DocTypeTarget_ID(p_C_DocType_ID);
tpbLine.setSalesRep_ID(30178);
@ -150,7 +157,7 @@ public class MID_UploadTPB extends SvrProcess{
BigDecimal PriceList = Env.ZERO;
BigDecimal Discount = Env.ZERO;
BigDecimal PriceActual = Env.ZERO;
if(AJU_DocType_Value.equals("23") || AJU_DocType_Value.equals("40")){
if(AJU_DocType_Value.equals("23") || AJU_DocType_Value.equals("40") || AJU_DocType_Value.equals("262")){
M_Product_ID = DB.getSQLValue(get_TrxName(), "SELECT M_Product_ID FROM M_Product WHERE Value =?", new Object[] { rowBarang.getCell(20).getStringCellValue() });
C_UOM_ID = DB.getSQLValue(get_TrxName(), " SELECT C_UOM_ID FROM C_UOM WHERE UOMSymbol =?", new Object[] { rowBarang.getCell(27).getStringCellValue()});
@ -171,19 +178,28 @@ public class MID_UploadTPB extends SvrProcess{
}
if(AJU_DocType_Value.equals("23")){
if(AJU_DocType_Value.equals("23") || AJU_DocType_Value.equals("262")){
Qty = new BigDecimal(rowBarang.getCell(16).getStringCellValue());
PriceList = new BigDecimal(rowBarang.getCell(12).getStringCellValue());
Discount = new BigDecimal(rowBarang.getCell(5).getStringCellValue());
try {
Discount = new BigDecimal(rowBarang.getCell(5).getStringCellValue());
}catch (Exception e) {
Discount = Env.ZERO;
}
PriceActual = PriceList.subtract(Discount.divide(Env.ONEHUNDRED, 2,BigDecimal.ROUND_DOWN).multiply(PriceList));
}else if (AJU_DocType_Value.equals("40")){
Qty = new BigDecimal(rowBarang.getCell(32).getStringCellValue());
PriceList = new BigDecimal(rowBarang.getCell(29).getStringCellValue());
PriceList = new BigDecimal(rowBarang.getCell(11).getStringCellValue());
PriceList = PriceList.divide(Qty,2,BigDecimal.ROUND_DOWN);
PriceActual = PriceList;
}else{
Qty = new BigDecimal(rowBarang.getCell(8).getStringCellValue());
PriceList = new BigDecimal(rowBarang.getCell(12).getStringCellValue());
PriceActual = new BigDecimal(rowBarang.getCell(5).getStringCellValue());
if(AJU_DocType_Value.equals("27"))
PriceList = new BigDecimal(rowBarang.getCell(12).getStringCellValue());
else
PriceList = PriceActual;
}
if(AJU_DocType_Value.equals("27")){

View File

@ -27,6 +27,8 @@ public class MID_InOutValidator {
return "";
}
private static String beforePrepare(MInOut inOut) {
if(inOut.getMovementType().equals(MInOut.MOVEMENTTYPE_VendorReturns) || inOut.getMovementType().equals(MInOut.MOVEMENTTYPE_CustomerReturns))
return "";
for(MInOutLine line : inOut.getLines()) {
int countAttLines = new Query(inOut.getCtx(), X_M_InOutLineMA.Table_Name, "M_InOutLine_ID =?", inOut.get_TrxName())
.setParameters(new Object[] { line.getM_InOutLine_ID() })