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