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.MetisDataResource;
21 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
22 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory.MoneyWiseTransCategoryList;
23 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseAccountInfoClass;
24 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseAccountInfoType;
25 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseAccountInfoType.MoneyWiseAccountInfoTypeList;
26 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
27 import io.github.tonywasher.joceanus.moneywise.exc.MoneyWiseDataException;
28 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
29 import io.github.tonywasher.joceanus.prometheus.data.PrometheusData.PrometheusDataSetCtl;
30 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataInfoClass;
31 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataInfoItem;
32 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataInfoSet;
33 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
34 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataList;
35 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataResource;
36 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataSet;
37 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataValues;
38 import io.github.tonywasher.joceanus.prometheus.data.PrometheusEncrypted.PrometheusDataInfoSetItemCtl;
39 import io.github.tonywasher.joceanus.prometheus.data.PrometheusListStyle;
40 import io.github.tonywasher.joceanus.prometheus.data.PrometheusStaticDataItem;
41 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
42
43 import java.util.Iterator;
44
45
46
47
48
49
50 public class MoneyWiseCashInfo
51 extends PrometheusDataInfoItem {
52
53
54
55 public static final String OBJECT_NAME = MoneyWiseBasicDataType.CASHINFO.getItemName();
56
57
58
59
60 public static final String LIST_NAME = MoneyWiseBasicDataType.CASHINFO.getListName();
61
62
63
64
65 private static final MetisFieldSet<MoneyWiseCashInfo> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseCashInfo.class);
66
67
68
69
70
71
72
73 protected MoneyWiseCashInfo(final MoneyWiseCashInfoList pList,
74 final MoneyWiseCashInfo pInfo) {
75
76 super(pList, pInfo);
77 }
78
79
80
81
82
83
84
85
86 private MoneyWiseCashInfo(final MoneyWiseCashInfoList pList,
87 final PrometheusDataItem pCash,
88 final MoneyWiseAccountInfoType pType) {
89
90 super(pList);
91 setNextDataKeySet();
92
93
94 setValueInfoType(pType);
95 setValueOwner(pCash);
96 }
97
98
99
100
101
102
103
104
105 private MoneyWiseCashInfo(final MoneyWiseCashInfoList pList,
106 final PrometheusDataValues pValues) throws OceanusException {
107
108 super(pList, pValues);
109
110
111 try {
112
113 resolveDataLink(PrometheusDataResource.DATAINFO_TYPE, MoneyWiseStaticDataType.ACCOUNTINFOTYPE);
114 resolveDataLink(PrometheusDataResource.DATAINFO_OWNER, MoneyWiseBasicDataType.CASH);
115
116
117 setValue(pValues.getValue(PrometheusDataResource.DATAINFO_VALUE));
118
119
120 resolveLink(null);
121
122
123 getInfoSet().registerInfo(this);
124
125 } catch (OceanusException e) {
126
127 throw new MoneyWiseDataException(this, ERROR_CREATEITEM, e);
128 }
129 }
130
131 @Override
132 public MetisFieldSetDef getDataFieldSet() {
133 return FIELD_DEFS;
134 }
135
136 @Override
137 public MoneyWiseAccountInfoType getInfoType() {
138 return getValues().getValue(PrometheusDataResource.DATAINFO_TYPE, MoneyWiseAccountInfoType.class);
139 }
140
141 @Override
142 public MoneyWiseAccountInfoClass getInfoClass() {
143 return getInfoType().getInfoClass();
144 }
145
146 @Override
147 public PrometheusDataItem getOwner() {
148 return getValues().getValue(PrometheusDataResource.DATAINFO_OWNER, PrometheusDataItem.class);
149 }
150
151
152
153
154
155
156 public MoneyWisePayee getPayee() {
157 return getValues().getValue(PrometheusDataResource.DATAINFO_LINK, MoneyWisePayee.class);
158 }
159
160
161
162
163
164
165 public MoneyWiseTransCategory getEventCategory() {
166 return getValues().getValue(PrometheusDataResource.DATAINFO_LINK, MoneyWiseTransCategory.class);
167 }
168
169 @Override
170 public String getLinkName() {
171 final PrometheusDataItem myItem = getLink();
172 if (myItem instanceof MoneyWisePayee myPayee) {
173 return myPayee.getName();
174 }
175 if (myItem instanceof MoneyWiseTransCategory myCat) {
176 return myCat.getName();
177 }
178 return null;
179 }
180
181 @Override
182 public MoneyWiseCashInfo getBase() {
183 return (MoneyWiseCashInfo) super.getBase();
184 }
185
186 @Override
187 public MoneyWiseCashInfoList getList() {
188 return (MoneyWiseCashInfoList) super.getList();
189 }
190
191
192
193
194
195
196 @SuppressWarnings("unchecked")
197 private PrometheusDataInfoSet<MoneyWiseCashInfo> getInfoSet() {
198 return (PrometheusDataInfoSet<MoneyWiseCashInfo>) ((PrometheusDataInfoSetItemCtl<MoneyWiseCashInfo>) getOwner()).getInfoSet();
199 }
200
201 @Override
202 public void deRegister() {
203
204 getInfoSet().deRegisterInfo(this);
205 }
206
207 @Override
208 public void resolveDataSetLinks() throws OceanusException {
209
210 super.resolveDataSetLinks();
211
212
213 resolveDataLink(PrometheusDataResource.DATAINFO_TYPE, MoneyWiseStaticDataType.ACCOUNTINFOTYPE);
214 resolveDataLink(PrometheusDataResource.DATAINFO_OWNER, MoneyWiseBasicDataType.CASH);
215
216
217 resolveLink(null);
218
219
220 getInfoSet().registerInfo(this);
221 }
222
223
224
225
226
227
228
229 public void resolveEditSetLinks(final PrometheusEditSet pEditSet) throws OceanusException {
230
231 resolveDataLink(PrometheusDataResource.DATAINFO_TYPE, pEditSet.getDataList(MoneyWiseStaticDataType.ACCOUNTINFOTYPE, MoneyWiseAccountInfoTypeList.class));
232 resolveDataLink(PrometheusDataResource.DATAINFO_OWNER, pEditSet.getDataList(MoneyWiseBasicDataType.CASH, PrometheusDataList.class));
233
234
235 resolveLink(pEditSet);
236 }
237
238
239
240
241
242
243
244 private void resolveLink(final PrometheusEditSet pEditSet) throws OceanusException {
245
246 final MoneyWiseAccountInfoType myType = getInfoType();
247 if (myType.isLink()) {
248
249 final PrometheusDataSetCtl myData = getDataSet();
250 final Object myLinkId = getValues().getValue(PrometheusDataResource.DATAINFO_VALUE);
251
252
253 switch (myType.getInfoClass()) {
254 case AUTOPAYEE:
255 resolveDataLink(PrometheusDataResource.DATAINFO_LINK, pEditSet == null
256 ? myData.getDataList(MoneyWiseBasicDataType.PAYEE, PrometheusDataList.class)
257 : pEditSet.getDataList(MoneyWiseBasicDataType.PAYEE, PrometheusDataList.class));
258 if (myLinkId == null) {
259 setValueValue(getPayee().getIndexedId());
260 }
261 break;
262 case AUTOEXPENSE:
263 resolveDataLink(PrometheusDataResource.DATAINFO_LINK, pEditSet == null
264 ? myData.getDataList(MoneyWiseBasicDataType.TRANSCATEGORY, MoneyWiseTransCategoryList.class)
265 : pEditSet.getDataList(MoneyWiseBasicDataType.TRANSCATEGORY, MoneyWiseTransCategoryList.class));
266 if (myLinkId == null) {
267 setValueValue(getEventCategory().getIndexedId());
268 }
269 break;
270 default:
271 break;
272 }
273 }
274 }
275
276
277
278
279
280
281
282 @Override
283 public boolean applyChanges(final PrometheusDataItem pInfo) {
284
285 if (!(pInfo instanceof MoneyWiseCashInfo myInfo)) {
286 return false;
287 }
288
289
290 pushHistory();
291
292
293 if (!MetisDataDifference.isEqual(getField(), myInfo.getField())) {
294 setValueValue(myInfo.getField());
295 if (getInfoType().isLink()) {
296 setValueLink(myInfo.getLink());
297 }
298 }
299
300
301 return checkForHistory();
302 }
303
304 @Override
305 public void touchUnderlyingItems() {
306
307 super.touchUnderlyingItems();
308
309
310 switch (getInfoClass()) {
311 case AUTOPAYEE:
312 getPayee().touchItem(this);
313 break;
314 case AUTOEXPENSE:
315 getEventCategory().touchItem(this);
316 break;
317 default:
318 break;
319 }
320 }
321
322 @Override
323 public void touchOnUpdate() {
324
325 switch (getInfoClass()) {
326 case AUTOPAYEE:
327 getPayee().touchItem(this);
328 break;
329 default:
330 break;
331 }
332 }
333
334
335
336
337 public static class MoneyWiseCashInfoList
338 extends PrometheusDataInfoList<MoneyWiseCashInfo> {
339
340
341
342 private static final MetisFieldSet<MoneyWiseCashInfoList> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseCashInfoList.class);
343
344
345
346
347
348
349 protected MoneyWiseCashInfoList(final PrometheusDataSet pData) {
350 super(MoneyWiseCashInfo.class, pData, MoneyWiseBasicDataType.CASHINFO, PrometheusListStyle.CORE);
351 }
352
353
354
355
356
357
358 private MoneyWiseCashInfoList(final MoneyWiseCashInfoList pSource) {
359 super(pSource);
360 }
361
362 @Override
363 public MetisFieldSet<MoneyWiseCashInfoList> getDataFieldSet() {
364 return FIELD_DEFS;
365 }
366
367 @Override
368 public String listName() {
369 return LIST_NAME;
370 }
371
372 @Override
373 public MetisFieldSetDef getItemFields() {
374 return MoneyWiseCashInfo.FIELD_DEFS;
375 }
376
377
378
379
380
381
382 protected void setBase(final MoneyWiseCashInfoList pBase) {
383
384 setStyle(PrometheusListStyle.EDIT);
385 super.setBase(pBase);
386 }
387
388 @Override
389 protected MoneyWiseCashInfoList getEmptyList(final PrometheusListStyle pStyle) {
390 final MoneyWiseCashInfoList myList = new MoneyWiseCashInfoList(this);
391 myList.setStyle(pStyle);
392 return myList;
393 }
394
395 @Override
396 public MoneyWiseCashInfo addCopyItem(final PrometheusDataItem pItem) {
397
398 if (!(pItem instanceof MoneyWiseCashInfo)) {
399 throw new UnsupportedOperationException();
400 }
401
402 final MoneyWiseCashInfo myInfo = new MoneyWiseCashInfo(this, (MoneyWiseCashInfo) pItem);
403 add(myInfo);
404 return myInfo;
405 }
406
407 @Override
408 public MoneyWiseCashInfo addNewItem() {
409 throw new UnsupportedOperationException();
410 }
411
412 @Override
413 protected MoneyWiseCashInfo addNewItem(final PrometheusDataItem pOwner,
414 final PrometheusStaticDataItem pInfoType) {
415
416 final MoneyWiseCashInfo myInfo = new MoneyWiseCashInfo(this, pOwner, (MoneyWiseAccountInfoType) pInfoType);
417 add(myInfo);
418
419
420 return myInfo;
421 }
422
423 @Override
424 public void addInfoItem(final Integer pId,
425 final PrometheusDataItem pCash,
426 final PrometheusDataInfoClass pInfoClass,
427 final Object pValue) throws OceanusException {
428
429 if (pValue == null) {
430 return;
431 }
432
433
434 final MoneyWiseAccountInfoTypeList myActInfos
435 = getDataSet().getDataList(MoneyWiseStaticDataType.ACCOUNTINFOTYPE, MoneyWiseAccountInfoTypeList.class);
436
437
438 final MoneyWiseAccountInfoType myInfoType = myActInfos.findItemByClass(pInfoClass);
439 if (myInfoType == null) {
440 throw new MoneyWiseDataException(pCash, ERROR_BADINFOCLASS + " [" + pInfoClass + "]");
441 }
442
443
444 final PrometheusDataValues myValues = new PrometheusDataValues(OBJECT_NAME);
445 myValues.addValue(MetisDataResource.DATA_ID, pId);
446 myValues.addValue(PrometheusDataResource.DATAINFO_TYPE, myInfoType);
447 myValues.addValue(PrometheusDataResource.DATAINFO_OWNER, pCash);
448 myValues.addValue(PrometheusDataResource.DATAINFO_VALUE, pValue);
449
450
451 final MoneyWiseCashInfo myInfo = new MoneyWiseCashInfo(this, myValues);
452
453
454 if (!isIdUnique(pId)) {
455 myInfo.addError(ERROR_DUPLICATE, MetisDataResource.DATA_ID);
456 throw new MoneyWiseDataException(myInfo, ERROR_VALIDATION);
457 }
458
459
460 add(myInfo);
461 }
462
463 @Override
464 public MoneyWiseCashInfo addValuesItem(final PrometheusDataValues pValues) throws OceanusException {
465
466 final MoneyWiseCashInfo myInfo = new MoneyWiseCashInfo(this, pValues);
467
468
469 if (!isIdUnique(myInfo.getIndexedId())) {
470 myInfo.addError(ERROR_DUPLICATE, MetisDataResource.DATA_ID);
471 throw new MoneyWiseDataException(myInfo, ERROR_VALIDATION);
472 }
473
474
475 add(myInfo);
476
477
478 return myInfo;
479 }
480
481
482
483
484
485
486 public void resolveValueLinks() throws OceanusException {
487
488 final Iterator<MoneyWiseCashInfo> myIterator = iterator();
489 while (myIterator.hasNext()) {
490 final MoneyWiseCashInfo myCurr = myIterator.next();
491
492
493 if (myCurr.getInfoType().isLink()) {
494
495 myCurr.resolveLink(null);
496 }
497 }
498 }
499
500 @Override
501 public void postProcessOnLoad() throws OceanusException {
502
503 validateOnLoad();
504
505
506 final PrometheusDataList<?> myCash
507 = getDataSet().getDataList(MoneyWiseBasicDataType.CASH, PrometheusDataList.class);
508 myCash.mapData();
509 myCash.validateOnLoad();
510 }
511 }
512 }