Skip to content

Commit

Permalink
IDEMPIERE-5040 Stall M_InOutLine.QtyOverReceipt (#1005)
Browse files Browse the repository at this point in the history
* IDEMPIERE-5040 Stall M_InOutLine.QtyOverReceipt

* IDEMPIERE-5040 Stall M_InOutLine.QtyOverReceipt

Drop the user of M_InOutLine.QtyOverReceipt column
  • Loading branch information
hengsin committed Nov 29, 2021
1 parent 744e84c commit 05447b3
Show file tree
Hide file tree
Showing 9 changed files with 194 additions and 59 deletions.
23 changes: 23 additions & 0 deletions migration/i8.2z/oracle/202111210850_IDEMPIERE-5040.sql
@@ -0,0 +1,23 @@
SET SQLBLANKLINES ON
SET DEFINE OFF

-- IDEMPIERE-5040 Stall M_InOutLine.QtyOverReceipt
-- Nov 19, 2021, 11:00:44 PM MYT
INSERT INTO AD_TableIndex (AD_Client_ID,AD_Org_ID,AD_TableIndex_ID,AD_TableIndex_UU,Created,CreatedBy,EntityType,IsActive,Name,Updated,UpdatedBy,AD_Table_ID,IsCreateConstraint,IsUnique,Processing,TableIndexDrop,IsKey) VALUES (0,0,201096,'c97e6bf9-5754-485c-a983-5cb01429032f',TO_DATE('2021-11-19 23:00:43','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','m_inoutline_orderline_idx',TO_DATE('2021-11-19 23:00:43','YYYY-MM-DD HH24:MI:SS'),100,320,'N','N','N','N','N')
;

-- Nov 19, 2021, 11:00:58 PM MYT
INSERT INTO AD_IndexColumn (AD_Client_ID,AD_Org_ID,AD_IndexColumn_ID,AD_IndexColumn_UU,Created,CreatedBy,EntityType,IsActive,Updated,UpdatedBy,AD_Column_ID,AD_TableIndex_ID,SeqNo) VALUES (0,0,201443,'4c920b11-27f2-40a5-b30f-cc8b525d942b',TO_DATE('2021-11-19 23:00:57','YYYY-MM-DD HH24:MI:SS'),100,'D','Y',TO_DATE('2021-11-19 23:00:57','YYYY-MM-DD HH24:MI:SS'),100,3811,201096,10)
;

-- Nov 19, 2021, 11:01:04 PM MYT
CREATE INDEX m_inoutline_orderline_idx ON M_InOutLine (C_OrderLine_ID)
;

-- Nov 26, 2021, 6:14:22 AM MYT
UPDATE AD_Column SET IsActive='N',Updated=TO_DATE('2021-11-26 06:14:22','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=210888
;

SELECT register_migration_script('202111210850_IDEMPIERE-5040.sql') FROM dual
;

20 changes: 20 additions & 0 deletions migration/i8.2z/postgresql/202111210850_IDEMPIERE-5040.sql
@@ -0,0 +1,20 @@
-- IDEMPIERE-5040 Stall M_InOutLine.QtyOverReceipt
-- Nov 19, 2021, 11:00:44 PM MYT
INSERT INTO AD_TableIndex (AD_Client_ID,AD_Org_ID,AD_TableIndex_ID,AD_TableIndex_UU,Created,CreatedBy,EntityType,IsActive,Name,Updated,UpdatedBy,AD_Table_ID,IsCreateConstraint,IsUnique,Processing,TableIndexDrop,IsKey) VALUES (0,0,201096,'c97e6bf9-5754-485c-a983-5cb01429032f',TO_TIMESTAMP('2021-11-19 23:00:43','YYYY-MM-DD HH24:MI:SS'),100,'D','Y','m_inoutline_orderline_idx',TO_TIMESTAMP('2021-11-19 23:00:43','YYYY-MM-DD HH24:MI:SS'),100,320,'N','N','N','N','N')
;

-- Nov 19, 2021, 11:00:58 PM MYT
INSERT INTO AD_IndexColumn (AD_Client_ID,AD_Org_ID,AD_IndexColumn_ID,AD_IndexColumn_UU,Created,CreatedBy,EntityType,IsActive,Updated,UpdatedBy,AD_Column_ID,AD_TableIndex_ID,SeqNo) VALUES (0,0,201443,'4c920b11-27f2-40a5-b30f-cc8b525d942b',TO_TIMESTAMP('2021-11-19 23:00:57','YYYY-MM-DD HH24:MI:SS'),100,'D','Y',TO_TIMESTAMP('2021-11-19 23:00:57','YYYY-MM-DD HH24:MI:SS'),100,3811,201096,10)
;

-- Nov 19, 2021, 11:01:04 PM MYT
CREATE INDEX m_inoutline_orderline_idx ON M_InOutLine (C_OrderLine_ID)
;

-- Nov 26, 2021, 6:14:22 AM MYT
UPDATE AD_Column SET IsActive='N',Updated=TO_TIMESTAMP('2021-11-26 06:14:22','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Column_ID=210888
;

SELECT register_migration_script('202111210850_IDEMPIERE-5040.sql') FROM dual
;

13 changes: 0 additions & 13 deletions org.adempiere.base/src/org/compiere/model/I_M_InOutLine.java
Expand Up @@ -447,19 +447,6 @@ public interface I_M_InOutLine
*/
public BigDecimal getQtyEntered();

/** Column name QtyOverReceipt */
public static final String COLUMNNAME_QtyOverReceipt = "QtyOverReceipt";

/** Set Over Receipt.
* Over Receipt Quantity
*/
public void setQtyOverReceipt (BigDecimal QtyOverReceipt);

/** Get Over Receipt.
* Over Receipt Quantity
*/
public BigDecimal getQtyOverReceipt();

/** Column name Ref_InOutLine_ID */
public static final String COLUMNNAME_Ref_InOutLine_ID = "Ref_InOutLine_ID";

Expand Down
43 changes: 22 additions & 21 deletions org.adempiere.base/src/org/compiere/model/MInOut.java
Expand Up @@ -762,8 +762,6 @@ public int copyLinesFrom (MInOut otherShipment, boolean counter, boolean setOrde
}
}

line.setQtyOverReceipt(fromLine.getQtyOverReceipt());

//
line.setProcessed(false);
if (line.save(get_TrxName()))
Expand Down Expand Up @@ -1358,8 +1356,6 @@ public String completeIt()
log.fine("Material Transaction");
MTransaction mtrx = null;

//
BigDecimal overReceipt = BigDecimal.ZERO;
if (!isReversal())
{
if (oLine != null)
Expand All @@ -1368,21 +1364,25 @@ public String completeIt()
.subtract(oLine.getQtyDelivered());
if (toDelivered.signum() < 0) // IDEMPIERE-2889
toDelivered = Env.ZERO;
if (sLine.getMovementQty().compareTo(toDelivered) > 0)
overReceipt = sLine.getMovementQty().subtract(
toDelivered);
if (overReceipt.signum() != 0)
{
sLine.setQtyOverReceipt(overReceipt);
sLine.saveEx();
}
}
}
else

BigDecimal storageReservationToUpdate = sLine.getMovementQty();
if (oLine != null)
{
overReceipt = sLine.getQtyOverReceipt();
if (!isReversal())
{
if (storageReservationToUpdate.compareTo(oLine.getQtyReserved()) > 0)
storageReservationToUpdate = oLine.getQtyReserved();
}
else
{
BigDecimal tmp = storageReservationToUpdate.negate().add(oLine.getQtyReserved());
if (tmp.compareTo(oLine.getQtyOrdered()) > 0)
storageReservationToUpdate = oLine.getQtyOrdered().subtract(oLine.getQtyReserved());
}
}
BigDecimal orderedQtyToUpdate = sLine.getMovementQty().subtract(overReceipt);

//
if (sLine.getM_AttributeSetInstance_ID() == 0)
{
Expand Down Expand Up @@ -1421,7 +1421,8 @@ public String completeIt()
}
}

if (oLine!=null && mtrx!=null && oLine.getQtyOrdered().signum() >= 0)
if (oLine!=null && mtrx!=null &&
((!isReversal() && oLine.getQtyReserved().signum() > 0) || (isReversal() && oLine.getQtyOrdered().signum() > 0)))
{
if (sLine.getC_OrderLine_ID() != 0 && oLine.getM_Product_ID() > 0)
{
Expand All @@ -1436,7 +1437,7 @@ public String completeIt()
if (!MStorageReservation.add(getCtx(), oLine.getM_Warehouse_ID(),
oLine.getM_Product_ID(),
oLine.getM_AttributeSetInstance_ID(),
orderedQtyToUpdate.negate(),
storageReservationToUpdate.negate(),
isSOTrx(),
get_TrxName(), tracer))
{
Expand Down Expand Up @@ -1510,7 +1511,8 @@ public String completeIt()
m_processMsg = "Cannot correct Inventory OnHand [" + product.getValue() + "] - " + lastError;
return DocAction.STATUS_Invalid;
}
if (oLine!=null && oLine.getQtyOrdered().signum() > 0 && oLine.getM_Product_ID() > 0)
if (oLine!=null && oLine.getM_Product_ID() > 0 &&
((!isReversal() && oLine.getQtyReserved().signum() > 0) || (isReversal() && oLine.getQtyOrdered().signum() > 0)))
{
IReservationTracer tracer = null;
IReservationTracerFactory factory = Core.getReservationTracerFactory();
Expand All @@ -1523,7 +1525,7 @@ public String completeIt()
if (!MStorageReservation.add(getCtx(), oLine.getM_Warehouse_ID(),
oLine.getM_Product_ID(),
oLine.getM_AttributeSetInstance_ID(),
orderedQtyToUpdate.negate(), isSOTrx(), get_TrxName(), tracer))
storageReservationToUpdate.negate(), isSOTrx(), get_TrxName(), tracer))
{
m_processMsg = "Cannot correct Inventory Reserved " + (isSOTrx()? "Reserved [" :"Ordered [") + product.getValue() + "]";
return DocAction.STATUS_Invalid;
Expand All @@ -1549,7 +1551,7 @@ public String completeIt()
{
if (oLine.getQtyOrdered().signum() >= 0)
{
oLine.setQtyReserved(oLine.getQtyReserved().subtract(sLine.getMovementQty().subtract(sLine.getQtyOverReceipt())));
oLine.setQtyReserved(oLine.getQtyReserved().subtract(sLine.getMovementQty()));

if (oLine.getQtyReserved().signum() == -1)
oLine.setQtyReserved(Env.ZERO);
Expand Down Expand Up @@ -2312,7 +2314,6 @@ protected MInOut reverse(boolean accrual) {
MInOutLine rLine = rLines[i];
rLine.setQtyEntered(rLine.getQtyEntered().negate());
rLine.setMovementQty(rLine.getMovementQty().negate());
rLine.setQtyOverReceipt(rLine.getQtyOverReceipt().negate());
rLine.setM_AttributeSetInstance_ID(sLines[i].getM_AttributeSetInstance_ID());
// Goodwill: store original (voided/reversed) document line
rLine.setReversalLine_ID(sLines[i].getM_InOutLine_ID());
Expand Down
12 changes: 11 additions & 1 deletion org.adempiere.base/src/org/compiere/model/MOrder.java
Expand Up @@ -2003,14 +2003,24 @@ && getC_Payment_ID() == 0 && getC_CashLine_ID() == 0)
}
}

updateOverReceipt();

setProcessed(true);
m_processMsg = info.toString();
//
setDocAction(DOCACTION_Close);
return DocAction.STATUS_Completed;
} // completeIt


private void updateOverReceipt() {
for(MOrderLine line : m_lines) {
if (line.getM_Product_ID() <= 0) continue;
if (line.getQtyDelivered().signum() > 0 && line.getQtyOrdered().compareTo(line.getQtyDelivered()) >= 0) {
DB.executeUpdateEx("UPDATE M_InOutLine Set QtyOverReceipt=0 WHERE C_OrderLine_ID=? AND QtyOverReceipt>0",
new Object[] {line.getC_OrderLine_ID()}, get_TrxName());
}
}
}

protected String landedCostAllocation() {
MOrderLandedCost[] landedCosts = MOrderLandedCost.getOfOrder(getC_Order_ID(), get_TrxName());
Expand Down
22 changes: 1 addition & 21 deletions org.adempiere.base/src/org/compiere/model/X_M_InOutLine.java
Expand Up @@ -33,7 +33,7 @@ public class X_M_InOutLine extends PO implements I_M_InOutLine, I_Persistent
/**
*
*/
private static final long serialVersionUID = 20211106L;
private static final long serialVersionUID = 20211126L;

/** Standard Constructor */
public X_M_InOutLine (Properties ctx, int M_InOutLine_ID, String trxName)
Expand Down Expand Up @@ -742,26 +742,6 @@ public BigDecimal getQtyEntered ()
return bd;
}

/** Set Over Receipt.
@param QtyOverReceipt
Over Receipt Quantity
*/
public void setQtyOverReceipt (BigDecimal QtyOverReceipt)
{
set_Value (COLUMNNAME_QtyOverReceipt, QtyOverReceipt);
}

/** Get Over Receipt.
@return Over Receipt Quantity
*/
public BigDecimal getQtyOverReceipt ()
{
BigDecimal bd = (BigDecimal)get_Value(COLUMNNAME_QtyOverReceipt);
if (bd == null)
return Env.ZERO;
return bd;
}

/** Set Referenced Shipment Line.
@param Ref_InOutLine_ID Referenced Shipment Line */
public void setRef_InOutLine_ID (int Ref_InOutLine_ID)
Expand Down
13 changes: 11 additions & 2 deletions org.adempiere.ui/src/org/compiere/apps/form/Match.java
Expand Up @@ -487,14 +487,23 @@ protected boolean createMatchRecord (boolean invoice, int M_InOutLine_ID, int Li
{
// Update Order Line
MOrderLine oLine = new MOrderLine(Env.getCtx(), Line_ID, trxName);
BigDecimal storageReservationToUpdate = null;
if (oLine.get_ID() != 0) // other in MInOut.completeIt
{
storageReservationToUpdate = oLine.getQtyReserved();
oLine.setQtyReserved(oLine.getQtyReserved().subtract(qty));
if (oLine.getQtyReserved().signum() == -1)
oLine.setQtyReserved(Env.ZERO);
else if (oLine.getQtyDelivered().compareTo(oLine.getQtyOrdered()) > 0)
oLine.setQtyReserved(Env.ZERO);
oLine.saveEx();
storageReservationToUpdate = storageReservationToUpdate.subtract(oLine.getQtyReserved());
}

// Update Shipment Line
BigDecimal toDeliver = oLine.getQtyOrdered().subtract(oLine.getQtyDelivered());
if (toDeliver.signum() < 0)
toDeliver = Env.ZERO;
if (sLine.getMovementQty().compareTo(toDeliver) <= 0)
{
sLine.setC_OrderLine_ID(Line_ID);
Expand Down Expand Up @@ -525,7 +534,7 @@ else if (sLine.getC_OrderLine_ID() != 0)
{
success = true;
// Correct Ordered Qty for Stocked Products (see MOrder.reserveStock / MInOut.processIt)
if (oLine.get_ID() > 0 && oLine.getM_Product_ID() > 0 && oLine.getProduct().isStocked()) {
if (oLine.get_ID() > 0 && oLine.getM_Product_ID() > 0 && oLine.getProduct().isStocked() && storageReservationToUpdate != null) {
IReservationTracer tracer = null;
IReservationTracerFactory factory = Core.getReservationTracerFactory();
if (factory != null) {
Expand All @@ -537,7 +546,7 @@ else if (sLine.getC_OrderLine_ID() != 0)
success = MStorageReservation.add (Env.getCtx(), oLine.getM_Warehouse_ID(),
oLine.getM_Product_ID(),
oLine.getM_AttributeSetInstance_ID(),
qty.negate(), oLine.getParent().isSOTrx(), trxName, tracer);
storageReservationToUpdate.negate(), oLine.getParent().isSOTrx(), trxName, tracer);
}
}
}
Expand Down
Expand Up @@ -168,7 +168,7 @@ public void testMatShipmentPosting() {

info = MWorkflow.runDocumentActionWorkflow(delivery, DocAction.ACTION_Complete);
delivery.load(getTrxName());
assertFalse(info.isError());
assertFalse(info.isError(), info.getSummary());
assertEquals(DocAction.STATUS_Completed, delivery.getDocStatus());

if (!delivery.isPosted()) {
Expand Down

0 comments on commit 05447b3

Please sign in to comment.