IDEMPIERE-5039 Negative Lost Sales Quantity (#978)
* IDEMPIERE-5039 Negative Lost Sales Quantity * IDEMPIERE-5039 Negative Lost Sales Quantity * IDEMPIERE-5039 Negative Lost Sales Quantity add unit test
This commit is contained in:
parent
5c8b7ae6a8
commit
f4764b1411
|
@ -1725,9 +1725,8 @@ public class MOrder extends X_C_Order implements DocAction
|
||||||
}
|
}
|
||||||
// Binding
|
// Binding
|
||||||
BigDecimal target = binding ? line.getQtyOrdered() : Env.ZERO;
|
BigDecimal target = binding ? line.getQtyOrdered() : Env.ZERO;
|
||||||
BigDecimal difference = target
|
BigDecimal difference = target.compareTo(line.getQtyDelivered()) > 0 ? target.subtract(line.getQtyDelivered()) : Env.ZERO;
|
||||||
.subtract(line.getQtyReserved())
|
difference = difference.subtract(line.getQtyReserved());
|
||||||
.subtract(line.getQtyDelivered());
|
|
||||||
|
|
||||||
if (difference.signum() == 0 || line.getQtyOrdered().signum() < 0)
|
if (difference.signum() == 0 || line.getQtyOrdered().signum() < 0)
|
||||||
{
|
{
|
||||||
|
@ -2592,9 +2591,16 @@ public class MOrder extends X_C_Order implements DocAction
|
||||||
MOrderLine line = lines[i];
|
MOrderLine line = lines[i];
|
||||||
BigDecimal old = line.getQtyOrdered();
|
BigDecimal old = line.getQtyOrdered();
|
||||||
if (old.compareTo(line.getQtyDelivered()) != 0)
|
if (old.compareTo(line.getQtyDelivered()) != 0)
|
||||||
{
|
{
|
||||||
line.setQtyLostSales(line.getQtyOrdered().subtract(line.getQtyDelivered()));
|
if (line.getQtyOrdered().compareTo(line.getQtyDelivered()) > 0)
|
||||||
line.setQtyOrdered(line.getQtyDelivered());
|
{
|
||||||
|
line.setQtyLostSales(line.getQtyOrdered().subtract(line.getQtyDelivered()));
|
||||||
|
line.setQtyOrdered(line.getQtyDelivered());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
line.setQtyLostSales(Env.ZERO);
|
||||||
|
}
|
||||||
// QtyEntered unchanged
|
// QtyEntered unchanged
|
||||||
line.addDescription("Close (" + old + ")");
|
line.addDescription("Close (" + old + ")");
|
||||||
line.saveEx(get_TrxName());
|
line.saveEx(get_TrxName());
|
||||||
|
|
|
@ -869,5 +869,106 @@ public class SalesOrderTest extends AbstractTestCase {
|
||||||
assertTrue(log.getDeltaQty().intValue() == -1, "Delta quantity of MStorageReservationLog != -1 ("+log.getDeltaQty().toPlainString()+")");
|
assertTrue(log.getDeltaQty().intValue() == -1, "Delta quantity of MStorageReservationLog != -1 ("+log.getDeltaQty().toPlainString()+")");
|
||||||
reservation = MStorageReservation.get(Env.getCtx(), line1.getM_Warehouse_ID(), PRODUCT_AZALEA, 0, true, getTrxName());
|
reservation = MStorageReservation.get(Env.getCtx(), line1.getM_Warehouse_ID(), PRODUCT_AZALEA, 0, true, getTrxName());
|
||||||
assertTrue(log.getNewQty().equals(reservation.getQty()), "New Qty from MStorageReservationLog != Qty from MStorageReservation");
|
assertTrue(log.getNewQty().equals(reservation.getQty()), "New Qty from MStorageReservationLog != Qty from MStorageReservation");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testQtyLostSales() {
|
||||||
|
MOrder order = new MOrder(Env.getCtx(), 0, getTrxName());
|
||||||
|
order.setBPartner(MBPartner.get(Env.getCtx(), BP_JOE_BLOCK));
|
||||||
|
order.setC_DocTypeTarget_ID(MOrder.DocSubTypeSO_Standard);
|
||||||
|
order.setDeliveryRule(MOrder.DELIVERYRULE_CompleteOrder);
|
||||||
|
order.setDocStatus(DocAction.STATUS_Drafted);
|
||||||
|
order.setDocAction(DocAction.ACTION_Complete);
|
||||||
|
Timestamp today = TimeUtil.getDay(System.currentTimeMillis());
|
||||||
|
order.setDateOrdered(today);
|
||||||
|
order.setDatePromised(today);
|
||||||
|
order.saveEx();
|
||||||
|
|
||||||
|
MOrderLine line1 = new MOrderLine(order);
|
||||||
|
line1.setLine(10);
|
||||||
|
line1.setProduct(MProduct.get(Env.getCtx(), PRODUCT_AZALEA));
|
||||||
|
line1.setQty(new BigDecimal("1"));
|
||||||
|
line1.setDatePromised(today);
|
||||||
|
line1.saveEx();
|
||||||
|
|
||||||
|
ProcessInfo info = MWorkflow.runDocumentActionWorkflow(order, DocAction.ACTION_Complete);
|
||||||
|
assertFalse(info.isError());
|
||||||
|
order.load(getTrxName());
|
||||||
|
assertEquals(DocAction.STATUS_Completed, order.getDocStatus());
|
||||||
|
line1.load(getTrxName());
|
||||||
|
assertEquals(1, line1.getQtyReserved().intValue());
|
||||||
|
|
||||||
|
MInOut shipment = new MInOut(order, 120, order.getDateOrdered());
|
||||||
|
shipment.setDocStatus(DocAction.STATUS_Drafted);
|
||||||
|
shipment.setDocAction(DocAction.ACTION_Complete);
|
||||||
|
shipment.saveEx();
|
||||||
|
|
||||||
|
//over shipment
|
||||||
|
MInOutLine shipmentLine = new MInOutLine(shipment);
|
||||||
|
shipmentLine.setOrderLine(line1, 0, new BigDecimal("2"));
|
||||||
|
shipmentLine.setQty(new BigDecimal("2"));
|
||||||
|
shipmentLine.saveEx();
|
||||||
|
|
||||||
|
info = MWorkflow.runDocumentActionWorkflow(shipment, DocAction.ACTION_Complete);
|
||||||
|
assertFalse(info.isError());
|
||||||
|
shipment.load(getTrxName());
|
||||||
|
assertEquals(DocAction.STATUS_Completed, shipment.getDocStatus());
|
||||||
|
|
||||||
|
info = MWorkflow.runDocumentActionWorkflow(order, DocAction.ACTION_Close);
|
||||||
|
assertFalse(info.isError());
|
||||||
|
order.load(getTrxName());
|
||||||
|
assertEquals(DocAction.STATUS_Closed, order.getDocStatus());
|
||||||
|
line1.load(getTrxName());
|
||||||
|
assertEquals(0, line1.getQtyReserved().intValue());
|
||||||
|
assertEquals(0, line1.getQtyLostSales().intValue());
|
||||||
|
|
||||||
|
order = new MOrder(Env.getCtx(), 0, getTrxName());
|
||||||
|
order.setBPartner(MBPartner.get(Env.getCtx(), BP_JOE_BLOCK));
|
||||||
|
order.setC_DocTypeTarget_ID(MOrder.DocSubTypeSO_Standard);
|
||||||
|
order.setDeliveryRule(MOrder.DELIVERYRULE_CompleteOrder);
|
||||||
|
order.setDocStatus(DocAction.STATUS_Drafted);
|
||||||
|
order.setDocAction(DocAction.ACTION_Complete);
|
||||||
|
order.setDateOrdered(today);
|
||||||
|
order.setDatePromised(today);
|
||||||
|
order.saveEx();
|
||||||
|
|
||||||
|
line1 = new MOrderLine(order);
|
||||||
|
line1.setLine(10);
|
||||||
|
line1.setProduct(MProduct.get(Env.getCtx(), PRODUCT_AZALEA));
|
||||||
|
line1.setQty(new BigDecimal("2"));
|
||||||
|
line1.setDatePromised(today);
|
||||||
|
line1.saveEx();
|
||||||
|
|
||||||
|
info = MWorkflow.runDocumentActionWorkflow(order, DocAction.ACTION_Complete);
|
||||||
|
assertFalse(info.isError());
|
||||||
|
order.load(getTrxName());
|
||||||
|
assertEquals(DocAction.STATUS_Completed, order.getDocStatus());
|
||||||
|
line1.load(getTrxName());
|
||||||
|
assertEquals(2, line1.getQtyReserved().intValue());
|
||||||
|
|
||||||
|
shipment = new MInOut(order, 120, order.getDateOrdered());
|
||||||
|
shipment.setDocStatus(DocAction.STATUS_Drafted);
|
||||||
|
shipment.setDocAction(DocAction.ACTION_Complete);
|
||||||
|
shipment.saveEx();
|
||||||
|
|
||||||
|
//under shipment
|
||||||
|
shipmentLine = new MInOutLine(shipment);
|
||||||
|
shipmentLine.setOrderLine(line1, 0, new BigDecimal("1"));
|
||||||
|
shipmentLine.setQty(new BigDecimal("1"));
|
||||||
|
shipmentLine.saveEx();
|
||||||
|
|
||||||
|
info = MWorkflow.runDocumentActionWorkflow(shipment, DocAction.ACTION_Complete);
|
||||||
|
assertFalse(info.isError());
|
||||||
|
shipment.load(getTrxName());
|
||||||
|
assertEquals(DocAction.STATUS_Completed, shipment.getDocStatus());
|
||||||
|
|
||||||
|
info = MWorkflow.runDocumentActionWorkflow(order, DocAction.ACTION_Close);
|
||||||
|
assertFalse(info.isError());
|
||||||
|
order.load(getTrxName());
|
||||||
|
assertEquals(DocAction.STATUS_Closed, order.getDocStatus());
|
||||||
|
line1.load(getTrxName());
|
||||||
|
assertEquals(0, line1.getQtyReserved().intValue());
|
||||||
|
assertEquals(1, line1.getQtyLostSales().intValue());
|
||||||
|
assertEquals(line1.getQtyDelivered().intValue(), line1.getQtyOrdered().intValue());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue