From dc3e4946c894562956a64a94ca06fd2f5560c5f9 Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Sat, 20 Jun 2026 19:06:24 +0530 Subject: [PATCH 01/10] feat: supplier ledger decoupled from independent db connection Signed-off-by: Rajdeep Roy Chowdhury --- .../entry/bill/AddBillController.java | 13 ++--- .../entry/payment/AddPaymentController.java | 2 +- .../controller/master/SupplierController.java | 4 +- .../report/SupplierLedgerController.java | 16 ++++- .../model/SupplierLedgerRow.java | 28 +++++++++ .../repository/PaymentRepository.java | 39 +++++++++++++ .../service/PaymentService.java | 5 ++ .../service/SupplierService.java | 39 ++++++++++++- src/main/resources/jrxml/SupplierLedger.jrxml | 58 ++++++++----------- 9 files changed, 156 insertions(+), 48 deletions(-) create mode 100644 src/main/java/satyamconsignment/model/SupplierLedgerRow.java diff --git a/src/main/java/satyamconsignment/controller/entry/bill/AddBillController.java b/src/main/java/satyamconsignment/controller/entry/bill/AddBillController.java index 24fe035..d6495c1 100644 --- a/src/main/java/satyamconsignment/controller/entry/bill/AddBillController.java +++ b/src/main/java/satyamconsignment/controller/entry/bill/AddBillController.java @@ -19,14 +19,8 @@ import satyamconsignment.entity.BillEntity; import satyamconsignment.entity.LREntity; import satyamconsignment.model.LR; -import satyamconsignment.repository.BillRepository; -import satyamconsignment.repository.BuyerRepository; -import satyamconsignment.repository.SupplierRepository; -import satyamconsignment.repository.TransportRepository; -import satyamconsignment.service.BillService; -import satyamconsignment.service.BuyerService; -import satyamconsignment.service.SupplierService; -import satyamconsignment.service.TransportService; +import satyamconsignment.repository.*; +import satyamconsignment.service.*; public class AddBillController implements Initializable { @@ -89,7 +83,8 @@ public class AddBillController implements Initializable { public void initialize(URL url, ResourceBundle rb) { try { billService = new BillService(new BillRepository()); - SupplierService supplierService = new SupplierService(new SupplierRepository()); + SupplierService supplierService = + new SupplierService(new SupplierRepository(), new PaymentService(new PaymentRepository())); BuyerService buyerService = new BuyerService(new BuyerRepository()); TransportService transportService = new TransportService(new TransportRepository()); diff --git a/src/main/java/satyamconsignment/controller/entry/payment/AddPaymentController.java b/src/main/java/satyamconsignment/controller/entry/payment/AddPaymentController.java index e649bb8..f52bde3 100644 --- a/src/main/java/satyamconsignment/controller/entry/payment/AddPaymentController.java +++ b/src/main/java/satyamconsignment/controller/entry/payment/AddPaymentController.java @@ -132,7 +132,7 @@ public class AddPaymentController implements Initializable { public void initialize(URL url, ResourceBundle rb) { billService = new BillService(new BillRepository()); paymentService = new PaymentService(new PaymentRepository()); - supplierService = new SupplierService(new SupplierRepository()); + supplierService = new SupplierService(new SupplierRepository(), new PaymentService(new PaymentRepository())); paymentItems = new ArrayList<>(); supplierNameComboList = new ArrayList<>(); diff --git a/src/main/java/satyamconsignment/controller/master/SupplierController.java b/src/main/java/satyamconsignment/controller/master/SupplierController.java index 7c21f37..a1c4476 100644 --- a/src/main/java/satyamconsignment/controller/master/SupplierController.java +++ b/src/main/java/satyamconsignment/controller/master/SupplierController.java @@ -13,7 +13,9 @@ import javafx.scene.control.ListView; import javafx.scene.control.TextField; import satyamconsignment.common.Utils; +import satyamconsignment.repository.PaymentRepository; import satyamconsignment.repository.SupplierRepository; +import satyamconsignment.service.PaymentService; import satyamconsignment.service.SupplierService; public class SupplierController implements Initializable { @@ -43,7 +45,7 @@ public class SupplierController implements Initializable { @Override public void initialize(URL url, ResourceBundle rb) { - supplierService = new SupplierService(new SupplierRepository()); + supplierService = new SupplierService(new SupplierRepository(), new PaymentService(new PaymentRepository())); refreshList(); } diff --git a/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java b/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java index 102ed11..605af10 100644 --- a/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java +++ b/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java @@ -22,7 +22,9 @@ import satyamconsignment.common.Constants; import satyamconsignment.common.DatabaseHandler; import satyamconsignment.common.Utils; +import satyamconsignment.repository.PaymentRepository; import satyamconsignment.repository.SupplierRepository; +import satyamconsignment.service.PaymentService; import satyamconsignment.service.SupplierService; public class SupplierLedgerController implements Initializable { @@ -45,9 +47,11 @@ public class SupplierLedgerController implements Initializable { @FXML private Button launch_pdf_btn; + private SupplierService supplierService; + @Override public void initialize(URL url, ResourceBundle rb) { - SupplierService supplierService = new SupplierService(new SupplierRepository()); + supplierService = new SupplierService(new SupplierRepository(), new PaymentService(new PaymentRepository())); try { List supplierList = supplierService.getAllSuppliers(); supplier_name_combo.setItems(FXCollections.observableArrayList(supplierList)); @@ -61,11 +65,17 @@ public void initialize(URL url, ResourceBundle rb) { private void generatePDF(ActionEvent event) { Connection conn = DatabaseHandler.getInstance().getConnection(); - String jrxmlFileName; + String jrxmlFileName = ""; if (agewise_outstanding_radio.isSelected()) { jrxmlFileName = "SupplierLedgerAge.jrxml"; } else { - jrxmlFileName = "SupplierLedger.jrxml"; + try { + supplierService.generatePdf( + supplier_name_combo.getSelectionModel().getSelectedItem(), false); + } catch (SQLException e) { + throw new RuntimeException(e); + } + return; } String jrxmlFilePath = "/jrxml/" + jrxmlFileName; Map map = new HashMap<>(); diff --git a/src/main/java/satyamconsignment/model/SupplierLedgerRow.java b/src/main/java/satyamconsignment/model/SupplierLedgerRow.java new file mode 100644 index 0000000..d3f8c50 --- /dev/null +++ b/src/main/java/satyamconsignment/model/SupplierLedgerRow.java @@ -0,0 +1,28 @@ +package satyamconsignment.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@AllArgsConstructor +@Getter +@Setter +@Builder +public class SupplierLedgerRow { + + private String billNo; + private String billDate; + private Integer billAmount; + + private String buyerName; + + private String voucherNo; + + private Integer amountPaid; + private Integer dueAmount; + + private String bank; + private String ddNo; + private String ddDate; +} diff --git a/src/main/java/satyamconsignment/repository/PaymentRepository.java b/src/main/java/satyamconsignment/repository/PaymentRepository.java index 006611c..1985720 100644 --- a/src/main/java/satyamconsignment/repository/PaymentRepository.java +++ b/src/main/java/satyamconsignment/repository/PaymentRepository.java @@ -12,6 +12,7 @@ import satyamconsignment.common.Utils; import satyamconsignment.entity.PaymentEntity; import satyamconsignment.entity.PaymentItemEntity; +import satyamconsignment.model.SupplierLedgerRow; public class PaymentRepository { @@ -304,4 +305,42 @@ public List getPayments() throws SQLException { throw ex; } } + + public List getPaymentDetailsForSupplier(String supplierName) throws SQLException { + try { + Connection connection = DatabaseHandler.getInstance().getConnection(); + // language=sql + String sql = + """ + select * from `Bill_Entry_Table` left join + (`Payment_Entry_Extended_Table` + join `Payment_Entry_Table` using ("Voucher No.")) + using("Bill No.") where `Bill_Entry_Table`.`Supplier Name`=? + order by `Bill_Entry_Table`.`Bill No.` + """; + PreparedStatement preparedStatement = connection.prepareStatement(sql); + preparedStatement.setString(1, supplierName); + ResultSet resultSet = preparedStatement.executeQuery(); + + List res = new ArrayList<>(); + while (resultSet.next()) { + res.add(SupplierLedgerRow.builder() + .billNo(resultSet.getString("Bill No.")) + .billDate(resultSet.getString("Bill Date")) + .billAmount(resultSet.getInt("Bill Amount")) + .buyerName(resultSet.getString("Buyer Name")) + .voucherNo(resultSet.getString("Voucher No.")) + .amountPaid(resultSet.getInt("Amount Paid")) + .bank(resultSet.getString("Bank")) + .ddNo(resultSet.getString("DD No.")) + .ddDate(resultSet.getString("DD Date")) + .dueAmount(resultSet.getInt("Due Amount")) + .build()); + } + return res; + } catch (SQLException ex) { + Logger.getLogger(PaymentRepository.class.getName()).log(Level.SEVERE, ex.toString(), ex); + throw ex; + } + } } diff --git a/src/main/java/satyamconsignment/service/PaymentService.java b/src/main/java/satyamconsignment/service/PaymentService.java index 5493d43..5080b31 100644 --- a/src/main/java/satyamconsignment/service/PaymentService.java +++ b/src/main/java/satyamconsignment/service/PaymentService.java @@ -3,6 +3,7 @@ import java.sql.SQLException; import java.util.List; import satyamconsignment.entity.PaymentEntity; +import satyamconsignment.model.SupplierLedgerRow; import satyamconsignment.repository.PaymentRepository; public class PaymentService { @@ -40,4 +41,8 @@ public void deletePayment(String voucherNo) throws SQLException { public List getPayments() throws SQLException { return paymentRepository.getPayments(); } + + public List getPaymentDetailsForSupplier(String supplierName) throws SQLException { + return paymentRepository.getPaymentDetailsForSupplier(supplierName); + } } diff --git a/src/main/java/satyamconsignment/service/SupplierService.java b/src/main/java/satyamconsignment/service/SupplierService.java index 8e02ef7..b6fd35d 100644 --- a/src/main/java/satyamconsignment/service/SupplierService.java +++ b/src/main/java/satyamconsignment/service/SupplierService.java @@ -1,15 +1,28 @@ package satyamconsignment.service; +import java.io.IOException; import java.sql.SQLException; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import net.sf.jasperreports.engine.*; +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; +import satyamconsignment.common.Constants; +import satyamconsignment.common.Utils; +import satyamconsignment.controller.report.SupplierLedgerController; +import satyamconsignment.model.SupplierLedgerRow; import satyamconsignment.repository.SupplierRepository; public class SupplierService { private final SupplierRepository supplierRepository; + private final PaymentService paymentService; - public SupplierService(SupplierRepository supplierRepository) { + public SupplierService(SupplierRepository supplierRepository, PaymentService paymentService) { this.supplierRepository = supplierRepository; + this.paymentService = paymentService; } public List getAllSuppliers() throws SQLException { @@ -27,4 +40,28 @@ public void deleteSupplier(String supplierName) throws SQLException { public void renameSupplier(String oldName, String newName) throws SQLException { supplierRepository.renameSupplier(oldName, newName); } + + public void generatePdf(String supplierName, boolean isAgewise) throws SQLException { + + String jrxmlFileName = "SupplierLedger.jrxml"; + String jrxmlFilePath = "/jrxml/" + jrxmlFileName; + Map payload = new HashMap<>(); + payload.put("supplierName", supplierName); + + List supplierLedgerRows = paymentService.getPaymentDetailsForSupplier(supplierName); + + JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(supplierLedgerRows); + + try { + JasperReport jasperReport = + JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); + JasperPrint jprint = JasperFillManager.fillReport(jasperReport, payload, dataSource); + JasperExportManager.exportReportToPdfFile(jprint, Constants.REPORT_FILE_NAME); + Utils.launchPdf(Constants.REPORT_FILE_NAME); + Utils.showAlert("Report Successfully Generated", 1); + } catch (JRException | IOException ex) { + Utils.showAlert(ex.toString()); + Logger.getLogger(SupplierLedgerController.class.getName()).log(Level.SEVERE, ex.toString(), ex); + } + } } diff --git a/src/main/resources/jrxml/SupplierLedger.jrxml b/src/main/resources/jrxml/SupplierLedger.jrxml index e779f99..6827de0 100644 --- a/src/main/resources/jrxml/SupplierLedger.jrxml +++ b/src/main/resources/jrxml/SupplierLedger.jrxml @@ -3,36 +3,28 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + - + - + - + - + @@ -177,7 +169,7 @@ order by `Bill_Entry_Table`.`Bill No.`]]> - + @@ -191,7 +183,7 @@ order by `Bill_Entry_Table`.`Bill No.`]]> - + @@ -205,7 +197,7 @@ order by `Bill_Entry_Table`.`Bill No.`]]> - + @@ -219,7 +211,7 @@ order by `Bill_Entry_Table`.`Bill No.`]]> - + @@ -233,7 +225,7 @@ order by `Bill_Entry_Table`.`Bill No.`]]> - + @@ -247,7 +239,7 @@ order by `Bill_Entry_Table`.`Bill No.`]]> - + @@ -261,7 +253,7 @@ order by `Bill_Entry_Table`.`Bill No.`]]> - + @@ -275,7 +267,7 @@ order by `Bill_Entry_Table`.`Bill No.`]]> - + @@ -289,7 +281,7 @@ order by `Bill_Entry_Table`.`Bill No.`]]> - + @@ -303,7 +295,7 @@ order by `Bill_Entry_Table`.`Bill No.`]]> - + From ea304c519d5fa3d19c8bbc51907b815318a6e463 Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Sat, 20 Jun 2026 20:19:15 +0530 Subject: [PATCH 02/10] feat: supplier ledge age wise decoupled Signed-off-by: Rajdeep Roy Chowdhury --- .../java/satyamconsignment/common/Utils.java | 5 ++ .../entry/payment/AddPaymentController.java | 2 +- .../report/SupplierLedgerController.java | 35 ++--------- .../model/SupplierLedgerAgeRow.java | 16 +++++ .../repository/PaymentRepository.java | 27 +++++++-- .../service/PaymentService.java | 9 ++- .../service/SupplierService.java | 31 ++++++++-- .../resources/jrxml/SupplierLedgerAge.jrxml | 58 ++++--------------- 8 files changed, 93 insertions(+), 90 deletions(-) create mode 100644 src/main/java/satyamconsignment/model/SupplierLedgerAgeRow.java diff --git a/src/main/java/satyamconsignment/common/Utils.java b/src/main/java/satyamconsignment/common/Utils.java index 554a79e..5451d2f 100644 --- a/src/main/java/satyamconsignment/common/Utils.java +++ b/src/main/java/satyamconsignment/common/Utils.java @@ -80,4 +80,9 @@ public static String formatDate(String dateString) { } } } + + public static LocalDate parseDate(String dateString) { + DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + return LocalDate.parse(dateString, inputFormatter); + } } diff --git a/src/main/java/satyamconsignment/controller/entry/payment/AddPaymentController.java b/src/main/java/satyamconsignment/controller/entry/payment/AddPaymentController.java index f52bde3..09a5eeb 100644 --- a/src/main/java/satyamconsignment/controller/entry/payment/AddPaymentController.java +++ b/src/main/java/satyamconsignment/controller/entry/payment/AddPaymentController.java @@ -359,7 +359,7 @@ private void fillSupplierCombo() { @FXML private void fillBillNoCombo(ActionEvent ignoredEvent) { try { - billNoComboList = paymentService.fetchPendingBillsForSupplier(supplier_name_combo.getValue()); + billNoComboList = paymentService.fetchPendingBillNosForSupplier(supplier_name_combo.getValue()); bill_no_combo.setItems(FXCollections.observableArrayList(billNoComboList)); } catch (SQLException ex) { Utils.showAlert(ex.toString()); diff --git a/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java b/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java index 605af10..31eb47b 100644 --- a/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java +++ b/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java @@ -2,11 +2,8 @@ import java.io.IOException; import java.net.URL; -import java.sql.Connection; import java.sql.SQLException; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; @@ -20,7 +17,6 @@ import javafx.scene.control.ToggleGroup; import net.sf.jasperreports.engine.*; import satyamconsignment.common.Constants; -import satyamconsignment.common.DatabaseHandler; import satyamconsignment.common.Utils; import satyamconsignment.repository.PaymentRepository; import satyamconsignment.repository.SupplierRepository; @@ -63,34 +59,11 @@ public void initialize(URL url, ResourceBundle rb) { @FXML private void generatePDF(ActionEvent event) { - Connection conn = DatabaseHandler.getInstance().getConnection(); - - String jrxmlFileName = ""; - if (agewise_outstanding_radio.isSelected()) { - jrxmlFileName = "SupplierLedgerAge.jrxml"; - } else { - try { - supplierService.generatePdf( - supplier_name_combo.getSelectionModel().getSelectedItem(), false); - } catch (SQLException e) { - throw new RuntimeException(e); - } - return; - } - String jrxmlFilePath = "/jrxml/" + jrxmlFileName; - Map map = new HashMap<>(); - map.put("supplierName", supplier_name_combo.getSelectionModel().getSelectedItem()); - try { - JasperReport jasperReport = - JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); - JasperPrint jprint = JasperFillManager.fillReport(jasperReport, map, conn); - JasperExportManager.exportReportToPdfFile(jprint, Constants.REPORT_FILE_NAME); - Utils.launchPdf(Constants.REPORT_FILE_NAME); - Utils.showAlert("Report Successfully Generated", 1); - } catch (JRException | IOException ex) { - Utils.showAlert(ex.toString()); - Logger.getLogger(SupplierLedgerController.class.getName()).log(Level.SEVERE, ex.toString(), ex); + supplierService.generatePdf( + supplier_name_combo.getSelectionModel().getSelectedItem(), agewise_outstanding_radio.isSelected()); + } catch (SQLException e) { + throw new RuntimeException(e); } } diff --git a/src/main/java/satyamconsignment/model/SupplierLedgerAgeRow.java b/src/main/java/satyamconsignment/model/SupplierLedgerAgeRow.java new file mode 100644 index 0000000..da4b6b5 --- /dev/null +++ b/src/main/java/satyamconsignment/model/SupplierLedgerAgeRow.java @@ -0,0 +1,16 @@ +package satyamconsignment.model; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@Getter +@Setter +public class SupplierLedgerAgeRow { + private String billNo; + private String billDate; + private String billAmount; + private String buyerName; + private Integer days; +} diff --git a/src/main/java/satyamconsignment/repository/PaymentRepository.java b/src/main/java/satyamconsignment/repository/PaymentRepository.java index 1985720..26ce32e 100644 --- a/src/main/java/satyamconsignment/repository/PaymentRepository.java +++ b/src/main/java/satyamconsignment/repository/PaymentRepository.java @@ -10,6 +10,7 @@ import java.util.logging.Logger; import satyamconsignment.common.DatabaseHandler; import satyamconsignment.common.Utils; +import satyamconsignment.entity.BillEntity; import satyamconsignment.entity.PaymentEntity; import satyamconsignment.entity.PaymentItemEntity; import satyamconsignment.model.SupplierLedgerRow; @@ -57,7 +58,7 @@ public void savePayment(PaymentEntity paymentEntity) throws SQLException { } } - public List fetchPendingBillsForSupplier(String supplierName) throws SQLException { + public List fetchPendingBillsForSupplier(String supplierName) throws SQLException { try { Connection connection = DatabaseHandler.getInstance().getConnection(); // language=sql @@ -74,7 +75,10 @@ with cte_paid as ( ), cte_bill as ( select - * + `Bill No.`, + `Bill Date`, + `Bill Amount`, + `Buyer Name` from Bill_Entry_Table WHERE @@ -83,7 +87,9 @@ cte_bill as ( cte_bill_paid as ( select `Bill No.`, + `Bill Date`, `Bill Amount`, + `Buyer Name`, coalesce(`amount_paid`, 0) as amount_paid from cte_bill @@ -93,13 +99,19 @@ cte_bill_paid as ( cte_pending as ( select `Bill No.`, + `Bill Date`, + `Bill Amount`, + `Buyer Name`, `Bill Amount` - amount_paid as pending_amount from cte_bill_paid ), cte_final as ( select - `Bill No.` + `Bill No.`, + `Bill Date`, + `Bill Amount`, + `Buyer Name` from cte_pending where @@ -116,9 +128,14 @@ cte_final as ( preparedStatement.setString(1, supplierName); ResultSet resultSet = preparedStatement.executeQuery(); - List res = new ArrayList<>(); + List res = new ArrayList<>(); while (resultSet.next()) { - res.add(resultSet.getString("Bill No.")); + res.add(BillEntity.builder() + .billNo(resultSet.getString("Bill No.")) + .billDate(resultSet.getString("Bill Date")) + .billAmount(resultSet.getString("Bill Amount")) + .buyerName(resultSet.getString("Buyer Name")) + .build()); } return res; } catch (SQLException ex) { diff --git a/src/main/java/satyamconsignment/service/PaymentService.java b/src/main/java/satyamconsignment/service/PaymentService.java index 5080b31..3b0d5d5 100644 --- a/src/main/java/satyamconsignment/service/PaymentService.java +++ b/src/main/java/satyamconsignment/service/PaymentService.java @@ -2,6 +2,7 @@ import java.sql.SQLException; import java.util.List; +import satyamconsignment.entity.BillEntity; import satyamconsignment.entity.PaymentEntity; import satyamconsignment.model.SupplierLedgerRow; import satyamconsignment.repository.PaymentRepository; @@ -14,7 +15,13 @@ public PaymentService(PaymentRepository paymentRepository) { this.paymentRepository = paymentRepository; } - public List fetchPendingBillsForSupplier(String supplierName) throws SQLException { + public List fetchPendingBillNosForSupplier(String supplierName) throws SQLException { + return paymentRepository.fetchPendingBillsForSupplier(supplierName).stream() + .map(BillEntity::getBillNo) + .toList(); + } + + public List fetchPendingBillsForSupplier(String supplierName) throws SQLException { return paymentRepository.fetchPendingBillsForSupplier(supplierName); } diff --git a/src/main/java/satyamconsignment/service/SupplierService.java b/src/main/java/satyamconsignment/service/SupplierService.java index b6fd35d..432aeb6 100644 --- a/src/main/java/satyamconsignment/service/SupplierService.java +++ b/src/main/java/satyamconsignment/service/SupplierService.java @@ -2,6 +2,8 @@ import java.io.IOException; import java.sql.SQLException; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -12,6 +14,7 @@ import satyamconsignment.common.Constants; import satyamconsignment.common.Utils; import satyamconsignment.controller.report.SupplierLedgerController; +import satyamconsignment.model.SupplierLedgerAgeRow; import satyamconsignment.model.SupplierLedgerRow; import satyamconsignment.repository.SupplierRepository; @@ -43,15 +46,33 @@ public void renameSupplier(String oldName, String newName) throws SQLException { public void generatePdf(String supplierName, boolean isAgewise) throws SQLException { - String jrxmlFileName = "SupplierLedger.jrxml"; + String jrxmlFileName; + JRBeanCollectionDataSource dataSource; + + if (isAgewise) { + jrxmlFileName = "SupplierLedgerAge.jrxml"; + List supplierLedgerAgeRows = + paymentService.fetchPendingBillsForSupplier(supplierName).stream() + .map(it -> SupplierLedgerAgeRow.builder() + .billNo(it.getBillNo()) + .billDate(it.getBillDate()) + .billAmount(it.getBillAmount()) + .buyerName(it.getBuyerName()) + .days((int) + ChronoUnit.DAYS.between(Utils.parseDate(it.getBillDate()), LocalDate.now())) + .build()) + .toList(); + dataSource = new JRBeanCollectionDataSource(supplierLedgerAgeRows); + } else { + jrxmlFileName = "SupplierLedger.jrxml"; + List supplierLedgerRows = paymentService.getPaymentDetailsForSupplier(supplierName); + dataSource = new JRBeanCollectionDataSource(supplierLedgerRows); + } + String jrxmlFilePath = "/jrxml/" + jrxmlFileName; Map payload = new HashMap<>(); payload.put("supplierName", supplierName); - List supplierLedgerRows = paymentService.getPaymentDetailsForSupplier(supplierName); - - JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(supplierLedgerRows); - try { JasperReport jasperReport = JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); diff --git a/src/main/resources/jrxml/SupplierLedgerAge.jrxml b/src/main/resources/jrxml/SupplierLedgerAge.jrxml index e85b033..8c88dfa 100644 --- a/src/main/resources/jrxml/SupplierLedgerAge.jrxml +++ b/src/main/resources/jrxml/SupplierLedgerAge.jrxml @@ -18,51 +18,15 @@ - + - - 0 - order by 1) -select * -from cte_final; -]]> - - - - - + + + + + @@ -161,7 +125,7 @@ from cte_final; - + @@ -175,7 +139,7 @@ from cte_final; - + @@ -189,7 +153,7 @@ from cte_final; - + @@ -203,7 +167,7 @@ from cte_final; - + @@ -218,7 +182,7 @@ from cte_final; - + From 1812938fc8c46452668da14108460412f21ca7f6 Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Sat, 20 Jun 2026 20:26:45 +0530 Subject: [PATCH 03/10] fix: minor bug fixes Signed-off-by: Rajdeep Roy Chowdhury --- .../controller/report/SupplierLedgerController.java | 5 +++-- src/main/java/satyamconsignment/service/SupplierService.java | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java b/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java index 31eb47b..779a82b 100644 --- a/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java +++ b/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java @@ -62,8 +62,9 @@ private void generatePDF(ActionEvent event) { try { supplierService.generatePdf( supplier_name_combo.getSelectionModel().getSelectedItem(), agewise_outstanding_radio.isSelected()); - } catch (SQLException e) { - throw new RuntimeException(e); + } catch (SQLException ex) { + Utils.showAlert(ex.toString()); + Logger.getLogger(SupplierLedgerController.class.getName()).log(Level.SEVERE, ex.toString(), ex); } } diff --git a/src/main/java/satyamconsignment/service/SupplierService.java b/src/main/java/satyamconsignment/service/SupplierService.java index 432aeb6..9efeca3 100644 --- a/src/main/java/satyamconsignment/service/SupplierService.java +++ b/src/main/java/satyamconsignment/service/SupplierService.java @@ -13,7 +13,6 @@ import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import satyamconsignment.common.Constants; import satyamconsignment.common.Utils; -import satyamconsignment.controller.report.SupplierLedgerController; import satyamconsignment.model.SupplierLedgerAgeRow; import satyamconsignment.model.SupplierLedgerRow; import satyamconsignment.repository.SupplierRepository; @@ -82,7 +81,7 @@ public void generatePdf(String supplierName, boolean isAgewise) throws SQLExcept Utils.showAlert("Report Successfully Generated", 1); } catch (JRException | IOException ex) { Utils.showAlert(ex.toString()); - Logger.getLogger(SupplierLedgerController.class.getName()).log(Level.SEVERE, ex.toString(), ex); + Logger.getLogger(SupplierService.class.getName()).log(Level.SEVERE, ex.toString(), ex); } } } From eadd4555fc542b325c0021db8d5f8171c43b5281 Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Sat, 20 Jun 2026 21:15:14 +0530 Subject: [PATCH 04/10] feat: buyer ledger decoupled Signed-off-by: Rajdeep Roy Chowdhury --- .../entry/bill/AddBillController.java | 3 +- .../collection/AddCollectionController.java | 4 +- .../controller/master/BuyerController.java | 4 +- .../report/BuyerLedgerController.java | 33 +++------- .../model/BuyerLedgerAgeRow.java | 16 +++++ .../model/BuyerLedgerRow.java | 28 ++++++++ .../repository/CollectionRepository.java | 65 +++++++++++++++++-- .../service/BuyerService.java | 56 +++++++++++++++- .../service/CollectionService.java | 14 +++- 9 files changed, 187 insertions(+), 36 deletions(-) create mode 100644 src/main/java/satyamconsignment/model/BuyerLedgerAgeRow.java create mode 100644 src/main/java/satyamconsignment/model/BuyerLedgerRow.java diff --git a/src/main/java/satyamconsignment/controller/entry/bill/AddBillController.java b/src/main/java/satyamconsignment/controller/entry/bill/AddBillController.java index d6495c1..1d1be95 100644 --- a/src/main/java/satyamconsignment/controller/entry/bill/AddBillController.java +++ b/src/main/java/satyamconsignment/controller/entry/bill/AddBillController.java @@ -85,7 +85,8 @@ public void initialize(URL url, ResourceBundle rb) { billService = new BillService(new BillRepository()); SupplierService supplierService = new SupplierService(new SupplierRepository(), new PaymentService(new PaymentRepository())); - BuyerService buyerService = new BuyerService(new BuyerRepository()); + BuyerService buyerService = + new BuyerService(new BuyerRepository(), new CollectionService(new CollectionRepository())); TransportService transportService = new TransportService(new TransportRepository()); TextFields.bindAutoCompletion(supplier_field, supplierService.getAllSuppliers()); diff --git a/src/main/java/satyamconsignment/controller/entry/collection/AddCollectionController.java b/src/main/java/satyamconsignment/controller/entry/collection/AddCollectionController.java index fc380d3..53829e1 100644 --- a/src/main/java/satyamconsignment/controller/entry/collection/AddCollectionController.java +++ b/src/main/java/satyamconsignment/controller/entry/collection/AddCollectionController.java @@ -108,7 +108,7 @@ public class AddCollectionController implements Initializable { @Override public void initialize(URL url, ResourceBundle rb) { billService = new BillService(new BillRepository()); - buyerService = new BuyerService(new BuyerRepository()); + buyerService = new BuyerService(new BuyerRepository(), new CollectionService(new CollectionRepository())); collectionService = new CollectionService(new CollectionRepository()); collectionItemList = new ArrayList<>(); @@ -143,7 +143,7 @@ private void fillBuyerNameCombo() { @FXML private void fillBillNoCombo() { try { - billNoComboList = collectionService.fetchPendingBillsForBuyer(buyer_name.getValue()); + billNoComboList = collectionService.fetchPendingBillNosForBuyer(buyer_name.getValue()); bill_no_combo.setItems(FXCollections.observableArrayList(billNoComboList)); } catch (SQLException ex) { Utils.showAlert(ex.toString()); diff --git a/src/main/java/satyamconsignment/controller/master/BuyerController.java b/src/main/java/satyamconsignment/controller/master/BuyerController.java index 4125419..5fe46b5 100644 --- a/src/main/java/satyamconsignment/controller/master/BuyerController.java +++ b/src/main/java/satyamconsignment/controller/master/BuyerController.java @@ -14,7 +14,9 @@ import javafx.scene.control.TextField; import satyamconsignment.common.Utils; import satyamconsignment.repository.BuyerRepository; +import satyamconsignment.repository.CollectionRepository; import satyamconsignment.service.BuyerService; +import satyamconsignment.service.CollectionService; public class BuyerController implements Initializable { @@ -43,7 +45,7 @@ public class BuyerController implements Initializable { @Override public void initialize(URL url, ResourceBundle rb) { - buyerService = new BuyerService(new BuyerRepository()); + buyerService = new BuyerService(new BuyerRepository(), new CollectionService(new CollectionRepository())); refreshList(); } diff --git a/src/main/java/satyamconsignment/controller/report/BuyerLedgerController.java b/src/main/java/satyamconsignment/controller/report/BuyerLedgerController.java index 157ab24..62324a5 100644 --- a/src/main/java/satyamconsignment/controller/report/BuyerLedgerController.java +++ b/src/main/java/satyamconsignment/controller/report/BuyerLedgerController.java @@ -2,11 +2,8 @@ import java.io.IOException; import java.net.URL; -import java.sql.Connection; import java.sql.SQLException; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; @@ -20,10 +17,11 @@ import javafx.scene.control.ToggleGroup; import net.sf.jasperreports.engine.*; import satyamconsignment.common.Constants; -import satyamconsignment.common.DatabaseHandler; import satyamconsignment.common.Utils; import satyamconsignment.repository.BuyerRepository; +import satyamconsignment.repository.CollectionRepository; import satyamconsignment.service.BuyerService; +import satyamconsignment.service.CollectionService; public class BuyerLedgerController implements Initializable { @@ -45,9 +43,11 @@ public class BuyerLedgerController implements Initializable { @FXML private Button launch_pdf_btn; + private BuyerService buyerService; + @Override public void initialize(URL url, ResourceBundle rb) { - BuyerService buyerService = new BuyerService(new BuyerRepository()); + buyerService = new BuyerService(new BuyerRepository(), new CollectionService(new CollectionRepository())); try { List buyerNames = buyerService.getAllBuyers(); buyer_name_combo.setItems(FXCollections.observableArrayList(buyerNames)); @@ -59,27 +59,10 @@ public void initialize(URL url, ResourceBundle rb) { @FXML private void generatePDF(ActionEvent event) { - Connection conn = DatabaseHandler.getInstance().getConnection(); - - String jrxmlFileName; - if (agewise_outstanding_radio.isSelected()) { - jrxmlFileName = "BuyerLedgerAge.jrxml"; - } else { - jrxmlFileName = "BuyerLedger.jrxml"; - } - String jrxmlFilePath = "/jrxml/" + jrxmlFileName; - - Map map = new HashMap<>(); - map.put("buyerName", buyer_name_combo.getSelectionModel().getSelectedItem()); - try { - JasperReport jasperReport = - JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); - JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, conn); - JasperExportManager.exportReportToPdfFile(jasperPrint, Constants.REPORT_FILE_NAME); - Utils.launchPdf(Constants.REPORT_FILE_NAME); - Utils.showAlert("Report Successfully Generated", 1); - } catch (IOException | JRException ex) { + buyerService.generatePdf( + buyer_name_combo.getSelectionModel().getSelectedItem(), agewise_outstanding_radio.isSelected()); + } catch (SQLException ex) { Utils.showAlert(ex.toString()); Logger.getLogger(BuyerLedgerController.class.getName()).log(Level.SEVERE, ex.toString(), ex); } diff --git a/src/main/java/satyamconsignment/model/BuyerLedgerAgeRow.java b/src/main/java/satyamconsignment/model/BuyerLedgerAgeRow.java new file mode 100644 index 0000000..f89fb82 --- /dev/null +++ b/src/main/java/satyamconsignment/model/BuyerLedgerAgeRow.java @@ -0,0 +1,16 @@ +package satyamconsignment.model; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@Getter +@Setter +public class BuyerLedgerAgeRow { + private String billNo; + private String billDate; + private String billAmount; + private String supplierName; + private Integer days; +} diff --git a/src/main/java/satyamconsignment/model/BuyerLedgerRow.java b/src/main/java/satyamconsignment/model/BuyerLedgerRow.java new file mode 100644 index 0000000..4a2065b --- /dev/null +++ b/src/main/java/satyamconsignment/model/BuyerLedgerRow.java @@ -0,0 +1,28 @@ +package satyamconsignment.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@AllArgsConstructor +@Getter +@Setter +@Builder +public class BuyerLedgerRow { + + private String billNo; + private String billDate; + private Integer billAmount; + + private String supplierName; + + private String voucherNo; + + private Integer amountCollected; + private Integer collectionDue; + + private String bank; + private String ddNo; + private String ddDate; +} diff --git a/src/main/java/satyamconsignment/repository/CollectionRepository.java b/src/main/java/satyamconsignment/repository/CollectionRepository.java index 0d1d326..7cafcc7 100644 --- a/src/main/java/satyamconsignment/repository/CollectionRepository.java +++ b/src/main/java/satyamconsignment/repository/CollectionRepository.java @@ -10,12 +10,14 @@ import java.util.logging.Logger; import satyamconsignment.common.DatabaseHandler; import satyamconsignment.common.Utils; +import satyamconsignment.entity.BillEntity; import satyamconsignment.entity.CollectionEntity; import satyamconsignment.entity.CollectionItemEntity; +import satyamconsignment.model.BuyerLedgerRow; public class CollectionRepository { - public List fetchPendingBillsForBuyer(String buyerName) throws SQLException { + public List fetchPendingBillsForBuyer(String buyerName) throws SQLException { try { Connection connection = DatabaseHandler.getInstance().getConnection(); // language=sql @@ -32,7 +34,10 @@ with cte_collected as ( ), cte_bill as ( select - * + `Bill No.`, + `Bill Date`, + `Bill Amount`, + `Supplier Name` from Bill_Entry_Table WHERE @@ -41,7 +46,9 @@ cte_bill as ( cte_bill_collected as ( select `Bill No.`, + `Bill Date`, `Bill Amount`, + `Supplier Name`, coalesce(`amount_collected`, 0) as amount_collected from cte_bill @@ -51,13 +58,19 @@ cte_bill_collected as ( cte_pending as ( select `Bill No.`, + `Bill Date`, + `Bill Amount`, + `Supplier Name`, `Bill Amount` - amount_collected as pending_amount from cte_bill_collected ), cte_final as ( select - `Bill No.` + `Bill No.`, + `Bill Date`, + `Bill Amount`, + `Supplier Name` from cte_pending where @@ -74,9 +87,14 @@ cte_final as ( preparedStatement.setString(1, buyerName); ResultSet resultSet = preparedStatement.executeQuery(); - List res = new ArrayList<>(); + List res = new ArrayList<>(); while (resultSet.next()) { - res.add(resultSet.getString("Bill No.")); + res.add(BillEntity.builder() + .billNo(resultSet.getString("Bill No.")) + .billDate(resultSet.getString("Bill Date")) + .billAmount(resultSet.getString("Bill Amount")) + .buyerName(resultSet.getString("Supplier Name")) + .build()); } return res; } catch (SQLException ex) { @@ -326,4 +344,41 @@ public List getCollections() throws SQLException { throw ex; } } + + public List getCollectionDetailsForBuyer(String buyerName) throws SQLException { + try { + Connection connection = DatabaseHandler.getInstance().getConnection(); + // language=sql + String sql = + """ + select * from `Bill_Entry_Table` left join + (`Collection_Entry_Extended_Table` + join `Collection_Entry_Table` using ("Voucher No.")) + using("Bill No.") where `Bill_Entry_Table`.`Buyer Name`=? + """; + PreparedStatement preparedStatement = connection.prepareStatement(sql); + preparedStatement.setString(1, buyerName); + ResultSet resultSet = preparedStatement.executeQuery(); + + List res = new ArrayList<>(); + while (resultSet.next()) { + res.add(BuyerLedgerRow.builder() + .billNo(resultSet.getString("Bill No.")) + .billDate(resultSet.getString("Bill Date")) + .billAmount(resultSet.getInt("Bill Amount")) + .supplierName(resultSet.getString("Supplier Name")) + .voucherNo(resultSet.getString("Voucher No.")) + .amountCollected(resultSet.getInt("Amount Collected")) + .bank(resultSet.getString("Bank")) + .ddNo(resultSet.getString("DD No.")) + .ddDate(resultSet.getString("DD Date")) + .collectionDue(resultSet.getInt("Collection Due")) + .build()); + } + return res; + } catch (SQLException ex) { + Logger.getLogger(CollectionRepository.class.getName()).log(Level.SEVERE, ex.toString(), ex); + throw ex; + } + } } diff --git a/src/main/java/satyamconsignment/service/BuyerService.java b/src/main/java/satyamconsignment/service/BuyerService.java index 0836975..4ee9f5f 100644 --- a/src/main/java/satyamconsignment/service/BuyerService.java +++ b/src/main/java/satyamconsignment/service/BuyerService.java @@ -1,15 +1,30 @@ package satyamconsignment.service; +import java.io.IOException; import java.sql.SQLException; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import net.sf.jasperreports.engine.*; +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; +import satyamconsignment.common.Constants; +import satyamconsignment.common.Utils; +import satyamconsignment.model.BuyerLedgerAgeRow; +import satyamconsignment.model.BuyerLedgerRow; import satyamconsignment.repository.BuyerRepository; public class BuyerService { private final BuyerRepository buyerRepository; + private final CollectionService collectionService; - public BuyerService(BuyerRepository buyerRepository) { + public BuyerService(BuyerRepository buyerRepository, CollectionService collectionService) { this.buyerRepository = buyerRepository; + this.collectionService = collectionService; } public List getAllBuyers() throws SQLException { @@ -27,4 +42,43 @@ public void deleteBuyer(String buyerName) throws SQLException { public void renameBuyer(String oldName, String newName) throws SQLException { buyerRepository.renameBuyer(oldName, newName); } + + public void generatePdf(String buyerName, boolean isAgewise) throws SQLException { + String jrxmlFileName; + JRBeanCollectionDataSource dataSource; + + if (isAgewise) { + jrxmlFileName = "BuyerLedgerAge.jrxml"; + List buyerLedgerAgeRows = collectionService.fetchPendingBillsForBuyer(buyerName).stream() + .map(it -> BuyerLedgerAgeRow.builder() + .billNo(it.getBillNo()) + .billDate(it.getBillDate()) + .billAmount(it.getBillAmount()) + .supplierName(it.getSupplierName()) + .days((int) ChronoUnit.DAYS.between(Utils.parseDate(it.getBillDate()), LocalDate.now())) + .build()) + .toList(); + dataSource = new JRBeanCollectionDataSource(buyerLedgerAgeRows); + } else { + jrxmlFileName = "BuyerLedger.jrxml"; + List buyerLedgerRows = collectionService.getCollectionDetailsForBuyer(buyerName); + dataSource = new JRBeanCollectionDataSource(buyerLedgerRows); + } + + String jrxmlFilePath = "/jrxml/" + jrxmlFileName; + Map payload = new HashMap<>(); + payload.put("buyerName", buyerName); + + try { + JasperReport jasperReport = + JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); + JasperPrint jprint = JasperFillManager.fillReport(jasperReport, payload, dataSource); + JasperExportManager.exportReportToPdfFile(jprint, Constants.REPORT_FILE_NAME); + Utils.launchPdf(Constants.REPORT_FILE_NAME); + Utils.showAlert("Report Successfully Generated", 1); + } catch (JRException | IOException ex) { + Utils.showAlert(ex.toString()); + Logger.getLogger(BuyerService.class.getName()).log(Level.SEVERE, ex.toString(), ex); + } + } } diff --git a/src/main/java/satyamconsignment/service/CollectionService.java b/src/main/java/satyamconsignment/service/CollectionService.java index 57f3ca2..f37cbb6 100644 --- a/src/main/java/satyamconsignment/service/CollectionService.java +++ b/src/main/java/satyamconsignment/service/CollectionService.java @@ -2,7 +2,9 @@ import java.sql.SQLException; import java.util.List; +import satyamconsignment.entity.BillEntity; import satyamconsignment.entity.CollectionEntity; +import satyamconsignment.model.BuyerLedgerRow; import satyamconsignment.repository.CollectionRepository; public class CollectionService { @@ -13,7 +15,13 @@ public CollectionService(CollectionRepository collectionRepository) { this.collectionRepository = collectionRepository; } - public List fetchPendingBillsForBuyer(String buyerName) throws SQLException { + public List fetchPendingBillNosForBuyer(String buyerName) throws SQLException { + return collectionRepository.fetchPendingBillsForBuyer(buyerName).stream() + .map(BillEntity::getBillNo) + .toList(); + } + + public List fetchPendingBillsForBuyer(String buyerName) throws SQLException { return collectionRepository.fetchPendingBillsForBuyer(buyerName); } @@ -40,4 +48,8 @@ public void deleteCollection(String voucherNo) throws SQLException { public List getCollections() throws SQLException { return collectionRepository.getCollections(); } + + public List getCollectionDetailsForBuyer(String buyerName) throws SQLException { + return collectionRepository.getCollectionDetailsForBuyer(buyerName); + } } From 99c337e7a2e216aaa97f29647297ba3b931c0616 Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Sat, 20 Jun 2026 21:45:44 +0530 Subject: [PATCH 05/10] fix: bug fixes Signed-off-by: Rajdeep Roy Chowdhury --- .../repository/CollectionRepository.java | 2 +- src/main/resources/jrxml/BuyerLedger.jrxml | 52 +++++++---------- src/main/resources/jrxml/BuyerLedgerAge.jrxml | 58 ++++--------------- 3 files changed, 32 insertions(+), 80 deletions(-) diff --git a/src/main/java/satyamconsignment/repository/CollectionRepository.java b/src/main/java/satyamconsignment/repository/CollectionRepository.java index 7cafcc7..6c20862 100644 --- a/src/main/java/satyamconsignment/repository/CollectionRepository.java +++ b/src/main/java/satyamconsignment/repository/CollectionRepository.java @@ -93,7 +93,7 @@ cte_final as ( .billNo(resultSet.getString("Bill No.")) .billDate(resultSet.getString("Bill Date")) .billAmount(resultSet.getString("Bill Amount")) - .buyerName(resultSet.getString("Supplier Name")) + .supplierName(resultSet.getString("Supplier Name")) .build()); } return res; diff --git a/src/main/resources/jrxml/BuyerLedger.jrxml b/src/main/resources/jrxml/BuyerLedger.jrxml index ecf2490..0ff6d14 100644 --- a/src/main/resources/jrxml/BuyerLedger.jrxml +++ b/src/main/resources/jrxml/BuyerLedger.jrxml @@ -4,28 +4,16 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + @@ -163,7 +151,7 @@ using("Bill No.") where `Bill_Entry_Table`.`Buyer Name`=$P{buyerName}]]> - + @@ -177,7 +165,7 @@ using("Bill No.") where `Bill_Entry_Table`.`Buyer Name`=$P{buyerName}]]> - + @@ -191,7 +179,7 @@ using("Bill No.") where `Bill_Entry_Table`.`Buyer Name`=$P{buyerName}]]> - + @@ -208,7 +196,7 @@ using("Bill No.") where `Bill_Entry_Table`.`Buyer Name`=$P{buyerName}]]> - + @@ -222,7 +210,7 @@ using("Bill No.") where `Bill_Entry_Table`.`Buyer Name`=$P{buyerName}]]> - + @@ -236,7 +224,7 @@ using("Bill No.") where `Bill_Entry_Table`.`Buyer Name`=$P{buyerName}]]> - + @@ -250,7 +238,7 @@ using("Bill No.") where `Bill_Entry_Table`.`Buyer Name`=$P{buyerName}]]> - + @@ -264,21 +252,21 @@ using("Bill No.") where `Bill_Entry_Table`.`Buyer Name`=$P{buyerName}]]> - + - + - + diff --git a/src/main/resources/jrxml/BuyerLedgerAge.jrxml b/src/main/resources/jrxml/BuyerLedgerAge.jrxml index 822d199..e53c8b9 100644 --- a/src/main/resources/jrxml/BuyerLedgerAge.jrxml +++ b/src/main/resources/jrxml/BuyerLedgerAge.jrxml @@ -6,48 +6,12 @@ topMargin="20" bottomMargin="20" uuid="f86cb926-fbcc-4cdf-8db2-487e31f42b8a"> - - - 0 - ORDER BY 1) -SELECT * -FROM cte_final; - ]]> - - - - - + + + + + + @@ -133,25 +97,25 @@ FROM cte_final; - + - + - + - + @@ -166,7 +130,7 @@ FROM cte_final; - + From 2ebe019f5fab4d7629fb6fa7a0f07b19869ad188 Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Mon, 22 Jun 2026 12:01:17 +0530 Subject: [PATCH 06/10] feat: transport ledger decoupled Signed-off-by: Rajdeep Roy Chowdhury --- .../report/TransportLedgerController.java | 37 ++++---------- .../model/TransportLedgerRow.java | 17 +++++++ .../repository/TransportRepository.java | 50 +++++++++++++++++++ .../service/TransportService.java | 36 +++++++++++++ .../resources/jrxml/TransportLedger.jrxml | 42 ++++++---------- 5 files changed, 128 insertions(+), 54 deletions(-) create mode 100644 src/main/java/satyamconsignment/model/TransportLedgerRow.java diff --git a/src/main/java/satyamconsignment/controller/report/TransportLedgerController.java b/src/main/java/satyamconsignment/controller/report/TransportLedgerController.java index 7127d51..31975f0 100644 --- a/src/main/java/satyamconsignment/controller/report/TransportLedgerController.java +++ b/src/main/java/satyamconsignment/controller/report/TransportLedgerController.java @@ -2,9 +2,7 @@ import java.io.IOException; import java.net.URL; -import java.sql.Connection; import java.sql.SQLException; -import java.time.format.DateTimeFormatter; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; @@ -18,7 +16,6 @@ import javafx.scene.control.DatePicker; import net.sf.jasperreports.engine.*; import satyamconsignment.common.Constants; -import satyamconsignment.common.DatabaseHandler; import satyamconsignment.common.Utils; import satyamconsignment.repository.TransportRepository; import satyamconsignment.service.TransportService; @@ -43,9 +40,11 @@ public class TransportLedgerController implements Initializable { @FXML private Button launch_report_btn; + private TransportService transportService; + @Override public void initialize(URL url, ResourceBundle rb) { - TransportService transportService = new TransportService(new TransportRepository()); + transportService = new TransportService(new TransportRepository()); try { List transportList = transportService.getAllTransports(); transport_name_combo.setItems(FXCollections.observableArrayList(transportList)); @@ -57,37 +56,21 @@ public void initialize(URL url, ResourceBundle rb) { @FXML private void generatePDF(ActionEvent event) { - Connection conn = DatabaseHandler.getInstance().getConnection(); - - String jrxmlFileName = "TransportLedger.jrxml"; - String jrxmlFilePath = "/jrxml/" + jrxmlFileName; - - Map map = new HashMap<>(); - map.put("transportName", transport_name_combo.getSelectionModel().getSelectedItem()); - map.put("fromDate", "01-01-2000"); - map.put("toDate", "31-12-2100"); - - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); - + String fromDate = "01-01-2000", toDate = "01-01-2100"; if (!all_time_checkbox.isSelected()) { if (from_date.getValue() == null || to_date.getValue() == null) { Utils.showAlert("Select dates properly"); return; } - map.put("fromDate", from_date.getValue().format(formatter)); - map.put("toDate", to_date.getValue().format(formatter)); + fromDate = Utils.formatDate(from_date.getValue().toString()); + toDate = Utils.formatDate(to_date.getValue().toString()); } - try { - JasperReport jasperReport = - JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); - JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, conn); - JasperExportManager.exportReportToPdfFile(jasperPrint, Constants.REPORT_FILE_NAME); - Utils.launchPdf(Constants.REPORT_FILE_NAME); - Utils.showAlert("Report Successfully Generated", 1); - } catch (IOException | JRException ex) { + transportService.generatePdf( + transport_name_combo.getSelectionModel().getSelectedItem(), fromDate, toDate); + } catch (SQLException ex) { Utils.showAlert(ex.toString()); - Logger.getLogger(TransportLedgerController.class.getName()).log(Level.SEVERE, ex.toString(), ex); + Logger.getLogger(SupplierLedgerController.class.getName()).log(Level.SEVERE, ex.toString(), ex); } } diff --git a/src/main/java/satyamconsignment/model/TransportLedgerRow.java b/src/main/java/satyamconsignment/model/TransportLedgerRow.java new file mode 100644 index 0000000..346e724 --- /dev/null +++ b/src/main/java/satyamconsignment/model/TransportLedgerRow.java @@ -0,0 +1,17 @@ +package satyamconsignment.model; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +public class TransportLedgerRow { + private String lr; + private String pm; + private String billNo; + private String supplierName; + private String buyerName; + private String lrDate; +} diff --git a/src/main/java/satyamconsignment/repository/TransportRepository.java b/src/main/java/satyamconsignment/repository/TransportRepository.java index 796c01e..035f082 100644 --- a/src/main/java/satyamconsignment/repository/TransportRepository.java +++ b/src/main/java/satyamconsignment/repository/TransportRepository.java @@ -9,6 +9,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import satyamconsignment.common.DatabaseHandler; +import satyamconsignment.model.TransportLedgerRow; public class TransportRepository { @@ -68,4 +69,53 @@ public List getAllTransports() throws SQLException { throw ex; } } + + public List getTransportReportFor(String transportName, String fromDate, String toDate) + throws SQLException { + try { + List result = new ArrayList<>(); + Connection connection = DatabaseHandler.getInstance().getConnection(); + + // language=sql + String sql = + """ + select `LR No.`,`PM`,`Bill No.`,`Supplier Name`,`Buyer Name`,`LR Date` + from `LR_Table` join `Bill_Entry_Table` using (`Bill No.`) + where `Transport`=? + and + substr(`LR Date`, 7, 4)||substr(`LR Date`, 4, 2)||substr(`LR Date`, 1, 2) + between + substr(?, 7, 4)||substr(?, 4, 2)||substr(?, 1, 2) + and + substr(?, 7, 4)||substr(?, 4, 2)||substr(?, 1, 2) + order by datetime(substr(`LR Date`, 7, 4)||'-'||substr(`LR Date`, 4, 2)||'-'||substr(`LR Date`, 1, 2)) +"""; + + PreparedStatement ps = connection.prepareStatement(sql); + ps.setString(1, transportName); + ps.setString(2, fromDate); + ps.setString(3, fromDate); + ps.setString(4, fromDate); + ps.setString(5, toDate); + ps.setString(6, toDate); + ps.setString(7, toDate); + + ResultSet transportResultSet = ps.executeQuery(); + + while (transportResultSet.next()) { + result.add(TransportLedgerRow.builder() + .lr(transportResultSet.getString("LR No.")) + .pm(transportResultSet.getString("PM")) + .billNo(transportResultSet.getString("Bill No.")) + .supplierName(transportResultSet.getString("Supplier Name")) + .buyerName(transportResultSet.getString("Buyer Name")) + .lrDate(transportResultSet.getString("LR Date")) + .build()); + } + return result; + } catch (SQLException ex) { + Logger.getLogger(TransportRepository.class.getName()).log(Level.SEVERE, ex.toString(), ex); + throw ex; + } + } } diff --git a/src/main/java/satyamconsignment/service/TransportService.java b/src/main/java/satyamconsignment/service/TransportService.java index add51e7..7ce1d59 100644 --- a/src/main/java/satyamconsignment/service/TransportService.java +++ b/src/main/java/satyamconsignment/service/TransportService.java @@ -1,7 +1,17 @@ package satyamconsignment.service; +import java.io.IOException; import java.sql.SQLException; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import net.sf.jasperreports.engine.*; +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; +import satyamconsignment.common.Constants; +import satyamconsignment.common.Utils; +import satyamconsignment.model.TransportLedgerRow; import satyamconsignment.repository.TransportRepository; public class TransportService { @@ -27,4 +37,30 @@ public void deleteTransport(String transportName) throws SQLException { public void renameTransport(String oldName, String newName) throws SQLException { transportRepository.renameTransport(oldName, newName); } + + public void generatePdf(String transportName, String fromDate, String toDate) throws SQLException { + List transportLedgerRows = + transportRepository.getTransportReportFor(transportName, fromDate, toDate); + JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(transportLedgerRows); + + String jrxmlFileName = "TransportLedger.jrxml"; + String jrxmlFilePath = "/jrxml/" + jrxmlFileName; + + Map map = new HashMap<>(); + map.put("transportName", transportName); + map.put("fromDate", fromDate); + map.put("toDate", toDate); + + try { + JasperReport jasperReport = + JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); + JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, dataSource); + JasperExportManager.exportReportToPdfFile(jasperPrint, Constants.REPORT_FILE_NAME); + Utils.launchPdf(Constants.REPORT_FILE_NAME); + Utils.showAlert("Report Successfully Generated", 1); + } catch (IOException | JRException ex) { + Utils.showAlert(ex.toString()); + Logger.getLogger(TransportService.class.getName()).log(Level.SEVERE, ex.toString(), ex); + } + } } diff --git a/src/main/resources/jrxml/TransportLedger.jrxml b/src/main/resources/jrxml/TransportLedger.jrxml index f5aedfb..f585fb8 100644 --- a/src/main/resources/jrxml/TransportLedger.jrxml +++ b/src/main/resources/jrxml/TransportLedger.jrxml @@ -3,27 +3,15 @@ - - - - - - - - - - - - + + + + + + + + + @@ -114,32 +102,32 @@ order by datetime(substr(`LR Date`, 7, 4)||'-'||substr(`LR Date`, 4, 2)||'-'||su - + - + - + - + - + - + From 96fb0a0de28ff0e3891ad4cae277fe278b2a991e Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Mon, 22 Jun 2026 12:12:54 +0530 Subject: [PATCH 07/10] feat: proper separation of concerns for ledger controller and services Signed-off-by: Rajdeep Roy Chowdhury --- .../controller/report/BuyerLedgerController.java | 4 +++- .../controller/report/SupplierLedgerController.java | 4 +++- .../controller/report/TransportLedgerController.java | 6 ++++-- .../java/satyamconsignment/service/BuyerService.java | 9 +++------ .../satyamconsignment/service/SupplierService.java | 9 +++------ .../satyamconsignment/service/TransportService.java | 10 +++------- 6 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/main/java/satyamconsignment/controller/report/BuyerLedgerController.java b/src/main/java/satyamconsignment/controller/report/BuyerLedgerController.java index 62324a5..e6dd3c1 100644 --- a/src/main/java/satyamconsignment/controller/report/BuyerLedgerController.java +++ b/src/main/java/satyamconsignment/controller/report/BuyerLedgerController.java @@ -62,7 +62,9 @@ private void generatePDF(ActionEvent event) { try { buyerService.generatePdf( buyer_name_combo.getSelectionModel().getSelectedItem(), agewise_outstanding_radio.isSelected()); - } catch (SQLException ex) { + Utils.launchPdf(Constants.REPORT_FILE_NAME); + Utils.showAlert("Report Successfully Generated", 1); + } catch (SQLException | IOException | JRException ex) { Utils.showAlert(ex.toString()); Logger.getLogger(BuyerLedgerController.class.getName()).log(Level.SEVERE, ex.toString(), ex); } diff --git a/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java b/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java index 779a82b..e8088b1 100644 --- a/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java +++ b/src/main/java/satyamconsignment/controller/report/SupplierLedgerController.java @@ -62,7 +62,9 @@ private void generatePDF(ActionEvent event) { try { supplierService.generatePdf( supplier_name_combo.getSelectionModel().getSelectedItem(), agewise_outstanding_radio.isSelected()); - } catch (SQLException ex) { + Utils.launchPdf(Constants.REPORT_FILE_NAME); + Utils.showAlert("Report Successfully Generated", 1); + } catch (IOException | SQLException | JRException ex) { Utils.showAlert(ex.toString()); Logger.getLogger(SupplierLedgerController.class.getName()).log(Level.SEVERE, ex.toString(), ex); } diff --git a/src/main/java/satyamconsignment/controller/report/TransportLedgerController.java b/src/main/java/satyamconsignment/controller/report/TransportLedgerController.java index 31975f0..f36efcb 100644 --- a/src/main/java/satyamconsignment/controller/report/TransportLedgerController.java +++ b/src/main/java/satyamconsignment/controller/report/TransportLedgerController.java @@ -68,9 +68,11 @@ private void generatePDF(ActionEvent event) { try { transportService.generatePdf( transport_name_combo.getSelectionModel().getSelectedItem(), fromDate, toDate); - } catch (SQLException ex) { + Utils.launchPdf(Constants.REPORT_FILE_NAME); + Utils.showAlert("Report Successfully Generated", 1); + } catch (JRException | SQLException | IOException ex) { Utils.showAlert(ex.toString()); - Logger.getLogger(SupplierLedgerController.class.getName()).log(Level.SEVERE, ex.toString(), ex); + Logger.getLogger(TransportLedgerController.class.getName()).log(Level.SEVERE, ex.toString(), ex); } } diff --git a/src/main/java/satyamconsignment/service/BuyerService.java b/src/main/java/satyamconsignment/service/BuyerService.java index 4ee9f5f..193b958 100644 --- a/src/main/java/satyamconsignment/service/BuyerService.java +++ b/src/main/java/satyamconsignment/service/BuyerService.java @@ -1,6 +1,5 @@ package satyamconsignment.service; -import java.io.IOException; import java.sql.SQLException; import java.time.LocalDate; import java.time.temporal.ChronoUnit; @@ -43,7 +42,7 @@ public void renameBuyer(String oldName, String newName) throws SQLException { buyerRepository.renameBuyer(oldName, newName); } - public void generatePdf(String buyerName, boolean isAgewise) throws SQLException { + public void generatePdf(String buyerName, boolean isAgewise) throws SQLException, JRException { String jrxmlFileName; JRBeanCollectionDataSource dataSource; @@ -74,11 +73,9 @@ public void generatePdf(String buyerName, boolean isAgewise) throws SQLException JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); JasperPrint jprint = JasperFillManager.fillReport(jasperReport, payload, dataSource); JasperExportManager.exportReportToPdfFile(jprint, Constants.REPORT_FILE_NAME); - Utils.launchPdf(Constants.REPORT_FILE_NAME); - Utils.showAlert("Report Successfully Generated", 1); - } catch (JRException | IOException ex) { - Utils.showAlert(ex.toString()); + } catch (JRException ex) { Logger.getLogger(BuyerService.class.getName()).log(Level.SEVERE, ex.toString(), ex); + throw ex; } } } diff --git a/src/main/java/satyamconsignment/service/SupplierService.java b/src/main/java/satyamconsignment/service/SupplierService.java index 9efeca3..c3cdc8a 100644 --- a/src/main/java/satyamconsignment/service/SupplierService.java +++ b/src/main/java/satyamconsignment/service/SupplierService.java @@ -1,6 +1,5 @@ package satyamconsignment.service; -import java.io.IOException; import java.sql.SQLException; import java.time.LocalDate; import java.time.temporal.ChronoUnit; @@ -43,7 +42,7 @@ public void renameSupplier(String oldName, String newName) throws SQLException { supplierRepository.renameSupplier(oldName, newName); } - public void generatePdf(String supplierName, boolean isAgewise) throws SQLException { + public void generatePdf(String supplierName, boolean isAgewise) throws SQLException, JRException { String jrxmlFileName; JRBeanCollectionDataSource dataSource; @@ -77,11 +76,9 @@ public void generatePdf(String supplierName, boolean isAgewise) throws SQLExcept JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); JasperPrint jprint = JasperFillManager.fillReport(jasperReport, payload, dataSource); JasperExportManager.exportReportToPdfFile(jprint, Constants.REPORT_FILE_NAME); - Utils.launchPdf(Constants.REPORT_FILE_NAME); - Utils.showAlert("Report Successfully Generated", 1); - } catch (JRException | IOException ex) { - Utils.showAlert(ex.toString()); + } catch (JRException ex) { Logger.getLogger(SupplierService.class.getName()).log(Level.SEVERE, ex.toString(), ex); + throw ex; } } } diff --git a/src/main/java/satyamconsignment/service/TransportService.java b/src/main/java/satyamconsignment/service/TransportService.java index 7ce1d59..679ea8c 100644 --- a/src/main/java/satyamconsignment/service/TransportService.java +++ b/src/main/java/satyamconsignment/service/TransportService.java @@ -1,6 +1,5 @@ package satyamconsignment.service; -import java.io.IOException; import java.sql.SQLException; import java.util.HashMap; import java.util.List; @@ -10,7 +9,6 @@ import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import satyamconsignment.common.Constants; -import satyamconsignment.common.Utils; import satyamconsignment.model.TransportLedgerRow; import satyamconsignment.repository.TransportRepository; @@ -38,7 +36,7 @@ public void renameTransport(String oldName, String newName) throws SQLException transportRepository.renameTransport(oldName, newName); } - public void generatePdf(String transportName, String fromDate, String toDate) throws SQLException { + public void generatePdf(String transportName, String fromDate, String toDate) throws SQLException, JRException { List transportLedgerRows = transportRepository.getTransportReportFor(transportName, fromDate, toDate); JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(transportLedgerRows); @@ -56,11 +54,9 @@ public void generatePdf(String transportName, String fromDate, String toDate) th JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, dataSource); JasperExportManager.exportReportToPdfFile(jasperPrint, Constants.REPORT_FILE_NAME); - Utils.launchPdf(Constants.REPORT_FILE_NAME); - Utils.showAlert("Report Successfully Generated", 1); - } catch (IOException | JRException ex) { - Utils.showAlert(ex.toString()); + } catch (JRException ex) { Logger.getLogger(TransportService.class.getName()).log(Level.SEVERE, ex.toString(), ex); + throw ex; } } } From b1289c5fef2f2ac917b0c659610d87747ee7b482 Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Tue, 23 Jun 2026 10:14:17 +0530 Subject: [PATCH 08/10] refactor: common logic refactored to util class Signed-off-by: Rajdeep Roy Chowdhury --- .../java/satyamconsignment/common/Utils.java | 21 +++++++++++++ .../service/BuyerService.java | 31 +++++-------------- .../service/SupplierService.java | 31 +++++-------------- .../service/TransportService.java | 28 +++++------------ 4 files changed, 42 insertions(+), 69 deletions(-) diff --git a/src/main/java/satyamconsignment/common/Utils.java b/src/main/java/satyamconsignment/common/Utils.java index 5451d2f..e2215ef 100644 --- a/src/main/java/satyamconsignment/common/Utils.java +++ b/src/main/java/satyamconsignment/common/Utils.java @@ -6,11 +6,15 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; +import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.logging.Level; import java.util.logging.Logger; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; +import net.sf.jasperreports.engine.*; +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; public class Utils { @@ -85,4 +89,21 @@ public static LocalDate parseDate(String dateString) { DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); return LocalDate.parse(dateString, inputFormatter); } + + public static void generatePdf(String jrxmlFileName, Map payload, List dataRows) + throws JRException { + JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(dataRows); + + String jrxmlFilePath = "/jrxml/" + jrxmlFileName; + + try { + JasperReport jasperReport = + JasperCompileManager.compileReport(Utils.class.getResourceAsStream(jrxmlFilePath)); + JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, payload, dataSource); + JasperExportManager.exportReportToPdfFile(jasperPrint, Constants.REPORT_FILE_NAME); + } catch (JRException ex) { + Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, ex.toString(), ex); + throw ex; + } + } } diff --git a/src/main/java/satyamconsignment/service/BuyerService.java b/src/main/java/satyamconsignment/service/BuyerService.java index 193b958..21bb5ca 100644 --- a/src/main/java/satyamconsignment/service/BuyerService.java +++ b/src/main/java/satyamconsignment/service/BuyerService.java @@ -6,11 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; import net.sf.jasperreports.engine.*; -import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; -import satyamconsignment.common.Constants; import satyamconsignment.common.Utils; import satyamconsignment.model.BuyerLedgerAgeRow; import satyamconsignment.model.BuyerLedgerRow; @@ -43,11 +39,12 @@ public void renameBuyer(String oldName, String newName) throws SQLException { } public void generatePdf(String buyerName, boolean isAgewise) throws SQLException, JRException { - String jrxmlFileName; - JRBeanCollectionDataSource dataSource; + + Map payload = new HashMap<>(); + payload.put("buyerName", buyerName); if (isAgewise) { - jrxmlFileName = "BuyerLedgerAge.jrxml"; + String jrxmlFileName = "BuyerLedgerAge.jrxml"; List buyerLedgerAgeRows = collectionService.fetchPendingBillsForBuyer(buyerName).stream() .map(it -> BuyerLedgerAgeRow.builder() .billNo(it.getBillNo()) @@ -57,25 +54,11 @@ public void generatePdf(String buyerName, boolean isAgewise) throws SQLException .days((int) ChronoUnit.DAYS.between(Utils.parseDate(it.getBillDate()), LocalDate.now())) .build()) .toList(); - dataSource = new JRBeanCollectionDataSource(buyerLedgerAgeRows); + Utils.generatePdf(jrxmlFileName, payload, buyerLedgerAgeRows); } else { - jrxmlFileName = "BuyerLedger.jrxml"; + String jrxmlFileName = "BuyerLedger.jrxml"; List buyerLedgerRows = collectionService.getCollectionDetailsForBuyer(buyerName); - dataSource = new JRBeanCollectionDataSource(buyerLedgerRows); - } - - String jrxmlFilePath = "/jrxml/" + jrxmlFileName; - Map payload = new HashMap<>(); - payload.put("buyerName", buyerName); - - try { - JasperReport jasperReport = - JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); - JasperPrint jprint = JasperFillManager.fillReport(jasperReport, payload, dataSource); - JasperExportManager.exportReportToPdfFile(jprint, Constants.REPORT_FILE_NAME); - } catch (JRException ex) { - Logger.getLogger(BuyerService.class.getName()).log(Level.SEVERE, ex.toString(), ex); - throw ex; + Utils.generatePdf(jrxmlFileName, payload, buyerLedgerRows); } } } diff --git a/src/main/java/satyamconsignment/service/SupplierService.java b/src/main/java/satyamconsignment/service/SupplierService.java index c3cdc8a..79e757b 100644 --- a/src/main/java/satyamconsignment/service/SupplierService.java +++ b/src/main/java/satyamconsignment/service/SupplierService.java @@ -6,11 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; import net.sf.jasperreports.engine.*; -import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; -import satyamconsignment.common.Constants; import satyamconsignment.common.Utils; import satyamconsignment.model.SupplierLedgerAgeRow; import satyamconsignment.model.SupplierLedgerRow; @@ -44,11 +40,11 @@ public void renameSupplier(String oldName, String newName) throws SQLException { public void generatePdf(String supplierName, boolean isAgewise) throws SQLException, JRException { - String jrxmlFileName; - JRBeanCollectionDataSource dataSource; + Map payload = new HashMap<>(); + payload.put("supplierName", supplierName); if (isAgewise) { - jrxmlFileName = "SupplierLedgerAge.jrxml"; + String jrxmlFileName = "SupplierLedgerAge.jrxml"; List supplierLedgerAgeRows = paymentService.fetchPendingBillsForSupplier(supplierName).stream() .map(it -> SupplierLedgerAgeRow.builder() @@ -60,25 +56,12 @@ public void generatePdf(String supplierName, boolean isAgewise) throws SQLExcept ChronoUnit.DAYS.between(Utils.parseDate(it.getBillDate()), LocalDate.now())) .build()) .toList(); - dataSource = new JRBeanCollectionDataSource(supplierLedgerAgeRows); + + Utils.generatePdf(jrxmlFileName, payload, supplierLedgerAgeRows); } else { - jrxmlFileName = "SupplierLedger.jrxml"; + String jrxmlFileName = "SupplierLedger.jrxml"; List supplierLedgerRows = paymentService.getPaymentDetailsForSupplier(supplierName); - dataSource = new JRBeanCollectionDataSource(supplierLedgerRows); - } - - String jrxmlFilePath = "/jrxml/" + jrxmlFileName; - Map payload = new HashMap<>(); - payload.put("supplierName", supplierName); - - try { - JasperReport jasperReport = - JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); - JasperPrint jprint = JasperFillManager.fillReport(jasperReport, payload, dataSource); - JasperExportManager.exportReportToPdfFile(jprint, Constants.REPORT_FILE_NAME); - } catch (JRException ex) { - Logger.getLogger(SupplierService.class.getName()).log(Level.SEVERE, ex.toString(), ex); - throw ex; + Utils.generatePdf(jrxmlFileName, payload, supplierLedgerRows); } } } diff --git a/src/main/java/satyamconsignment/service/TransportService.java b/src/main/java/satyamconsignment/service/TransportService.java index 679ea8c..65d58fa 100644 --- a/src/main/java/satyamconsignment/service/TransportService.java +++ b/src/main/java/satyamconsignment/service/TransportService.java @@ -4,11 +4,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; import net.sf.jasperreports.engine.*; -import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; -import satyamconsignment.common.Constants; +import satyamconsignment.common.Utils; import satyamconsignment.model.TransportLedgerRow; import satyamconsignment.repository.TransportRepository; @@ -39,24 +36,13 @@ public void renameTransport(String oldName, String newName) throws SQLException public void generatePdf(String transportName, String fromDate, String toDate) throws SQLException, JRException { List transportLedgerRows = transportRepository.getTransportReportFor(transportName, fromDate, toDate); - JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(transportLedgerRows); + + Map payload = new HashMap<>(); + payload.put("transportName", transportName); + payload.put("fromDate", fromDate); + payload.put("toDate", toDate); String jrxmlFileName = "TransportLedger.jrxml"; - String jrxmlFilePath = "/jrxml/" + jrxmlFileName; - - Map map = new HashMap<>(); - map.put("transportName", transportName); - map.put("fromDate", fromDate); - map.put("toDate", toDate); - - try { - JasperReport jasperReport = - JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFilePath)); - JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, dataSource); - JasperExportManager.exportReportToPdfFile(jasperPrint, Constants.REPORT_FILE_NAME); - } catch (JRException ex) { - Logger.getLogger(TransportService.class.getName()).log(Level.SEVERE, ex.toString(), ex); - throw ex; - } + Utils.generatePdf(jrxmlFileName, payload, transportLedgerRows); } } From eeebd15f47045bb121f68706379b6a797ede2f41 Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Wed, 24 Jun 2026 13:39:35 +0530 Subject: [PATCH 09/10] feat: collection print decoupled Signed-off-by: Rajdeep Roy Chowdhury --- .../ViewDeleteCollectionController.java | 18 +--- .../service/CollectionService.java | 21 +++++ src/main/resources/jrxml/Collection.jrxml | 94 ++++++------------- 3 files changed, 52 insertions(+), 81 deletions(-) diff --git a/src/main/java/satyamconsignment/controller/entry/collection/ViewDeleteCollectionController.java b/src/main/java/satyamconsignment/controller/entry/collection/ViewDeleteCollectionController.java index e0fb813..7b32253 100644 --- a/src/main/java/satyamconsignment/controller/entry/collection/ViewDeleteCollectionController.java +++ b/src/main/java/satyamconsignment/controller/entry/collection/ViewDeleteCollectionController.java @@ -2,11 +2,8 @@ import java.io.IOException; import java.net.URL; -import java.sql.Connection; import java.sql.SQLException; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; @@ -18,7 +15,6 @@ import javafx.scene.control.cell.PropertyValueFactory; import net.sf.jasperreports.engine.*; import satyamconsignment.common.Constants; -import satyamconsignment.common.DatabaseHandler; import satyamconsignment.common.Utils; import satyamconsignment.entity.CollectionEntity; import satyamconsignment.model.CollectionItem; @@ -173,20 +169,10 @@ private void deleteEntry(ActionEvent event) { @FXML private void printCollection(ActionEvent event) { try { - Connection connection = DatabaseHandler.getInstance().getConnection(); - String jrxmlFileName = "/jrxml/Collection.jrxml"; - JasperReport jasperReport = - JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFileName)); - Map map = new HashMap<>(); - map.put("voucherNo", voucher_no_field.getText()); - map.put("voucherDate", voucher_date.getText()); - map.put("buyerName", buyer_name.getText()); - map.put("billAmount", total_amount_field.getText()); - JasperPrint jprint = JasperFillManager.fillReport(jasperReport, map, connection); - JasperExportManager.exportReportToPdfFile(jprint, Constants.REPORT_FILE_NAME); + collectionService.generatePdf(voucher_no_field.getText()); Utils.launchPdf(Constants.REPORT_FILE_NAME); Utils.showAlert("Report Successfully Generated", 1); - } catch (IOException | JRException ex) { + } catch (JRException | SQLException | IOException ex) { Utils.showAlert(ex.toString()); Logger.getLogger(ViewDeleteCollectionController.class.getName()).log(Level.SEVERE, ex.toString(), ex); } diff --git a/src/main/java/satyamconsignment/service/CollectionService.java b/src/main/java/satyamconsignment/service/CollectionService.java index f37cbb6..3b7a911 100644 --- a/src/main/java/satyamconsignment/service/CollectionService.java +++ b/src/main/java/satyamconsignment/service/CollectionService.java @@ -1,9 +1,14 @@ package satyamconsignment.service; import java.sql.SQLException; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import net.sf.jasperreports.engine.*; +import satyamconsignment.common.Utils; import satyamconsignment.entity.BillEntity; import satyamconsignment.entity.CollectionEntity; +import satyamconsignment.entity.CollectionItemEntity; import satyamconsignment.model.BuyerLedgerRow; import satyamconsignment.repository.CollectionRepository; @@ -52,4 +57,20 @@ public List getCollections() throws SQLException { public List getCollectionDetailsForBuyer(String buyerName) throws SQLException { return collectionRepository.getCollectionDetailsForBuyer(buyerName); } + + public void generatePdf(String voucherNo) throws SQLException, JRException { + + CollectionEntity collectionEntity = getCollection(voucherNo); + + Map payload = new HashMap<>(); + + payload.put("voucherNo", voucherNo); + payload.put("voucherDate", collectionEntity.getVoucherDate()); + payload.put("buyerName", collectionEntity.getBuyerName()); + payload.put("billAmount", collectionEntity.getTotalAmount()); + + List dataRows = collectionEntity.getItems(); + + Utils.generatePdf("Collection.jrxml", payload, dataRows); + } } diff --git a/src/main/resources/jrxml/Collection.jrxml b/src/main/resources/jrxml/Collection.jrxml index b624415..e5ce401 100644 --- a/src/main/resources/jrxml/Collection.jrxml +++ b/src/main/resources/jrxml/Collection.jrxml @@ -6,7 +6,6 @@ name="Collection" pageWidth="595" pageHeight="420" orientation="Landscape" columnWidth="380" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="06e081a1-744e-4dfc-8da8-ab8f0e125c09"> - @@ -17,54 +16,19 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -180,21 +144,21 @@ where "Voucher No."=$P{voucherNo}]]> - + - + - + @@ -202,23 +166,23 @@ where "Voucher No."=$P{voucherNo}]]> value="7b150011-7ea1-4315-9bed-a8182833dd39"/> - - - - - - - - + + + + + + + + + - + @@ -226,21 +190,21 @@ where "Voucher No."=$P{voucherNo}]]> value="1af0b97e-b946-4931-ac00-cc9a55f6cb8f"/> - + - + - + From 053da1f7974233693137eca09cb45d68f33f8f0c Mon Sep 17 00:00:00 2001 From: Rajdeep Roy Chowdhury Date: Wed, 24 Jun 2026 14:10:52 +0530 Subject: [PATCH 10/10] feat: payment print decoupled Signed-off-by: Rajdeep Roy Chowdhury --- .../payment/ViewDeletePaymentController.java | 14 +-- .../service/PaymentService.java | 23 ++++- src/main/resources/jrxml/BuyerLedger.jrxml | 4 +- src/main/resources/jrxml/BuyerLedgerAge.jrxml | 2 - src/main/resources/jrxml/Payment.jrxml | 95 ++++++------------- src/main/resources/jrxml/SupplierLedger.jrxml | 2 - .../resources/jrxml/SupplierLedgerAge.jrxml | 2 - .../resources/jrxml/TransportLedger.jrxml | 2 - 8 files changed, 53 insertions(+), 91 deletions(-) diff --git a/src/main/java/satyamconsignment/controller/entry/payment/ViewDeletePaymentController.java b/src/main/java/satyamconsignment/controller/entry/payment/ViewDeletePaymentController.java index b85853d..e64ab15 100644 --- a/src/main/java/satyamconsignment/controller/entry/payment/ViewDeletePaymentController.java +++ b/src/main/java/satyamconsignment/controller/entry/payment/ViewDeletePaymentController.java @@ -179,20 +179,10 @@ private void deleteEntry(ActionEvent event) { @FXML private void printPayment(ActionEvent event) { try { - Connection conn = DatabaseHandler.getInstance().getConnection(); - String jrxmlFileName = "/jrxml/Payment.jrxml"; - JasperReport jasperReport = - JasperCompileManager.compileReport(getClass().getResourceAsStream(jrxmlFileName)); - Map map = new HashMap<>(); - map.put("voucherNo", voucher_no_field.getText()); - map.put("voucherDate", voucher_date.getText()); - map.put("supplierName", supplier_name.getText()); - map.put("billAmount", total_amount_field.getText()); - JasperPrint jprint = JasperFillManager.fillReport(jasperReport, map, conn); - JasperExportManager.exportReportToPdfFile(jprint, Constants.REPORT_FILE_NAME); + paymentService.generatePdf(voucher_no_field.getText()); Utils.launchPdf(Constants.REPORT_FILE_NAME); Utils.showAlert("Report Successfully Generated", 1); - } catch (IOException | JRException ex) { + } catch (IOException | JRException | SQLException ex) { Utils.showAlert(ex.toString()); Logger.getLogger(PaymentEntryController.class.getName()).log(Level.SEVERE, ex.toString(), ex); } diff --git a/src/main/java/satyamconsignment/service/PaymentService.java b/src/main/java/satyamconsignment/service/PaymentService.java index 3b0d5d5..e301a7f 100644 --- a/src/main/java/satyamconsignment/service/PaymentService.java +++ b/src/main/java/satyamconsignment/service/PaymentService.java @@ -1,9 +1,12 @@ package satyamconsignment.service; import java.sql.SQLException; +import java.util.HashMap; import java.util.List; -import satyamconsignment.entity.BillEntity; -import satyamconsignment.entity.PaymentEntity; +import java.util.Map; +import net.sf.jasperreports.engine.JRException; +import satyamconsignment.common.Utils; +import satyamconsignment.entity.*; import satyamconsignment.model.SupplierLedgerRow; import satyamconsignment.repository.PaymentRepository; @@ -52,4 +55,20 @@ public List getPayments() throws SQLException { public List getPaymentDetailsForSupplier(String supplierName) throws SQLException { return paymentRepository.getPaymentDetailsForSupplier(supplierName); } + + public void generatePdf(String voucherNo) throws SQLException, JRException { + + PaymentEntity paymentEntity = getPayment(voucherNo); + + Map payload = new HashMap<>(); + + payload.put("voucherNo", voucherNo); + payload.put("voucherDate", paymentEntity.getVoucherDate()); + payload.put("supplierName", paymentEntity.getSupplierName()); + payload.put("billAmount", paymentEntity.getTotalAmount()); + + List dataRows = paymentEntity.getItems(); + + Utils.generatePdf("Payment.jrxml", payload, dataRows); + } } diff --git a/src/main/resources/jrxml/BuyerLedger.jrxml b/src/main/resources/jrxml/BuyerLedger.jrxml index 0ff6d14..6e78230 100644 --- a/src/main/resources/jrxml/BuyerLedger.jrxml +++ b/src/main/resources/jrxml/BuyerLedger.jrxml @@ -1,9 +1,7 @@ - - - + diff --git a/src/main/resources/jrxml/BuyerLedgerAge.jrxml b/src/main/resources/jrxml/BuyerLedgerAge.jrxml index e53c8b9..7ea9fff 100644 --- a/src/main/resources/jrxml/BuyerLedgerAge.jrxml +++ b/src/main/resources/jrxml/BuyerLedgerAge.jrxml @@ -4,8 +4,6 @@ xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="BuyerLedgerAge" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="f86cb926-fbcc-4cdf-8db2-487e31f42b8a"> - - diff --git a/src/main/resources/jrxml/Payment.jrxml b/src/main/resources/jrxml/Payment.jrxml index a85f3c3..80de6ce 100644 --- a/src/main/resources/jrxml/Payment.jrxml +++ b/src/main/resources/jrxml/Payment.jrxml @@ -5,7 +5,6 @@ xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Payment" pageWidth="595" pageHeight="420" orientation="Landscape" columnWidth="380" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="06e081a1-744e-4dfc-8da8-ab8f0e125c09"> - @@ -15,55 +14,19 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -179,21 +142,21 @@ where "Voucher No."=$P{voucherNo}]]> - + - + - + @@ -201,23 +164,23 @@ where "Voucher No."=$P{voucherNo}]]> value="03ac2e6c-da4f-43da-a4eb-6277fd13fe2f"/> - - - - - - - - + + + + + + + + + - + @@ -225,21 +188,21 @@ where "Voucher No."=$P{voucherNo}]]> value="ae49c6d3-9da5-4082-a240-2bd1e817865e"/> - + - + - + diff --git a/src/main/resources/jrxml/SupplierLedger.jrxml b/src/main/resources/jrxml/SupplierLedger.jrxml index 6827de0..5a3cfe2 100644 --- a/src/main/resources/jrxml/SupplierLedger.jrxml +++ b/src/main/resources/jrxml/SupplierLedger.jrxml @@ -1,8 +1,6 @@ - - diff --git a/src/main/resources/jrxml/SupplierLedgerAge.jrxml b/src/main/resources/jrxml/SupplierLedgerAge.jrxml index 8c88dfa..bef86e0 100644 --- a/src/main/resources/jrxml/SupplierLedgerAge.jrxml +++ b/src/main/resources/jrxml/SupplierLedgerAge.jrxml @@ -6,8 +6,6 @@ xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="SupplierLedger" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="2b5461f1-4580-477e-9d69-6885b2c7bb67"> - - diff --git a/src/main/resources/jrxml/TransportLedger.jrxml b/src/main/resources/jrxml/TransportLedger.jrxml index f585fb8..133223d 100644 --- a/src/main/resources/jrxml/TransportLedger.jrxml +++ b/src/main/resources/jrxml/TransportLedger.jrxml @@ -1,8 +1,6 @@ - -