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.atlas.reports;
18  
19  import io.github.tonywasher.joceanus.oceanus.date.OceanusDateRange;
20  import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
21  import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
22  import io.github.tonywasher.joceanus.metis.report.MetisReportBase;
23  import io.github.tonywasher.joceanus.metis.report.MetisReportHTMLBuilder;
24  import io.github.tonywasher.joceanus.metis.report.MetisReportHTMLBuilder.MetisHTMLTable;
25  import io.github.tonywasher.joceanus.metis.report.MetisReportManager;
26  import io.github.tonywasher.joceanus.metis.report.MetisReportReferenceManager.DelayedTable;
27  import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysis;
28  import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisTaxBasisAccountBucket;
29  import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisTaxBasisBucket;
30  import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisTaxBasisBucket.MoneyWiseXAnalysisTaxBasisBucketList;
31  import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisTaxBasisAttr;
32  import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisTaxBasisValues;
33  import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisValuesResource;
34  import io.github.tonywasher.joceanus.moneywise.atlas.views.MoneyWiseXAnalysisFilter;
35  import io.github.tonywasher.joceanus.moneywise.atlas.views.MoneyWiseXAnalysisFilter.MoneyWiseXAnalysisTaxBasisFilter;
36  import org.w3c.dom.Document;
37  import org.w3c.dom.Element;
38  
39  import java.util.Iterator;
40  
41  /**
42   * Taxation Basis report builder.
43   */
44  public class MoneyWiseXReportTaxationBasis
45          extends MetisReportBase<MoneyWiseXAnalysis, MoneyWiseXAnalysisFilter<?, ?>> {
46      /**
47       * The Title text.
48       */
49      private static final String TEXT_TITLE = MoneyWiseXReportResource.TAXBASIS_TITLE.getValue();
50  
51      /**
52       * The Net text.
53       */
54      private static final String TEXT_NETT = MoneyWiseXAnalysisValuesResource.TAXATTR_NETT.getValue();
55  
56      /**
57       * The Gross text.
58       */
59      private static final String TEXT_GROSS = MoneyWiseXAnalysisValuesResource.TAXATTR_GROSS.getValue();
60  
61      /**
62       * HTML builder.
63       */
64      private final MetisReportHTMLBuilder theBuilder;
65  
66      /**
67       * The Formatter.
68       */
69      private final OceanusDataFormatter theFormatter;
70  
71      /**
72       * Constructor.
73       *
74       * @param pManager the Report Manager
75       */
76      MoneyWiseXReportTaxationBasis(final MetisReportManager<MoneyWiseXAnalysisFilter<?, ?>> pManager) {
77          /* Access underlying utilities */
78          theBuilder = pManager.getBuilder();
79          theFormatter = theBuilder.getDataFormatter();
80      }
81  
82      @Override
83      public Document createReport(final MoneyWiseXAnalysis pAnalysis) {
84          /* Access the bucket lists */
85          final MoneyWiseXAnalysisTaxBasisBucketList myTaxBasis = pAnalysis.getTaxBasis();
86          final OceanusDateRange myRange = pAnalysis.getDateRange();
87  
88          /* Obtain the totals bucket */
89          final MoneyWiseXAnalysisTaxBasisBucket myTotals = myTaxBasis.getTotals();
90  
91          /* Start the report */
92          final Element myBody = theBuilder.startReport();
93          theBuilder.makeTitle(myBody, TEXT_TITLE, theFormatter.formatObject(myRange));
94  
95          /* Initialise the table */
96          final MetisHTMLTable myTable = theBuilder.startTable(myBody);
97          theBuilder.startHdrRow(myTable);
98          theBuilder.makeTitleCell(myTable);
99          theBuilder.makeTitleCell(myTable, TEXT_NETT);
100         theBuilder.makeTitleCell(myTable, TEXT_GROSS);
101 
102         /* Loop through the TaxBasis Buckets */
103         final Iterator<MoneyWiseXAnalysisTaxBasisBucket> myIterator = myTaxBasis.iterator();
104         while (myIterator.hasNext()) {
105             final MoneyWiseXAnalysisTaxBasisBucket myBucket = myIterator.next();
106 
107             /* Access the tax basis */
108             final boolean hasAccounts = myBucket.hasAccounts();
109 
110             /* Access the amount */
111             final MoneyWiseXAnalysisTaxBasisValues myValues = myBucket.getValues();
112             final OceanusMoney myGross = myValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS);
113             final OceanusMoney myNett = myValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.NETT);
114 
115             /* If we have a non-zero value */
116             if (myGross.isNonZero()) {
117                 /* Access bucket name */
118                 final String myName = myBucket.getName();
119 
120                 /* Format the detail */
121                 theBuilder.startRow(myTable);
122                 if (hasAccounts) {
123                     theBuilder.makeDelayLinkCell(myTable, myName);
124                 } else {
125                     theBuilder.makeFilterLinkCell(myTable, myName);
126                 }
127                 theBuilder.makeValueCell(myTable, myNett);
128                 theBuilder.makeValueCell(myTable, myGross);
129 
130                 /* Create links */
131                 if (hasAccounts) {
132                     setDelayedTable(myName, myTable, myBucket);
133                 } else {
134                     setFilterForId(myName, myBucket);
135                 }
136             }
137         }
138 
139         /* Access values */
140         final MoneyWiseXAnalysisTaxBasisValues myValues = myTotals.getValues();
141 
142         /* Format the total */
143         theBuilder.startTotalRow(myTable);
144         theBuilder.makeTitleCell(myTable, MoneyWiseXReportBuilder.TEXT_TOTAL);
145         theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.NETT));
146         theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS));
147 
148         /* Return the document */
149         return theBuilder.getDocument();
150     }
151 
152     @Override
153     public MetisHTMLTable createDelayedTable(final DelayedTable pTable) {
154         /* Access the source */
155         final Object mySource = pTable.getSource();
156         if (mySource instanceof MoneyWiseXAnalysisTaxBasisBucket mySourceBucket) {
157             return createDelayedAccounts(pTable.getParent(), mySourceBucket);
158         }
159 
160         /* Return the null table */
161         return null;
162     }
163 
164     /**
165      * Create a delayed accounts table.
166      *
167      * @param pParent the parent table
168      * @param pSource the source bucket
169      * @return the new document fragment
170      */
171     protected MetisHTMLTable createDelayedAccounts(final MetisHTMLTable pParent,
172                                                    final MoneyWiseXAnalysisTaxBasisBucket pSource) {
173         /* Create an embedded table */
174         final MetisHTMLTable myTable = theBuilder.createEmbeddedTable(pParent);
175 
176         /* Loop through the Account Buckets */
177         final Iterator<MoneyWiseXAnalysisTaxBasisAccountBucket> myIterator = pSource.accountIterator();
178         while (myIterator.hasNext()) {
179             final MoneyWiseXAnalysisTaxBasisAccountBucket myBucket = myIterator.next();
180 
181             /* Access bucket name */
182             final String myName = myBucket.getName();
183             final String mySimpleName = myBucket.getSimpleName();
184 
185             /* Access values */
186             final MoneyWiseXAnalysisTaxBasisValues myValues = myBucket.getValues();
187 
188             /* Create the SubCategory row */
189             theBuilder.startRow(myTable);
190             theBuilder.makeFilterLinkCell(myTable, myName, mySimpleName);
191             theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.NETT));
192             theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTaxBasisAttr.GROSS));
193 
194             /* Record the selection */
195             setFilterForId(myName, myBucket);
196         }
197 
198         /* Return the table */
199         return myTable;
200     }
201 
202     @Override
203     public MoneyWiseXAnalysisTaxBasisFilter processFilter(final Object pSource) {
204         if (pSource instanceof MoneyWiseXAnalysisTaxBasisBucket mySource) {
205             /* Create the new filter */
206             return new MoneyWiseXAnalysisTaxBasisFilter(mySource);
207         }
208         return null;
209     }
210 }