📄 minout.java
字号:
setDocAction(DOCACTION_Close);
return DocAction.STATUS_Completed;
} // completeIt
/**
* Check Material Policy
* Sets line ASI
*/
private void checkMaterialPolicy()
{
int no = MInOutLineMA.deleteInOutMA(getM_InOut_ID(), get_TrxName());
if (no > 0)
log.config("Delete old #" + no);
MInOutLine[] lines = getLines(false);
// Incoming Trx
String MovementType = getMovementType();
boolean inTrx = MovementType.charAt(1) == '+'; // V+ Vendor Receipt
MClient client = MClient.get(getCtx());
// Check Lines
for (int i = 0; i < lines.length; i++)
{
MInOutLine line = lines[i];
boolean needSave = false;
MProduct product = line.getProduct();
// Need to have Location
if (product != null
&& line.getM_Locator_ID() == 0)
{
line.setM_Warehouse_ID(getM_Warehouse_ID());
line.setM_Locator_ID(inTrx ? Env.ZERO : line.getMovementQty()); // default Locator
needSave = true;
}
// Attribute Set Instance
if (product != null
&& line.getM_AttributeSetInstance_ID() == 0)
{
if (inTrx)
{
MAttributeSetInstance asi = new MAttributeSetInstance(getCtx(), 0, get_TrxName());
asi.setClientOrg(getAD_Client_ID(), 0);
asi.setM_AttributeSet_ID(product.getM_AttributeSet_ID());
if (asi.save())
{
line.setM_AttributeSetInstance_ID(asi.getM_AttributeSetInstance_ID());
log.config("New ASI=" + line);
needSave = true;
}
}
else // Outgoing Trx
{
MProductCategory pc = MProductCategory.get(getCtx(), product.getM_Product_Category_ID());
String MMPolicy = pc.getMMPolicy();
if (MMPolicy == null || MMPolicy.length() == 0)
MMPolicy = client.getMMPolicy();
//
MStorage[] storages = MStorage.getAllWithASI(getCtx(),
line.getM_Product_ID(), line.getM_Locator_ID(),
MClient.MMPOLICY_FiFo.equals(MMPolicy), get_TrxName());
BigDecimal qtyToDeliver = line.getMovementQty();
for (int ii = 0; ii < storages.length; ii++)
{
MStorage storage = storages[ii];
if (ii == 0)
{
if (storage.getQtyOnHand().compareTo(qtyToDeliver) >= 0)
{
line.setM_AttributeSetInstance_ID(storage.getM_AttributeSetInstance_ID());
needSave = true;
log.config("Direct - " + line);
qtyToDeliver = Env.ZERO;
}
else
{
log.config("Split - " + line);
MInOutLineMA ma = new MInOutLineMA (line,
storage.getM_AttributeSetInstance_ID(),
storage.getQtyOnHand());
if (!ma.save())
;
qtyToDeliver = qtyToDeliver.subtract(storage.getQtyOnHand());
log.fine("#" + ii + ": " + ma + ", QtyToDeliver=" + qtyToDeliver);
}
}
else // create addl material allocation
{
MInOutLineMA ma = new MInOutLineMA (line,
storage.getM_AttributeSetInstance_ID(),
qtyToDeliver);
if (storage.getQtyOnHand().compareTo(qtyToDeliver) >= 0)
qtyToDeliver = Env.ZERO;
else
{
ma.setMovementQty(storage.getQtyOnHand());
qtyToDeliver = qtyToDeliver.subtract(storage.getQtyOnHand());
}
if (!ma.save())
;
log.fine("#" + ii + ": " + ma + ", QtyToDeliver=" + qtyToDeliver);
}
if (qtyToDeliver.signum() == 0)
break;
} // for all storages
// No AttributeSetInstance found for remainder
if (qtyToDeliver.signum() != 0)
{
MInOutLineMA ma = new MInOutLineMA (line,
0, qtyToDeliver);
if (!ma.save())
;
log.fine("##: " + ma);
}
} // outgoing Trx
} // attributeSetInstance
if (needSave && !line.save())
log.severe("NOT saved " + line);
} // for all lines
} // checkMaterialPolicy
/**************************************************************************
* Create Counter Document
*/
private MInOut createCounterDoc()
{
// Is this a counter doc ?
if (getRef_InOut_ID() != 0)
return null;
// Org Must be linked to BPartner
MOrg org = MOrg.get(getCtx(), getAD_Org_ID());
int counterC_BPartner_ID = org.getLinkedC_BPartner_ID();
if (counterC_BPartner_ID == 0)
return null;
// Business Partner needs to be linked to Org
MBPartner bp = new MBPartner (getCtx(), getC_BPartner_ID(), null);
int counterAD_Org_ID = bp.getAD_OrgBP_ID_Int();
if (counterAD_Org_ID == 0)
return null;
MBPartner counterBP = new MBPartner (getCtx(), counterC_BPartner_ID, null);
MOrgInfo counterOrgInfo = MOrgInfo.get(getCtx(), counterAD_Org_ID);
log.info("Counter BP=" + counterBP.getName());
// Document Type
int C_DocTypeTarget_ID = 0;
MDocTypeCounter counterDT = MDocTypeCounter.getCounterDocType(getCtx(), getC_DocType_ID());
if (counterDT != null)
{
log.fine(counterDT.toString());
if (!counterDT.isCreateCounter() || !counterDT.isValid())
return null;
C_DocTypeTarget_ID = counterDT.getCounter_C_DocType_ID();
}
else // indirect
{
C_DocTypeTarget_ID = MDocTypeCounter.getCounterDocType_ID(getCtx(), getC_DocType_ID());
log.fine("Indirect C_DocTypeTarget_ID=" + C_DocTypeTarget_ID);
if (C_DocTypeTarget_ID <= 0)
return null;
}
// Deep Copy
MInOut counter = copyFrom(this, getMovementDate(),
C_DocTypeTarget_ID, !isSOTrx(), true, get_TrxName(), true);
//
counter.setAD_Org_ID(counterAD_Org_ID);
counter.setM_Warehouse_ID(counterOrgInfo.getM_Warehouse_ID());
//
counter.setBPartner(counterBP);
// Refernces (Should not be required
counter.setSalesRep_ID(getSalesRep_ID());
counter.save(get_TrxName());
String MovementType = counter.getMovementType();
boolean inTrx = MovementType.charAt(1) == '+'; // V+ Vendor Receipt
// Update copied lines
MInOutLine[] counterLines = counter.getLines(true);
for (int i = 0; i < counterLines.length; i++)
{
MInOutLine counterLine = counterLines[i];
counterLine.setClientOrg(counter);
counterLine.setM_Warehouse_ID(counter.getM_Warehouse_ID());
counterLine.setM_Locator_ID(0);
counterLine.setM_Locator_ID(inTrx ? Env.ZERO : counterLine.getMovementQty());
//
counterLine.save(get_TrxName());
}
log.fine(counter.toString());
// Document Action
if (counterDT != null)
{
if (counterDT.getDocAction() != null)
{
counter.setDocAction(counterDT.getDocAction());
counter.processIt(counterDT.getDocAction());
counter.save(get_TrxName());
}
}
return counter;
} // createCounterDoc
/**
* Void Document.
* @return true if success
*/
public boolean voidIt()
{
log.info(toString());
if (DOCSTATUS_Closed.equals(getDocStatus())
|| DOCSTATUS_Reversed.equals(getDocStatus())
|| DOCSTATUS_Voided.equals(getDocStatus()))
{
m_processMsg = "Document Closed: " + getDocStatus();
return false;
}
// Not Processed
if (DOCSTATUS_Drafted.equals(getDocStatus())
|| DOCSTATUS_Invalid.equals(getDocStatus())
|| DOCSTATUS_InProgress.equals(getDocStatus())
|| DOCSTATUS_Approved.equals(getDocStatus())
|| DOCSTATUS_NotApproved.equals(getDocStatus()) )
{
// Set lines to 0
MInOutLine[] lines = getLines(false);
for (int i = 0; i < lines.length; i++)
{
MInOutLine line = lines[i];
BigDecimal old = line.getMovementQty();
if (old.signum() != 0)
{
line.setQty(Env.ZERO);
line.addDescription("Void (" + old + ")");
line.save(get_TrxName());
}
}
}
else
{
return reverseCorrectIt();
}
setProcessed(true);
setDocAction(DOCACTION_None);
return true;
} // voidIt
/**
* Close Document.
* @return true if success
*/
public boolean closeIt()
{
log.info(toString());
setProcessed(true);
setDocAction(DOCACTION_None);
return true;
} // closeIt
/**
* Reverse Correction - same date
* @return true if success
*/
public boolean reverseCorrectIt()
{
log.info(toString());
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID());
if (!MPeriod.isOpen(getCtx(), getDateAcct(), dt.getDocBaseType()))
{
m_processMsg = "@PeriodClosed@";
return false;
}
// Reverse/Delete Matching
if (!isSOTrx())
{
MMatchInv[] mInv = MMatchInv.getInOut(getCtx(), getM_InOut_ID(), get_TrxName());
for (int i = 0; i < mInv.length; i++)
mInv[i].delete(true);
MMatchPO[] mPO = MMatchPO.getInOut(getCtx(), getM_InOut_ID(), get_TrxName());
for (int i = 0; i < mPO.length; i++)
{
if (mPO[i].getC_InvoiceLine_ID() == 0)
mPO[i].delete(true);
else
{
mPO[i].setM_InOutLine_ID(0);
mPO[i].save();
}
}
}
// Deep Copy
MInOut reversal = copyFrom (this, getMovementDate(),
getC_DocType_ID(), isSOTrx(), false, get_TrxName(), true);
if (reversal == null)
{
m_processMsg = "Could not create Ship Reversal";
return false;
}
reversal.setReversal(true);
// Reverse Line Qty
MInOutLine[] sLines = getLines(false);
MInOutLine[] rLines = reversal.getLines(false);
for (int i = 0; i < rLines.length; i++)
{
MInOutLine rLine = rLines[i];
rLine.setQtyEntered(rLine.getQtyEntered().negate());
rLine.setMovementQty(rLine.getMovementQty().negate());
rLine.setM_AttributeSetInstance_ID(sLines[i].getM_AttributeSetInstance_ID());
if (!rLine.save(get_TrxName()))
{
m_processMsg = "Could not correct Ship Reversal Line";
return false;
}
// We need to copy MA
if (rLine.getM_AttributeSetInstance_ID() == 0)
{
MInOutLineMA mas[] = MInOutLineMA.get(getCtx(),
sLines[i].getM_InOutLine_ID(), get_TrxName());
for (int j = 0; j < mas.length; j++)
{
MInOutLineMA ma = new MInOutLineMA (rLine,
mas[j].getM_AttributeSetInstance_ID(),
mas[j].getMovementQty().negate());
if (!ma.save())
;
}
}
// De-Activate Asset
MAsset asset = MAsset.getFromShipment(getCtx(), sLines[i].getM_InOutLine_ID(), get_TrxName());
if (asset != null)
{
asset.setIsActive(false);
asset.addDescription("(" + reversal.getDocumentNo() + " #" + rLine.getLine() + "<-)");
asset.save();
}
}
reversal.setC_Order_ID(getC_Order_ID());
reversal.addDescription("{->" + getDocumentNo() + ")");
//
if (!reversal.processIt(DocAction.ACTION_Complete)
|| !reversal.getDocStatus().equals(DocAction.STATUS_Completed))
{
m_processMsg = "Reversal ERROR: " + reversal.getProcessMsg();
return false;
}
reversal.closeIt();
reversal.setDocStatus(DOCSTATUS_Reversed);
reversal.setDocAction(DOCACTION_None);
reversal.save(get_TrxName());
//
addDescription("(" + reversal.getDocumentNo() + "<-)");
m_processMsg = reversal.getDocumentNo();
setProcessed(true);
setDocStatus(DOCSTATUS_Reversed); // may come from void
setDocAction(DOCACTION_None);
return true;
} // reverseCorrectionIt
/**
* Reverse Accrual - none
* @return false
*/
public boolean reverseAccrualIt()
{
log.info(toString());
return false;
} // reverseAccrualIt
/**
* Re-activate
* @return false
*/
public boolean reActivateIt()
{
log.info(toString());
return false;
} // reActivateIt
/*************************************************************************
* Get Summary
* @return Summary of Document
*/
public String getSummary()
{
StringBuffer sb = new StringBuffer();
sb.append(getDocumentNo());
// : Total Lines = 123.00 (#1)
sb.append(":")
// .append(Msg.translate(getCtx(),"TotalLines")).append("=").append(getTotalLines())
.append(" (#").append(getLines(false).length).append(")");
// - Description
if (getDescription() != null && getDescription().length() > 0)
sb.append(" - ").append(getDescription());
return sb.toString();
} // getSummary
/**
* Get Process Message
* @return clear text error message
*/
public String getProcessMsg()
{
return m_processMsg;
} // getProcessMsg
/**
* Get Document Owner (Responsible)
* @return AD_User_ID
*/
public int getDoc_User_ID()
{
return getSalesRep_ID();
} // getDoc_User_ID
/**
* Get Document Approval Amount
* @return amount
*/
public BigDecimal getApprovalAmt()
{
return Env.ZERO;
} // getApprovalAmt
/**
* Get C_Currency_ID
* @return Accounting Currency
*/
public int getC_Currency_ID ()
{
return Env.getContextAsInt(getCtx(),"$C_Currency_ID ");
} // getC_Currency_ID
/**
* Document Status is Complete or Closed
* @return true if CO, CL or RE
*/
public boolean isComplete()
{
String ds = getDocStatus();
return DOCSTATUS_Completed.equals(ds)
|| DOCSTATUS_Closed.equals(ds)
|| DOCSTATUS_Reversed.equals(ds);
} // isComplete
} // MInOut
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -