1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.format.OceanusDataFormatter;
21 import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
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.MoneyWiseXAnalysisTransCategoryBucket;
29 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisTransCategoryBucket.MoneyWiseXAnalysisTransCategoryBucketList;
30 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisTransAttr;
31 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisTransValues;
32 import io.github.tonywasher.joceanus.moneywise.atlas.views.MoneyWiseXAnalysisFilter;
33 import io.github.tonywasher.joceanus.moneywise.atlas.views.MoneyWiseXAnalysisFilter.MoneyWiseXAnalysisTransCategoryFilter;
34 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory;
35 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryClass;
36 import org.w3c.dom.Document;
37 import org.w3c.dom.Element;
38
39 import java.util.Iterator;
40
41
42
43
44 public class MoneyWiseXReportIncomeExpense
45 extends MetisReportBase<MoneyWiseXAnalysis, MoneyWiseXAnalysisFilter<?, ?>> {
46
47
48
49 private static final String TEXT_TITLE = MoneyWiseXReportResource.INCEXP_TITLE.getValue();
50
51
52
53
54 private final MetisReportHTMLBuilder theBuilder;
55
56
57
58
59 private final OceanusDataFormatter theFormatter;
60
61
62
63
64 private MoneyWiseXAnalysis theAnalysis;
65
66
67
68
69
70
71 MoneyWiseXReportIncomeExpense(final MetisReportManager<MoneyWiseXAnalysisFilter<?, ?>> pManager) {
72
73 theBuilder = pManager.getBuilder();
74 theFormatter = theBuilder.getDataFormatter();
75 }
76
77 @Override
78 public Document createReport(final MoneyWiseXAnalysis pAnalysis) {
79
80 theAnalysis = pAnalysis;
81 final MoneyWiseXAnalysisTransCategoryBucketList myCategories = theAnalysis.getTransCategories();
82 final OceanusDateRange myRange = theAnalysis.getDateRange();
83
84
85 final MoneyWiseXAnalysisTransCategoryBucket myTotals = myCategories.getTotals();
86
87
88 final Element myBody = theBuilder.startReport();
89 theBuilder.makeTitle(myBody, TEXT_TITLE, theFormatter.formatObject(myRange));
90
91
92 final MetisHTMLTable myTable = theBuilder.startTable(myBody);
93 theBuilder.startHdrRow(myTable);
94 theBuilder.makeTitleCell(myTable);
95 theBuilder.makeTitleCell(myTable, MoneyWiseXReportBuilder.TEXT_INCOME);
96 theBuilder.makeTitleCell(myTable, MoneyWiseXReportBuilder.TEXT_EXPENSE);
97 theBuilder.makeTitleCell(myTable, MoneyWiseXReportBuilder.TEXT_PROFIT);
98
99
100 final Iterator<MoneyWiseXAnalysisTransCategoryBucket> myIterator = myCategories.iterator();
101 while (myIterator.hasNext()) {
102 final MoneyWiseXAnalysisTransCategoryBucket myBucket = myIterator.next();
103
104
105 final MoneyWiseTransCategoryClass myClass = myBucket.getTransactionCategoryType().getCategoryClass();
106 if (!myClass.isSubTotal()) {
107 continue;
108 }
109
110
111 final String myName = myBucket.getName();
112
113
114 final MoneyWiseXAnalysisTransValues myValues = myBucket.getValues();
115
116
117 theBuilder.startRow(myTable);
118 theBuilder.makeDelayLinkCell(myTable, myName);
119 theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTransAttr.INCOME));
120 theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTransAttr.EXPENSE));
121 theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTransAttr.PROFIT));
122
123
124 setDelayedTable(myName, myTable, myBucket);
125 }
126
127
128 final MoneyWiseXAnalysisTransValues myValues = myTotals.getValues();
129
130
131 theBuilder.startTotalRow(myTable);
132 theBuilder.makeTitleCell(myTable, MoneyWiseXReportBuilder.TEXT_TOTAL);
133 theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTransAttr.INCOME));
134 theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTransAttr.EXPENSE));
135 theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTransAttr.PROFIT));
136
137
138 return theBuilder.getDocument();
139 }
140
141 @Override
142 public MetisHTMLTable createDelayedTable(final DelayedTable pTable) {
143
144 final Object mySource = pTable.getSource();
145 if (mySource instanceof MoneyWiseXAnalysisTransCategoryBucket mySourceBucket) {
146 return createDelayedCategory(pTable.getParent(), mySourceBucket);
147 }
148
149
150 return null;
151 }
152
153
154
155
156
157
158
159
160 protected MetisHTMLTable createDelayedCategory(final MetisHTMLTable pParent,
161 final MoneyWiseXAnalysisTransCategoryBucket pSource) {
162
163 final MoneyWiseXAnalysisTransCategoryBucketList myCategories = theAnalysis.getTransCategories();
164 final MoneyWiseTransCategory myCategory = pSource.getTransactionCategory();
165
166
167 final MetisHTMLTable myTable = theBuilder.createEmbeddedTable(pParent);
168
169
170 final Iterator<MoneyWiseXAnalysisTransCategoryBucket> myIterator = myCategories.iterator();
171 while (myIterator.hasNext()) {
172 final MoneyWiseXAnalysisTransCategoryBucket myBucket = myIterator.next();
173
174
175 final MoneyWiseTransCategory myCurr = myBucket.getTransactionCategory();
176 if (!MetisDataDifference.isEqual(myCurr.getParentCategory(), myCategory)) {
177 continue;
178 }
179
180
181 final String myName = myBucket.getName();
182
183
184 final MoneyWiseXAnalysisTransValues myValues = myBucket.getValues();
185
186
187 theBuilder.startRow(myTable);
188 theBuilder.makeFilterLinkCell(myTable, myName, myCurr.getSubCategory());
189 theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTransAttr.INCOME));
190 theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTransAttr.EXPENSE));
191 theBuilder.makeTotalCell(myTable, myValues.getMoneyValue(MoneyWiseXAnalysisTransAttr.PROFIT));
192
193
194 setFilterForId(myName, myBucket);
195 }
196
197
198 return myTable;
199 }
200
201 @Override
202 public MoneyWiseXAnalysisTransCategoryFilter processFilter(final Object pSource) {
203
204 if (pSource instanceof MoneyWiseXAnalysisTransCategoryBucket mySource) {
205
206 return new MoneyWiseXAnalysisTransCategoryFilter(mySource);
207 }
208 return null;
209 }
210 }