cancel
Showing results for 
Search instead for 
Did you mean: 

Add SalesItem with negative quantity

haythem_jaidi
Participant
0 Kudos

Hi,

I have a scenario to implement: The Cashier will buy an article.

For that a SalesItem with a négative quantity should be added to the Receipt.

I was able to add a SalesItem with positive quantity but not with a negative one: The Item was added with an error message "Quantity must be positive".

While if I do it manually the négative quantity is accepted.

I think it is considered as a Customer Return:

How can I achieve this programmatically?

Here is my Java Code:

        CDBSession session = CDBSessionFactory.instance.createSession();
        ReceiptManager receiptManager = new ReceiptManager(session);
        MaterialManager materialManager = new MaterialManager(session);

        ReceiptEntity receipt = receiptManager.findOrCreate(UserRegistry.INSTANCE.getCurrentUser(), null, false);

        MaterialEntity material = materialManager.readMaterialByExternalID(ExternalId);
        SalesItemEntity sie = EntityFactory.INSTANCE.createSalesItemEntity( material, material.getDescription(),new BigDecimal(price), new BigDecimal(-1), "Manual");


        receiptManager.addSalesItems(receipt, sie, true);
        receiptManager.calculate(receipt, BaseEntity.EntityActions.UPDATE);
        receiptManager.update(receipt);
        BroadcasterHolder.INSTANCE.getBroadcaster().broadcastPluginEventForPath("RECEIPT_REFRESH", null);

Best Regards

Accepted Solutions (0)

Answers (1)

Answers (1)

haythem_jaidi
Participant
0 Kudos

Hi,

I was able to add a return SalesItem but I think I am not using right way since I have 2 items added using the below code:

CDBSession session = CDBSessionFactory.instance.createSession();
ReceiptManager receiptManager = new ReceiptManager(session);
MaterialManager materialManager = new MaterialManager(session);

ReceiptEntity receipt = receiptManager.findOrCreate(UserRegistry.INSTANCE.getCurrentUser(), null, false);

MaterialEntity material = materialManager.readMaterialByExternalID(ExternalId);//"I00002098");
SalesItemEntity sie = EntityFactory.INSTANCE.createSalesItemEntity( material, material.getDescription(),new BigDecimal(price), new BigDecimal(1), "Manual");

ReturnSalesItemPosService returnSalesItemPosService = ServiceFactory.INSTANCE.getOrCreateServiceInstance(ReturnSalesItemPosService.class, session);

receiptManager.addSalesItems(receipt, sie);

try {
    returnSalesItemPosService.returnSalesItemInSameReceipt(receipt, sie, new BigDecimal(-1), "1", "01", true);
} catch (ValidationException e) {
    throw new RuntimeException(e);
}

receiptManager.calculate(receipt, BaseEntity.EntityActions.UPDATE);
receiptManager.update(receipt);

BroadcasterHolder.INSTANCE.getBroadcaster().broadcastPluginEventForPath("RECEIPT_REFRESH", null);<br>

I added this code to be precise:

ReturnSalesItemPosService returnSalesItemPosService = ServiceFactory.INSTANCE.getOrCreateServiceInstance(ReturnSalesItemPosService.class, session);

receiptManager.addSalesItems(receipt, sie);

try {
    returnSalesItemPosService.returnSalesItemInSameReceipt(receipt, sie, new BigDecimal(-1), "1", "01", true);
} catch (ValidationException e) {
    throw new RuntimeException(e);
}<br>

I am not getting the right behavior since I have 2 items added to the receipt as below:

When I remove the addSalesItems instruction below an exception is raised:

receiptManager.addSalesItems(receipt, sie);<br>

Here is the exception:

2023-11-08 14:41:12,609 [Atmosphere-Shared-57] ERROR com.sap.scco.ap.pos.service.impl.ReturnSalesItemPosServiceImpl - Unexpected exception in receipt calculation
java.lang.NullPointerException: Cannot invoke "com.sap.scco.ap.pos.entity.ReceiptEntity.getLastExternalId()" because "receipt" is null
        at com.sap.scco.ap.pos.service.util.ReceiptPosServiceUtil.generateExternalId(ReceiptPosServiceUtil.java:108)
        at com.sap.scco.ap.pos.service.impl.SalesItemPosServiceImpl.createCancellationSalesItemForInternalReceipt_aroundBody40(SalesItemPosServiceImpl.java:351)
        at com.sap.scco.ap.pos.service.impl.SalesItemPosServiceImpl.createCancellationSalesItemForInternalReceipt_aroundBody41$advice(SalesItemPosServiceImpl.java:31)
        at com.sap.scco.ap.pos.service.impl.SalesItemPosServiceImpl.createCancellationSalesItemForInternalReceipt(SalesItemPosServiceImpl.java:1)
        at com.sap.scco.ap.pos.service.impl.SalesItemPosServiceImpl.createCancellationSalesItem_aroundBody38(SalesItemPosServiceImpl.java:331)
        at com.sap.scco.ap.pos.service.impl.SalesItemPosServiceImpl.createCancellationSalesItem_aroundBody39$advice(SalesItemPosServiceImpl.java:31)
        at com.sap.scco.ap.pos.service.impl.SalesItemPosServiceImpl.createCancellationSalesItem(SalesItemPosServiceImpl.java:1)
        at com.sap.scco.ap.pos.service.impl.ReturnSalesItemPosServiceImpl.handleCreateNewCancellationSalesItem_aroundBody36(ReturnSalesItemPosServiceImpl.java:358)
        at com.sap.scco.ap.pos.service.impl.ReturnSalesItemPosServiceImpl.handleCreateNewCancellationSalesItem_aroundBody37$advice(ReturnSalesItemPosServiceImpl.java:31)
        at com.sap.scco.ap.pos.service.impl.ReturnSalesItemPosServiceImpl.handleCreateNewCancellationSalesItem(ReturnSalesItemPosServiceImpl.java:1)
        at com.sap.scco.ap.pos.service.impl.ReturnSalesItemPosServiceImpl.returnSalesItemInSameReceipt_aroundBody2(ReturnSalesItemPosServiceImpl.java:156)
        at com.sap.scco.ap.pos.service.impl.ReturnSalesItemPosServiceImpl.returnSalesItemInSameReceipt_aroundBody3$advice(ReturnSalesItemPosServiceImpl.java:69)
        at com.sap.scco.ap.pos.service.impl.ReturnSalesItemPosServiceImpl.returnSalesItemInSameReceipt_aroundBody4(ReturnSalesItemPosServiceImpl.java:1)
        at com.sap.scco.ap.pos.service.impl.ReturnSalesItemPosServiceImpl.returnSalesItemInSameReceipt_aroundBody5$advice(ReturnSalesItemPosServiceImpl.java:31)
        at com.sap.scco.ap.pos.service.impl.ReturnSalesItemPosServiceImpl.returnSalesItemInSameReceipt(ReturnSalesItemPosServiceImpl.java:1)<br>

Thx