From 06a2c4c692e08fdc860e489c86f34b2fe64696d1 Mon Sep 17 00:00:00 2001 From: Harishankar Date: Thu, 2 Apr 2020 11:49:52 +0530 Subject: [PATCH] Reporting Functionality - Filter by Client Enhanced the report functionality by adding filter by client to the report view. --- src/habeas/GenerateRaisedBillsDialog.java | 2 +- src/habeas/MainFrame.java | 2 +- src/habeas/NoticesReportViewDialog.form | 46 ++++++++++++- src/habeas/NoticesReportViewDialog.java | 83 +++++++++++++++++++++-- src/habeas/Utility.java | 24 +++++-- 5 files changed, 140 insertions(+), 17 deletions(-) diff --git a/src/habeas/GenerateRaisedBillsDialog.java b/src/habeas/GenerateRaisedBillsDialog.java index 0e1541d..e47de3a 100644 --- a/src/habeas/GenerateRaisedBillsDialog.java +++ b/src/habeas/GenerateRaisedBillsDialog.java @@ -135,7 +135,7 @@ public class GenerateRaisedBillsDialog extends javax.swing.JDialog { } JFileChooser chooser = new JFileChooser (); - FileFilter filter = new FileNameExtensionFilter("Flat OpenDocument text", "fodt"); + FileFilter filter = new FileNameExtensionFilter("Flat OpenDocument text (.fodt)", "fodt"); chooser.setFileFilter(filter); int r = chooser.showSaveDialog(this); if (r == JFileChooser.APPROVE_OPTION) { diff --git a/src/habeas/MainFrame.java b/src/habeas/MainFrame.java index 4c7d97b..ec3ce33 100644 --- a/src/habeas/MainFrame.java +++ b/src/habeas/MainFrame.java @@ -192,7 +192,7 @@ public class MainFrame extends javax.swing.JFrame { // TODO add your handling code here: NoticesReportViewDialog frm = new NoticesReportViewDialog(this, false); String [] cols = {"Reference Number", "Description", "Bill Date", "Bill Amount", "Client"}; - ArrayList data = Utility.getPendingPaymentBills (); + ArrayList data = Utility.getPendingPaymentBills (-1); if (data == null) { JOptionPane.showMessageDialog(this, ERROR_DISPLAYING_REPORT); return; diff --git a/src/habeas/NoticesReportViewDialog.form b/src/habeas/NoticesReportViewDialog.form index 7578904..2a58dd0 100644 --- a/src/habeas/NoticesReportViewDialog.form +++ b/src/habeas/NoticesReportViewDialog.form @@ -1,6 +1,6 @@ -
+ @@ -26,6 +26,7 @@ + @@ -46,11 +47,19 @@ + - + + + + + + + + @@ -58,7 +67,13 @@ - + + + + + + + @@ -95,5 +110,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/habeas/NoticesReportViewDialog.java b/src/habeas/NoticesReportViewDialog.java index ed0932d..64f5536 100644 --- a/src/habeas/NoticesReportViewDialog.java +++ b/src/habeas/NoticesReportViewDialog.java @@ -9,6 +9,8 @@ import java.util.ArrayList; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JTable; +import javax.swing.filechooser.FileFilter; +import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; @@ -28,6 +30,7 @@ public class NoticesReportViewDialog extends javax.swing.JDialog { public NoticesReportViewDialog(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); + populateClients (); } /** @@ -44,6 +47,9 @@ public class NoticesReportViewDialog extends javax.swing.JDialog { labelReportTitle = new javax.swing.JLabel(); jScrollPane2 = new javax.swing.JScrollPane(); tableReport = new javax.swing.JTable(); + checkFilterByClient = new javax.swing.JCheckBox(); + comboClients = new javax.swing.JComboBox<>(); + buttonApply = new javax.swing.JButton(); popMenu.setLabel("Popup"); @@ -58,6 +64,7 @@ public class NoticesReportViewDialog extends javax.swing.JDialog { setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("View Report"); + setLocationByPlatform(true); labelReportTitle.setFont(new java.awt.Font("Noto Sans", 1, 15)); // NOI18N labelReportTitle.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); @@ -73,21 +80,44 @@ public class NoticesReportViewDialog extends javax.swing.JDialog { )); jScrollPane2.setViewportView(tableReport); + checkFilterByClient.setText("Filter by Client"); + + buttonApply.setMnemonic('a'); + buttonApply.setText("Apply"); + buttonApply.setToolTipText(""); + buttonApply.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonApplyActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 679, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(labelReportTitle, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) - .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 682, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(checkFilterByClient, javax.swing.GroupLayout.PREFERRED_SIZE, 196, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(comboClients, javax.swing.GroupLayout.PREFERRED_SIZE, 322, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonApply, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(labelReportTitle, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 354, Short.MAX_VALUE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(checkFilterByClient) + .addComponent(comboClients, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(buttonApply)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 326, Short.MAX_VALUE)) ); pack(); @@ -96,9 +126,13 @@ public class NoticesReportViewDialog extends javax.swing.JDialog { private void menuExportCSVActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuExportCSVActionPerformed // TODO add your handling code here: JFileChooser chooser = new JFileChooser (); + FileFilter filter = new FileNameExtensionFilter("Comma Separated Values (.csv)", "csv"); + chooser.setFileFilter(filter); int rt = chooser.showSaveDialog(this); if (rt == JFileChooser.APPROVE_OPTION) { String filePath = chooser.getSelectedFile().getAbsolutePath(); + if (!filePath.endsWith(".csv")) + filePath = filePath.concat(".csv"); boolean ret = Utility.saveReportCSV (filePath, reportCols, reportData); if (ret == false) JOptionPane.showMessageDialog(this, ERROR_SAVING_REPORT); @@ -106,6 +140,24 @@ public class NoticesReportViewDialog extends javax.swing.JDialog { JOptionPane.showMessageDialog(this, REPORT_SAVED_SUCCESSFULLY); } }//GEN-LAST:event_menuExportCSVActionPerformed + + private void buttonApplyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonApplyActionPerformed + // TODO add your handling code here: + if (! checkFilterByClient.isSelected()) { + reportData = Utility.getPendingPaymentBills(-1); + if (reportData != null) + populateReport(); + } else { + DBItem db = (DBItem)comboClients.getSelectedItem(); + if (db == null) + return; + int selid = db.getKey(); + reportData = Utility.getPendingPaymentBills(selid); + if (reportData != null) + populateReport(); + } + + }//GEN-LAST:event_buttonApplyActionPerformed private static final String REPORT_SAVED_SUCCESSFULLY = "Report saved successfully"; private static final String ERROR_SAVING_REPORT = "Error saving report"; @@ -152,6 +204,9 @@ public class NoticesReportViewDialog extends javax.swing.JDialog { } // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton buttonApply; + private javax.swing.JCheckBox checkFilterByClient; + private javax.swing.JComboBox comboClients; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JLabel labelReportTitle; private javax.swing.JMenuItem menuExportCSV; @@ -174,11 +229,27 @@ public class NoticesReportViewDialog extends javax.swing.JDialog { tableReport.setComponentPopupMenu(popMenu); labelReportTitle.setText(title); - for (int i = 0; i < data.size(); i += columns.length) { - Object[] row = new Object[columns.length]; - for (int j = 0; j < columns.length; j ++) - row[j] = data.get(i+j); + populateReport (); + } + + private void populateReport () { + DefaultTableModel mdl = (DefaultTableModel)tableReport.getModel(); + mdl.setRowCount(0); + for (int i = 0; i < reportData.size(); i += reportCols.length) { + Object[] row = new Object[reportCols.length]; + for (int j = 0; j < reportCols.length; j ++) + row[j] = reportData.get(i+j); mdl.addRow (row); + + } + } + + private void populateClients() { + ArrayList clients = Utility.getClientsNameAndId(); + if (clients == null) return; + for (int i = 0; i < clients.size(); i += 2) { + comboClients.addItem (new DBItem ((int)clients.get(i), + (String)clients.get(i+1))); } } } diff --git a/src/habeas/Utility.java b/src/habeas/Utility.java index c0379a0..89d06cf 100644 --- a/src/habeas/Utility.java +++ b/src/habeas/Utility.java @@ -503,16 +503,28 @@ public class Utility { } - static ArrayList getPendingPaymentBills() { + static ArrayList getPendingPaymentBills(int clientid) { ArrayList data = new ArrayList<>(); try { Connection conn = DriverManager.getConnection(JDBC + connectionURL); - Statement st = conn.createStatement(); - ResultSet rs = st.executeQuery("SELECT ReferenceNumber, Description, " + + // if no client ID is specified i.e. -1 get ll + ResultSet rs; + if (clientid == -1) { + Statement st = conn.createStatement(); + rs = st.executeQuery("SELECT ReferenceNumber, Description, " + "BillDate, BillAmount, ClientName" + " FROM legalnotices INNER JOIN clients ON ClientId=clients.id " + "WHERE BillStatus='AWAITING PAYMENT';"); - + } + else { + PreparedStatement st = conn.prepareStatement("SELECT ReferenceNumber, " + + "Description, BillDate, BillAmount, ClientName" + + " FROM legalnotices INNER JOIN clients ON ClientId=clients.id " + + "WHERE BillStatus='AWAITING PAYMENT' AND ClientId=?;"); + st.setInt (1, clientid); + rs = st.executeQuery(); + } DateFormat fmt = new SimpleDateFormat ("dd/MM/yyyy"); while (rs.next()) { data.add (rs.getString("ReferenceNumber")); @@ -535,13 +547,13 @@ public class Utility { FileWriter f = new FileWriter (filePath); for (int i = 0; i < reportCols.length; i ++) { f.append (escapeQuote(reportCols[i])); - f.append (", "); + f.append (","); } f.append("\n"); for (int i = 0; i < reportData.size(); i += reportCols.length) { for (int j = 0; j < reportCols.length; j ++) { f.append (escapeQuote(reportData.get(i+j))); - f.append (", "); + f.append (","); } f.append ("\n"); } -- 2.20.1