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