From 8856dbc9c13ed120cf4fc003ad87e8333df46c10 Mon Sep 17 00:00:00 2001 From: EDSONZ-WASSWA Date: Fri, 20 Mar 2026 13:32:13 +0300 Subject: [PATCH] BillLineItems should have its own BillLineItemStatus --- .../advice/GenerateBillFromOrderAdvice.java | 9 ++++-- .../OrderCreationMethodBeforeAdvice.java | 3 +- .../module/billing/api/model/Bill.java | 2 +- .../billing/api/model/BillLineItem.java | 7 ++--- .../billing/api/model/BillLineItemStatus.java | 28 +++++++++++++++++++ api/src/main/resources/Bill.hbm.xml | 2 +- .../module/billing/api/model/BillTest.java | 8 +++--- .../billing/impl/BillServiceImplTest.java | 9 +++--- omod/src/main/resources/liquibase.xml | 14 ++++++++++ 9 files changed, 64 insertions(+), 18 deletions(-) create mode 100644 api/src/main/java/org/openmrs/module/billing/api/model/BillLineItemStatus.java diff --git a/api/src/main/java/org/openmrs/module/billing/advice/GenerateBillFromOrderAdvice.java b/api/src/main/java/org/openmrs/module/billing/advice/GenerateBillFromOrderAdvice.java index 14434572..b50b78ec 100644 --- a/api/src/main/java/org/openmrs/module/billing/advice/GenerateBillFromOrderAdvice.java +++ b/api/src/main/java/org/openmrs/module/billing/advice/GenerateBillFromOrderAdvice.java @@ -19,6 +19,7 @@ import org.openmrs.module.billing.api.model.Bill; import org.openmrs.module.billing.api.model.BillExemption; import org.openmrs.module.billing.api.model.BillLineItem; +import org.openmrs.module.billing.api.model.BillLineItemStatus; import org.openmrs.module.billing.api.model.BillStatus; import org.openmrs.module.billing.api.model.BillableService; import org.openmrs.module.billing.api.model.BillableServiceStatus; @@ -85,7 +86,8 @@ public void afterReturning(Object returnValue, Method method, Object[] args, Obj if (!stockItems.isEmpty()) { // check from the list for all exemptions boolean isExempted = checkIfOrderIsExempted(workflowService, order, ExemptionType.COMMODITY); - BillStatus lineItemStatus = isExempted ? BillStatus.EXEMPTED : BillStatus.PENDING; + BillLineItemStatus lineItemStatus = isExempted ? BillLineItemStatus.EXEMPTED + : BillLineItemStatus.PENDING; addBillItemToBill(order, patient, cashierUUID, stockItems.get(0), null, (int) drugQuantity, order.getDateActivated(), lineItemStatus); } @@ -99,7 +101,8 @@ public void afterReturning(Object returnValue, Method method, Object[] args, Obj List searchResult = service.getBillableServices(searchTemplate, null); if (!searchResult.isEmpty()) { boolean isExempted = checkIfOrderIsExempted(workflowService, order, ExemptionType.SERVICE); - BillStatus lineItemStatus = isExempted ? BillStatus.EXEMPTED : BillStatus.PENDING; + BillLineItemStatus lineItemStatus = isExempted ? BillLineItemStatus.EXEMPTED + : BillLineItemStatus.PENDING; addBillItemToBill(order, patient, cashierUUID, null, searchResult.get(0), 1, order.getDateActivated(), lineItemStatus); } @@ -168,7 +171,7 @@ private Map buildVariablesMap(Order order, ProgramWorkflowServic * @param cashierUUID */ public void addBillItemToBill(Order order, Patient patient, String cashierUUID, StockItem stockitem, - BillableService service, Integer quantity, Date orderDate, BillStatus lineItemStatus) { + BillableService service, Integer quantity, Date orderDate, BillLineItemStatus lineItemStatus) { try { // Search for a bill Bill activeBill = new Bill(); diff --git a/api/src/main/java/org/openmrs/module/billing/advice/OrderCreationMethodBeforeAdvice.java b/api/src/main/java/org/openmrs/module/billing/advice/OrderCreationMethodBeforeAdvice.java index 3338dcd3..d3109858 100644 --- a/api/src/main/java/org/openmrs/module/billing/advice/OrderCreationMethodBeforeAdvice.java +++ b/api/src/main/java/org/openmrs/module/billing/advice/OrderCreationMethodBeforeAdvice.java @@ -37,6 +37,7 @@ import org.openmrs.module.billing.api.ItemPriceService; import org.openmrs.module.billing.api.model.Bill; import org.openmrs.module.billing.api.model.BillLineItem; +import org.openmrs.module.billing.api.model.BillLineItemStatus; import org.openmrs.module.billing.api.model.BillStatus; import org.openmrs.module.billing.api.model.BillableService; import org.openmrs.module.billing.api.model.BillableServiceStatus; @@ -141,7 +142,7 @@ public void addBillItemToBill(Order order, Patient patient, String cashierUUID, billLineItem.setPrice(new BigDecimal("0.0")); } billLineItem.setQuantity(quantity); - billLineItem.setPaymentStatus(BillStatus.PENDING); + billLineItem.setPaymentStatus(BillLineItemStatus.PENDING); billLineItem.setLineItemOrder(0); // Bill diff --git a/api/src/main/java/org/openmrs/module/billing/api/model/Bill.java b/api/src/main/java/org/openmrs/module/billing/api/model/Bill.java index bf65b11b..74513597 100644 --- a/api/src/main/java/org/openmrs/module/billing/api/model/Bill.java +++ b/api/src/main/java/org/openmrs/module/billing/api/model/Bill.java @@ -177,7 +177,7 @@ public void synchronizeBillStatus() { if (this.lineItems != null) { for (BillLineItem lineItem : this.lineItems) { if (lineItem != null && !lineItem.getVoided()) { - lineItem.setPaymentStatus(BillStatus.PAID); + lineItem.setPaymentStatus(BillLineItemStatus.PAID); } } } diff --git a/api/src/main/java/org/openmrs/module/billing/api/model/BillLineItem.java b/api/src/main/java/org/openmrs/module/billing/api/model/BillLineItem.java index e78994c4..3ca48d4a 100644 --- a/api/src/main/java/org/openmrs/module/billing/api/model/BillLineItem.java +++ b/api/src/main/java/org/openmrs/module/billing/api/model/BillLineItem.java @@ -45,8 +45,7 @@ public class BillLineItem extends BaseChangeableOpenmrsData { private Integer lineItemOrder; - private BillStatus paymentStatus; // this should only be set to either - // pending or paid + private BillLineItemStatus paymentStatus; private Order order; @@ -133,11 +132,11 @@ public void setLineItemOrder(Integer lineItemOrder) { this.lineItemOrder = lineItemOrder; } - public BillStatus getPaymentStatus() { + public BillLineItemStatus getPaymentStatus() { return paymentStatus; } - public void setPaymentStatus(BillStatus paymentStatus) { + public void setPaymentStatus(BillLineItemStatus paymentStatus) { this.paymentStatus = paymentStatus; } diff --git a/api/src/main/java/org/openmrs/module/billing/api/model/BillLineItemStatus.java b/api/src/main/java/org/openmrs/module/billing/api/model/BillLineItemStatus.java new file mode 100644 index 00000000..c4bbecc7 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/billing/api/model/BillLineItemStatus.java @@ -0,0 +1,28 @@ +/* + * The contents of this file are subject to the OpenMRS Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://license.openmrs.org + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * + * Copyright (C) OpenMRS, LLC. All Rights Reserved. + */ + + +package org.openmrs.module.billing.api.model; + +/** + * The allowable statuses that a {@link BillLineItem} can have. + */ +public enum BillLineItemStatus { + + PENDING(), + PAID(), + CANCELLED(), + ADJUSTED(), + EXEMPTED(); +} diff --git a/api/src/main/resources/Bill.hbm.xml b/api/src/main/resources/Bill.hbm.xml index dd88092c..6a99db11 100644 --- a/api/src/main/resources/Bill.hbm.xml +++ b/api/src/main/resources/Bill.hbm.xml @@ -163,7 +163,7 @@ - org.openmrs.module.billing.api.model.BillStatus + org.openmrs.module.billing.api.model.BillLineItemStatus 12 diff --git a/api/src/test/java/org/openmrs/module/billing/api/model/BillTest.java b/api/src/test/java/org/openmrs/module/billing/api/model/BillTest.java index 17a1240a..a1cf9ec6 100644 --- a/api/src/test/java/org/openmrs/module/billing/api/model/BillTest.java +++ b/api/src/test/java/org/openmrs/module/billing/api/model/BillTest.java @@ -121,7 +121,7 @@ public void synchronizeBillStatus_shouldUpdateStatusToPaidWhenFullyPaid() { bill.synchronizeBillStatus(); assertEquals(BillStatus.PAID, bill.getStatus()); - assertEquals(BillStatus.PAID, lineItem.getPaymentStatus()); + assertEquals(BillLineItemStatus.PAID, lineItem.getPaymentStatus()); } @Test @@ -177,7 +177,7 @@ public void synchronizeBillStatus_shouldUpdateStatusToPaidAfterVoidingLineItems( bill.synchronizeBillStatus(); assertEquals(BillStatus.PAID, bill.getStatus()); // Only non-voided line items should be set to PAID - assertEquals(BillStatus.PAID, lineItem1.getPaymentStatus()); + assertEquals(BillLineItemStatus.PAID, lineItem1.getPaymentStatus()); } @Test @@ -212,8 +212,8 @@ public void synchronizeBillStatus_shouldUpdateAllNonVoidedLineItemsToPaidWhenBil bill.synchronizeBillStatus(); assertEquals(BillStatus.PAID, bill.getStatus()); - assertEquals(BillStatus.PAID, lineItem1.getPaymentStatus()); - assertEquals(BillStatus.PAID, lineItem2.getPaymentStatus()); + assertEquals(BillLineItemStatus.PAID, lineItem1.getPaymentStatus()); + assertEquals(BillLineItemStatus.PAID, lineItem2.getPaymentStatus()); // Voided line items should not be updated assertNull(voidedLineItem.getPaymentStatus()); } diff --git a/api/src/test/java/org/openmrs/module/billing/impl/BillServiceImplTest.java b/api/src/test/java/org/openmrs/module/billing/impl/BillServiceImplTest.java index aa8b62ef..f5ae9410 100644 --- a/api/src/test/java/org/openmrs/module/billing/impl/BillServiceImplTest.java +++ b/api/src/test/java/org/openmrs/module/billing/impl/BillServiceImplTest.java @@ -33,6 +33,7 @@ import org.openmrs.module.billing.api.base.PagingInfo; import org.openmrs.module.billing.api.model.Bill; import org.openmrs.module.billing.api.model.BillLineItem; +import org.openmrs.module.billing.api.model.BillLineItemStatus; import org.openmrs.module.billing.api.model.BillStatus; import org.openmrs.module.billing.api.model.Payment; import org.openmrs.module.billing.api.model.PaymentMode; @@ -148,7 +149,7 @@ public void saveBill_shouldCreateNewBillWithNewItem() { StockItem stockItem = existingItem.getItem(); BillLineItem lineItem = newBill.addLineItem(stockItem, BigDecimal.valueOf(150), "New price", 2); - lineItem.setPaymentStatus(BillStatus.PENDING); + lineItem.setPaymentStatus(BillLineItemStatus.PENDING); lineItem.setUuid(UUID.randomUUID().toString()); Bill savedBill = billService.saveBill(newBill); @@ -227,7 +228,7 @@ public void saveBill_shouldAllowAddingLineItemsToPendingBill() { BillLineItem newLineItem = new BillLineItem(); newLineItem.setPrice(BigDecimal.valueOf(25.50)); newLineItem.setQuantity(2); - newLineItem.setPaymentStatus(BillStatus.PENDING); + newLineItem.setPaymentStatus(BillLineItemStatus.PENDING); newLineItem.setLineItemOrder(pendingBill.getLineItems().size()); pendingBill.addLineItem(newLineItem); @@ -251,7 +252,7 @@ public void saveBill_shouldThrowExceptionWhenAddingLineItemsToPaidBill() { BillLineItem newLineItem = new BillLineItem(); newLineItem.setPrice(BigDecimal.valueOf(25.50)); newLineItem.setQuantity(2); - newLineItem.setPaymentStatus(BillStatus.PENDING); + newLineItem.setPaymentStatus(BillLineItemStatus.PENDING); paidBill.addLineItem(newLineItem); // Should throw exception when saving (BillValidator catches line item @@ -481,7 +482,7 @@ public void saveBill_shouldGenerateReceiptNumberWhenNotProvided() { Bill templateBill = billService.getBill(0); BillLineItem existingItem = templateBill.getLineItems().get(0); BillLineItem lineItem = newBill.addLineItem(existingItem.getItem(), BigDecimal.valueOf(100), "Test price", 1); - lineItem.setPaymentStatus(BillStatus.PENDING); + lineItem.setPaymentStatus(BillLineItemStatus.PENDING); lineItem.setUuid(UUID.randomUUID().toString()); Bill savedBill = billService.saveBill(newBill); diff --git a/omod/src/main/resources/liquibase.xml b/omod/src/main/resources/liquibase.xml index 118d17c3..f8a1591b 100644 --- a/omod/src/main/resources/liquibase.xml +++ b/omod/src/main/resources/liquibase.xml @@ -1095,4 +1095,18 @@ baseTableName="bill_exemption_rule" baseColumnNames="voided_by" referencedTableName="users" referencedColumnNames="user_id"/> + + + + SELECT CASE WHEN EXISTS ( + SELECT 1 FROM cashier_bill_line_item WHERE payment_status = 'POSTED' + ) THEN 1 ELSE 0 END + + + + UPDATE cashier_bill_line_item + SET payment_status = 'PENDING' + WHERE payment_status = 'POSTED' + + \ No newline at end of file