📄 morder.java
字号:
shipment.save(get_TrxName());
if (!DOCSTATUS_Completed.equals(status))
{
m_processMsg = "@M_InOut_ID@: " + shipment.getProcessMsg();
return null;
}
return shipment;
} // createShipment
/**
* Create Invoice
* @param dt order document type
* @param shipment optional shipment
* @return invoice or null
*/
private MInvoice createInvoice (MDocType dt, MInOut shipment, Timestamp invoiceDate)
{
log.info(dt.toString());
MInvoice invoice = new MInvoice (this, dt.getC_DocTypeInvoice_ID(), invoiceDate);
if (!invoice.save(get_TrxName()))
{
m_processMsg = "Could not create Invoice";
return null;
}
// If we have a Shipment - use that as a base
if (shipment != null)
{
if (!INVOICERULE_AfterDelivery.equals(getInvoiceRule()))
setInvoiceRule(INVOICERULE_AfterDelivery);
//
MInOutLine[] sLines = shipment.getLines(false);
for (int i = 0; i < sLines.length; i++)
{
MInOutLine sLine = sLines[i];
//
MInvoiceLine iLine = new MInvoiceLine(invoice);
iLine.setShipLine(sLine);
// Qty = Delivered
iLine.setQtyEntered(sLine.getQtyEntered());
iLine.setQtyInvoiced(sLine.getMovementQty());
if (!iLine.save(get_TrxName()))
{
m_processMsg = "Could not create Invoice Line from Shipment Line";
return null;
}
//
sLine.setIsInvoiced(true);
if (!sLine.save(get_TrxName()))
{
log.warning("Could not update Shipment line: " + sLine);
}
}
}
else // Create Invoice from Order
{
if (!INVOICERULE_Immediate.equals(getInvoiceRule()))
setInvoiceRule(INVOICERULE_Immediate);
//
MOrderLine[] oLines = getLines();
for (int i = 0; i < oLines.length; i++)
{
MOrderLine oLine = oLines[i];
//
MInvoiceLine iLine = new MInvoiceLine(invoice);
iLine.setOrderLine(oLine);
// Qty = Ordered - Invoiced
iLine.setQtyInvoiced(oLine.getQtyOrdered().subtract(oLine.getQtyInvoiced()));
if (oLine.getQtyOrdered().compareTo(oLine.getQtyEntered()) == 0)
iLine.setQtyEntered(iLine.getQtyInvoiced());
else
iLine.setQtyEntered(iLine.getQtyInvoiced().multiply(oLine.getQtyEntered())
.divide(oLine.getQtyOrdered(), 12, BigDecimal.ROUND_HALF_UP));
if (!iLine.save(get_TrxName()))
{
m_processMsg = "Could not create Invoice Line from Order Line";
return null;
}
}
}
// Manually Process Invoice
String status = invoice.completeIt();
invoice.setDocStatus(status);
invoice.save(get_TrxName());
setC_CashLine_ID(invoice.getC_CashLine_ID());
if (!DOCSTATUS_Completed.equals(status))
{
m_processMsg = "@C_Invoice_ID@: " + invoice.getProcessMsg();
return null;
}
return invoice;
} // createInvoice
/**
* Create Counter Document
*/
private MOrder createCounterDoc()
{
// Is this itself a counter doc ?
if (getRef_Order_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
MOrder counter = copyFrom (this, getDateOrdered(),
C_DocTypeTarget_ID, !isSOTrx(), true, false, get_TrxName());
//
counter.setAD_Org_ID(counterAD_Org_ID);
counter.setM_Warehouse_ID(counterOrgInfo.getM_Warehouse_ID());
//
counter.setBPartner(counterBP);
counter.setDatePromised(getDatePromised()); // default is date ordered
// Refernces (Should not be required
counter.setSalesRep_ID(getSalesRep_ID());
counter.save(get_TrxName());
// Update copied lines
MOrderLine[] counterLines = counter.getLines(true, null);
for (int i = 0; i < counterLines.length; i++)
{
MOrderLine counterLine = counterLines[i];
counterLine.setOrder(counter); // copies header values (BP, etc.)
counterLine.setPrice();
counterLine.setTax();
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.
* Set Qtys to 0 - Sales: reverse all documents
* @return true if success
*/
public boolean voidIt()
{
MOrderLine[] lines = getLines(true, "M_Product_ID");
log.info(toString());
for (int i = 0; i < lines.length; i++)
{
MOrderLine line = lines[i];
BigDecimal old = line.getQtyOrdered();
if (old.signum() != 0)
{
line.addDescription(Msg.getMsg(getCtx(), "Voided") + " (" + old + ")");
line.setQty(Env.ZERO);
line.setLineNetAmt(Env.ZERO);
line.save(get_TrxName());
}
}
addDescription(Msg.getMsg(getCtx(), "Voided"));
// Clear Reservations
if (!reserveStock(null, lines))
{
m_processMsg = "Cannot unreserve Stock (void)";
return false;
}
if (!createReversals())
return false;
setProcessed(true);
setDocAction(DOCACTION_None);
return true;
} // voidIt
/**
* Create Shipment/Invoice Reversals
* @return true if success
*/
private boolean createReversals()
{
// Cancel only Sales
if (!isSOTrx())
return true;
log.info("createReversals");
StringBuffer info = new StringBuffer();
// Reverse All *Shipments*
info.append("@M_InOut_ID@:");
MInOut[] shipments = getShipments();
for (int i = 0; i < shipments.length; i++)
{
MInOut ship = shipments[i];
// if closed - ignore
if (MInOut.DOCSTATUS_Closed.equals(ship.getDocStatus())
|| MInOut.DOCSTATUS_Reversed.equals(ship.getDocStatus())
|| MInOut.DOCSTATUS_Voided.equals(ship.getDocStatus()) )
continue;
ship.set_TrxName(get_TrxName());
// If not completed - void - otherwise reverse it
if (!MInOut.DOCSTATUS_Completed.equals(ship.getDocStatus()))
{
if (ship.voidIt())
ship.setDocStatus(MInOut.DOCSTATUS_Voided);
}
else if (ship.reverseCorrectIt()) // completed shipment
{
ship.setDocStatus(MInOut.DOCSTATUS_Reversed);
info.append(" ").append(ship.getDocumentNo());
}
else
{
m_processMsg = "Could not reverse Shipment " + ship;
return false;
}
ship.setDocAction(MInOut.DOCACTION_None);
ship.save(get_TrxName());
} // for all shipments
// Reverse All *Invoices*
info.append(" - @C_Invoice_ID@:");
MInvoice[] invoices = getInvoices();
for (int i = 0; i < invoices.length; i++)
{
MInvoice invoice = invoices[i];
// if closed - ignore
if (MInvoice.DOCSTATUS_Closed.equals(invoice.getDocStatus())
|| MInvoice.DOCSTATUS_Reversed.equals(invoice.getDocStatus())
|| MInvoice.DOCSTATUS_Voided.equals(invoice.getDocStatus()) )
continue;
invoice.set_TrxName(get_TrxName());
// If not compleded - void - otherwise reverse it
if (!MInvoice.DOCSTATUS_Completed.equals(invoice.getDocStatus()))
{
if (invoice.voidIt())
invoice.setDocStatus(MInvoice.DOCSTATUS_Voided);
}
else if (invoice.reverseCorrectIt()) // completed invoice
{
invoice.setDocStatus(MInvoice.DOCSTATUS_Reversed);
info.append(" ").append(invoice.getDocumentNo());
}
else
{
m_processMsg = "Could not reverse Invoice " + invoice;
return false;
}
invoice.setDocAction(MInvoice.DOCACTION_None);
invoice.save(get_TrxName());
} // for all shipments
m_processMsg = info.toString();
return true;
} // createReversals
/**
* Close Document.
* Cancel not delivered Qunatities
* @return true if success
*/
public boolean closeIt()
{
log.info(toString());
// Close Not delivered Qty - SO/PO
MOrderLine[] lines = getLines(true, "M_Product_ID");
for (int i = 0; i < lines.length; i++)
{
MOrderLine line = lines[i];
BigDecimal old = line.getQtyOrdered();
if (old.compareTo(line.getQtyDelivered()) != 0)
{
line.setQtyLostSales(line.getQtyOrdered().subtract(line.getQtyDelivered()));
line.setQtyOrdered(line.getQtyDelivered());
// QtyEntered unchanged
line.addDescription("Close (" + old + ")");
line.save(get_TrxName());
}
}
// Clear Reservations
if (!reserveStock(null, lines))
{
m_processMsg = "Cannot unreserve Stock (close)";
return false;
}
setProcessed(true);
setDocAction(DOCACTION_None);
return true;
} // closeIt
/**
* Reverse Correction - same void
* @return true if success
*/
public boolean reverseCorrectIt()
{
log.info(toString());
return voidIt();
} // reverseCorrectionIt
/**
* Reverse Accrual - none
* @return false
*/
public boolean reverseAccrualIt()
{
log.info(toString());
return false;
} // reverseAccrualIt
/**
* Re-activate.
* @return true if success
*/
public boolean reActivateIt()
{
log.info(toString());
MDocType dt = MDocType.get(getCtx(), getC_DocType_ID());
String DocSubTypeSO = dt.getDocSubTypeSO();
// PO - just re-open
if (!isSOTrx())
log.info("Existing documents not modified - " + dt);
// Reverse Direct Documents
else if (MDocType.DOCSUBTYPESO_OnCreditOrder.equals(DocSubTypeSO) // (W)illCall(I)nvoice
|| MDocType.DOCSUBTYPESO_WarehouseOrder.equals(DocSubTypeSO) // (W)illCall(P)ickup
|| MDocType.DOCSUBTYPESO_POSOrder.equals(DocSubTypeSO)) // (W)alkIn(R)eceipt
{
if (!createReversals())
return false;
}
else
{
log.info("Existing documents not modified - SubType=" + DocSubTypeSO);
}
setDocAction(DOCACTION_Complete);
setProcessed(false);
return true;
} // reActivateIt
/*************************************************************************
* Get Summary
* @return Summary of Document
*/
public String getSummary()
{
StringBuffer sb = new StringBuffer();
sb.append(getDocumentNo());
// : Grand Total = 123.00 (#1)
sb.append(": ").
append(Msg.translate(getCtx(),"GrandTotal")).append("=").append(getGrandTotal());
if (m_lines != null)
sb.append(" (#").append(m_lines.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 getGrandTotal();
} // getApprovalAmt
} // MOrder
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -