View Javadoc
1   /*
2    * MoneyWise: Finance Application
3    * Copyright 2012-2026. Tony Washer
4    *
5    * Licensed under the Apache License, Version 2.0 (the "License"); you may not
6    * use this file except in compliance with the License.  You may obtain a copy
7    * of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
14   * License for the specific language governing permissions and limitations under
15   * the License.
16   */
17  package io.github.tonywasher.joceanus.moneywise.lethe.reports;
18  
19  import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
20  import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
21  import io.github.tonywasher.joceanus.metis.report.MetisReportBase;
22  import io.github.tonywasher.joceanus.metis.report.MetisReportHTMLBuilder;
23  import io.github.tonywasher.joceanus.metis.report.MetisReportHTMLBuilder.MetisHTMLTable;
24  import io.github.tonywasher.joceanus.metis.report.MetisReportManager;
25  import io.github.tonywasher.joceanus.metis.report.MetisReportReferenceManager.DelayedTable;
26  import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysis;
27  import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisPayeeBucket;
28  import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisPayeeBucket.MoneyWiseAnalysisPayeeBucketList;
29  import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.values.MoneyWiseAnalysisPayeeAttr;
30  import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.values.MoneyWiseAnalysisPayeeValues;
31  import io.github.tonywasher.joceanus.moneywise.lethe.views.MoneyWiseAnalysisFilter;
32  import io.github.tonywasher.joceanus.moneywise.lethe.views.MoneyWiseAnalysisFilter.MoneyWiseAnalysisPayeeFilter;
33  import org.w3c.dom.Document;
34  import org.w3c.dom.Element;
35  
36  import java.util.Iterator;
37  
38  /**
39   * CashFlow report builder.
40   */
41  public class MoneyWiseReportCashFlow
42          extends MetisReportBase<MoneyWiseAnalysis, MoneyWiseAnalysisFilter<?, ?>> {
43      /**
44       * The Title text.
45       */
46      private static final String TEXT_TITLE = MoneyWiseReportResource.CASHFLOW_TITLE.getValue();
47  
48      /**
49       * HTML builder.
50       */
51      private final MetisReportHTMLBuilder theBuilder;
52  
53      /**
54       * The Formatter.
55       */
56      private final OceanusDataFormatter theFormatter;
57  
58      /**
59       * Constructor.
60       *
61       * @param pManager the Report Manager
62       */
63      protected MoneyWiseReportCashFlow(final MetisReportManager<MoneyWiseAnalysisFilter<?, ?>> pManager) {
64          /* Access underlying utilities */
65          theBuilder = pManager.getBuilder();
66          theFormatter = theBuilder.getDataFormatter();
67      }
68  
69      @Override
70      public Document createReport(final MoneyWiseAnalysis pAnalysis) {
71          /* Access the bucket lists */
72          final MoneyWiseAnalysisPayeeBucketList myPayees = pAnalysis.getPayees();
73          final OceanusDateRange myRange = pAnalysis.getDateRange();
74  
75          /* Obtain the totals bucket */
76          final MoneyWiseAnalysisPayeeBucket myTotals = myPayees.getTotals();
77  
78          /* Start the report */
79          final Element myBody = theBuilder.startReport();
80          theBuilder.makeTitle(myBody, TEXT_TITLE, theFormatter.formatObject(myRange));
81  
82          /* Initialise the table */
83          final MetisHTMLTable myTable = theBuilder.startTable(myBody);
84          theBuilder.startHdrRow(myTable);
85          theBuilder.makeTotalCell(myTable);
86          theBuilder.makeTitleCell(myTable, MoneyWiseReportBuilder.TEXT_INCOME);
87          theBuilder.makeTitleCell(myTable, MoneyWiseReportBuilder.TEXT_EXPENSE);
88          theBuilder.makeTitleCell(myTable, MoneyWiseReportBuilder.TEXT_PROFIT);
89  
90          /* Loop through the Payee Buckets */
91          final Iterator<MoneyWiseAnalysisPayeeBucket> myIterator = myPayees.iterator();
92          while (myIterator.hasNext()) {
93              final MoneyWiseAnalysisPayeeBucket myBucket = myIterator.next();
94  
95              /* Access bucket name */
96              final String myName = myBucket.getName();
97  
98              /* Access values */
99              final MoneyWiseAnalysisPayeeValues myValues = myBucket.getValues();
100 
101             /* Format the detail */
102             theBuilder.startRow(myTable);
103             theBuilder.makeFilterLinkCell(myTable, myName);
104             theBuilder.makeValueCell(myTable, myValues.getMoneyValue(MoneyWiseAnalysisPayeeAttr.INCOME));
105             theBuilder.makeValueCell(myTable, myValues.getMoneyValue(MoneyWiseAnalysisPayeeAttr.EXPENSE));
106             theBuilder.makeValueCell(myTable, myValues.getMoneyValue(MoneyWiseAnalysisPayeeAttr.PROFIT));
107 
108             /* Record the filter */
109             setFilterForId(myName, myBucket);
110         }
111 
112         /* Access values */
113         final MoneyWiseAnalysisPayeeValues myValues = myTotals.getValues();
114 
115         /* Format the total */
116         theBuilder.startTotalRow(myTable);
117         theBuilder.makeTitleCell(myTable, MoneyWiseReportBuilder.TEXT_TOTAL);
118         theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseAnalysisPayeeAttr.INCOME));
119         theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseAnalysisPayeeAttr.EXPENSE));
120         theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseAnalysisPayeeAttr.PROFIT));
121 
122         /* Return the document */
123         return theBuilder.getDocument();
124     }
125 
126     @Override
127     public MoneyWiseAnalysisPayeeFilter processFilter(final Object pSource) {
128         /* If this is an PayeeBucket */
129         if (pSource instanceof MoneyWiseAnalysisPayeeBucket mySource) {
130             /* Create the new filter */
131             return new MoneyWiseAnalysisPayeeFilter(mySource);
132         }
133         return null;
134     }
135 
136     @Override
137     public MetisHTMLTable createDelayedTable(final DelayedTable pTable) {
138         return null;
139     }
140 }