From 8c4d8f0ab081a1b35aab2361de99c7fd5d26aec9 Mon Sep 17 00:00:00 2001 From: buddhika75 Date: Wed, 17 Jul 2024 01:34:57 +0530 Subject: [PATCH 01/18] Signed-off-by: buddhika75 --- nb-configuration.xml | 1 + pom.xml | 4 ++-- .../divudi/bean/channel/BookingControllerViewScope.java | 2 +- .../java/com/divudi/bean/common/WebUserController.java | 2 +- src/main/resources/META-INF/persistence.xml | 4 ++-- src/main/webapp/WEB-INF/glassfish-web.xml | 2 +- src/main/webapp/channel/channel_nurse_view.xhtml | 2 +- .../webapp/channel/channel_views/channel_nurse_view.xhtml | 4 ++-- src/main/webapp/opd/opd_bill.xhtml | 3 +-- src/main/webapp/resources/bill/staffBill_1.xhtml | 8 ++++++++ 10 files changed, 20 insertions(+), 12 deletions(-) diff --git a/nb-configuration.xml b/nb-configuration.xml index 63482369af..ef71acbe24 100644 --- a/nb-configuration.xml +++ b/nb-configuration.xml @@ -15,5 +15,6 @@ That way multiple projects can share the same settings (useful for formatting ru Any value defined here will override the pom.xml file value but is only applicable to the current project. --> ide + none diff --git a/pom.xml b/pom.xml index 66d989b800..df84157960 100644 --- a/pom.xml +++ b/pom.xml @@ -2,10 +2,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.divudi - demo1 + sethma 3.0.0 war - demo1 + sethma ${project.build.directory}/endorsed diff --git a/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java b/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java index 6c12efde21..2ee5b21b61 100644 --- a/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java +++ b/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java @@ -407,7 +407,7 @@ public void sendSmsOnChannelBookingReschedule() { private String createChanelBookingRescheduleSms(Bill b, BillSession s) { // String template = sessionController.getDepartmentPreference().getSmsTemplateForChannelBooking(); - String template = configOptionController.getLongTextValueByKey("Template for SMS sent on Patient Feedback", OptionScope.APPLICATION, null, null, null); + String template = configOptionController.getLongTextValueByKey("Template for SMS sent on Booking Rescheduled", OptionScope.APPLICATION, null, null, null); if (template == null || template.isEmpty()) { template = "Dear {patient_name}, Your appointment No. {serial_no} with {doctor} is rescheduled to appointment No. {new_serial_no} with {new_doctor} on {new_appointment_date} at {new_appointment_time} . {ins_name}"; } diff --git a/src/main/java/com/divudi/bean/common/WebUserController.java b/src/main/java/com/divudi/bean/common/WebUserController.java index 0624f100f3..d43b5ea021 100644 --- a/src/main/java/com/divudi/bean/common/WebUserController.java +++ b/src/main/java/com/divudi/bean/common/WebUserController.java @@ -141,7 +141,7 @@ public class WebUserController implements Serializable { private LoginPage loginPage; - boolean grantAllPrivilegesToAllUsersForTesting = true; + boolean grantAllPrivilegesToAllUsersForTesting = false; private List userNotifications; private int userNotificationCount; diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index 5c09324a9e..82d8488908 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -2,7 +2,7 @@ org.eclipse.persistence.jpa.PersistenceProvider - jdbc/demos + jdbc/sethma false @@ -11,7 +11,7 @@ - jdbc/demos + jdbc/sethmaAudit com.divudi.entity.AuditEvent true diff --git a/src/main/webapp/WEB-INF/glassfish-web.xml b/src/main/webapp/WEB-INF/glassfish-web.xml index 9097c2b50d..2ef047d83a 100644 --- a/src/main/webapp/WEB-INF/glassfish-web.xml +++ b/src/main/webapp/WEB-INF/glassfish-web.xml @@ -1,7 +1,7 @@ - /demo1 + /sethma diff --git a/src/main/webapp/channel/channel_nurse_view.xhtml b/src/main/webapp/channel/channel_nurse_view.xhtml index b5a4dfa092..068abb5f2c 100644 --- a/src/main/webapp/channel/channel_nurse_view.xhtml +++ b/src/main/webapp/channel/channel_nurse_view.xhtml @@ -115,7 +115,7 @@ - + diff --git a/src/main/webapp/channel/channel_views/channel_nurse_view.xhtml b/src/main/webapp/channel/channel_views/channel_nurse_view.xhtml index a2dfa2d6bc..64e849002e 100644 --- a/src/main/webapp/channel/channel_views/channel_nurse_view.xhtml +++ b/src/main/webapp/channel/channel_views/channel_nurse_view.xhtml @@ -112,8 +112,8 @@ - - + + ide + none diff --git a/pom.xml b/pom.xml index 66d989b800..df84157960 100644 --- a/pom.xml +++ b/pom.xml @@ -2,10 +2,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.divudi - demo1 + sethma 3.0.0 war - demo1 + sethma ${project.build.directory}/endorsed diff --git a/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java b/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java index 6c12efde21..2ee5b21b61 100644 --- a/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java +++ b/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java @@ -407,7 +407,7 @@ public void sendSmsOnChannelBookingReschedule() { private String createChanelBookingRescheduleSms(Bill b, BillSession s) { // String template = sessionController.getDepartmentPreference().getSmsTemplateForChannelBooking(); - String template = configOptionController.getLongTextValueByKey("Template for SMS sent on Patient Feedback", OptionScope.APPLICATION, null, null, null); + String template = configOptionController.getLongTextValueByKey("Template for SMS sent on Booking Rescheduled", OptionScope.APPLICATION, null, null, null); if (template == null || template.isEmpty()) { template = "Dear {patient_name}, Your appointment No. {serial_no} with {doctor} is rescheduled to appointment No. {new_serial_no} with {new_doctor} on {new_appointment_date} at {new_appointment_time} . {ins_name}"; } diff --git a/src/main/java/com/divudi/bean/common/WebUserController.java b/src/main/java/com/divudi/bean/common/WebUserController.java index 0624f100f3..d43b5ea021 100644 --- a/src/main/java/com/divudi/bean/common/WebUserController.java +++ b/src/main/java/com/divudi/bean/common/WebUserController.java @@ -141,7 +141,7 @@ public class WebUserController implements Serializable { private LoginPage loginPage; - boolean grantAllPrivilegesToAllUsersForTesting = true; + boolean grantAllPrivilegesToAllUsersForTesting = false; private List userNotifications; private int userNotificationCount; diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index 5c09324a9e..82d8488908 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -2,7 +2,7 @@ org.eclipse.persistence.jpa.PersistenceProvider - jdbc/demos + jdbc/sethma false @@ -11,7 +11,7 @@ - jdbc/demos + jdbc/sethmaAudit com.divudi.entity.AuditEvent true diff --git a/src/main/webapp/WEB-INF/glassfish-web.xml b/src/main/webapp/WEB-INF/glassfish-web.xml index 9097c2b50d..2ef047d83a 100644 --- a/src/main/webapp/WEB-INF/glassfish-web.xml +++ b/src/main/webapp/WEB-INF/glassfish-web.xml @@ -1,7 +1,7 @@ - /demo1 + /sethma diff --git a/src/main/webapp/channel/channel_nurse_view.xhtml b/src/main/webapp/channel/channel_nurse_view.xhtml index b5a4dfa092..068abb5f2c 100644 --- a/src/main/webapp/channel/channel_nurse_view.xhtml +++ b/src/main/webapp/channel/channel_nurse_view.xhtml @@ -115,7 +115,7 @@ - + diff --git a/src/main/webapp/channel/channel_views/channel_nurse_view.xhtml b/src/main/webapp/channel/channel_views/channel_nurse_view.xhtml index a2dfa2d6bc..64e849002e 100644 --- a/src/main/webapp/channel/channel_views/channel_nurse_view.xhtml +++ b/src/main/webapp/channel/channel_views/channel_nurse_view.xhtml @@ -112,8 +112,8 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 63772e043ce2efdb1ee516ae141eaf099861e9b7 Mon Sep 17 00:00:00 2001 From: buddhika75 Date: Thu, 18 Jul 2024 06:02:29 +0530 Subject: [PATCH 04/18] Signed-off-by: buddhika75 --- .../FinancialTransactionController.java | 50 ++- .../analytics/ReportTemplateController.java | 377 ++++++++++++++++-- .../com/divudi/data/ReportTemplateRow.java | 26 ++ .../data/analytics/ReportTemplateFilter.java | 5 +- .../data/analytics/ReportTemplateType.java | 11 +- src/main/resources/META-INF/persistence.xml | 2 +- src/main/webapp/dataAdmin/report.xhtml | 110 +++-- .../dataAdmin/report_template_list.xhtml | 2 +- ...bill_fee_grouped_by_atomic_bill_type.xhtml | 30 ++ ...y_bill_type_atomic_and_to_department.xhtml | 39 ++ .../report_item_cateroy_value.xhtml | 30 ++ 11 files changed, 606 insertions(+), 76 deletions(-) create mode 100644 src/main/webapp/resources/ezcomp/report_templates/report_bill_fee_grouped_by_atomic_bill_type.xhtml create mode 100644 src/main/webapp/resources/ezcomp/report_templates/report_bill_fee_grouped_by_category_bill_type_atomic_and_to_department.xhtml create mode 100644 src/main/webapp/resources/ezcomp/report_templates/report_item_cateroy_value.xhtml diff --git a/src/main/java/com/divudi/bean/cashTransaction/FinancialTransactionController.java b/src/main/java/com/divudi/bean/cashTransaction/FinancialTransactionController.java index 6ef7ccc4bc..38ab116388 100644 --- a/src/main/java/com/divudi/bean/cashTransaction/FinancialTransactionController.java +++ b/src/main/java/com/divudi/bean/cashTransaction/FinancialTransactionController.java @@ -565,35 +565,67 @@ public void processDayEndSummary() { private void createPaymentSummery() { System.out.println("createPaymentSummery"); System.out.println("paymentsFromShiftSratToNow = " + paymentsFromShiftSratToNow); + if (paymentsFromShiftSratToNow == null) { return; } + paymentSummaryBundle = new ReportTemplateRowBundle(); Map aggregatedPayments = new HashMap<>(); Map keyMap = new HashMap<>(); for (Payment p : paymentsFromShiftSratToNow) { System.out.println("p = " + p); + + if (p == null || p.getBill() == null) { + continue; // Skip this iteration if p or p.getBill() is null + } + ReportTemplateRow row = new ReportTemplateRow(); - row.setCategory(p.getBill().getCategory()); - row.setBillTypeAtomic(p.getBill().getBillTypeAtomic()); - row.setCreditCompany(p.getBill().getCreditCompany()); - row.setToDepartment(p.getBill().getToDepartment()); - row.setServiceType(p.getBill().getBillTypeAtomic().getServiceType()); + + if (p.getBill().getCategory() != null) { + row.setCategory(p.getBill().getCategory()); + } + + if (p.getBill().getBillTypeAtomic() != null) { + row.setBillTypeAtomic(p.getBill().getBillTypeAtomic()); + + if (p.getBill().getBillTypeAtomic().getServiceType() != null) { + row.setServiceType(p.getBill().getBillTypeAtomic().getServiceType()); + } + } + + if (p.getBill().getCreditCompany() != null) { + row.setCreditCompany(p.getBill().getCreditCompany()); + } + + if (p.getBill().getToDepartment() != null) { + row.setToDepartment(p.getBill().getToDepartment()); + } + row.setRowValue(p.getPaidValue()); String keyString = row.getCustomKey(); - keyMap.putIfAbsent(keyString, row); - aggregatedPayments.merge(keyString, p.getPaidValue(), Double::sum); + + if (keyString != null) { + keyMap.putIfAbsent(keyString, row); + aggregatedPayments.merge(keyString, p.getPaidValue(), Double::sum); + } } List rows = aggregatedPayments.entrySet().stream().map(entry -> { ReportTemplateRow row = keyMap.get(entry.getKey()); - row.setRowValue(entry.getValue()); + + if (row != null) { + row.setRowValue(entry.getValue()); + } + return row; }).collect(Collectors.toList()); - paymentSummaryBundle.getReportTemplateRows().addAll(rows); + if (paymentSummaryBundle != null) { + paymentSummaryBundle.getReportTemplateRows().addAll(rows); + } } public String navigateToCreateShiftEndSummaryBillByBills() { diff --git a/src/main/java/com/divudi/bean/channel/analytics/ReportTemplateController.java b/src/main/java/com/divudi/bean/channel/analytics/ReportTemplateController.java index 720524cdec..6960e9f250 100644 --- a/src/main/java/com/divudi/bean/channel/analytics/ReportTemplateController.java +++ b/src/main/java/com/divudi/bean/channel/analytics/ReportTemplateController.java @@ -40,6 +40,7 @@ import javax.faces.convert.FacesConverter; import javax.inject.Inject; import javax.inject.Named; +import javax.persistence.TemporalType; /** * @@ -62,6 +63,7 @@ public class ReportTemplateController implements Serializable { private Date fromDate; private Date toDate; private Institution institution; + private Institution creditCompany; private Department department; private Institution fromInstitution; private Department fromDepartment; @@ -69,7 +71,7 @@ public class ReportTemplateController implements Serializable { private Department toDepartment; private WebUser user; private Staff staff; - + private List ReportTemplateRows; private ReportTemplateRowBundle reportTemplateRowBundle; @@ -146,6 +148,9 @@ public String processReport() { case BILLT_TYPE_AND_PAYMENT_METHOD_SUMMARY_USING_BILLS: handleBillTypeAndPaymentMethodSummaryUsingBills(); break; + case BILL_TYPE_ATOMIC_SUMMARY_USING_FEES: + handleBillFeeGroupedByBillTypeAtomic(); + break; case BILL_FEE_GROUPED_BY_TO_DEPARTMENT_AND_CATEGORY: handleBillFeeGroupedByToDepartmentAndCategory(); break; @@ -182,6 +187,24 @@ public String processReport() { case PAYMENT_TYPE_SUMMARY_USING_BILLS: handlePaymentTypeSummaryUsingBills(); break; + case ITEM_CATEGORY_SUMMARY_BY_BILL_FEE: + handleItemCategorySummaryByBillFee(); + break; + case ITEM_CATEGORY_SUMMARY_BY_BILL_ITEM: + handleItemCategorySummaryByBillItem(); + break; + case ITEM_CATEGORY_SUMMARY_BY_BILL: + handleItemCategorySummaryByBill(); + break; + case TO_DEPARTMENT_SUMMARY_BY_BILL_FEE: + handleToDepartmentSummaryByBillFee(); + break; + case TO_DEPARTMENT_SUMMARY_BY_BILL_ITEM: + handleToDepartmentSummaryByBillItem(); + break; + case TO_DEPARTMENT_SUMMARY_BY_BILL: + handleToDepartmentSummaryByBill(); + break; default: JsfUtil.addErrorMessage("Unknown Report Type"); return ""; @@ -197,67 +220,151 @@ private void handleBillTypeAndPaymentMethodSummaryUsingBills() { // Method implementation here } - private void handleBillFeeGroupedByToDepartmentAndCategory() { + private void handleBillFeeGroupedByBillTypeAtomic() { String jpql; Map parameters = new HashMap<>(); + reportTemplateRowBundle = new ReportTemplateRowBundle(); - jpql = "select new com.divudi.data.ReportTemplateRow(bf.bill.billTypeAtomic, bf.bill.category.name, bf.bill.toDepartment.name, sum(bf.fee)) " + jpql = "select new com.divudi.data.ReportTemplateRow(" + + " bill.billTypeAtomic, sum(bf.feeValue)) " + " from BillFee bf " - + " where bf.retired=:bfr " - + " and bf.billItem.retired=:bir " - + " and bf.bill.retired=:br " - + " and bf.bill.billTypeAtomic in :btas "; + + " join bf.bill bill " + + " where bf.retired<>:bfr " + + " and bf.billItem.retired<>:bir " + + " and bill.retired<>:br "; + parameters.put("bfr", true); + parameters.put("bir", true); + parameters.put("br", true); - boolean testing = true; - if (!testing) { - BillFee bf = new BillFee(); - bf.getBill().getBillTypeAtomic(); // Enum - bf.getBill().getCategory().getName(); // String - bf.getBill().getToDepartment().getName(); // String - bf.getFeeValue(); // double + if (current.getBillTypeAtomics() != null) { + jpql += " and bill.billTypeAtomic in :btas "; + parameters.put("btas", current.getBillTypeAtomics()); } + for (ReportTemplateFilter f : current.getReportFilters()) { + switch (f) { + case DATE: + jpql += " and bill.billDate=:bd "; + parameters.put("bd", date); + break; + case TO_DATE: + jpql += " and bill.billDate < :td "; + parameters.put("td", toDate); + break; + case FROM_DATE: + jpql += " and bill.billDate > :fd "; + parameters.put("fd", fromDate); + break; + case INSTITUTION: + jpql += " and bill.institution=:ins "; + parameters.put("ins", institution); + break; + case DEPARTMENT: + jpql += " and bill.department=:dep "; + parameters.put("dep", department); + break; + case FROM_INSTITUTION: + jpql += " and bill.fromInstitution=:fins "; + parameters.put("fins", fromInstitution); + break; + case FROM_DEPARTMENT: + jpql += " and bill.fromDepartment=:fdep "; + parameters.put("fdep", fromDepartment); + break; + case TO_INSTITUTION: + jpql += " and bill.toInstitution=:tins "; + parameters.put("tins", toInstitution); + break; + case TO_DEPARTMENT: + jpql += " and bill.toDepartment=:tdep "; + parameters.put("tdep", toDepartment); + break; + case CREDIT_COMPANY: + jpql += " and bill.creditCompany=:creditCompany "; + parameters.put("creditCompany", creditCompany); + break; + default: + throw new AssertionError(); + } + } + + jpql += " group by bill.billTypeAtomic"; + + System.out.println("jpql = " + jpql); + System.out.println("parameters = " + parameters); + + List rs = (List) ejbFacade.findLightsByJpql(jpql, parameters, TemporalType.DATE); + + if (rs == null || rs.isEmpty()) { + System.out.println("No results found."); + } else { + System.out.println("Results found: " + rs.size()); + } + + long idCounter = 1; + for (ReportTemplateRow row : rs) { + row.setId(idCounter++); + } + reportTemplateRowBundle.setReportTemplateRows(rs); + } + + private void handleBillFeeGroupedByToDepartmentAndCategory() { + String jpql; + Map parameters = new HashMap<>(); + reportTemplateRowBundle = new ReportTemplateRowBundle(); + + jpql = "select new com.divudi.data.ReportTemplateRow(" + + " bill.billTypeAtomic, sum(bf.feeValue)) " + + " from BillFee bf " + + " join bf.bill bill " + + " where bf.retired<>:bfr " + + " and bf.billItem.retired<>:bir " + + " and bill.retired<>:br "; + parameters.put("bfr", true); + parameters.put("bir", true); + parameters.put("br", true); + if (current.getBillTypeAtomics() != null) { - jpql += " and bf.bill.billTypeAtomic in :btas "; + jpql += " and bill.billTypeAtomic in :btas "; parameters.put("btas", current.getBillTypeAtomics()); } for (ReportTemplateFilter f : current.getReportFilters()) { switch (f) { case DATE: - jpql += " and bf.bill.billDate=:bd "; + jpql += " and bill.billDate=:bd "; parameters.put("bd", date); break; case TO_DATE: - jpql += " and bf.bill.billDate < :td "; + jpql += " and bill.billDate < :td "; parameters.put("td", toDate); break; case FROM_DATE: - jpql += " and bf.bill.billDate > :fd "; + jpql += " and bill.billDate > :fd "; parameters.put("fd", fromDate); break; case INSTITUTION: - jpql += " and bf.bill.institution=:ins "; + jpql += " and bill.institution=:ins "; parameters.put("ins", institution); break; case DEPARTMENT: - jpql += " and bf.bill.department=:dep "; + jpql += " and bill.department=:dep "; parameters.put("dep", department); break; case FROM_INSTITUTION: - jpql += " and bf.bill.fromInstitution=:fins "; + jpql += " and bill.fromInstitution=:fins "; parameters.put("fins", fromInstitution); break; case FROM_DEPARTMENT: - jpql += " and bf.bill.fromDepartment=:fdep "; + jpql += " and bill.fromDepartment=:fdep "; parameters.put("fdep", fromDepartment); break; case TO_INSTITUTION: - jpql += " and bf.bill.toInstitution=:tins "; + jpql += " and bill.toInstitution=:tins "; parameters.put("tins", toInstitution); break; case TO_DEPARTMENT: - jpql += " and bf.bill.toDepartment=:tdep "; + jpql += " and bill.toDepartment=:tdep "; parameters.put("tdep", toDepartment); break; default: @@ -265,7 +372,24 @@ private void handleBillFeeGroupedByToDepartmentAndCategory() { } } - // Add the code to execute the JPQL query using the parameters map + jpql += " group by bill.billTypeAtomic"; + + System.out.println("jpql = " + jpql); + System.out.println("parameters = " + parameters); + + List rs = (List) ejbFacade.findLightsByJpql(jpql, parameters, TemporalType.DATE); + + if (rs == null || rs.isEmpty()) { + System.out.println("No results found."); + } else { + System.out.println("Results found: " + rs.size()); + } + + long idCounter = 1; + for (ReportTemplateRow row : rs) { + row.setId(idCounter++); + } + reportTemplateRowBundle.setReportTemplateRows(rs); } private void handleBillFeeList() { @@ -281,7 +405,87 @@ private void handleBillList() { } private void handleBillTypeAtomicSummaryUsingBills() { - // Method implementation here + String jpql; + Map parameters = new HashMap<>(); + reportTemplateRowBundle = new ReportTemplateRowBundle(); + + jpql = "select new com.divudi.data.ReportTemplateRow(" + + " bill.billTypeAtomic, sum(bill.netTotal)) " + + " from Bill bill " + + " where bill.retired<>:br "; + parameters.put("br", true); + + if (current.getBillTypeAtomics() != null) { + jpql += " and bill.billTypeAtomic in :btas "; + parameters.put("btas", current.getBillTypeAtomics()); + } + + for (ReportTemplateFilter f : current.getReportFilters()) { + switch (f) { + case DATE: + jpql += " and bill.billDate=:bd "; + parameters.put("bd", date); + break; + case TO_DATE: + jpql += " and bill.billDate < :td "; + parameters.put("td", toDate); + break; + case FROM_DATE: + jpql += " and bill.billDate > :fd "; + parameters.put("fd", fromDate); + break; + case INSTITUTION: + jpql += " and bill.institution=:ins "; + parameters.put("ins", institution); + break; + case DEPARTMENT: + jpql += " and bill.department=:dep "; + parameters.put("dep", department); + break; + case FROM_INSTITUTION: + jpql += " and bill.fromInstitution=:fins "; + parameters.put("fins", fromInstitution); + break; + case FROM_DEPARTMENT: + jpql += " and bill.fromDepartment=:fdep "; + parameters.put("fdep", fromDepartment); + break; + case TO_INSTITUTION: + jpql += " and bill.toInstitution=:tins "; + parameters.put("tins", toInstitution); + break; + case TO_DEPARTMENT: + jpql += " and bill.toDepartment=:tdep "; + parameters.put("tdep", toDepartment); + break; + case CREDIT_COMPANY: + jpql += " and bill.creditCompany=:creditCompany "; + parameters.put("creditCompany", creditCompany); + break; + default: + throw new AssertionError(); + } + } + + jpql += " group by bill.billTypeAtomic"; + + System.out.println("jpql = " + jpql); + System.out.println("parameters = " + parameters); + + List rs = (List) ejbFacade.findLightsByJpql(jpql, parameters, TemporalType.DATE); + + if (rs == null || rs.isEmpty()) { + System.out.println("No results found."); + } else { + System.out.println("Results found: " + rs.size()); + } + + long idCounter = 1; + for (ReportTemplateRow row : rs) { + row.setId(idCounter++); + } + reportTemplateRowBundle.setReportTemplateRows(rs); + } private void handleBillTypeAtomicSummaryUsingPayments() { @@ -592,14 +796,127 @@ public ReportTemplateRowBundle getReportTemplateRowBundle() { public void setReportTemplateRowBundle(ReportTemplateRowBundle reportTemplateRowBundle) { this.reportTemplateRowBundle = reportTemplateRowBundle; } - - - + + public Institution getCreditCompany() { + return creditCompany; + } + + public void setCreditCompany(Institution creditCompany) { + this.creditCompany = creditCompany; + } /** * */ - @FacesConverter(forClass = ReportTemplate.class) + private void handleItemCategorySummaryByBillFee() { + throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + private void handleItemCategorySummaryByBillItem() { + String jpql; + Map parameters = new HashMap<>(); + reportTemplateRowBundle = new ReportTemplateRowBundle(); + + jpql = "select new com.divudi.data.ReportTemplateRow(" + + " bi.item.category.name, sum(bi.netValue)) " + + " from BillItem bi" + + " join bi.bill bill " + + " where bill.retired<>:br " + + " and bi.retired<>:br "; + parameters.put("br", true); + + if (current.getBillTypeAtomics() != null) { + jpql += " and bill.billTypeAtomic in :btas "; + parameters.put("btas", current.getBillTypeAtomics()); + } + + for (ReportTemplateFilter f : current.getReportFilters()) { + switch (f) { + case DATE: + jpql += " and bill.billDate=:bd "; + parameters.put("bd", date); + break; + case TO_DATE: + jpql += " and bill.billDate < :td "; + parameters.put("td", toDate); + break; + case FROM_DATE: + jpql += " and bill.billDate > :fd "; + parameters.put("fd", fromDate); + break; + case INSTITUTION: + jpql += " and bill.institution=:ins "; + parameters.put("ins", institution); + break; + case DEPARTMENT: + jpql += " and bill.department=:dep "; + parameters.put("dep", department); + break; + case FROM_INSTITUTION: + jpql += " and bill.fromInstitution=:fins "; + parameters.put("fins", fromInstitution); + break; + case FROM_DEPARTMENT: + jpql += " and bill.fromDepartment=:fdep "; + parameters.put("fdep", fromDepartment); + break; + case TO_INSTITUTION: + jpql += " and bill.toInstitution=:tins "; + parameters.put("tins", toInstitution); + break; + case TO_DEPARTMENT: + jpql += " and bill.toDepartment=:tdep "; + parameters.put("tdep", toDepartment); + break; + case CREDIT_COMPANY: + jpql += " and bill.creditCompany=:creditCompany "; + parameters.put("creditCompany", creditCompany); + break; + default: + throw new AssertionError(); + } + } + + jpql += " and bi.item is not null " + + " and bi.item.category is not null "; + + jpql += " group by bi.item.category "; + + System.out.println("jpql = " + jpql); + System.out.println("parameters = " + parameters); + + List rs = (List) ejbFacade.findLightsByJpql(jpql, parameters, TemporalType.DATE); + + if (rs == null || rs.isEmpty()) { + System.out.println("No results found."); + } else { + System.out.println("Results found: " + rs.size()); + } + + long idCounter = 1; + for (ReportTemplateRow row : rs) { + row.setId(idCounter++); + } + reportTemplateRowBundle.setReportTemplateRows(rs); + } + + private void handleItemCategorySummaryByBill() { + throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + private void handleToDepartmentSummaryByBillFee() { + throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + private void handleToDepartmentSummaryByBillItem() { + throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + private void handleToDepartmentSummaryByBill() { + throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + } + + public static class ReportTemplateConverter implements Converter { @Override diff --git a/src/main/java/com/divudi/data/ReportTemplateRow.java b/src/main/java/com/divudi/data/ReportTemplateRow.java index ca24b1c17b..965710e6d9 100644 --- a/src/main/java/com/divudi/data/ReportTemplateRow.java +++ b/src/main/java/com/divudi/data/ReportTemplateRow.java @@ -86,6 +86,28 @@ public ReportTemplateRow(String feeName, String categoryName, String toDepartmen this.rowValue = rowValue; this.rowCount = rowCount; } + + public ReportTemplateRow(String categoryName, Double rowValue) { + this.categoryName = categoryName; + this.rowValue = rowValue; + } + + public ReportTemplateRow(BillTypeAtomic billTypeAtomic, String categoryName, String toDepartmentName, Double rowValue) { + this.billTypeAtomic = billTypeAtomic; + this.categoryName = categoryName; + this.toDepartmentName = toDepartmentName; + this.rowValue = rowValue; + } + + public ReportTemplateRow(BillTypeAtomic billTypeAtomic, Double rowValue) { + this.billTypeAtomic = billTypeAtomic; + this.rowValue = rowValue; + } + + + public ReportTemplateRow(Double rowValue) { + this.rowValue = rowValue; + } public ReportTemplateRow() { } @@ -147,4 +169,8 @@ public String getCustomKey() { + (billTypeAtomic != null ? billTypeAtomic.getLabel() : ""); } + public String getFeeName() { + return feeName; + } + } diff --git a/src/main/java/com/divudi/data/analytics/ReportTemplateFilter.java b/src/main/java/com/divudi/data/analytics/ReportTemplateFilter.java index 9635712506..bb4f67ed62 100644 --- a/src/main/java/com/divudi/data/analytics/ReportTemplateFilter.java +++ b/src/main/java/com/divudi/data/analytics/ReportTemplateFilter.java @@ -10,12 +10,11 @@ public enum ReportTemplateFilter { TO_DATE("To Date"), INSTITUTION("Institution"), DEPARTMENT("Department"), + CREDIT_COMPANY("Credit Company"), FROM_INSTITUTION("From Institution"), FROM_DEPARTMENT("From Department"), TO_INSTITUTION("To Institution"), - TO_DEPARTMENT("To Department"), - - ; + TO_DEPARTMENT("To Department"),; private final String label; diff --git a/src/main/java/com/divudi/data/analytics/ReportTemplateType.java b/src/main/java/com/divudi/data/analytics/ReportTemplateType.java index 139a36d735..d52b6ceb15 100644 --- a/src/main/java/com/divudi/data/analytics/ReportTemplateType.java +++ b/src/main/java/com/divudi/data/analytics/ReportTemplateType.java @@ -15,10 +15,19 @@ public enum ReportTemplateType { BILLT_TYPE_AND_PAYMENT_METHOD_SUMMARY_USING_BILLS("Bill Type Summary by using Bills"), PAYMENT_TYPE_SUMMARY_USING_BILLS("Payment Method Summary by using Bills"), BILL_TYPE_ATOMIC_SUMMARY_USING_PAYMENTS("Bill Type Summary by using Payments"), + BILL_TYPE_ATOMIC_SUMMARY_USING_FEES("Bill Type Summary usinf Bill Fees"), BILLT_TYPE_AND_PAYMENT_METHOD_SUMMARY_PAYMENTS("Bill Type Summary by using Payments"), PAYMENT_METHOD_SUMMARY_USING_PAYMENTS("Bill Type Summary by using Payments"), PAYMENT_METHOD_SUMMARY_USING_BILLS("Bill Type Summary by using Payments"), - PAYMENT_TYPE_SUMMARY_PAYMENTS("Payment Method Summary by using Payments"),; + PAYMENT_TYPE_SUMMARY_PAYMENTS("Payment Method Summary by using Payments"), + ITEM_CATEGORY_SUMMARY_BY_BILL_FEE("Item Category Summary by Bill Fee"), + ITEM_CATEGORY_SUMMARY_BY_BILL_ITEM("Item Category Summary by Bill Item"), + ITEM_CATEGORY_SUMMARY_BY_BILL("Item Category Summary by Bill"), + TO_DEPARTMENT_SUMMARY_BY_BILL_FEE("To Department Summary by Bill Fee"), + TO_DEPARTMENT_SUMMARY_BY_BILL_ITEM("To Department Summary by Bill Item"), + TO_DEPARTMENT_SUMMARY_BY_BILL("To Department Summary by Bill"); + + ; private final String label; diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index 3262b4846a..b403f37ec5 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -1,7 +1,7 @@ - jdbc/demos + jdbc/sethma false diff --git a/src/main/webapp/dataAdmin/report.xhtml b/src/main/webapp/dataAdmin/report.xhtml index a09d7ce4f5..f4e68d288d 100644 --- a/src/main/webapp/dataAdmin/report.xhtml +++ b/src/main/webapp/dataAdmin/report.xhtml @@ -1,11 +1,10 @@ - + xmlns:ez="http://xmlns.jcp.org/jsf/composite/ezcomp/report_templates"> @@ -14,39 +13,88 @@ - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - + +

+ + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -
+ + + + + + + + + + + +
diff --git a/src/main/webapp/dataAdmin/report_template_list.xhtml b/src/main/webapp/dataAdmin/report_template_list.xhtml index 076e0c1bb4..ffdd172956 100644 --- a/src/main/webapp/dataAdmin/report_template_list.xhtml +++ b/src/main/webapp/dataAdmin/report_template_list.xhtml @@ -23,7 +23,7 @@ - + diff --git a/src/main/webapp/resources/ezcomp/report_templates/report_bill_fee_grouped_by_atomic_bill_type.xhtml b/src/main/webapp/resources/ezcomp/report_templates/report_bill_fee_grouped_by_atomic_bill_type.xhtml new file mode 100644 index 0000000000..4865e85879 --- /dev/null +++ b/src/main/webapp/resources/ezcomp/report_templates/report_bill_fee_grouped_by_atomic_bill_type.xhtml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/ezcomp/report_templates/report_bill_fee_grouped_by_category_bill_type_atomic_and_to_department.xhtml b/src/main/webapp/resources/ezcomp/report_templates/report_bill_fee_grouped_by_category_bill_type_atomic_and_to_department.xhtml new file mode 100644 index 0000000000..b498ff2047 --- /dev/null +++ b/src/main/webapp/resources/ezcomp/report_templates/report_bill_fee_grouped_by_category_bill_type_atomic_and_to_department.xhtml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/ezcomp/report_templates/report_item_cateroy_value.xhtml b/src/main/webapp/resources/ezcomp/report_templates/report_item_cateroy_value.xhtml new file mode 100644 index 0000000000..cc73879a82 --- /dev/null +++ b/src/main/webapp/resources/ezcomp/report_templates/report_item_cateroy_value.xhtml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 264a115444085d2268844a59035af5326606ff64 Mon Sep 17 00:00:00 2001 From: DamithDeshan Date: Thu, 18 Jul 2024 19:13:17 +0530 Subject: [PATCH 05/18] Signed-off-by: DamithDeshan --- src/main/resources/META-INF/persistence.xml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index 0130d37b57..6ede920af7 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -2,30 +2,20 @@ org.eclipse.persistence.jpa.PersistenceProvider - jdbc/digasiri + jdbc/arogya false - - - jdbc/digasiriAudit + jdbc/arogyaAudit com.divudi.entity.AuditEvent true - - From 8c8868962f813fef56885a27485b3119deb58a67 Mon Sep 17 00:00:00 2001 From: DamithDeshan Date: Thu, 18 Jul 2024 22:18:31 +0530 Subject: [PATCH 06/18] Signed-off-by: DamithDeshan --- .../ezcomp/common/patient_details.xhtml | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/main/webapp/resources/ezcomp/common/patient_details.xhtml b/src/main/webapp/resources/ezcomp/common/patient_details.xhtml index bc08ba04ec..5ab1f8485d 100644 --- a/src/main/webapp/resources/ezcomp/common/patient_details.xhtml +++ b/src/main/webapp/resources/ezcomp/common/patient_details.xhtml @@ -83,7 +83,8 @@ action="#{patientController.quickSearchPatientLongPhoneNumber(cc.attrs.controller)}" process="btnSearchbyPhoneNo txtQuickSearchPhoneNumber" update="ptImp selectPatient editPatient viewPatient" - styleClass="btn-sm mx-1"/> + styleClass="btn-sm mx-1"> +
@@ -275,7 +276,7 @@
-
+
-
+ + + + + + +
- + @@ -362,6 +374,16 @@ + + + + + + From 829b74166e9ef46d9984ac0d380c6aeb8ecae33b Mon Sep 17 00:00:00 2001 From: DamithDeshan Date: Thu, 18 Jul 2024 22:18:37 +0530 Subject: [PATCH 07/18] Signed-off-by: DamithDeshan --- src/main/webapp/opd/patient_edit.xhtml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/opd/patient_edit.xhtml b/src/main/webapp/opd/patient_edit.xhtml index f269e8f8d1..b99d5588db 100644 --- a/src/main/webapp/opd/patient_edit.xhtml +++ b/src/main/webapp/opd/patient_edit.xhtml @@ -197,7 +197,7 @@ required="#{sessionController.departmentPreference.needAreaForPatientRegistration}" requiredMessage="Need an Area" > - +
@@ -234,13 +234,22 @@
-
+
+
+ + + +
From a871cc50684cd4c50d442f7a18d7356113bdbdc1 Mon Sep 17 00:00:00 2001 From: DamithDeshan Date: Thu, 18 Jul 2024 22:18:41 +0530 Subject: [PATCH 08/18] Signed-off-by: DamithDeshan --- src/main/webapp/opd/patient.xhtml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/opd/patient.xhtml b/src/main/webapp/opd/patient.xhtml index f9da56f195..4c0c1cbf21 100644 --- a/src/main/webapp/opd/patient.xhtml +++ b/src/main/webapp/opd/patient.xhtml @@ -93,7 +93,13 @@ - + + + @@ -105,7 +111,6 @@ - From 9f5f61516ba879c77773e6324b2c44fa49c0827b Mon Sep 17 00:00:00 2001 From: DamithDeshan Date: Thu, 18 Jul 2024 22:53:19 +0530 Subject: [PATCH 09/18] closes#6156 --- .../divudi/bean/opd/OpdBillController.java | 13 ++++-- src/main/webapp/opd/opd_bill.xhtml | 40 +++++++++---------- 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/divudi/bean/opd/OpdBillController.java b/src/main/java/com/divudi/bean/opd/OpdBillController.java index e89d52bc8d..4f38fc9c6e 100644 --- a/src/main/java/com/divudi/bean/opd/OpdBillController.java +++ b/src/main/java/com/divudi/bean/opd/OpdBillController.java @@ -294,6 +294,7 @@ public class OpdBillController implements Serializable, ControllerWithPatient, C private Double totalSaffFee; private boolean canChangeSpecialityAndDoctorInAddedBillItem; private String localNumber; + /** * * Navigation Methods @@ -831,7 +832,7 @@ public void changeBillDoctorByFee(BillFee bf) { getCurrentlyWorkingStaff().add(bf.getStaff()); selectedCurrentlyWorkingStaff = bf.getStaff(); } - + public void changeBillDoctorByReferral() { if (referredBy == null) { JsfUtil.addErrorMessage("No referring doctor"); @@ -1398,6 +1399,11 @@ public void setSessionDate(Date sessionDate) { } public boolean isForeigner() { + if (configOptionApplicationController.getBooleanValueByKey("Save the Patient with Patient Status")) { + if (patient != null) { + foreigner = patient.getPerson().isForeigner(); + } + } return foreigner; } @@ -2002,7 +2008,6 @@ private void saveBatchBill() { newBatchBill.setCreatedAt(new Date()); newBatchBill.setCreater(getSessionController().getLoggedUser()); newBatchBill.setFromStaff(selectedCurrentlyWorkingStaff); - getBillFacade().create(newBatchBill); @@ -2091,9 +2096,9 @@ private Bill saveBill(Department bt, Bill newBill) { newBill.setBillDate(new Date()); newBill.setBillTime(new Date()); newBill.setPatient(patient); - + if (localNumber != null) { - newBill.setLocalNumber(localNumber); + newBill.setLocalNumber(localNumber); } // newBill.setMembershipScheme(membershipSchemeController.fetchPatientMembershipScheme(patient, getSessionController().getApplicationPreference().isMembershipExpires())); diff --git a/src/main/webapp/opd/opd_bill.xhtml b/src/main/webapp/opd/opd_bill.xhtml index 5cbc391662..6385e40a61 100644 --- a/src/main/webapp/opd/opd_bill.xhtml +++ b/src/main/webapp/opd/opd_bill.xhtml @@ -844,26 +844,26 @@
- - - - + + + + + +
From cf86dcbe95e815ff6e860a3526492f8a119e3696 Mon Sep 17 00:00:00 2001 From: DamithDeshan Date: Thu, 18 Jul 2024 23:45:59 +0530 Subject: [PATCH 10/18] closes#6156 --- .../webapp/lab/collecting_centre_bill.xhtml | 119 +++++++++++++----- 1 file changed, 90 insertions(+), 29 deletions(-) diff --git a/src/main/webapp/lab/collecting_centre_bill.xhtml b/src/main/webapp/lab/collecting_centre_bill.xhtml index 6f6b02ec43..4bf701066d 100644 --- a/src/main/webapp/lab/collecting_centre_bill.xhtml +++ b/src/main/webapp/lab/collecting_centre_bill.xhtml @@ -14,17 +14,70 @@ - - - - +
+ +
+ + + + + +
+ +
+
+ +
+
+ +
+
+ + + #{ix.institutionCode} + #{ix.name} + +
+
+ +
+
+ +
+
+ - + - - - - +
+
@@ -36,28 +89,36 @@ + + + + + +
+
- - - - - - - - +
+
+ +
+
+ +
+
- - - - - #{ix.institutionCode} - #{ix.name} - - - - - - +
+
+ +
+
+ +
+
From b36a1a318cc3fc093062216ff932a4e83af3db03 Mon Sep 17 00:00:00 2001 From: buddhika75 Date: Fri, 19 Jul 2024 03:38:53 +0530 Subject: [PATCH 11/18] Signed-off-by: buddhika75 --- nb-configuration.xml | 1 + .../FinancialTransactionController.java | 175 ++++++++- .../bean/channel/BookingController.java | 120 +++++- .../channel/BookingControllerViewScope.java | 42 ++- .../bean/common/OpdTokenController.java | 6 +- src/main/webapp/analytics/index.xhtml | 17 + src/main/webapp/cashier/index.xhtml | 27 +- .../cashier/initial_fund_bill_list.xhtml | 105 ++++++ .../cashier/shift_end_summery_bill.xhtml | 346 +----------------- ...ery_bill_of_selected_user_not_closed.xhtml | 38 ++ .../channel/channel_booking_by_date.xhtml | 32 +- src/main/webapp/channel/channel_queue.xhtml | 2 +- .../channel_nurse_view_with_items.xhtml | 189 ++++++++++ .../webapp/channel/channel_views/index.xhtml | 6 + .../channel/manage_booking_by_date.xhtml | 6 +- src/main/webapp/channel/patient_portal.xhtml | 2 + src/main/webapp/patient_portal_pay.xhtml | 22 +- .../ezcomp/shift_end_summary_table.xhtml | 252 +++++++++++++ .../resources/image/PaymentGatewayFooter.jpg | Bin 0 -> 73498 bytes 19 files changed, 984 insertions(+), 404 deletions(-) create mode 100644 src/main/webapp/cashier/initial_fund_bill_list.xhtml create mode 100644 src/main/webapp/cashier/shift_end_summery_bill_of_selected_user_not_closed.xhtml create mode 100644 src/main/webapp/channel/channel_views/channel_nurse_view_with_items.xhtml create mode 100644 src/main/webapp/resources/ezcomp/shift_end_summary_table.xhtml create mode 100644 src/main/webapp/resources/image/PaymentGatewayFooter.jpg diff --git a/nb-configuration.xml b/nb-configuration.xml index ef71acbe24..abe4687959 100644 --- a/nb-configuration.xml +++ b/nb-configuration.xml @@ -16,5 +16,6 @@ Any value defined here will override the pom.xml file value but is only applicab --> ide none + false diff --git a/src/main/java/com/divudi/bean/cashTransaction/FinancialTransactionController.java b/src/main/java/com/divudi/bean/cashTransaction/FinancialTransactionController.java index b9586e5a0e..d820e98a81 100644 --- a/src/main/java/com/divudi/bean/cashTransaction/FinancialTransactionController.java +++ b/src/main/java/com/divudi/bean/cashTransaction/FinancialTransactionController.java @@ -21,6 +21,8 @@ import com.divudi.data.FinancialReport; import com.divudi.data.PaymentMethod; import com.divudi.data.PaymentMethodValues; +import com.divudi.entity.WebUser; +import com.divudi.java.CommonFunctions; import javax.inject.Named; import javax.enterprise.context.SessionScoped; import java.io.Serializable; @@ -31,6 +33,7 @@ import java.util.Map; import javax.ejb.EJB; import javax.inject.Inject; +import javax.persistence.TemporalType; import org.bouncycastle.mail.smime.handlers.pkcs7_mime; /** @@ -67,6 +70,7 @@ public class FinancialTransactionController implements Serializable { private Payment removingPayment; private List currentBillPayments; private List currentBills; + private List shiaftStartBills; private List fundTransferBillsToReceive; private List fundBillsForClosureBills; private Bill selectedBill; @@ -120,6 +124,8 @@ public class FinancialTransactionController implements Serializable { private double additions; private int fundTransferBillsToReceiveCount; + private Date fromDate; + private Date toDate; // // @@ -140,6 +146,27 @@ public String navigateToCreateNewInitialFundBill() { return "/cashier/initial_fund_bill?faces-redirect=true;"; } + public String navigateToListShiftEndSummaries() { + resetClassVariables(); + shiaftStartBills = new ArrayList<>(); + return "/cashier/initial_fund_bill_list?faces-redirect=true;"; + } + + public void listShiftStartBills() { + String jpql = "select b " + + " from Bill b " + + " where b.retired=:ret" + + " and b.billTypeAtomic=:bta " + + " and b.createdAt between :fd and :td " + + " order by b.id "; + Map params = new HashMap<>(); + params.put("ret", false); + params.put("bta", BillTypeAtomic.FUND_SHIFT_START_BILL); + params.put("fd", fromDate); + params.put("td", toDate); + shiaftStartBills = billFacade.findByJpql(jpql, params, TemporalType.TIMESTAMP); + } + public String navigateToFundTransferBill() { resetClassVariables(); prepareToAddNewFundTransferBill(); @@ -269,7 +296,7 @@ public void resetClassVariables() { selectedBill = null; nonClosedShiftStartFundBill = null; paymentsFromShiftSratToNow = null; - + } public void resetClassVariablesWithoutSelectedBill() { @@ -437,7 +464,7 @@ public String settleInitialFundBill() { currentBill.setDepartment(sessionController.getDepartment()); currentBill.setInstitution(sessionController.getInstitution()); currentBill.setStaff(sessionController.getLoggedUser().getStaff()); - + currentBill.setBillDate(new Date()); currentBill.setBillTime(new Date()); @@ -520,11 +547,11 @@ public String settleWithdrawalFundBill() { // // // - public void refreshCashNetTotalForMenu(){ + public void refreshCashNetTotalForMenu() { findNonClosedShiftStartFundBillIsAvailable(); fillPaymentsFromShiftStartToNow(); } - + public String navigateToCreateShiftEndSummaryBill() { resetClassVariables(); findNonClosedShiftStartFundBillIsAvailable(); @@ -541,6 +568,34 @@ public String navigateToCreateShiftEndSummaryBill() { return "/cashier/shift_end_summery_bill?faces-redirect=true"; } + public String navigateToViewEndOfSelectedShiftStartSummaryBill(Bill startBill) { + resetClassVariables(); + if (startBill == null) { + JsfUtil.addErrorMessage("No Start Bill"); + return null; + } + nonClosedShiftStartFundBill = startBill; + fillPaymentsFromShiftStartToNow(startBill, startBill.getCreater()); + return "/cashier/shift_end_summery_bill_of_selected_user_not_closed?faces-redirect=true"; + } + + public String navigateToViewStartToEndOfSelectedShiftStartSummaryBill(Bill startBill) { + resetClassVariables(); + if (startBill == null) { + JsfUtil.addErrorMessage("No Start Bill"); + return null; + } + Bill endBill; + if (startBill.getReferenceBill() == null) { + JsfUtil.addErrorMessage("No Start Bill"); + return null; + } + endBill = startBill.getReferenceBill(); + nonClosedShiftStartFundBill = startBill; + fillPaymentsFromShiftStartToEnd(startBill, endBill, startBill.getCreater()); + return "/cashier/shift_end_summery_bill_of_selected_user_not_closed?faces-redirect=true"; + } + public String navigateToCreateShiftEndSummaryBillByBills() { resetClassVariables(); findNonClosedShiftStartFundBillIsAvailable(); @@ -589,6 +644,73 @@ public void fillPaymentsFromShiftStartToNow() { } + public void fillPaymentsFromShiftStartToNow(Bill startBill, WebUser user) { + paymentsFromShiftSratToNow = new ArrayList<>(); + if (startBill == null) { + JsfUtil.addErrorMessage("No Start Bill"); + return; + } + if (user == null) { + JsfUtil.addErrorMessage("No User"); + return; + } + Long shiftStartBillId = startBill.getId(); + String jpql = "SELECT p " + + "FROM Payment p " + + "WHERE p.creater = :cr " + + "AND p.retired = :ret " + + "AND p.id > :cid " + + "ORDER BY p.id DESC"; + Map m = new HashMap<>(); + m.put("cr", user); + m.put("ret", false); + m.put("cid", shiftStartBillId); + paymentsFromShiftSratToNow = paymentFacade.findByJpql(jpql, m); + atomicBillTypeTotalsByPayments = new AtomicBillTypeTotals(); + for (Payment p : paymentsFromShiftSratToNow) { + if (p.getBill().getBillTypeAtomic() == null) { + } else { + atomicBillTypeTotalsByPayments.addOrUpdateAtomicRecord(p.getBill().getBillTypeAtomic(), p.getPaymentMethod(), p.getPaidValue()); + } + } + financialReportByPayments = new FinancialReport(atomicBillTypeTotalsByPayments); + } + + public void fillPaymentsFromShiftStartToEnd(Bill startBill, Bill endBill, WebUser user) { + paymentsFromShiftSratToNow = new ArrayList<>(); + if (startBill == null) { + JsfUtil.addErrorMessage("No Start Bill"); + return; + } + if (user == null) { + JsfUtil.addErrorMessage("No User"); + return; + } + Long shiftStartBillId = startBill.getId(); + Long shiftEndBillId = endBill.getId(); + String jpql = "SELECT p " + + "FROM Payment p " + + "WHERE p.creater = :cr " + + "AND p.retired = :ret " + + "AND p.id > :sid " + + "AND p.id < :eid " + + "ORDER BY p.id DESC"; + Map m = new HashMap<>(); + m.put("cr", user); + m.put("ret", false); + m.put("sid", shiftStartBillId); + m.put("eid", shiftEndBillId); + paymentsFromShiftSratToNow = paymentFacade.findByJpql(jpql, m); + atomicBillTypeTotalsByPayments = new AtomicBillTypeTotals(); + for (Payment p : paymentsFromShiftSratToNow) { + if (p.getBill().getBillTypeAtomic() == null) { + } else { + atomicBillTypeTotalsByPayments.addOrUpdateAtomicRecord(p.getBill().getBillTypeAtomic(), p.getPaymentMethod(), p.getPaidValue()); + } + } + financialReportByPayments = new FinancialReport(atomicBillTypeTotalsByPayments); + } + public void fillBillsFromShiftStartToNow() { currentBills = new ArrayList<>(); if (nonClosedShiftStartFundBill == null) { @@ -707,17 +829,15 @@ public void calculateTotalFundsFromShiftStartToNow() { //System.out.println("financialReportByPayments.getCollectedVoucher() = " + financialReportByPayments.getCollectedVoucher()); //System.out.println("financialReportByPayments.getNetOtherNonCreditTotal() = " + financialReportByPayments.getNetOtherNonCreditTotal()); //System.out.println("financialReportByPayments.getBankWithdrawals() = " + financialReportByPayments.getFloatReceived()); - + //additions = financialReportByPayments.getCashTotal() + financialReportByPayments.getNetCreditCardTotal() + financialReportByPayments.getCollectedVoucher() + financialReportByPayments.getNetOtherNonCreditTotal() + financialReportByPayments.getBankWithdrawals(); //Deductions = financialReportByPayments.getRefundedCash() + financialReportByPayments.getRefundedCreditCard() + financialReportByPayments.getRefundedVoucher() + financialReportByPayments.getRefundedOtherNonCredit() + financialReportByPayments.getFloatHandover() + financialReportByPayments.getBankDeposits(); - additions = financialReportByPayments.getBankWithdrawals() + financialReportByPayments.getCashTotal() + financialReportByPayments.getNetCreditCardTotal() + financialReportByPayments.getCollectedVoucher() + financialReportByPayments.getNetOtherNonCreditTotal() + financialReportByPayments.getFloatReceived(); Deductions = financialReportByPayments.getFloatHandover() + financialReportByPayments.getBankDeposits(); - + //System.out.println("\n\nDeductions"); //System.out.println("financialReportByPayments.getFloatHandover() = " + financialReportByPayments.getFloatHandover()); //System.out.println("financialReportByPayments.getBankDeposits() = " + financialReportByPayments.getBankDeposits()); - totalFunds = additions - Deductions; shiftEndTotalValue = totalFunds; @@ -794,8 +914,8 @@ public void listBillsFromInitialFundBillUpToNow() { } public String settleShiftEndFundBill() { - boolean fundTransferBillTocollect = false; - + boolean fundTransferBillTocollect = false; + if (currentBill == null) { JsfUtil.addErrorMessage("Error"); return ""; @@ -808,16 +928,15 @@ public String settleShiftEndFundBill() { JsfUtil.addErrorMessage("Error"); return ""; } - if (fundTransferBillsToReceive!=null && !fundTransferBillsToReceive.isEmpty()) { + if (fundTransferBillsToReceive != null && !fundTransferBillsToReceive.isEmpty()) { fundTransferBillTocollect = true; } - + if (fundTransferBillTocollect) { JsfUtil.addErrorMessage("Please collect funds transferred to you before closing."); return ""; } - currentBill.setDepartment(sessionController.getDepartment()); currentBill.setInstitution(sessionController.getInstitution()); currentBill.setStaff(sessionController.getLoggedUser().getStaff()); @@ -1373,4 +1492,34 @@ public void setFinancialReportByPayments(FinancialReport financialReportByPaymen this.financialReportByPayments = financialReportByPayments; } + public Date getFromDate() { + if (fromDate == null) { + fromDate = CommonFunctions.getStartOfDay(); + } + return fromDate; + } + + public void setFromDate(Date fromDate) { + this.fromDate = fromDate; + } + + public Date getToDate() { + if (toDate == null) { + toDate = CommonFunctions.getEndOfDay(); + } + return toDate; + } + + public void setToDate(Date toDate) { + this.toDate = toDate; + } + + public List getShiaftStartBills() { + return shiaftStartBills; + } + + public void setShiaftStartBills(List shiaftStartBills) { + this.shiaftStartBills = shiaftStartBills; + } + } diff --git a/src/main/java/com/divudi/bean/channel/BookingController.java b/src/main/java/com/divudi/bean/channel/BookingController.java index 8430bc5e5c..0bf8471bda 100644 --- a/src/main/java/com/divudi/bean/channel/BookingController.java +++ b/src/main/java/com/divudi/bean/channel/BookingController.java @@ -15,6 +15,7 @@ import com.divudi.bean.common.ItemForItemController; import com.divudi.bean.common.PatientController; import com.divudi.bean.common.PriceMatrixController; +import com.divudi.bean.common.SecurityController; import com.divudi.bean.common.SessionController; import com.divudi.data.ApplicationInstitution; @@ -199,6 +200,10 @@ public class BookingController implements Serializable, ControllerWithPatient { FinancialTransactionController financialTransactionController; @Inject BookingControllerViewScope bookingControllerViewScope; + @Inject + SecurityController securityController; + @Inject + private CommonController commonController; /** * Properties */ @@ -496,6 +501,9 @@ public void markSessionInstanceAsStarted() { JsfUtil.addErrorMessage("No session selected"); return; } + if(!selectedSessionInstance.isArrived()){ + markAsArrived(); + } selectedSessionInstance.setStarted(true); selectedSessionInstance.setStartedAt(new Date()); selectedSessionInstance.setStartedBy(sessionController.getLoggedUser()); @@ -504,13 +512,19 @@ public void markSessionInstanceAsStarted() { if (sessionController.getDepartmentPreference().isSendSmsOnChannelDoctorArrival()) { sendSmsOnChannelDoctorArrival(); } + boolean firstIncompleteFound = false; + for (BillSession bs : billSessions) { - if (!bs.isCompleted()) { + if (configOptionApplicationController.getBooleanValueByKey("Sent Channelling Status Update Notification SMS on Channel Session Start", true)) { + sendChannellingStatusUpdateNotificationSms(bs); + System.out.println("bs = " + bs); + } + if (!firstIncompleteFound && !bs.isCompleted()) { bs.setNextInLine(true); billSessionFacade.edit(bs); selectedSessionInstance.setNextInLineBillSession(bs); sessionInstanceFacade.edit(selectedSessionInstance); - return; + firstIncompleteFound = true; } } } @@ -555,6 +569,69 @@ public void markSessionInstanceAsCompleted() { JsfUtil.addSuccessMessage("Session Completed"); sendSmsOnChannelMissingChannelBookings(); } + + public void sendChannellingStatusUpdateNotificationSms(BillSession methodBillSession) { + if (methodBillSession == null) { + JsfUtil.addErrorMessage("Nothing to send"); + return; + } + if (methodBillSession.getSessionInstance() == null) { + JsfUtil.addErrorMessage("No Session"); + return; + } + if (methodBillSession.getSessionInstance().getOriginatingSession() == null) { + JsfUtil.addErrorMessage("No Originating Session"); + return; + } + if (methodBillSession.getBill() == null) { + JsfUtil.addErrorMessage("No Bill"); + return; + } + if (methodBillSession.getBill().getPatient() == null) { + JsfUtil.addErrorMessage("No Bill"); + return; + } + + if (!methodBillSession.getBill().getPatient().getPerson().getSmsNumber().trim().equals("")) { + Sms e = new Sms(); + e.setCreatedAt(new Date()); + e.setCreater(sessionController.getLoggedUser()); + e.setBill(methodBillSession.getBill()); + e.setCreatedAt(new Date()); + e.setSmsType(MessageType.ChannelStatusUpdate); + e.setCreater(sessionController.getLoggedUser()); + e.setReceipientNumber(methodBillSession.getBill().getPatient().getPerson().getSmsNumber()); + e.setSendingMessage(smsBody(methodBillSession)); + e.setDepartment(getSessionController().getLoggedUser().getDepartment()); + e.setInstitution(getSessionController().getLoggedUser().getInstitution()); + e.setPending(false); + getSmsFacade().create(e); + + Boolean sent = smsManager.sendSms(e); + e.setSentSuccessfully(sent); + getSmsFacade().edit(e); + + } + + JsfUtil.addSuccessMessage("SMS Sent"); + } + + public String smsBody(BillSession r) { + String securityKey = sessionController.getApplicationPreference().getEncrptionKey(); + if (securityKey == null || securityKey.trim().equals("")) { + sessionController.getApplicationPreference().setEncrptionKey(securityController.generateRandomKey(10)); + sessionController.savePreferences(sessionController.getApplicationPreference()); + } + Calendar c = Calendar.getInstance(); + c.add(Calendar.DATE, 2); + String temId = securityController.encryptAlphanumeric(r.getId().toString(), securityKey); + String url = commonController.getBaseUrl() + "faces/requests/cbss.xhtml?id=" + temId; + String b = "Your session of " + + r.getSessionInstance().getOriginatingSession().getName() + + " Started. " + + url; + return b; + } public String navigateToAddBooking() { if (staff == null) { @@ -987,11 +1064,46 @@ private void sortSessions() { Collections.sort(sortedSessionInstances, new Comparator() { @Override public int compare(SessionInstance s1, SessionInstance s2) { + // Check if s1 is cancelled or completed + boolean s1CancelledOrCompleted = s1.isCancelled() || s1.isCompleted(); + // Check if s2 is cancelled or completed + boolean s2CancelledOrCompleted = s2.isCancelled() || s2.isCompleted(); + + // Handle cancelled or completed sessions going to the bottom + if (s1CancelledOrCompleted && !s2CancelledOrCompleted) { + return 1; // s1 is cancelled/completed, s2 is not, so s1 goes after s2 + } else if (!s1CancelledOrCompleted && s2CancelledOrCompleted) { + return -1; // s2 is cancelled/completed, s1 is not, so s2 goes after s1 + } else if (s1CancelledOrCompleted && s2CancelledOrCompleted) { + // Both s1 and s2 are cancelled/completed, compare them by startingTime if available + if (s1.getStartingTime() != null && s2.getStartingTime() != null) { + return s1.getStartingTime().compareTo(s2.getStartingTime()); + } else if (s1.getStartingTime() != null) { + return -1; // s1 has startingTime, s2 does not + } else if (s2.getStartingTime() != null) { + return 1; // s2 has startingTime, s1 does not + } else { + return 0; // Both are cancelled/completed and startingTime is not available or equal + } + } + + // Compare by start status and startingTime for non-cancelled and non-completed sessions if (s1.isStarted() && !s2.isStarted()) { - return -1; + return -1; // s1 started before s2 } else if (!s1.isStarted() && s2.isStarted()) { - return 1; + return 1; // s1 not started after s2 + } else if (s1.isStarted() && s2.isStarted()) { + // Both sessions are started, compare by startingTime + if (s1.getStartingTime() != null && s2.getStartingTime() != null) { + return s1.getStartingTime().compareTo(s2.getStartingTime()); + } else if (s1.getStartingTime() != null) { + return -1; // s1 has startingTime, s2 does not + } else if (s2.getStartingTime() != null) { + return 1; // s2 has startingTime, s1 does not + } } + + // Default case: both sessions have the same start status and startingTime or neither have startingTime return 0; } }); diff --git a/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java b/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java index 2ee5b21b61..9c9fa56c2a 100644 --- a/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java +++ b/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java @@ -470,7 +470,7 @@ private void createBillSessionForReschedule(BillSession bs, SessionInstance si) bs.setReferenceBillSession(newBillSession); getBillSessionFacade().edit(bs); newBillSessionForSMS = newBillSession; - } + } public void fillSessionInstanceByDoctor() { sessionInstanceByDoctor = new ArrayList<>(); @@ -1019,6 +1019,9 @@ public void markSessionInstanceAsStarted() { JsfUtil.addErrorMessage("No session selected"); return; } + if(!selectedSessionInstance.isArrived()){ + markAsArrived(); + } selectedSessionInstance.setStarted(true); selectedSessionInstance.setStartedAt(new Date()); selectedSessionInstance.setStartedBy(sessionController.getLoggedUser()); @@ -1602,6 +1605,15 @@ public String navigateToNurseView() { return ""; } } + + public String navigateToNurseViewWithItems() { + if (preSet()) { + getChannelReportController().fillNurseView(); + return "/channel/channel_views/channel_nurse_view_with_items?faces-redirect=true"; + } else { + return ""; + } + } public String navigateToDoctorView() { if (preSet()) { @@ -2535,7 +2547,7 @@ private boolean paymentMethodErrorPresent() { return true; } - if (!(paymentMethod == PaymentMethod.Cash || paymentMethod == PaymentMethod.Card || paymentMethod == PaymentMethod.MultiplePaymentMethods)) { + if (!(paymentMethod == PaymentMethod.Cash || paymentMethod == PaymentMethod.Card || paymentMethod == PaymentMethod.MultiplePaymentMethods || paymentMethod == PaymentMethod.Agent)) { if (selectedSessionInstance.getOriginatingSession().isPaidAppointmentsOnly()) { JsfUtil.addErrorMessage("This session is only available for paid appointments."); return true; @@ -2711,6 +2723,10 @@ public void addChannelBooking(boolean reservedBooking) { int maxNo = selectedSessionInstance.getMaxNo(); long bookedPatientCount = selectedSessionInstance.getBookedPatientCount(); long totalPatientCount; + + List reservedNumbers = CommonFunctions.convertStringToIntegerList(selectedSessionInstance.getReserveNumbers()); + bookedPatientCount = bookedPatientCount + reservedNumbers.size(); + if (selectedSessionInstance.getCancelPatientCount() != null) { long canceledPatientCount = selectedSessionInstance.getCancelPatientCount(); totalPatientCount = bookedPatientCount - canceledPatientCount; @@ -2752,10 +2768,19 @@ public void addChannelBooking(boolean reservedBooking) { createPayment(printingBill, paymentMethod); } sendSmsAfterBooking(); + if(selectedSessionInstance.isStarted()){ + sendChannellingStatusUpdateNotificationSms(printingBill.getSingleBillSession()); + } settleSucessFully = true; printPreview = true; JsfUtil.addSuccessMessage("Channel Booking Added."); } + + public long totalReservedNumberCount(SessionInstance s){ + List reservedNumbers = CommonFunctions.convertStringToIntegerList(s.getReserveNumbers()); + long reservedNumberCount = reservedNumbers.size(); + return reservedNumberCount; + } public BillSession addChannelBookingForOnlinePayment() { errorText = ""; @@ -7167,6 +7192,7 @@ private void sortSessions() { Collections.sort(sortedSessionInstances, new Comparator() { @Override public int compare(SessionInstance s1, SessionInstance s2) { + // First, compare based on start and completion status if (s1.isStarted() && !s2.isStarted() && !s1.isCompleted()) { return -1; } else if (!s1.isStarted() && s2.isStarted() && !s2.isCompleted()) { @@ -7176,7 +7202,17 @@ public int compare(SessionInstance s1, SessionInstance s2) { } else if (!s1.isCompleted() && s2.isCompleted()) { return -1; } - return 0; + + // If statuses are the same, compare based on startingTime + if (s1.getStartingTime() != null && s2.getStartingTime() != null) { + return s1.getStartingTime().compareTo(s2.getStartingTime()); + } else if (s1.getStartingTime() != null) { + return -1; // s1 has startingTime, s2 does not + } else if (s2.getStartingTime() != null) { + return 1; // s2 has startingTime, s1 does not + } + + return 0; // Both startingTime are null or equal } }); } diff --git a/src/main/java/com/divudi/bean/common/OpdTokenController.java b/src/main/java/com/divudi/bean/common/OpdTokenController.java index d240d1d72e..0d66d69853 100644 --- a/src/main/java/com/divudi/bean/common/OpdTokenController.java +++ b/src/main/java/com/divudi/bean/common/OpdTokenController.java @@ -317,12 +317,10 @@ public void fillOpdTokens() { String j = "Select t " + " from Token t" + " where t.department=:dep" - + " and t.tokenDate=:date " + " and t.tokenType=:ty" + " and t.completed=:com"; Map m = new HashMap(); m.put("dep", sessionController.getDepartment()); - m.put("date", new Date()); m.put("ty", TokenType.OPD_TOKEN); m.put("com", false); if (counter != null) { @@ -358,15 +356,13 @@ public void fillOpdTokensCalled() { String j = "Select t " + " from Token t" + " where t.department=:dep" - + " and t.tokenDate=:date " + " and t.called=:cal " + " and t.tokenType=:ty" + " and t.inProgress=:prog " + " and t.completed=:com"; // Add conditions to filter out tokens that are in progress or completed m.put("dep", sessionController.getDepartment()); - m.put("date", new Date()); m.put("cal", true); // Tokens that are called - m.put("prog", false); // Tokens that are not in progress + m.put("prog", true); // Tokens that are not in progress m.put("ty", TokenType.OPD_TOKEN); // Chack Token Type that are called m.put("com", false); // Tokens that are not completed j += " order by t.id"; diff --git a/src/main/webapp/analytics/index.xhtml b/src/main/webapp/analytics/index.xhtml index e097fb831c..dea949d5e0 100644 --- a/src/main/webapp/analytics/index.xhtml +++ b/src/main/webapp/analytics/index.xhtml @@ -16,6 +16,23 @@ + +
+ + + + +
+
- -
-
+ +
+
+
- + - - - -
-
- - -
+
+
+
+ +
- +
+ diff --git a/src/main/webapp/cashier/initial_fund_bill_list.xhtml b/src/main/webapp/cashier/initial_fund_bill_list.xhtml new file mode 100644 index 0000000000..792c648ebc --- /dev/null +++ b/src/main/webapp/cashier/initial_fund_bill_list.xhtml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #{ssb.creater} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/cashier/shift_end_summery_bill.xhtml b/src/main/webapp/cashier/shift_end_summery_bill.xhtml index 278847dc2a..5b9802f900 100644 --- a/src/main/webapp/cashier/shift_end_summery_bill.xhtml +++ b/src/main/webapp/cashier/shift_end_summery_bill.xhtml @@ -4,7 +4,8 @@ xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.org/ui" - xmlns:f="http://xmlns.jcp.org/jsf/core"> + xmlns:f="http://xmlns.jcp.org/jsf/core" + xmlns:ez="http://xmlns.jcp.org/jsf/composite/ezcomp"> @@ -26,348 +27,7 @@
- - - -
-
-    - -
-
- -
-
- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CategoryInOutNet Total
- - #{financialTransactionController.financialReportByPayments.collectedCash}#{financialTransactionController.financialReportByPayments.refundedCash}#{financialTransactionController.financialReportByPayments.netCashTotal}
- - #{financialTransactionController.financialReportByPayments.collectedCreditCard}#{financialTransactionController.financialReportByPayments.refundedCreditCard}#{financialTransactionController.financialReportByPayments.netCreditCardTotal}
- - #{financialTransactionController.financialReportByPayments.collectedVoucher}#{financialTransactionController.financialReportByPayments.refundedVoucher}#{financialTransactionController.financialReportByPayments.netVoucherTotal}
- - - #{financialTransactionController.financialReportByPayments.collectedOtherNonCredit}#{financialTransactionController.financialReportByPayments.refundedOtherNonCredit}#{financialTransactionController.financialReportByPayments.netOtherNonCreditTotal}
Float My-Safe (Start Funds)#{financialTransactionController.financialReportByPayments.shiftStartFunds} #{financialTransactionController.financialReportByPayments.shiftStartFunds}
Float Collected Handovers#{financialTransactionController.financialReportByPayments.floatReceived}#{financialTransactionController.financialReportByPayments.floatHandover} #{financialTransactionController.financialReportByPayments.floatReceived - financialTransactionController.financialReportByPayments.floatHandover}
Bank Transaction#{financialTransactionController.financialReportByPayments.bankWithdrawals}#{financialTransactionController.financialReportByPayments.bankDeposits} #{financialTransactionController.financialReportByPayments.bankWithdrawals - financialTransactionController.financialReportByPayments.bankDeposits}
Cash In / Outs#{financialTransactionController.financialReportByPayments.cashCollectedTransferIn}#{financialTransactionController.financialReportByPayments.cashGivenOutTransferOut} #{financialTransactionController.financialReportByPayments.cashCollectedTransferIn - financialTransactionController.financialReportByPayments.cashGivenOutTransferOut}
Total - - - - - -
Short/Excess - - - - - - - - -
- - - -
- -
-
-
- - -
- - -
-
- -
-
- - - - - - -
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - - -
-
-
- - -
-
-
- - - - - - - - - - -
- - - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - + diff --git a/src/main/webapp/cashier/shift_end_summery_bill_of_selected_user_not_closed.xhtml b/src/main/webapp/cashier/shift_end_summery_bill_of_selected_user_not_closed.xhtml new file mode 100644 index 0000000000..57a0f3c8e8 --- /dev/null +++ b/src/main/webapp/cashier/shift_end_summery_bill_of_selected_user_not_closed.xhtml @@ -0,0 +1,38 @@ + + + + + + + + + + + +
+ +
+
+ + + +
+
+ No Start Fund Bill Available to Close +
+
+
+
+ + +
+
+
+ +
+ diff --git a/src/main/webapp/channel/channel_booking_by_date.xhtml b/src/main/webapp/channel/channel_booking_by_date.xhtml index a08df0f31a..53cd113615 100644 --- a/src/main/webapp/channel/channel_booking_by_date.xhtml +++ b/src/main/webapp/channel/channel_booking_by_date.xhtml @@ -54,11 +54,11 @@
- - - - - + + + + +
@@ -66,7 +66,7 @@
@@ -83,7 +83,7 @@ @@ -91,7 +91,7 @@ @@ -99,7 +99,7 @@ @@ -123,7 +123,7 @@
- +
@@ -216,14 +216,14 @@
- - - + + +

- +
diff --git a/src/main/webapp/channel/channel_queue.xhtml b/src/main/webapp/channel/channel_queue.xhtml index ec65e87e45..d0eb674f99 100644 --- a/src/main/webapp/channel/channel_queue.xhtml +++ b/src/main/webapp/channel/channel_queue.xhtml @@ -116,7 +116,7 @@ - +
diff --git a/src/main/webapp/channel/channel_views/channel_nurse_view_with_items.xhtml b/src/main/webapp/channel/channel_views/channel_nurse_view_with_items.xhtml new file mode 100644 index 0000000000..eb0254df35 --- /dev/null +++ b/src/main/webapp/channel/channel_views/channel_nurse_view_with_items.xhtml @@ -0,0 +1,189 @@ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + +
+
+
+ + + +
+ +
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + +
+
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+
+
+ + +
+ + diff --git a/src/main/webapp/channel/channel_views/index.xhtml b/src/main/webapp/channel/channel_views/index.xhtml index b4cf881f76..565b15c3c4 100644 --- a/src/main/webapp/channel/channel_views/index.xhtml +++ b/src/main/webapp/channel/channel_views/index.xhtml @@ -26,6 +26,12 @@ action="#{bookingControllerViewScope.navigateToNurseView()}" icon="fa fa-calendar-alt" styleClass="ui-button-success" /> + - + - + - + diff --git a/src/main/webapp/channel/patient_portal.xhtml b/src/main/webapp/channel/patient_portal.xhtml index 95a08c71bc..26f81adede 100644 --- a/src/main/webapp/channel/patient_portal.xhtml +++ b/src/main/webapp/channel/patient_portal.xhtml @@ -206,6 +206,7 @@ +
@@ -377,6 +378,7 @@
+
diff --git a/src/main/webapp/patient_portal_pay.xhtml b/src/main/webapp/patient_portal_pay.xhtml index 9023bf3602..24e2015778 100644 --- a/src/main/webapp/patient_portal_pay.xhtml +++ b/src/main/webapp/patient_portal_pay.xhtml @@ -38,11 +38,11 @@

Doctor:

-

#{patientPortalController.selectedConsultant.person.nameWithTitle}

+

#{patientPortalController.selectedSessionInstance.staff.person.nameWithTitle}

Speciality:

-

#{patientPortalController.selectedConsultant.speciality.name}

+

#{patientPortalController.selectedSessionInstance.staff.speciality.name}

Session:

@@ -61,8 +61,18 @@

Total Amount:

#{patientPortalController.selectedSessionInstance.originatingSession.total}

- +
+ I have read and agree to the terms and conditions and privacy policy. +
+ +
+
+ + +
+
+
@@ -81,5 +91,11 @@ Checkout.showPaymentPage(); // Or Checkout.showLightbox(); } + diff --git a/src/main/webapp/resources/ezcomp/shift_end_summary_table.xhtml b/src/main/webapp/resources/ezcomp/shift_end_summary_table.xhtml new file mode 100644 index 0000000000..cf8cfdccbd --- /dev/null +++ b/src/main/webapp/resources/ezcomp/shift_end_summary_table.xhtml @@ -0,0 +1,252 @@ + + + + + + + + + + + + + +
+
+    + +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CategoryInOutNet Total
+ + #{financialTransactionController.financialReportByPayments.collectedCash}#{financialTransactionController.financialReportByPayments.refundedCash}#{financialTransactionController.financialReportByPayments.netCashTotal}
+ + #{financialTransactionController.financialReportByPayments.collectedCreditCard}#{financialTransactionController.financialReportByPayments.refundedCreditCard}#{financialTransactionController.financialReportByPayments.netCreditCardTotal}
+ + #{financialTransactionController.financialReportByPayments.collectedVoucher}#{financialTransactionController.financialReportByPayments.refundedVoucher}#{financialTransactionController.financialReportByPayments.netVoucherTotal}
+ + + #{financialTransactionController.financialReportByPayments.collectedOtherNonCredit}#{financialTransactionController.financialReportByPayments.refundedOtherNonCredit}#{financialTransactionController.financialReportByPayments.netOtherNonCreditTotal}
Float My-Safe (Start Funds)#{financialTransactionController.financialReportByPayments.shiftStartFunds} #{financialTransactionController.financialReportByPayments.shiftStartFunds}
Float Collected Handovers#{financialTransactionController.financialReportByPayments.floatReceived}#{financialTransactionController.financialReportByPayments.floatHandover} #{financialTransactionController.financialReportByPayments.floatReceived - financialTransactionController.financialReportByPayments.floatHandover}
Bank Transaction#{financialTransactionController.financialReportByPayments.bankWithdrawals}#{financialTransactionController.financialReportByPayments.bankDeposits} #{financialTransactionController.financialReportByPayments.bankWithdrawals - financialTransactionController.financialReportByPayments.bankDeposits}
Cash In / Outs#{financialTransactionController.financialReportByPayments.cashCollectedTransferIn}#{financialTransactionController.financialReportByPayments.cashGivenOutTransferOut} #{financialTransactionController.financialReportByPayments.cashCollectedTransferIn - financialTransactionController.financialReportByPayments.cashGivenOutTransferOut}
Total + + + + + +
Short/Excess + + + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ \ No newline at end of file diff --git a/src/main/webapp/resources/image/PaymentGatewayFooter.jpg b/src/main/webapp/resources/image/PaymentGatewayFooter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eba57f627fbc9c28badec07dac482fd3b47a7a52 GIT binary patch literal 73498 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 literal 0 HcmV?d00001 From e733b5bbecf9aa61a4b1270fe190c670512f91bd Mon Sep 17 00:00:00 2001 From: buddhika75 Date: Sat, 20 Jul 2024 00:07:16 +0530 Subject: [PATCH 12/18] Working Copy in Sethma Signed-off-by: buddhika75 --- .../bean/channel/BookingController.java | 120 +++++++-- .../channel/BookingControllerViewScope.java | 179 +++++++++++-- .../ChannelStaffPaymentBillController.java | 2 + .../bean/common/OpdTokenController.java | 6 +- .../bean/common/PaymentGatewayController.java | 6 +- src/main/java/com/divudi/data/BillType.java | 2 + .../java/com/divudi/data/BillTypeAtomic.java | 2 + .../webapp/cashier/fund_transfer_bill.xhtml | 3 - src/main/webapp/cashier/index.xhtml | 7 +- .../webapp/cashier/initial_fund_bill.xhtml | 2 - .../channel/channel_booking_by_date.xhtml | 2 +- src/main/webapp/channel/channel_queue.xhtml | 251 +++++++++--------- src/main/webapp/channel/patient_portal.xhtml | 2 +- .../webapp/channel/session_instance.xhtml | 24 +- .../webapp/opd/token/opd_tokens_called.xhtml | 125 ++++++--- 15 files changed, 507 insertions(+), 226 deletions(-) diff --git a/src/main/java/com/divudi/bean/channel/BookingController.java b/src/main/java/com/divudi/bean/channel/BookingController.java index 0bf8471bda..0012106796 100644 --- a/src/main/java/com/divudi/bean/channel/BookingController.java +++ b/src/main/java/com/divudi/bean/channel/BookingController.java @@ -198,13 +198,13 @@ public class BookingController implements Serializable, ControllerWithPatient { ConfigOptionApplicationController configOptionApplicationController; @Inject FinancialTransactionController financialTransactionController; - @Inject + @Inject BookingControllerViewScope bookingControllerViewScope; @Inject SecurityController securityController; @Inject private CommonController commonController; - /** + /** * Properties */ private Speciality speciality; @@ -264,6 +264,61 @@ public class BookingController implements Serializable, ControllerWithPatient { private Integer selectedReserverdBookingNumber; private Double feeTotalForSelectedBill; private BillSession recheduledBillSession; + private List sessionInstancesToday; + private String sessionInstanceFilter; + private List sessionInstancesFiltered; + + public void filterSessionInstances() { + sessionInstancesToday = getSessionInstances(); + if (sessionInstanceFilter == null || sessionInstanceFilter.trim().isEmpty()) { + if (sessionInstances != null) { + sessionInstancesFiltered = new ArrayList<>(sessionInstances); + } else { + sessionInstancesFiltered = new ArrayList<>(); + return; + } + return; + } + + sessionInstancesFiltered = new ArrayList<>(); + String[] filterKeywords = sessionInstanceFilter.trim().toLowerCase().split("\\s+"); + + for (SessionInstance si : getSortedSessionInstances()) { + System.out.println("si = " + si); + String match1 = (si.getOriginatingSession() != null && si.getOriginatingSession().getName() != null) + ? si.getOriginatingSession().getName().toLowerCase() : ""; + String match2 = (si.getOriginatingSession() != null && si.getOriginatingSession().getStaff() != null + && si.getOriginatingSession().getStaff().getPerson() != null + && si.getOriginatingSession().getStaff().getPerson().getName() != null) + ? si.getOriginatingSession().getStaff().getPerson().getName().toLowerCase() : ""; + String match3 = (si.getOriginatingSession() != null && si.getOriginatingSession().getStaff() != null + && si.getOriginatingSession().getStaff().getSpeciality() != null + && si.getOriginatingSession().getStaff().getSpeciality().getName() != null) + ? si.getOriginatingSession().getStaff().getSpeciality().getName().toLowerCase() : ""; + + boolean matchesAll = true; + for (String keyword : filterKeywords) { + if (!(match1.contains(keyword) || match2.contains(keyword) || match3.contains(keyword))) { + matchesAll = false; + break; + } + } + + if (matchesAll) { + sessionInstancesFiltered.add(si); + } + } + sessionInstancesToday = sessionInstancesFiltered; + if (!sessionInstancesFiltered.isEmpty()) { + selectedSessionInstance = selectedSessionInstance = sessionInstancesFiltered.get(0); + sessionInstanceSelected(); + } + + } + + public void sessionInstanceSelected() { + sortSessions(); + } public void fillSessionInstanceByDoctor() { Staff selectedConsultant; @@ -346,7 +401,7 @@ public String createSmsForChannelBookingReschedule(Bill b, BillSession b1, Strin if (b.getSingleBillSession().getSessionInstance().getOriginatingSession() == null) { return ""; } - if (b1==null) { + if (b1 == null) { System.out.println("billsession = " + b1); } SessionInstance si = b.getSingleBillSession().getSessionInstance(); @@ -442,8 +497,8 @@ private void createBillSessionForReschedule(BillSession bs, SessionInstance si) bs.setRecheduledSession(true); bs.setReferenceBillSession(newBillSession); getBillSessionFacade().edit(bs); - recheduledBillSession=newBillSession; - + recheduledBillSession = newBillSession; + } public void sendSmsOnChannelBookingReschedule() { @@ -501,7 +556,7 @@ public void markSessionInstanceAsStarted() { JsfUtil.addErrorMessage("No session selected"); return; } - if(!selectedSessionInstance.isArrived()){ + if (!selectedSessionInstance.isArrived()) { markAsArrived(); } selectedSessionInstance.setStarted(true); @@ -569,7 +624,7 @@ public void markSessionInstanceAsCompleted() { JsfUtil.addSuccessMessage("Session Completed"); sendSmsOnChannelMissingChannelBookings(); } - + public void sendChannellingStatusUpdateNotificationSms(BillSession methodBillSession) { if (methodBillSession == null) { JsfUtil.addErrorMessage("Nothing to send"); @@ -615,7 +670,7 @@ public void sendChannellingStatusUpdateNotificationSms(BillSession methodBillSes JsfUtil.addSuccessMessage("SMS Sent"); } - + public String smsBody(BillSession r) { String securityKey = sessionController.getApplicationPreference().getEncrptionKey(); if (securityKey == null || securityKey.trim().equals("")) { @@ -719,6 +774,7 @@ public String navigateToChannelBookingFromMenu() { public String navigateToChannelQueueFromMenu() { sessionInstances = channelBean.listTodaysSesionInstances(); + sessionInstancesToday=sessionInstances; return "/channel/channel_queue?faces-redirect=true"; } @@ -743,18 +799,18 @@ public void listTodaysOngoingSesionInstances() { public void listTodaysCompletedSesionInstances() { sessionInstances = channelBean.listTodaysSessionInstances(null, true, null); } - + public void listSessionInstancesByDate() { - sessionInstances = channelBean.listSessionInstancesByDate(fromDate,null, null, null); - if(configOptionApplicationController.getBooleanValueByKey("Load Past Patient Data")){ - for( SessionInstance s : sessionInstances){ - bookingControllerViewScope.fillBillSessions(s); + sessionInstances = channelBean.listSessionInstancesByDate(fromDate, null, null, null); + if (configOptionApplicationController.getBooleanValueByKey("Load Past Patient Data")) { + for (SessionInstance s : sessionInstances) { + bookingControllerViewScope.fillBillSessions(s); } } } - + public boolean isSessionDateToday() { - if(fromDate == null){ + if (fromDate == null) { fromDate = new Date(); } @@ -762,8 +818,8 @@ public boolean isSessionDateToday() { Calendar sessionCalendar = Calendar.getInstance(); sessionCalendar.setTime(fromDate); - return today.get(Calendar.YEAR) == sessionCalendar.get(Calendar.YEAR) && - today.get(Calendar.DAY_OF_YEAR) == sessionCalendar.get(Calendar.DAY_OF_YEAR); + return today.get(Calendar.YEAR) == sessionCalendar.get(Calendar.YEAR) + && today.get(Calendar.DAY_OF_YEAR) == sessionCalendar.get(Calendar.DAY_OF_YEAR); } public void listTodaysPendingSesionInstances() { @@ -1060,7 +1116,7 @@ public void updateSelectedBillSessionPatient() { } private void sortSessions() { - sortedSessionInstances = new ArrayList<>(sessionInstances); + sortedSessionInstances = new ArrayList<>(sessionInstancesToday); Collections.sort(sortedSessionInstances, new Comparator() { @Override public int compare(SessionInstance s1, SessionInstance s2) { @@ -3743,8 +3799,8 @@ private BillSession createBillSession(Bill bill, BillItem billItem, boolean forR count = serviceSessionBean.getNextNonReservedSerialNumber(getSelectedSessionInstance(), reservedNumbers); JsfUtil.addErrorMessage("No reserved numbers available. Normal number is given"); } - - bs.setReservedBooking(true); + + bs.setReservedBooking(true); } else { count = serviceSessionBean.getNextNonReservedSerialNumber(getSelectedSessionInstance(), reservedNumbers); } @@ -4448,4 +4504,28 @@ public void setFromDate(Date fromDate) { this.fromDate = fromDate; } + public List getSessionInstancesToday() { + return sessionInstancesToday; + } + + public void setSessionInstancesToday(List sessionInstancesToday) { + this.sessionInstancesToday = sessionInstancesToday; + } + + public String getSessionInstanceFilter() { + return sessionInstanceFilter; + } + + public void setSessionInstanceFilter(String sessionInstanceFilter) { + this.sessionInstanceFilter = sessionInstanceFilter; + } + + public List getSessionInstancesFiltered() { + return sessionInstancesFiltered; + } + + public void setSessionInstancesFiltered(List sessionInstancesFiltered) { + this.sessionInstancesFiltered = sessionInstancesFiltered; + } + } diff --git a/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java b/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java index 9c9fa56c2a..ce88d159ed 100644 --- a/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java +++ b/src/main/java/com/divudi/bean/channel/BookingControllerViewScope.java @@ -423,9 +423,15 @@ private void createBillSessionForReschedule(BillSession bs, SessionInstance si) return; } + Bill printingBill = createBillForChannelReshedule(selectedBillSession); + BillItem savingBillItem = createSessionItemForReshedule(printingBill); + if (printingBill.getBillTypeAtomic().getBillFinanceType() == BillFinanceType.CASH_IN) { + createPayment(printingBill, paymentMethod); + } + newBillSession.copy(bs); - newBillSession.setBill(bs.getBill()); - newBillSession.setBillItem(bs.getBillItem()); + newBillSession.setBill(printingBill); + newBillSession.setBillItem(savingBillItem); newBillSession.setReferenceBillSession(bs); newBillSession.setCreatedAt(new Date()); newBillSession.setCreater(getSessionController().getLoggedUser()); @@ -470,7 +476,125 @@ private void createBillSessionForReschedule(BillSession bs, SessionInstance si) bs.setReferenceBillSession(newBillSession); getBillSessionFacade().edit(bs); newBillSessionForSMS = newBillSession; + System.out.println("newBillSessionForSMS = " + newBillSessionForSMS); + printingBill.setSingleBillSession(newBillSession); + billFacade.edit(printingBill); + for (BillItem bi : printingBill.getBillItems()) { + bi.setBillSession(newBillSession); + billItemFacade.edit(bi); + } + } + + private Bill createBillForChannelReshedule(BillSession bs) { + Bill bill = new BilledBill(); + List billItems = new ArrayList<>(); + bill.setBillItems(billItems); + bill.setStaff(getSelectedSessionInstanceForRechedule().getOriginatingSession().getStaff()); + bill.setToStaff(toStaff); + bill.setAppointmentAt(getSelectedSessionInstanceForRechedule().getSessionDate()); + bill.setTotal(getSelectedSessionInstanceForRechedule().getOriginatingSession().getTotal()); + bill.setNetTotal(getSelectedSessionInstanceForRechedule().getOriginatingSession().getTotal()); + bill.setPaymentMethod(bs.getBill().getPaymentMethod()); + bill.setPatient(bs.getBill().getPatient()); + switch (bs.getBill().getPaymentMethod()) { + case OnCall: + bill.setBillType(BillType.ChannelResheduleWithOutPayment); + bill.setBillTypeAtomic(BillTypeAtomic.CHANNEL_RESHEDULE_WITH_OUT_PAYMENT); + break; + + case Cash: + bill.setBillType(BillType.ChannelResheduleWithOutPayment); + bill.setBillTypeAtomic(BillTypeAtomic.CHANNEL_RESHEDULE_WITH_PAYMENT); + break; + + case Card: + bill.setBillType(BillType.ChannelResheduleWithPayment); + bill.setBillTypeAtomic(BillTypeAtomic.CHANNEL_RESHEDULE_WITH_PAYMENT); + break; + + case Cheque: + bill.setBillType(BillType.ChannelResheduleWithOutPayment); + bill.setBillTypeAtomic(BillTypeAtomic.CHANNEL_RESHEDULE_WITH_OUT_PAYMENT); + break; + + case Slip: + bill.setBillType(BillType.ChannelResheduleWithOutPayment); + bill.setBillTypeAtomic(BillTypeAtomic.CHANNEL_RESHEDULE_WITH_OUT_PAYMENT); + break; + case Agent: + bill.setBillType(BillType.ChannelResheduleWithOutPayment); + bill.setBillTypeAtomic(BillTypeAtomic.CHANNEL_RESHEDULE_WITH_OUT_PAYMENT); + break; + case Staff: + bill.setBillType(BillType.ChannelResheduleWithOutPayment); + bill.setBillTypeAtomic(BillTypeAtomic.CHANNEL_RESHEDULE_WITH_OUT_PAYMENT); + break; + case Credit: + bill.setBillType(BillType.ChannelResheduleWithOutPayment); + bill.setBillTypeAtomic(BillTypeAtomic.CHANNEL_RESHEDULE_WITH_OUT_PAYMENT); + break; + case OnlineSettlement: + bill.setBillType(BillType.ChannelResheduleWithOutPayment); + bill.setBillTypeAtomic(BillTypeAtomic.CHANNEL_RESHEDULE_WITH_OUT_PAYMENT); + break; + + case MultiplePaymentMethods: + bill.setBillType(BillType.ChannelResheduleWithPayment); + bill.setBillTypeAtomic(BillTypeAtomic.CHANNEL_RESHEDULE_WITH_PAYMENT); + break; + } + + String deptId = generateBillNumberDeptId(bill); + if (deptId.equals("")) { + return null; + } + bill.setDeptId(deptId); + bill.setInsId(deptId); + + bill.setPaidAmount(getSelectedSessionInstanceForRechedule().getOriginatingSession().getTotal()); + bill.setPaidAt(new Date()); + + bill.setBillDate(new Date()); + bill.setBillTime(new Date()); + bill.setCreatedAt(new Date()); + bill.setCreater(getSessionController().getLoggedUser()); + bill.setDepartment(getSessionController().getDepartment()); + bill.setInstitution(sessionController.getInstitution()); + + bill.setToDepartment(getSelectedSessionInstanceForRechedule().getDepartment()); + bill.setToInstitution(getSelectedSessionInstanceForRechedule().getInstitution()); + getBillFacade().create(bill); + BillItem savingBillItem = createSessionItemForReshedule(bill); + billItems.add(savingBillItem); + bill.setBillItems(billItems); + getBillFacade().edit(bill); + if (bs.getBill().getBillType() == BillType.ChannelCash || bs.getBill().getBillType() == BillType.ChannelAgent) { + bill.setPaidBill(bill); + getBillFacade().edit(bill); } + return bill; + } + + private BillItem createSessionItemForReshedule(Bill bill) { + BillItem bi = new BillItem(); + bi.setAdjustedValue(0.0); + bi.setAgentRefNo(agentRefNo); + bi.setBill(bill); + bi.setBillTime(new Date()); + bi.setCreatedAt(new Date()); + bi.setCreater(getSessionController().getLoggedUser()); + bi.setGrossValue(getSelectedSessionInstanceForRechedule().getOriginatingSession().getTotal()); + bi.setItem(getSelectedSessionInstanceForRechedule().getOriginatingSession()); +// bi.setItem(getSelectedSessionInstance().getOriginatingSession()); + bi.setNetRate(getSelectedSessionInstanceForRechedule().getOriginatingSession().getTotal()); + bi.setNetValue(getSelectedSessionInstanceForRechedule().getOriginatingSession().getTotal()); + bi.setQty(1.0); + bi.setRate(getSelectedSessionInstanceForRechedule().getOriginatingSession().getTotal()); + bi.setSessionDate(getSelectedSessionInstanceForRechedule().getSessionAt()); + + billItemFacade.create(bi); + return bi; + } public void fillSessionInstanceByDoctor() { sessionInstanceByDoctor = new ArrayList<>(); @@ -727,7 +851,7 @@ public void sendSmsChannelSessionCancelNotification() { } JsfUtil.addSuccessMessage("SMS Sent to all Patients."); } - + public void sendSmsChannelSessionTImeChangeNotification() { if (selectedSessionInstance == null) { @@ -755,7 +879,7 @@ public void sendSmsChannelSessionTImeChangeNotification() { Boolean sent = smsManager.sendSms(e); e.setSentSuccessfully(sent); getSmsFacade().edit(e); - + } JsfUtil.addSuccessMessage("SMS Sent to all Patients."); } @@ -803,11 +927,11 @@ public void saveSessionInstanceDetails() { JsfUtil.addErrorMessage("Starting Time and Endtime are the same or Endtime is before Starting Time"); return; } - + if (!selectedSessionInstance.getStartingTime().equals(selectedSessionInstance.getOriginatingSession().getStartingTime()) || !selectedSessionInstance.getEndingTime().equals(selectedSessionInstance.getOriginatingSession().getEndingTime())) { sendSmsChannelSessionTImeChangeNotification(); } - + selectedSessionInstance.setEditedAt(new Date()); selectedSessionInstance.setEditer(sessionController.getLoggedUser()); sessionInstanceFacade.edit(selectedSessionInstance); @@ -1019,7 +1143,7 @@ public void markSessionInstanceAsStarted() { JsfUtil.addErrorMessage("No session selected"); return; } - if(!selectedSessionInstance.isArrived()){ + if (!selectedSessionInstance.isArrived()) { markAsArrived(); } selectedSessionInstance.setStarted(true); @@ -1605,7 +1729,7 @@ public String navigateToNurseView() { return ""; } } - + public String navigateToNurseViewWithItems() { if (preSet()) { getChannelReportController().fillNurseView(); @@ -1869,7 +1993,7 @@ public void cancelCreditPaidBill() { comment = null; printPreviewC = true; } - + public void cancel(Bill bill, BillItem billItem, BillSession billSession) { if (errorCheckCancelling()) { return; @@ -1889,7 +2013,7 @@ public void cancel(Bill bill, BillItem billItem, BillSession billSession) { if (bill.getPaidBill().equals(bill)) { CancelledBill cb = createCancelCashBill(bill); - createPaymentForCancellationsAndRefunds(cb,cb.getPaymentMethod()); + createPaymentForCancellationsAndRefunds(cb, cb.getPaymentMethod()); BillItem cItem = cancelBillItems(billItem, cb); BillSession cbs = cancelBillSession(billSession, cb, cItem); bill.setCancelled(true); @@ -1908,7 +2032,7 @@ public void cancel(Bill bill, BillItem billItem, BillSession billSession) { } else { CancelledBill cb = createCancelBill(bill); - createPaymentForCancellationsAndRefunds(cb,bill.getPaidBill().getPaymentMethod()); + createPaymentForCancellationsAndRefunds(cb, bill.getPaidBill().getPaymentMethod()); BillItem cItem = cancelBillItems(billItem, cb); BillSession cbs = cancelBillSession(billSession, cb, cItem); bill.setCancelled(true); @@ -2723,10 +2847,10 @@ public void addChannelBooking(boolean reservedBooking) { int maxNo = selectedSessionInstance.getMaxNo(); long bookedPatientCount = selectedSessionInstance.getBookedPatientCount(); long totalPatientCount; - + List reservedNumbers = CommonFunctions.convertStringToIntegerList(selectedSessionInstance.getReserveNumbers()); bookedPatientCount = bookedPatientCount + reservedNumbers.size(); - + if (selectedSessionInstance.getCancelPatientCount() != null) { long canceledPatientCount = selectedSessionInstance.getCancelPatientCount(); totalPatientCount = bookedPatientCount - canceledPatientCount; @@ -2768,15 +2892,15 @@ public void addChannelBooking(boolean reservedBooking) { createPayment(printingBill, paymentMethod); } sendSmsAfterBooking(); - if(selectedSessionInstance.isStarted()){ + if (selectedSessionInstance.isStarted()) { sendChannellingStatusUpdateNotificationSms(printingBill.getSingleBillSession()); } settleSucessFully = true; printPreview = true; JsfUtil.addSuccessMessage("Channel Booking Added."); } - - public long totalReservedNumberCount(SessionInstance s){ + + public long totalReservedNumberCount(SessionInstance s) { List reservedNumbers = CommonFunctions.convertStringToIntegerList(s.getReserveNumbers()); long reservedNumberCount = reservedNumbers.size(); return reservedNumberCount; @@ -2966,7 +3090,7 @@ private String createChanellSessionCancellationBookingSms(Bill b) { } return createSmsForChannelBooking(b, smsTemplateForchannelSessionCancellation); } - + private String createChanellSessionTimeChangeSms(Bill b) { // String template = sessionController.getDepartmentPreference().getSmsTemplateForChannelBooking(); String smsTemplateForchannelSessionCancellation = configOptionController.getLongTextValueByKey("Template for SMS sent on Channel Booking Appointment Time Changed", OptionScope.APPLICATION, null, null, null); @@ -3015,7 +3139,7 @@ public String createSmsForChannelBooking(Bill b, String template) { return s; } - + public String createSmsForChannelBookingTimeChange(Bill b, String template) { if (b == null) { return ""; @@ -4655,7 +4779,7 @@ private Bill saveBilledBill(boolean forReservedNumbers) { if (savingBill.getPaidAmount() == 0.0) { if (!(savingBill.getPaymentMethod() == PaymentMethod.OnCall)) { savingBill.setPaidAmount(feeNetTotalForSelectedBill); - }else{ + } else { savingBill.setNetTotal(feeNetTotalForSelectedBill); } } @@ -5632,7 +5756,7 @@ public void listnerStaffListForSpecilitySelectedText() { listnerStaffListForRowSelect(); } } - + public void listnerForPaymentMethodChangeOnCreditSettle() { if (settlePaymentMethod == PaymentMethod.Card) { getPaymentMethodData().getCreditCard().setTotalValue(getBillSession().getBill().getNetTotal()); @@ -6551,7 +6675,7 @@ public void refund(Bill bill, BillItem billItem, List billFees, BillSes getBillFacade().edit(bill); } else { - if(refundPaymentMethod == null){ + if (refundPaymentMethod == null) { refundPaymentMethod = bill.getPaidBill().getPaymentMethod(); } RefundBill rb = (RefundBill) createRefundBill(bill); @@ -6571,7 +6695,7 @@ public void refund(Bill bill, BillItem billItem, List billFees, BillSes BillItem rpBilItm = refundBillItems(bill.getSingleBillItem(), rb); BillSession rpSession = refundBillSession(billSession.getPaidBillSession(), rpb, rpBilItm); - billSession.getPaidBillSession().setReferenceBillSession(rpSession); + billSession.getPaidBillSession().setReferenceBillSession(rpSession); billSessionFacade.edit(billSession.getPaidBillSession()); if (bill.getPaymentMethod() == PaymentMethod.Agent) { @@ -6637,7 +6761,7 @@ public void refund1(Bill bill, BillItem billItem, List billFees, BillSe RefundBill rpb = (RefundBill) createRefundBill1(bill.getPaidBill()); BillItem rpBilItm = refundBillItems(bill.getSingleBillItem(), rb); BillSession rpSession = refundBillSession(billSession.getPaidBillSession(), rpb, rpBilItm); - + billSession.getPaidBillSession().setReferenceBillSession(rpSession); billSessionFacade.edit(billSession.getPaidBillSession()); @@ -6655,20 +6779,20 @@ public void refund1(Bill bill, BillItem billItem, List billFees, BillSe } } - + public Payment createPaymentForCancellationsAndRefunds(Bill bill, PaymentMethod pm) { Payment p = new Payment(); p.setBill(bill); double valueToSet = 0 - Math.abs(bill.getNetTotal()); p.setPaidValue(valueToSet); - if(pm == null){ + if (pm == null) { pm = bill.getPaymentMethod(); } setPaymentMethodData(p, pm); return p; } - - public void setPaymentMethodData(Payment p, PaymentMethod pm) { + + public void setPaymentMethodData(Payment p, PaymentMethod pm) { p.setInstitution(getSessionController().getInstitution()); p.setDepartment(getSessionController().getDepartment()); p.setCreatedAt(new Date()); @@ -6776,7 +6900,6 @@ public void checkRefundTotal() { calRefundTotal(); } - private Bill createRefundBill(Bill bill) { RefundBill rb = new RefundBill(); rb.copy(bill); diff --git a/src/main/java/com/divudi/bean/channel/ChannelStaffPaymentBillController.java b/src/main/java/com/divudi/bean/channel/ChannelStaffPaymentBillController.java index 3c09b7dd3f..980a811adb 100644 --- a/src/main/java/com/divudi/bean/channel/ChannelStaffPaymentBillController.java +++ b/src/main/java/com/divudi/bean/channel/ChannelStaffPaymentBillController.java @@ -973,6 +973,7 @@ public void settleBill() { sendSmsAfterDocPayment(); } printPreview = true; + currentStaff=null; JsfUtil.addSuccessMessage("Successfully Paid"); //////// // System.out.println("Paid"); } @@ -997,6 +998,7 @@ public void settleSessionPaymentBill() { sendSmsAfterSessionPayment(); } printPreview = true; + currentStaff=null; JsfUtil.addSuccessMessage("Successfully Paid"); } diff --git a/src/main/java/com/divudi/bean/common/OpdTokenController.java b/src/main/java/com/divudi/bean/common/OpdTokenController.java index 0d66d69853..d240d1d72e 100644 --- a/src/main/java/com/divudi/bean/common/OpdTokenController.java +++ b/src/main/java/com/divudi/bean/common/OpdTokenController.java @@ -317,10 +317,12 @@ public void fillOpdTokens() { String j = "Select t " + " from Token t" + " where t.department=:dep" + + " and t.tokenDate=:date " + " and t.tokenType=:ty" + " and t.completed=:com"; Map m = new HashMap(); m.put("dep", sessionController.getDepartment()); + m.put("date", new Date()); m.put("ty", TokenType.OPD_TOKEN); m.put("com", false); if (counter != null) { @@ -356,13 +358,15 @@ public void fillOpdTokensCalled() { String j = "Select t " + " from Token t" + " where t.department=:dep" + + " and t.tokenDate=:date " + " and t.called=:cal " + " and t.tokenType=:ty" + " and t.inProgress=:prog " + " and t.completed=:com"; // Add conditions to filter out tokens that are in progress or completed m.put("dep", sessionController.getDepartment()); + m.put("date", new Date()); m.put("cal", true); // Tokens that are called - m.put("prog", true); // Tokens that are not in progress + m.put("prog", false); // Tokens that are not in progress m.put("ty", TokenType.OPD_TOKEN); // Chack Token Type that are called m.put("com", false); // Tokens that are not completed j += " order by t.id"; diff --git a/src/main/java/com/divudi/bean/common/PaymentGatewayController.java b/src/main/java/com/divudi/bean/common/PaymentGatewayController.java index 5027ab3e99..3253a113db 100644 --- a/src/main/java/com/divudi/bean/common/PaymentGatewayController.java +++ b/src/main/java/com/divudi/bean/common/PaymentGatewayController.java @@ -41,9 +41,9 @@ public class PaymentGatewayController implements Serializable { @Inject PatientPortalController patientPortalController; - private String merchantId = "TESTSETHMAHOSLKR"; // Actual Merchant ID - private String apiUsername = "merchant.TESTSETHMAHOSLKR"; // Actual API Username - private String apiPassword = "49de22fcd8ade9ecb3d81790f3ad152c"; // Actual API Password + private String merchantId = "SETHMAHOSLKR"; // Actual Merchant ID + private String apiUsername = "merchant.SETHMAHOSLKR"; // Actual API Username + private String apiPassword = "ae02020ce9b3d999767d17d5f36a5c4f"; // Actual API Password private String paymentStatus; private String sessionId; private String paymentUrl; diff --git a/src/main/java/com/divudi/data/BillType.java b/src/main/java/com/divudi/data/BillType.java index e65d27b812..3a73efad99 100644 --- a/src/main/java/com/divudi/data/BillType.java +++ b/src/main/java/com/divudi/data/BillType.java @@ -102,6 +102,8 @@ public enum BillType { ChannelAgent(ChannelCashFlow), ChannelOnCall(ChannelCreditFlow), ChannelStaff(ChannelCreditFlow), + ChannelResheduleWithOutPayment, + ChannelResheduleWithPayment, // @Deprecated need to payment bills for separately ChannelProPayment, ChannelAgencyPayment, diff --git a/src/main/java/com/divudi/data/BillTypeAtomic.java b/src/main/java/com/divudi/data/BillTypeAtomic.java index 576422a1dd..14f721a1aa 100644 --- a/src/main/java/com/divudi/data/BillTypeAtomic.java +++ b/src/main/java/com/divudi/data/BillTypeAtomic.java @@ -100,6 +100,8 @@ public enum BillTypeAtomic { // CHANNELLING CHANNEL_BOOKING_WITH_PAYMENT("Channel Booking and Payment", BillCategory.BILL, ServiceType.CHANNELLING, BillFinanceType.CASH_IN), CHANNEL_BOOKING_FOR_PAYMENT_ONLINE_PENDING_PAYMENT("Channel Booking For Online Payment - Pending Confirmation", BillCategory.BILL, ServiceType.CHANNELLING, BillFinanceType.NO_FINANCE_TRANSACTIONS), + CHANNEL_RESHEDULE_WITH_PAYMENT("Channel Reshedule for paid Appointment", BillCategory.BILL, ServiceType.CHANNELLING, BillFinanceType.NO_FINANCE_TRANSACTIONS), + CHANNEL_RESHEDULE_WITH_OUT_PAYMENT("Channel Reshedule For Non Paid Appointment", BillCategory.BILL, ServiceType.CHANNELLING, BillFinanceType.NO_FINANCE_TRANSACTIONS), @Deprecated CHANNEL_BOOKING_PAYMENT("Channel Booking For Online Payment - Pending Confirmation", BillCategory.BILL, ServiceType.CHANNELLING, BillFinanceType.NO_FINANCE_TRANSACTIONS), CHANNEL_BOOKING_WITH_PAYMENT_ONLINE("Channel Booking Online Payment", BillCategory.BILL, ServiceType.CHANNELLING, BillFinanceType.ONLINE_PAYMENT_IN), diff --git a/src/main/webapp/cashier/fund_transfer_bill.xhtml b/src/main/webapp/cashier/fund_transfer_bill.xhtml index 588286193d..171206b18c 100644 --- a/src/main/webapp/cashier/fund_transfer_bill.xhtml +++ b/src/main/webapp/cashier/fund_transfer_bill.xhtml @@ -69,9 +69,6 @@ layout="block" id="cheque" rendered="#{financialTransactionController.currentPayment.paymentMethod eq 'Cheque'}" > - - -
diff --git a/src/main/webapp/cashier/index.xhtml b/src/main/webapp/cashier/index.xhtml index 8daaecde35..84ba4acebe 100644 --- a/src/main/webapp/cashier/index.xhtml +++ b/src/main/webapp/cashier/index.xhtml @@ -8,10 +8,9 @@ - +
-
- +
- + diff --git a/src/main/webapp/cashier/initial_fund_bill.xhtml b/src/main/webapp/cashier/initial_fund_bill.xhtml index eb4254c16b..972bfbfcfd 100644 --- a/src/main/webapp/cashier/initial_fund_bill.xhtml +++ b/src/main/webapp/cashier/initial_fund_bill.xhtml @@ -6,11 +6,9 @@ xmlns:p="http://primefaces.org/ui" xmlns:prints="http://xmlns.jcp.org/jsf/composite/ezcomp/prints" xmlns:f="http://xmlns.jcp.org/jsf/core"> - - diff --git a/src/main/webapp/channel/channel_booking_by_date.xhtml b/src/main/webapp/channel/channel_booking_by_date.xhtml index 53cd113615..1eb96d6f85 100644 --- a/src/main/webapp/channel/channel_booking_by_date.xhtml +++ b/src/main/webapp/channel/channel_booking_by_date.xhtml @@ -123,7 +123,7 @@
- - -
-
-
- -
-
-
- - - - - - -
-
-
-
+ +
+
+ + + + +
+
+ + + + +
+
- +
-
-
- -
-
- +
+
+ + + + + +
- -
-
-
- -
- - - - - - - - : - - - - - - +
+
+
+
- -
+
+
+ +
+
+ +
+
-
-
- -
- -
- - - - +
+
+
+ +
+ + + + - - - - - - - + + : + + - +
- +
- -
-
-
-
- - +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+ +
+ + - - + + - - + + - - -
+ + +
-
- - - +
+ + + +
-
- - +
--> + +
diff --git a/src/main/webapp/channel/patient_portal.xhtml b/src/main/webapp/channel/patient_portal.xhtml index 26f81adede..290077c1c5 100644 --- a/src/main/webapp/channel/patient_portal.xhtml +++ b/src/main/webapp/channel/patient_portal.xhtml @@ -206,7 +206,7 @@
- +
diff --git a/src/main/webapp/channel/session_instance.xhtml b/src/main/webapp/channel/session_instance.xhtml index a3c3943830..697b3008ac 100644 --- a/src/main/webapp/channel/session_instance.xhtml +++ b/src/main/webapp/channel/session_instance.xhtml @@ -514,7 +514,29 @@ - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/opd/token/opd_tokens_called.xhtml b/src/main/webapp/opd/token/opd_tokens_called.xhtml index e65b18f71d..bdfd49199f 100644 --- a/src/main/webapp/opd/token/opd_tokens_called.xhtml +++ b/src/main/webapp/opd/token/opd_tokens_called.xhtml @@ -35,10 +35,10 @@ font-weight: bold; color: #333; } -/* .patient-name { - font-size: 1em; - color: #555; - }*/ + /* .patient-name { + font-size: 1em; + color: #555; + }*/ .token-item { margin-bottom: 20px; padding: 10px; @@ -47,10 +47,10 @@ background-color: #f9f9f9; } -/* .drDetails{ - font-size: 18pt; - font-weight: bolder; - }*/ + /* .drDetails{ + font-size: 18pt; + font-weight: bolder; + }*/ @keyframes gradientChange { 0% { @@ -123,21 +123,36 @@ } } - body { - background: linear-gradient(to right, rgba(78, 115, 223, 0.8), rgba(34, 74, 190, 0.6), rgba(44, 129, 222, 0.7), rgba(83, 131, 232, 0.9)); - background-size: 200% 100%; - animation: backgroundAnimation 10s ease infinite; + /* body { + background: linear-gradient(to right, rgba(78, 115, 223, 0.8), rgba(34, 74, 190, 0.6), rgba(44, 129, 222, 0.7), rgba(83, 131, 232, 0.9)); + background-size: 200% 100%; + animation: backgroundAnimation 10s ease infinite; + }*/ + + .department-a { + background-color: #1abc9c; /* Light red */ + } + .department-b { + background-color: #ff6b6b; /* Light green */ + } + .department-c { + background-color: #9b59b6; /* Light blue */ + } + .department-d { + background-color: #f39c12; /* Light blue */ + } + .section2{ + background-color: white; + } + .section3{ + background-color: white; } + - - - - - - + @@ -164,41 +179,65 @@
-
-
-
+ + +
+
+
-
- +
+

#{token.counter.name}

-

#{token.department.name}

-
-
- +
+
+
+
+
+ +
+
+
+
+
+ + + + + + + + +
+
-
-
-
- - - - - - - - -
-
-
-
+
+
+
+
+ +
+
+
+
+
+

#{token.staff.person.nameWithTitle}

+
+
+
+ +
-
From 0bdff07683f62cee0c35e17539aa9628c95dc9e7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 18:39:47 +0000 Subject: [PATCH 13/18] Update version to 3.0.0.20240720.1 --- .github/counter.txt | 2 +- .github/last_date.txt | 2 +- README.md | 2 +- src/main/resources/VERSION.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/counter.txt b/.github/counter.txt index 7f8f011eb7..d00491fd7e 100644 --- a/.github/counter.txt +++ b/.github/counter.txt @@ -1 +1 @@ -7 +1 diff --git a/.github/last_date.txt b/.github/last_date.txt index 92d0274c3c..6c93b259fd 100644 --- a/.github/last_date.txt +++ b/.github/last_date.txt @@ -1 +1 @@ -20240719 +20240720 diff --git a/README.md b/README.md index e98fa911ac..4d50a75ba0 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Developed using Java Enterprise Edition, the system offers both a web applicatio ## Current Version -Current Version: 3.0.0.20240719.7 (This line will be automatically updated to reflect the latest version) +Current Version: 3.0.0.20240720.1 (This line will be automatically updated to reflect the latest version) ## History diff --git a/src/main/resources/VERSION.txt b/src/main/resources/VERSION.txt index bf761b091e..492f6b1f2c 100644 --- a/src/main/resources/VERSION.txt +++ b/src/main/resources/VERSION.txt @@ -1 +1 @@ -3.0.0.20240719.7 +3.0.0.20240720.1 From 1910e79f3c757ef81a5e1d2afe178caaa7ae3f29 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 18:49:45 +0000 Subject: [PATCH 14/18] Update version to 3.0.0.20240720.2 --- .github/counter.txt | 2 +- README.md | 2 +- src/main/resources/VERSION.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/counter.txt b/.github/counter.txt index d00491fd7e..0cfbf08886 100644 --- a/.github/counter.txt +++ b/.github/counter.txt @@ -1 +1 @@ -1 +2 diff --git a/README.md b/README.md index 4d50a75ba0..70fee94b6e 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Developed using Java Enterprise Edition, the system offers both a web applicatio ## Current Version -Current Version: 3.0.0.20240720.1 (This line will be automatically updated to reflect the latest version) +Current Version: 3.0.0.20240720.2 (This line will be automatically updated to reflect the latest version) ## History diff --git a/src/main/resources/VERSION.txt b/src/main/resources/VERSION.txt index 492f6b1f2c..497b169fd2 100644 --- a/src/main/resources/VERSION.txt +++ b/src/main/resources/VERSION.txt @@ -1 +1 @@ -3.0.0.20240720.1 +3.0.0.20240720.2 From 4b696f81051e3dc773be280aa025d5e9bb93ad93 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:37:17 +0000 Subject: [PATCH 15/18] Update version to 3.0.0.20240720.3 --- .github/counter.txt | 2 +- README.md | 2 +- src/main/resources/VERSION.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/counter.txt b/.github/counter.txt index 0cfbf08886..00750edc07 100644 --- a/.github/counter.txt +++ b/.github/counter.txt @@ -1 +1 @@ -2 +3 diff --git a/README.md b/README.md index 70fee94b6e..134208565b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Developed using Java Enterprise Edition, the system offers both a web applicatio ## Current Version -Current Version: 3.0.0.20240720.2 (This line will be automatically updated to reflect the latest version) +Current Version: 3.0.0.20240720.3 (This line will be automatically updated to reflect the latest version) ## History diff --git a/src/main/resources/VERSION.txt b/src/main/resources/VERSION.txt index 9dc66492f8..66e6e7a3da 100644 --- a/src/main/resources/VERSION.txt +++ b/src/main/resources/VERSION.txt @@ -1 +1 @@ -3.0.0.20240720.2 \ No newline at end of file +3.0.0.20240720.3 From b0b2b2f3a4732b0d8dd8fbcc43d37b33fcd65da6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:14:35 +0000 Subject: [PATCH 16/18] Update version to 3.0.0.20240720.4 --- .github/counter.txt | 2 +- README.md | 2 +- src/main/resources/VERSION.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/counter.txt b/.github/counter.txt index 00750edc07..b8626c4cff 100644 --- a/.github/counter.txt +++ b/.github/counter.txt @@ -1 +1 @@ -3 +4 diff --git a/README.md b/README.md index 134208565b..d7c54d0312 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Developed using Java Enterprise Edition, the system offers both a web applicatio ## Current Version -Current Version: 3.0.0.20240720.3 (This line will be automatically updated to reflect the latest version) +Current Version: 3.0.0.20240720.4 (This line will be automatically updated to reflect the latest version) ## History diff --git a/src/main/resources/VERSION.txt b/src/main/resources/VERSION.txt index c5f93a7dca..e0a4575e39 100644 --- a/src/main/resources/VERSION.txt +++ b/src/main/resources/VERSION.txt @@ -1 +1 @@ -3.0.0.20240720.3 \ No newline at end of file +3.0.0.20240720.4 From 1a1ae8fee87c06b84e0c325d258e732cc0fcf0db Mon Sep 17 00:00:00 2001 From: Lawan Samarasekara Date: Sun, 21 Jul 2024 03:03:23 +0530 Subject: [PATCH 17/18] Fixed #6487 Signed-off-by: Lawan Samarasekara --- .../divudi/bean/common/PaymentGatewayController.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/divudi/bean/common/PaymentGatewayController.java b/src/main/java/com/divudi/bean/common/PaymentGatewayController.java index 3253a113db..0785d1a8f4 100644 --- a/src/main/java/com/divudi/bean/common/PaymentGatewayController.java +++ b/src/main/java/com/divudi/bean/common/PaymentGatewayController.java @@ -6,6 +6,7 @@ import com.divudi.data.channel.PatientPortalController; import com.divudi.entity.PaymentGatewayTransaction; import com.divudi.facade.PaymentGatewayTransactionFacade; +import com.divudi.bean.common.ConfigOptionApplicationController; import java.io.IOException; import java.io.Serializable; import java.net.URLDecoder; @@ -40,10 +41,12 @@ public class PaymentGatewayController implements Serializable { SessionController sessionController; @Inject PatientPortalController patientPortalController; + @Inject + ConfigOptionApplicationController configOptionApplicationController; - private String merchantId = "SETHMAHOSLKR"; // Actual Merchant ID - private String apiUsername = "merchant.SETHMAHOSLKR"; // Actual API Username - private String apiPassword = "ae02020ce9b3d999767d17d5f36a5c4f"; // Actual API Password + private String merchantId; + private String apiUsername; + private String apiPassword; private String paymentStatus; private String sessionId; private String paymentUrl; @@ -83,6 +86,9 @@ public void generateTemplateForOrderDescription() { } public String createCheckoutSession() { + merchantId = configOptionApplicationController.getLongTextValueByKey("Payment Gateway Merchant ID","TESTSETHMAHOSLKR"); // Actual Merchant ID + apiUsername = configOptionApplicationController.getLongTextValueByKey("Payment Gateway Username", "merchant.TESTSETHMAHOSLKR"); // Actual API Username + apiPassword = configOptionApplicationController.getLongTextValueByKey("Payment Gateway API Password", "49de22fcd8ade9ecb3d81790f3ad152c"); // Actual API Password generateTemplateForOrderDescription(); HttpClient client = HttpClients.createDefault(); HttpPost post = new HttpPost(gatewayUrl); From acd46719c3eb73d9a64cfe6360eea35d6c21dc7d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 20 Jul 2024 21:36:03 +0000 Subject: [PATCH 18/18] Update version to 3.0.0.20240721.1 --- .github/counter.txt | 2 +- .github/last_date.txt | 2 +- README.md | 2 +- src/main/resources/VERSION.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/counter.txt b/.github/counter.txt index b8626c4cff..d00491fd7e 100644 --- a/.github/counter.txt +++ b/.github/counter.txt @@ -1 +1 @@ -4 +1 diff --git a/.github/last_date.txt b/.github/last_date.txt index 83e0fd5a4a..d1ac33f77f 100644 --- a/.github/last_date.txt +++ b/.github/last_date.txt @@ -1 +1 @@ -20240720 \ No newline at end of file +20240721 diff --git a/README.md b/README.md index d7c54d0312..93cd18beee 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Developed using Java Enterprise Edition, the system offers both a web applicatio ## Current Version -Current Version: 3.0.0.20240720.4 (This line will be automatically updated to reflect the latest version) +Current Version: 3.0.0.20240721.1 (This line will be automatically updated to reflect the latest version) ## History diff --git a/src/main/resources/VERSION.txt b/src/main/resources/VERSION.txt index e0a4575e39..dfe901a5d7 100644 --- a/src/main/resources/VERSION.txt +++ b/src/main/resources/VERSION.txt @@ -1 +1 @@ -3.0.0.20240720.4 +3.0.0.20240721.1