1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.data.basic;
18
19 import io.github.tonywasher.joceanus.metis.data.MetisDataDifference;
20 import io.github.tonywasher.joceanus.metis.data.MetisDataItem.MetisDataFieldId;
21 import io.github.tonywasher.joceanus.metis.data.MetisDataResource;
22 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
23 import io.github.tonywasher.joceanus.metis.field.MetisFieldVersionedSet;
24 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
25 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryClass;
26 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryType;
27 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryType.MoneyWiseTransCategoryTypeList;
28 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransInfoClass;
29 import io.github.tonywasher.joceanus.moneywise.exc.MoneyWiseDataException;
30 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
31 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
32 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
33 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataResource;
34 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataValues;
35 import io.github.tonywasher.joceanus.prometheus.data.PrometheusStaticDataItem;
36 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
37
38 import java.util.HashMap;
39 import java.util.Iterator;
40 import java.util.Map;
41 import java.util.Objects;
42
43
44
45
46 public final class MoneyWiseTransCategory
47 extends MoneyWiseCategoryBase {
48
49
50
51 public static final String OBJECT_NAME = MoneyWiseBasicDataType.TRANSCATEGORY.getItemName();
52
53
54
55
56 public static final String LIST_NAME = MoneyWiseBasicDataType.TRANSCATEGORY.getListName();
57
58
59
60
61 private static final MetisFieldVersionedSet<MoneyWiseTransCategory> FIELD_DEFS = MetisFieldVersionedSet.newVersionedFieldSet(MoneyWiseTransCategory.class);
62
63
64
65
66 static {
67 FIELD_DEFS.declareLinkField(MoneyWiseStaticDataType.TRANSTYPE);
68 }
69
70
71
72
73
74
75
76 MoneyWiseTransCategory(final MoneyWiseTransCategoryList pList,
77 final MoneyWiseTransCategory pCategory) {
78
79 super(pList, pCategory);
80 }
81
82
83
84
85
86
87
88
89 private MoneyWiseTransCategory(final MoneyWiseTransCategoryList pList,
90 final PrometheusDataValues pValues) throws OceanusException {
91
92 super(pList, pValues);
93
94
95 final Object myValue = pValues.getValue(MoneyWiseStaticDataType.TRANSTYPE);
96 if (myValue instanceof Integer i) {
97 setValueType(i);
98 } else if (myValue instanceof String s) {
99 setValueType(s);
100 }
101 }
102
103
104
105
106
107
108 public MoneyWiseTransCategory(final MoneyWiseTransCategoryList pList) {
109 super(pList);
110 }
111
112 @Override
113 public MetisFieldSetDef getDataFieldSet() {
114 return FIELD_DEFS;
115 }
116
117 @Override
118 public boolean isActive() {
119 return super.isActive() || isHidden();
120 }
121
122 @Override
123 public boolean includeXmlField(final MetisDataFieldId pField) {
124
125 if (MoneyWiseStaticDataType.TRANSTYPE.equals(pField)) {
126 return true;
127 }
128
129
130 return super.includeXmlField(pField);
131 }
132
133 @Override
134 public MoneyWiseTransCategoryType getCategoryType() {
135 return getValues().getValue(MoneyWiseStaticDataType.TRANSTYPE, MoneyWiseTransCategoryType.class);
136 }
137
138 @Override
139 public MoneyWiseTransCategoryClass getCategoryTypeClass() {
140 final MoneyWiseTransCategoryType myType = getCategoryType();
141 return myType == null
142 ? null
143 : myType.getCategoryClass();
144 }
145
146 @Override
147 public MoneyWiseTransCategory getParentCategory() {
148 return getValues().getValue(PrometheusDataResource.DATAGROUP_PARENT, MoneyWiseTransCategory.class);
149 }
150
151
152
153
154
155
156 private void setValueType(final MoneyWiseTransCategoryType pValue) {
157 getValues().setUncheckedValue(MoneyWiseStaticDataType.TRANSTYPE, pValue);
158 }
159
160
161
162
163
164
165 private void setValueType(final Integer pValue) {
166 getValues().setUncheckedValue(MoneyWiseStaticDataType.TRANSTYPE, pValue);
167 }
168
169
170
171
172
173
174 private void setValueType(final String pValue) {
175 getValues().setUncheckedValue(MoneyWiseStaticDataType.TRANSTYPE, pValue);
176 }
177
178 @Override
179 public MoneyWiseTransCategoryList getList() {
180 return (MoneyWiseTransCategoryList) super.getList();
181 }
182
183
184
185
186
187
188
189 public boolean isCategoryClass(final MoneyWiseTransCategoryClass pClass) {
190
191 return getCategoryTypeClass() == pClass;
192 }
193
194
195
196
197
198
199 public boolean isTransfer() {
200
201 final MoneyWiseTransCategoryClass myClass = getCategoryTypeClass();
202 return myClass != null
203 && myClass.isTransfer();
204 }
205
206
207
208
209
210
211
212 public void setDefaults(final MoneyWiseTransCategory pParent) throws OceanusException {
213 getList().getValidator().setDefaults(pParent, this);
214 }
215
216 @Override
217 public void resolveDataSetLinks() throws OceanusException {
218
219 super.resolveDataSetLinks();
220
221
222 final MoneyWiseDataSet myData = getDataSet();
223 resolveDataLink(MoneyWiseStaticDataType.TRANSTYPE, myData.getTransCategoryTypes());
224 }
225
226 @Override
227 protected void resolveEditSetLinks() throws OceanusException {
228
229 resolveDataLink(PrometheusDataResource.DATAGROUP_PARENT, getList());
230
231
232 final PrometheusEditSet myEditSet = getList().getEditSet();
233 if (myEditSet.hasDataType(MoneyWiseStaticDataType.TRANSTYPE)) {
234 resolveDataLink(MoneyWiseStaticDataType.TRANSTYPE, myEditSet.getDataList(MoneyWiseStaticDataType.TRANSTYPE, MoneyWiseTransCategoryTypeList.class));
235 }
236 }
237
238 @Override
239 public void setCategoryType(final PrometheusStaticDataItem pType) {
240 setValueType((MoneyWiseTransCategoryType) pType);
241 }
242
243
244
245
246
247
248
249 @Override
250 public boolean applyChanges(final PrometheusDataItem pCategory) {
251
252 if (!(pCategory instanceof MoneyWiseTransCategory myCategory)) {
253 return false;
254 }
255
256
257 pushHistory();
258
259
260 applyBasicChanges(myCategory);
261
262
263 if (!MetisDataDifference.isEqual(getCategoryType(), myCategory.getCategoryType())) {
264 setValueType(myCategory.getCategoryType());
265 }
266
267
268 return checkForHistory();
269 }
270
271
272
273
274
275
276 public boolean isHidden() {
277 final MoneyWiseTransCategoryClass myClass = this.getCategoryTypeClass();
278 return myClass != null
279 && myClass.isHiddenType();
280 }
281
282
283
284
285 public static class MoneyWiseTransCategoryList
286 extends MoneyWiseCategoryBaseList<MoneyWiseTransCategory> {
287
288
289
290 private static final MetisFieldSet<MoneyWiseTransCategoryList> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseTransCategoryList.class);
291
292
293
294
295 private PrometheusEditSet theEditSet;
296
297
298
299
300
301
302 public MoneyWiseTransCategoryList(final MoneyWiseDataSet pData) {
303 super(pData, MoneyWiseTransCategory.class, MoneyWiseBasicDataType.TRANSCATEGORY);
304 }
305
306
307
308
309
310
311 protected MoneyWiseTransCategoryList(final MoneyWiseTransCategoryList pSource) {
312 super(pSource);
313 }
314
315 @Override
316 public MetisFieldSet<MoneyWiseTransCategoryList> getDataFieldSet() {
317 return FIELD_DEFS;
318 }
319
320 @Override
321 public String listName() {
322 return LIST_NAME;
323 }
324
325 @Override
326 public MetisFieldSetDef getItemFields() {
327 return MoneyWiseTransCategory.FIELD_DEFS;
328 }
329
330
331
332
333
334
335 public PrometheusEditSet getEditSet() {
336 return theEditSet;
337 }
338
339 @Override
340 public MoneyWiseTransCategoryDataMap getDataMap() {
341 return (MoneyWiseTransCategoryDataMap) super.getDataMap();
342 }
343
344 @Override
345 protected MoneyWiseTransCategoryList getEmptyList(final PrometheusListStyle pStyle) {
346 final MoneyWiseTransCategoryList myList = new MoneyWiseTransCategoryList(this);
347 myList.setStyle(pStyle);
348 return myList;
349 }
350
351
352
353
354
355
356
357
358 public MoneyWiseTransCategoryList deriveEditList(final PrometheusEditSet pEditSet) throws OceanusException {
359
360 final MoneyWiseTransCategoryList myList = getEmptyList(PrometheusListStyle.EDIT);
361 myList.ensureMap();
362 pEditSet.setEditEntryList(MoneyWiseBasicDataType.TRANSCATEGORY, myList);
363 myList.getValidator().setEditSet(pEditSet);
364
365
366 myList.theEditSet = pEditSet;
367
368
369 final Iterator<MoneyWiseTransCategory> myIterator = iterator();
370 while (myIterator.hasNext()) {
371 final MoneyWiseTransCategory myCurr = myIterator.next();
372
373
374 if (myCurr.isDeleted()) {
375 continue;
376 }
377
378
379 final MoneyWiseTransCategory myCategory = new MoneyWiseTransCategory(myList, myCurr);
380 myList.add(myCategory);
381 myCategory.resolveEditSetLinks();
382
383
384 myCategory.adjustMapForItem();
385 }
386
387
388 return myList;
389 }
390
391
392
393
394
395
396
397 @Override
398 public MoneyWiseTransCategory addCopyItem(final PrometheusDataItem pCategory) {
399
400 if (!(pCategory instanceof MoneyWiseTransCategory)) {
401 throw new UnsupportedOperationException();
402 }
403
404 final MoneyWiseTransCategory myCategory = new MoneyWiseTransCategory(this, (MoneyWiseTransCategory) pCategory);
405 add(myCategory);
406 return myCategory;
407 }
408
409
410
411
412
413
414 @Override
415 public MoneyWiseTransCategory addNewItem() {
416 final MoneyWiseTransCategory myCategory = new MoneyWiseTransCategory(this);
417 add(myCategory);
418 return myCategory;
419 }
420
421
422
423
424
425
426
427 public MoneyWiseTransCategory getSingularClass(final MoneyWiseTransCategoryClass pClass) {
428
429 return getDataMap().findSingularItem(pClass);
430 }
431
432
433
434
435
436
437
438 public MoneyWiseTransCategory getEventInfoCategory(final MoneyWiseTransInfoClass pInfoClass) {
439
440 switch (pInfoClass) {
441 case TAXCREDIT:
442 return getSingularClass(MoneyWiseTransCategoryClass.INCOMETAX);
443 case DEEMEDBENEFIT:
444 return getSingularClass(MoneyWiseTransCategoryClass.VIRTUALINCOME);
445 case EMPLOYEENATINS:
446 return getSingularClass(MoneyWiseTransCategoryClass.EMPLOYEENATINS);
447 case EMPLOYERNATINS:
448 return getSingularClass(MoneyWiseTransCategoryClass.EMPLOYERNATINS);
449 case WITHHELD:
450 return getSingularClass(MoneyWiseTransCategoryClass.WITHHELD);
451 default:
452 return null;
453 }
454 }
455
456 @Override
457 public MoneyWiseTransCategory addValuesItem(final PrometheusDataValues pValues) throws OceanusException {
458
459 final MoneyWiseTransCategory myCategory = new MoneyWiseTransCategory(this, pValues);
460
461
462 if (!isIdUnique(myCategory.getIndexedId())) {
463 myCategory.addError(ERROR_DUPLICATE, MetisDataResource.DATA_ID);
464 throw new MoneyWiseDataException(myCategory, ERROR_VALIDATION);
465 }
466
467
468 add(myCategory);
469
470
471 return myCategory;
472 }
473
474 @Override
475 protected MoneyWiseTransCategoryDataMap allocateDataMap() {
476 return new MoneyWiseTransCategoryDataMap();
477 }
478 }
479
480
481
482
483 public static class MoneyWiseTransCategoryDataMap
484 extends MoneyWiseCategoryDataMap<MoneyWiseTransCategory> {
485
486
487
488 private static final MetisFieldSet<MoneyWiseTransCategoryDataMap> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseTransCategoryDataMap.class);
489
490
491
492
493 static {
494 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.MONEYWISEDATA_MAP_SINGULARMAP, MoneyWiseTransCategoryDataMap::getSingularMap);
495 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.MONEYWISEDATA_MAP_SINGULARCOUNTS, MoneyWiseTransCategoryDataMap::getSingularCountMap);
496 }
497
498
499
500
501 private final Map<Integer, Integer> theCategoryCountMap;
502
503
504
505
506 private final Map<Integer, MoneyWiseTransCategory> theCategoryMap;
507
508
509
510
511 public MoneyWiseTransCategoryDataMap() {
512
513 theCategoryCountMap = new HashMap<>();
514 theCategoryMap = new HashMap<>();
515 }
516
517 @Override
518 public MetisFieldSet<MoneyWiseTransCategoryDataMap> getDataFieldSet() {
519 return FIELD_DEFS;
520 }
521
522 @Override
523 public String formatObject(final OceanusDataFormatter pFormatter) {
524 return FIELD_DEFS.getName();
525 }
526
527
528
529
530
531
532 private Map<Integer, MoneyWiseTransCategory> getSingularMap() {
533 return theCategoryMap;
534 }
535
536
537
538
539
540
541 private Map<Integer, Integer> getSingularCountMap() {
542 return theCategoryCountMap;
543 }
544
545 @Override
546 public void resetMap() {
547 super.resetMap();
548 theCategoryCountMap.clear();
549 theCategoryMap.clear();
550 }
551
552 @Override
553 public void adjustForItem(final PrometheusDataItem pItem) {
554
555 final MoneyWiseTransCategory myItem = (MoneyWiseTransCategory) pItem;
556
557
558 final MoneyWiseTransCategoryClass myClass = Objects.requireNonNull(myItem.getCategoryTypeClass());
559 if (myClass.isSingular()) {
560
561 final Integer myId = myClass.getClassId();
562 final Integer myCount = theCategoryCountMap.get(myId);
563 if (myCount == null) {
564 theCategoryCountMap.put(myId, ONE);
565 } else {
566 theCategoryCountMap.put(myId, myCount + 1);
567 }
568
569
570 theCategoryMap.put(myId, myItem);
571 }
572
573
574 adjustForItem(myItem, myItem.getName());
575 }
576
577
578
579
580
581
582
583 public MoneyWiseTransCategory findSingularItem(final MoneyWiseTransCategoryClass pClass) {
584 return theCategoryMap.get(pClass.getClassId());
585 }
586
587
588
589
590
591
592
593 public boolean validSingularCount(final MoneyWiseTransCategoryClass pClass) {
594 final Integer myResult = theCategoryCountMap.get(pClass.getClassId());
595 return ONE.equals(myResult);
596 }
597 }
598 }