1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.views;
18
19 import io.github.tonywasher.joceanus.metis.data.MetisDataEditState;
20 import io.github.tonywasher.joceanus.metis.data.MetisDataState;
21 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
22 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
23 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
24 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataSet;
25 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePortfolio;
26 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurity;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurityPrice;
28 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysis;
29 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisManager;
30 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisPortfolioBucket;
31 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisPortfolioBucket.MoneyWiseAnalysisPortfolioBucketList;
32 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisSecurityBucket;
33 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysisSecurityBucket.MoneyWiseAnalysisSecurityBucketList;
34 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
35 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusPrice;
36 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
37 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataValues;
38 import io.github.tonywasher.joceanus.prometheus.data.PrometheusEncryptedValues;
39 import io.github.tonywasher.joceanus.prometheus.data.PrometheusListStyle;
40
41 import java.util.Iterator;
42 import java.util.ListIterator;
43
44
45
46
47
48
49 public final class MoneyWiseSpotSecurityPrice
50 extends MoneyWiseSecurityPrice {
51
52
53
54 public static final String OBJECT_NAME = MoneyWiseSpotSecurityPrice.class.getSimpleName();
55
56
57
58
59 public static final String LIST_NAME = OBJECT_NAME + "s";
60
61
62
63
64 @SuppressWarnings("rawtypes")
65 private static final MetisFieldSet<MoneyWiseSpotSecurityPrice> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseSpotSecurityPrice.class);
66
67
68
69
70 static {
71 FIELD_DEFS.declareLocalField(MoneyWiseViewResource.SPOTEVENT_PREVDATE, MoneyWiseSpotSecurityPrice::getPrevDate);
72 FIELD_DEFS.declareLocalField(MoneyWiseViewResource.SPOTPRICE_PREVPRICE, MoneyWiseSpotSecurityPrice::getPrevPrice);
73 }
74
75
76
77
78 private OceanusDate thePrevDate;
79
80
81
82
83 private OceanusPrice thePrevPrice;
84
85
86
87
88 private boolean isDisabled;
89
90
91
92
93
94
95
96 private MoneyWiseSpotSecurityPrice(final MoneyWiseSpotSecurityList pList,
97 final MoneyWiseSecurity pSecurity) {
98 super(pList);
99
100
101 setSecurity(pSecurity);
102 }
103
104 @Override
105 public MetisFieldSetDef getDataFieldSet() {
106 return FIELD_DEFS;
107 }
108
109
110
111
112
113
114 public OceanusPrice getPrevPrice() {
115 return thePrevPrice;
116 }
117
118
119
120
121
122
123 protected void setPrevPrice(final OceanusPrice pPrice) {
124 thePrevPrice = pPrice;
125 }
126
127
128
129
130
131
132 public OceanusDate getPrevDate() {
133 return thePrevDate;
134 }
135
136
137
138
139
140
141 protected void setPrevDate(final OceanusDate pDate) {
142 thePrevDate = pDate;
143 }
144
145 @Override
146 public boolean isDisabled() {
147 return isDisabled;
148 }
149
150
151
152
153
154
155 protected void setDisabled(final boolean pDisabled) {
156 isDisabled = pDisabled;
157 }
158
159
160
161
162 @Override
163 public void validate() {
164 setValidEdit();
165 }
166
167
168 @Override
169 public boolean isLocked() {
170 return isDeleted();
171 }
172
173
174
175
176 @Override
177 public void setValidEdit() {
178 setEditState(hasHistory()
179 ? MetisDataEditState.VALID
180 : MetisDataEditState.CLEAN);
181 }
182
183 @Override
184 public OceanusPrice getPrice() {
185
186 switch (getState()) {
187 case NEW:
188 case CHANGED:
189 case RECOVERED:
190 case CLEAN:
191 return super.getPrice();
192 default:
193 return null;
194 }
195 }
196
197 @Override
198 public MetisDataState getState() {
199 final PrometheusEncryptedValues myCurr = getValues();
200 final PrometheusEncryptedValues myBase = getOriginalValues();
201
202
203 if (myCurr.getVersion() == 0) {
204 return MetisDataState.CLEAN;
205 }
206
207
208 if (myBase.getValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE) == null) {
209
210 return myCurr.getValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE) == null
211 ? MetisDataState.DELNEW
212 : MetisDataState.NEW;
213 }
214
215
216 return myCurr.getValue(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_PRICE) == null
217 ? MetisDataState.DELETED
218 : MetisDataState.CHANGED;
219 }
220
221
222
223
224 public static class MoneyWiseSpotSecurityList
225 extends MoneyWiseSecurityPriceBaseList<MoneyWiseSpotSecurityPrice> {
226
227
228
229 @SuppressWarnings("rawtypes")
230 private static final MetisFieldSet<MoneyWiseSpotSecurityList> FIELD_DEFS = MetisFieldSet.newFieldSet(MoneyWiseSpotSecurityList.class);
231
232
233
234
235 static {
236 FIELD_DEFS.declareLocalField(MoneyWiseBasicDataType.PORTFOLIO, MoneyWiseSpotSecurityList::getPortfolio);
237 FIELD_DEFS.declareLocalField(MoneyWiseBasicResource.MONEYWISEDATA_FIELD_DATE, MoneyWiseSpotSecurityList::getDate);
238 FIELD_DEFS.declareLocalField(MoneyWiseViewResource.SPOTEVENT_NEXTDATE, MoneyWiseSpotSecurityList::getNext);
239 FIELD_DEFS.declareLocalField(MoneyWiseViewResource.SPOTEVENT_PREVDATE, MoneyWiseSpotSecurityList::getPrev);
240 }
241
242
243
244
245 private final OceanusDate theDate;
246
247
248
249
250 private final MoneyWiseView theView;
251
252
253
254
255 private final MoneyWisePortfolio thePortfolio;
256
257
258
259
260 private OceanusDate theNext;
261
262
263
264
265 private OceanusDate thePrev;
266
267
268
269
270
271
272
273
274 public MoneyWiseSpotSecurityList(final MoneyWiseView pView,
275 final MoneyWisePortfolio pPortfolio,
276 final OceanusDate pDate) {
277
278 super(pView.getData(), MoneyWiseSpotSecurityPrice.class, MoneyWiseBasicDataType.SECURITYPRICE);
279 setStyle(PrometheusListStyle.EDIT);
280 ensureMap();
281
282
283 theDate = pDate;
284 theView = pView;
285 thePortfolio = pPortfolio;
286
287
288 final MoneyWiseAnalysisManager myManager = theView.getAnalysisManager();
289 final MoneyWiseAnalysis myAnalysis = myManager.getAnalysis();
290 final MoneyWiseAnalysisPortfolioBucketList myPortfolios = myAnalysis.getPortfolios();
291 final MoneyWiseAnalysisPortfolioBucket myBucket = myPortfolios.findItemById(thePortfolio.getIndexedId());
292 if (myBucket == null) {
293 return;
294 }
295 final MoneyWiseAnalysisSecurityBucketList mySecurities = myBucket.getSecurities();
296
297
298 final OceanusDate myDate = new OceanusDate(theDate);
299 final Iterator<MoneyWiseAnalysisSecurityBucket> mySecIterator = mySecurities.iterator();
300 while (mySecIterator.hasNext()) {
301 final MoneyWiseAnalysisSecurityBucket mySecBucket = mySecIterator.next();
302 final MoneyWiseSecurity mySecurity = mySecBucket.getSecurity();
303
304
305 if (mySecurity.getCategoryClass().isOption()) {
306 continue;
307 }
308
309
310 final MoneyWiseSpotSecurityPrice mySpot = new MoneyWiseSpotSecurityPrice(this, mySecurity);
311 mySpot.setIndexedId(mySecurity.getIndexedId());
312 mySpot.setDate(myDate);
313 mySpot.setDisabled(!mySecBucket.isActive());
314 add(mySpot);
315 }
316
317
318 final MoneyWiseDataSet myData = theView.getData();
319 final MoneyWiseSecurityPriceList myPrices = myData.getSecurityPrices();
320 setBase(myPrices);
321
322
323 final ListIterator<MoneyWiseSecurityPrice> myIterator = myPrices.listIterator(myPrices.size());
324 while (myIterator.hasPrevious()) {
325 final MoneyWiseSecurityPrice myPrice = myIterator.previous();
326
327
328 final MoneyWiseSecurity mySecurity = myPrice.getSecurity();
329 final MoneyWiseSpotSecurityPrice mySpot = findItemById(mySecurity.getIndexedId());
330 if (mySpot == null || myPrice.isDeleted()) {
331 continue;
332 }
333
334
335 final int iDiff = theDate.compareTo(myPrice.getDate());
336
337
338 if (iDiff < 0) {
339
340 theNext = myPrice.getDate();
341 break;
342 }
343
344
345 if (iDiff == 0) {
346
347 mySpot.setValuePrice(myPrice.getPriceField());
348
349
350 mySpot.setBase(myPrice);
351
352
353 } else {
354
355 mySpot.setPrevDate(myPrice.getDate());
356 mySpot.setPrevPrice(myPrice.getPrice());
357
358
359 thePrev = myPrice.getDate();
360 }
361 }
362 }
363
364 @SuppressWarnings("rawtypes")
365 @Override
366 public MetisFieldSet<MoneyWiseSpotSecurityList> getDataFieldSet() {
367 return FIELD_DEFS;
368 }
369
370 @Override
371 public String listName() {
372 return MoneyWiseSpotSecurityList.class.getSimpleName();
373 }
374
375 @Override
376 public MetisFieldSetDef getItemFields() {
377 return MoneyWiseSpotSecurityPrice.FIELD_DEFS;
378 }
379
380 @Override
381 protected MoneyWiseSpotSecurityList getEmptyList(final PrometheusListStyle pStyle) {
382 throw new UnsupportedOperationException();
383 }
384
385 @Override
386 public MoneyWiseDataSet getDataSet() {
387 return (MoneyWiseDataSet) super.getDataSet();
388 }
389
390
391
392
393
394
395 private MoneyWisePortfolio getPortfolio() {
396 return thePortfolio;
397 }
398
399
400
401
402
403
404 private OceanusDate getDate() {
405 return theDate;
406 }
407
408
409
410
411
412
413 public OceanusDate getNext() {
414 return theNext;
415 }
416
417
418
419
420
421
422 public OceanusDate getPrev() {
423 return thePrev;
424 }
425
426
427 @Override
428 public boolean isLocked() {
429 return false;
430 }
431
432
433 @Override
434 public MoneyWiseSpotSecurityPrice addCopyItem(final PrometheusDataItem pElement) {
435 throw new UnsupportedOperationException();
436 }
437
438 @Override
439 public MoneyWiseSpotSecurityPrice addNewItem() {
440 throw new UnsupportedOperationException();
441 }
442
443 @Override
444 public MoneyWiseSpotSecurityPrice addValuesItem(final PrometheusDataValues pValues) {
445 throw new UnsupportedOperationException();
446 }
447 }
448 }