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.OceanusDate;
20 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusDecimal;
21 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
22 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusPrice;
23 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusRatio;
24 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusUnits;
25 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
26 import io.github.tonywasher.joceanus.metis.report.MetisReportBase;
27 import io.github.tonywasher.joceanus.metis.report.MetisReportHTMLBuilder;
28 import io.github.tonywasher.joceanus.metis.report.MetisReportHTMLBuilder.MetisHTMLTable;
29 import io.github.tonywasher.joceanus.metis.report.MetisReportManager;
30 import io.github.tonywasher.joceanus.metis.report.MetisReportReferenceManager.DelayedTable;
31 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.base.MoneyWiseXAnalysisEvent;
32 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.base.MoneyWiseXAnalysisEventType;
33 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysis;
34 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.buckets.MoneyWiseXAnalysisSecurityBucket;
35 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisSecurityAttr;
36 import io.github.tonywasher.joceanus.moneywise.atlas.data.analysis.values.MoneyWiseXAnalysisSecurityValues;
37 import io.github.tonywasher.joceanus.moneywise.atlas.views.MoneyWiseXAnalysisFilter;
38 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
39 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
40 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransAsset;
41 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransaction;
42 import io.github.tonywasher.joceanus.moneywise.tax.MoneyWiseCashType;
43 import org.w3c.dom.Document;
44 import org.w3c.dom.Element;
45
46 import java.util.List;
47
48
49
50
51 public class MoneyWiseXReportCapitalGains
52 extends MetisReportBase<MoneyWiseXAnalysis, MoneyWiseXAnalysisFilter<?, ?>> {
53
54
55
56 private static final String TEXT_TITLE = MoneyWiseXReportResource.CAPITALGAINS_TITLE.getValue();
57
58
59
60
61 private final MetisReportHTMLBuilder theBuilder;
62
63
64
65
66 private final OceanusDataFormatter theFormatter;
67
68
69
70
71 private final StringBuilder theStringBuilder;
72
73
74
75
76 private MoneyWiseXAnalysisSecurityBucket theSecurity;
77
78
79
80
81 private List<MoneyWiseXAnalysisEvent> theEvents;
82
83
84
85
86 private OceanusDate theEndDate;
87
88
89
90
91 private MetisHTMLTable theTable;
92
93
94
95
96 private MetisHTMLTable theAttrTable;
97
98
99
100
101
102
103 MoneyWiseXReportCapitalGains(final MetisReportManager<MoneyWiseXAnalysisFilter<?, ?>> pManager) {
104
105 theBuilder = pManager.getBuilder();
106 theFormatter = theBuilder.getDataFormatter();
107 theStringBuilder = new StringBuilder();
108 }
109
110
111
112
113
114
115 protected void setSecurity(final MoneyWiseXAnalysisSecurityBucket pSecurity) {
116 theSecurity = pSecurity;
117 }
118
119 @Override
120 public Document createReport(final MoneyWiseXAnalysis pAnalysis) {
121
122
123 theEndDate = pAnalysis.getDateRange().getEnd();
124
125
126 final Element myBody = theBuilder.startReport();
127 theBuilder.makeTitle(myBody, TEXT_TITLE, theFormatter.formatObject(theEndDate));
128 theBuilder.makeSubTitle(myBody, theSecurity.getDecoratedName());
129
130
131 theTable = theBuilder.startTable(myBody);
132 theBuilder.startHdrRow(theTable);
133 theBuilder.makeTitleCell(theTable, MoneyWiseBasicResource.MONEYWISEDATA_FIELD_DATE.getValue());
134 theBuilder.makeTitleCell(theTable, MoneyWiseBasicDataType.TRANSACTION.getItemName());
135
136
137 formatHistory();
138
139
140 return theBuilder.getDocument();
141 }
142
143
144
145
146 private void formatHistory() {
147
148 for (MoneyWiseXAnalysisEvent myEvent : theEvents) {
149
150 if (myEvent.getEventType() != MoneyWiseXAnalysisEventType.TRANSACTION) {
151 continue;
152 }
153
154
155 if (theEndDate != null
156 && theEndDate.compareTo(myEvent.getDate()) < 0) {
157 break;
158 }
159
160
161 final MoneyWiseXAnalysisSecurityValues myValues = theSecurity.getValuesForEvent(myEvent);
162 if (myValues != null) {
163
164 formatTransaction(myEvent, myValues);
165
166
167 if (theAttrTable != null) {
168
169 theBuilder.embedTable(theAttrTable);
170 theAttrTable = null;
171 }
172 }
173 }
174 }
175
176
177
178
179
180
181
182 private void formatTransaction(final MoneyWiseXAnalysisEvent pEvent,
183 final MoneyWiseXAnalysisSecurityValues pValues) {
184
185 final MoneyWiseTransaction myTrans = pEvent.getTransaction();
186 switch (myTrans.getCategoryClass()) {
187 case TRANSFER:
188 case STOCKRIGHTSISSUE:
189 case INHERITED:
190 formatTransfer(pEvent, pValues);
191 break;
192 case SECURITYREPLACE:
193 case STOCKTAKEOVER:
194 formatStockTakeOver(pEvent, pValues);
195 break;
196 case STOCKDEMERGER:
197 formatStockDeMerger(pEvent, pValues);
198 break;
199 case STOCKSPLIT:
200 case UNITSADJUST:
201 formatUnitsAdjust(pEvent, pValues);
202 break;
203 case DIVIDEND:
204 formatDividend(pEvent, pValues);
205 break;
206 case PORTFOLIOXFER:
207 formatPortfolioXfer(pEvent, pValues);
208 break;
209 default:
210 break;
211 }
212 }
213
214
215
216
217
218
219 private void formatBasicTransaction(final MoneyWiseXAnalysisEvent pEvent) {
220
221 final MoneyWiseTransaction myTrans = pEvent.getTransaction();
222 theBuilder.startRow(theTable);
223 theBuilder.makeValueCell(theTable, myTrans.getDate());
224 theBuilder.makeValueCell(theTable, myTrans);
225 }
226
227
228
229
230
231
232
233 private boolean isDebit(final MoneyWiseXAnalysisEvent pEvent) {
234 final MoneyWiseTransaction myTrans = pEvent.getTransaction();
235 final MoneyWiseTransAsset myDebit = myTrans.getDirection().isTo()
236 ? myTrans.getAccount()
237 : myTrans.getPartner();
238 return myDebit.equals(theSecurity.getSecurityHolding());
239 }
240
241
242
243
244
245
246
247 private boolean isCredit(final MoneyWiseXAnalysisEvent pEvent) {
248 final MoneyWiseTransaction myTrans = pEvent.getTransaction();
249 final MoneyWiseTransAsset myCredit = myTrans.getDirection().isFrom()
250 ? myTrans.getAccount()
251 : myTrans.getPartner();
252 return myCredit.equals(theSecurity.getSecurityHolding());
253 }
254
255
256
257
258 private void ensureAttrTable() {
259
260 if (theAttrTable == null) {
261
262 theAttrTable = theBuilder.createEmbeddedTable(theTable);
263 }
264 }
265
266
267
268
269
270
271
272 private void formatValue(final MoneyWiseXAnalysisSecurityAttr pAttr,
273 final Object pValue) {
274
275 ensureAttrTable();
276
277
278 theBuilder.startRow(theAttrTable);
279 theBuilder.makeValueCell(theAttrTable, pAttr);
280 theBuilder.makeStretchedValueCell(theAttrTable, pValue);
281 }
282
283
284
285
286
287
288
289
290
291 private void formatDivision(final MoneyWiseXAnalysisSecurityAttr pAttr,
292 final Object pValue,
293 final OceanusDecimal pNumerator,
294 final OceanusDecimal pDivisor) {
295
296 ensureAttrTable();
297
298
299 theBuilder.startRow(theAttrTable);
300 theBuilder.makeValueCell(theAttrTable, pAttr);
301 theBuilder.makeValueCell(theAttrTable, formatDivision(pNumerator, pDivisor));
302 theBuilder.makeValueCell(theAttrTable, pValue);
303 }
304
305
306
307
308
309
310
311
312 private String formatDivision(final OceanusDecimal pNumerator,
313 final OceanusDecimal pDivisor) {
314 return formatCombination(pNumerator, pDivisor, '/');
315 }
316
317
318
319
320
321
322
323
324
325
326 private void formatValuation(final MoneyWiseXAnalysisSecurityAttr pAttr,
327 final Object pValue,
328 final OceanusUnits pUnits,
329 final OceanusPrice pPrice,
330 final OceanusRatio pXchangeRate) {
331
332 ensureAttrTable();
333
334
335 theBuilder.startRow(theAttrTable);
336 theBuilder.makeValueCell(theAttrTable, pAttr);
337 theBuilder.makeValueCell(theAttrTable, formatValuation(pUnits, pPrice, pXchangeRate));
338 theBuilder.makeValueCell(theAttrTable, pValue);
339 }
340
341
342
343
344
345
346
347
348
349 private String formatValuation(final OceanusUnits pUnits,
350 final OceanusPrice pPrice,
351 final OceanusRatio pXchangeRate) {
352 theStringBuilder.setLength(0);
353 theStringBuilder.append(theFormatter.formatObject(pUnits));
354 theStringBuilder.append('@');
355 theStringBuilder.append(theFormatter.formatObject(pPrice));
356 if (pXchangeRate != null) {
357 theStringBuilder.append('/');
358 theStringBuilder.append(theFormatter.formatObject(pXchangeRate));
359 }
360 return theStringBuilder.toString();
361 }
362
363
364
365
366
367
368
369
370
371 private void formatMultiplication(final MoneyWiseXAnalysisSecurityAttr pAttr,
372 final Object pValue,
373 final OceanusDecimal pFirst,
374 final OceanusDecimal pSecond) {
375
376 ensureAttrTable();
377
378
379 theBuilder.startRow(theAttrTable);
380 theBuilder.makeValueCell(theAttrTable, pAttr);
381 theBuilder.makeValueCell(theAttrTable, formatMultiplication(pFirst, pSecond));
382 theBuilder.makeValueCell(theAttrTable, pValue);
383 }
384
385
386
387
388
389
390
391
392 private String formatMultiplication(final OceanusDecimal pFirst,
393 final OceanusDecimal pSecond) {
394 return formatCombination(pFirst, pSecond, '*');
395 }
396
397
398
399
400
401
402
403
404
405 private void formatAddition(final MoneyWiseXAnalysisSecurityAttr pAttr,
406 final Object pValue,
407 final OceanusDecimal pFirst,
408 final OceanusDecimal pSecond) {
409
410 ensureAttrTable();
411
412
413 theBuilder.startRow(theAttrTable);
414 theBuilder.makeValueCell(theAttrTable, pAttr);
415 theBuilder.makeValueCell(theAttrTable, formatAddition(pFirst, pSecond));
416 theBuilder.makeValueCell(theAttrTable, pValue);
417 }
418
419
420
421
422
423
424
425
426 private String formatAddition(final OceanusDecimal pFirst,
427 final OceanusDecimal pSecond) {
428 return formatCombination(pFirst, pSecond, '+');
429 }
430
431
432
433
434
435
436
437
438
439 private void formatSubtraction(final MoneyWiseXAnalysisSecurityAttr pAttr,
440 final Object pValue,
441 final OceanusDecimal pFirst,
442 final OceanusDecimal pSecond) {
443
444 ensureAttrTable();
445
446
447 theBuilder.startRow(theAttrTable);
448 theBuilder.makeValueCell(theAttrTable, pAttr);
449 theBuilder.makeValueCell(theAttrTable, formatSubtraction(pFirst, pSecond));
450 theBuilder.makeValueCell(theAttrTable, pValue);
451 }
452
453
454
455
456
457
458
459
460 private String formatSubtraction(final OceanusDecimal pFirst,
461 final OceanusDecimal pSecond) {
462 return formatCombination(pFirst, pSecond, '-');
463 }
464
465
466
467
468
469
470
471
472
473 private String formatCombination(final OceanusDecimal pFirst,
474 final OceanusDecimal pSecond,
475 final char pSymbol) {
476 theStringBuilder.setLength(0);
477 theStringBuilder.append(theFormatter.formatObject(pFirst));
478 theStringBuilder.append(pSymbol);
479 theStringBuilder.append(theFormatter.formatObject(pSecond));
480 return theStringBuilder.toString();
481 }
482
483
484
485
486
487
488
489 private void formatTransfer(final MoneyWiseXAnalysisEvent pEvent,
490 final MoneyWiseXAnalysisSecurityValues pValues) {
491
492 formatBasicTransaction(pEvent);
493
494
495 if (isDebit(pEvent)) {
496 formatTransferOut(pEvent, pValues);
497 } else {
498 formatTransferIn(pEvent, pValues);
499 }
500 }
501
502
503
504
505
506
507
508 private void formatDividend(final MoneyWiseXAnalysisEvent pEvent,
509 final MoneyWiseXAnalysisSecurityValues pValues) {
510
511 if (isCredit(pEvent)) {
512
513 formatBasicTransaction(pEvent);
514
515
516 formatTransferIn(pEvent, pValues);
517 }
518 }
519
520
521
522
523
524
525
526 private void formatTransferIn(final MoneyWiseXAnalysisEvent pEvent,
527 final MoneyWiseXAnalysisSecurityValues pValues) {
528
529
530 final MoneyWiseTransaction myTrans = pEvent.getTransaction();
531 final OceanusUnits myUnits = pValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
532 OceanusUnits myDeltaUnits = myTrans.getAccountDeltaUnits();
533 if (myDeltaUnits == null) {
534 myDeltaUnits = myTrans.getPartnerDeltaUnits();
535 }
536 final OceanusMoney myCost = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
537 final OceanusMoney myAmount = theSecurity.getMoneyDeltaForEvent(pEvent, MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
538 final OceanusPrice myPrice = pValues.getPriceValue(MoneyWiseXAnalysisSecurityAttr.PRICE);
539 final OceanusRatio myXchangeRate = pValues.getRatioValue(MoneyWiseXAnalysisSecurityAttr.EXCHANGERATE);
540
541
542 final MoneyWiseXAnalysisSecurityValues myPreviousValues = theSecurity.getPreviousValuesForEvent(pEvent);
543 final OceanusUnits myOriginalUnits = myPreviousValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
544 final OceanusMoney myOriginalCost = myPreviousValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
545
546
547
548
549
550
551
552
553
554 if (myDeltaUnits != null) {
555 formatAddition(MoneyWiseXAnalysisSecurityAttr.UNITS, myUnits, myOriginalUnits, myDeltaUnits);
556 }
557 formatAddition(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST, myCost, myOriginalCost, myAmount);
558 }
559
560
561
562
563
564
565
566 private void formatTransferOut(final MoneyWiseXAnalysisEvent pEvent,
567 final MoneyWiseXAnalysisSecurityValues pValues) {
568
569 final OceanusMoney myGain = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.CAPITALGAIN);
570 final OceanusMoney myAllowedCost = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.ALLOWEDCOST);
571 final OceanusRatio myCostDilution = pValues.getRatioValue(MoneyWiseXAnalysisSecurityAttr.COSTDILUTION);
572 final OceanusMoney myTotalGains = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.REALISEDGAINS);
573 final OceanusMoney myCost = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
574 final OceanusUnits myUnits = pValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
575 final OceanusMoney myCash = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RETURNEDCASH);
576 final OceanusMoney myConsideration = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.CONSIDERATION);
577 final MoneyWiseCashType myCashType = pValues.getEnumValue(MoneyWiseXAnalysisSecurityAttr.CASHTYPE, MoneyWiseCashType.class);
578
579
580 final MoneyWiseXAnalysisSecurityValues myPreviousValues = theSecurity.getPreviousValuesForEvent(pEvent);
581 final OceanusMoney myOriginalCost = myPreviousValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
582 final OceanusUnits myOriginalUnits = myPreviousValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
583
584
585 OceanusUnits myDeltaUnits = theSecurity.getUnitsDeltaForEvent(pEvent, MoneyWiseXAnalysisSecurityAttr.UNITS);
586 final OceanusMoney myAmount = new OceanusMoney(myCash);
587 myAmount.negate();
588
589
590 formatValue(MoneyWiseXAnalysisSecurityAttr.RETURNEDCASH, myCash);
591 if (myCashType != null) {
592 formatValue(MoneyWiseXAnalysisSecurityAttr.CASHTYPE, myCashType);
593 }
594
595
596 if (myDeltaUnits.isNonZero()) {
597
598 myDeltaUnits = new OceanusUnits(myDeltaUnits);
599 myDeltaUnits.negate();
600
601
602 formatSubtraction(MoneyWiseXAnalysisSecurityAttr.UNITS, myUnits, myOriginalUnits, myDeltaUnits);
603
604
605 formatDivision(MoneyWiseXAnalysisSecurityAttr.COSTDILUTION, myCostDilution, myUnits, myOriginalUnits);
606
607
608 } else if (myConsideration != null) {
609
610 final OceanusMoney myValuation = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.VALUATION);
611 final OceanusPrice myPrice = pValues.getPriceValue(MoneyWiseXAnalysisSecurityAttr.PRICE);
612 final OceanusRatio myXchangeRate = pValues.getRatioValue(MoneyWiseXAnalysisSecurityAttr.EXCHANGERATE);
613 formatValuation(MoneyWiseXAnalysisSecurityAttr.VALUATION, myValuation, myUnits, myPrice, myXchangeRate);
614 formatAddition(MoneyWiseXAnalysisSecurityAttr.CONSIDERATION, myConsideration, myCash, myValuation);
615
616
617 formatDivision(MoneyWiseXAnalysisSecurityAttr.COSTDILUTION, myCostDilution, myValuation, myConsideration);
618 }
619
620
621 if (myCostDilution != null) {
622 formatMultiplication(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST, myCost, myOriginalCost, myCostDilution);
623 formatSubtraction(MoneyWiseXAnalysisSecurityAttr.ALLOWEDCOST, myAllowedCost, myOriginalCost, myCost);
624 } else {
625 formatValue(MoneyWiseXAnalysisSecurityAttr.ALLOWEDCOST, myAllowedCost);
626 formatSubtraction(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST, myCost, myOriginalCost, myAllowedCost);
627 }
628
629
630 if (myGain != null) {
631 formatSubtraction(MoneyWiseXAnalysisSecurityAttr.CAPITALGAIN, myGain, myCash, myAllowedCost);
632 formatValue(MoneyWiseXAnalysisSecurityAttr.REALISEDGAINS, myTotalGains);
633 }
634 }
635
636
637
638
639
640
641
642 private void formatUnitsAdjust(final MoneyWiseXAnalysisEvent pEvent,
643 final MoneyWiseXAnalysisSecurityValues pValues) {
644
645 final MoneyWiseTransaction myTrans = pEvent.getTransaction();
646 formatBasicTransaction(pEvent);
647
648
649 final OceanusUnits myUnits = pValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
650 OceanusUnits myDeltaUnits = myTrans.getAccountDeltaUnits();
651
652
653 final MoneyWiseXAnalysisSecurityValues myPreviousValues = theSecurity.getPreviousValuesForEvent(pEvent);
654 final OceanusUnits myOriginalUnits = myPreviousValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
655
656
657 if (myDeltaUnits.isPositive()) {
658 formatAddition(MoneyWiseXAnalysisSecurityAttr.UNITS, myUnits, myOriginalUnits, myDeltaUnits);
659 } else {
660 myDeltaUnits = new OceanusUnits(myDeltaUnits);
661 myDeltaUnits.negate();
662 formatSubtraction(MoneyWiseXAnalysisSecurityAttr.UNITS, myUnits, myOriginalUnits, myDeltaUnits);
663 }
664 }
665
666
667
668
669
670
671
672 private void formatStockDeMerger(final MoneyWiseXAnalysisEvent pEvent,
673 final MoneyWiseXAnalysisSecurityValues pValues) {
674
675 formatBasicTransaction(pEvent);
676
677
678 if (isDebit(pEvent)) {
679 formatDebitStockDeMerger(pEvent, pValues);
680 } else {
681 formatCreditStockDeMerger(pEvent, pValues);
682 }
683 }
684
685
686
687
688
689
690
691 private void formatDebitStockDeMerger(final MoneyWiseXAnalysisEvent pEvent,
692 final MoneyWiseXAnalysisSecurityValues pValues) {
693
694 final OceanusRatio myCostDilution = pValues.getRatioValue(MoneyWiseXAnalysisSecurityAttr.COSTDILUTION);
695 final OceanusMoney myResidualCost = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
696 final OceanusMoney myXferredCost = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST);
697 OceanusUnits myDeltaUnits = theSecurity.getUnitsDeltaForEvent(pEvent, MoneyWiseXAnalysisSecurityAttr.UNITS);
698
699
700 final boolean isDeltaUnits = myDeltaUnits.isNonZero();
701
702
703 final MoneyWiseXAnalysisSecurityValues myPreviousValues = theSecurity.getPreviousValuesForEvent(pEvent);
704 final OceanusMoney myOriginalCost = myPreviousValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
705
706
707 if (isDeltaUnits) {
708
709 final OceanusUnits myOriginalUnits = myPreviousValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
710 final OceanusUnits myUnits = pValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
711 myDeltaUnits = new OceanusUnits(myDeltaUnits);
712 myDeltaUnits.negate();
713
714
715 formatSubtraction(MoneyWiseXAnalysisSecurityAttr.UNITS, myUnits, myOriginalUnits, myDeltaUnits);
716 formatDivision(MoneyWiseXAnalysisSecurityAttr.COSTDILUTION, myCostDilution, myUnits, myOriginalUnits);
717
718
719 } else {
720 formatValue(MoneyWiseXAnalysisSecurityAttr.COSTDILUTION, myCostDilution);
721 }
722
723
724 formatMultiplication(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST, myResidualCost, myOriginalCost, myCostDilution);
725 formatSubtraction(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST, myXferredCost, myOriginalCost, myResidualCost);
726 }
727
728
729
730
731
732
733
734 private void formatCreditStockDeMerger(final MoneyWiseXAnalysisEvent pEvent,
735 final MoneyWiseXAnalysisSecurityValues pValues) {
736
737 final OceanusMoney myResidualCost = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
738 final OceanusMoney myXferredCost = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST);
739 final OceanusMoney myValueXfer = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.XFERREDVALUE);
740 final OceanusUnits myUnits = theSecurity.getUnitsDeltaForEvent(pEvent, MoneyWiseXAnalysisSecurityAttr.UNITS);
741 final OceanusPrice myPrice = pValues.getPriceValue(MoneyWiseXAnalysisSecurityAttr.PRICE);
742 final OceanusRatio myXchangeRate = pValues.getRatioValue(MoneyWiseXAnalysisSecurityAttr.EXCHANGERATE);
743
744
745 formatValuation(MoneyWiseXAnalysisSecurityAttr.XFERREDVALUE, myValueXfer, myUnits, myPrice, myXchangeRate);
746 formatValue(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST, myXferredCost);
747 formatValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST, myResidualCost);
748 }
749
750
751
752
753
754
755
756 private void formatStockTakeOver(final MoneyWiseXAnalysisEvent pEvent,
757 final MoneyWiseXAnalysisSecurityValues pValues) {
758
759 formatBasicTransaction(pEvent);
760
761
762 final OceanusMoney myCash = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RETURNEDCASH);
763 if (myCash != null) {
764 formatStockAndCashTakeOver(pEvent, pValues, myCash);
765
766
767 } else if (isDebit(pEvent)) {
768
769 final OceanusMoney myCostXfer = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST);
770 formatValue(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST, myCostXfer);
771 } else {
772 formatCreditStockTakeOver(pEvent, pValues);
773 }
774 }
775
776
777
778
779
780
781
782
783 private void formatStockAndCashTakeOver(final MoneyWiseXAnalysisEvent pEvent,
784 final MoneyWiseXAnalysisSecurityValues pValues,
785 final OceanusMoney pCash) {
786
787 if (isDebit(pEvent)) {
788 formatDebitStockAndCashTakeOver(pEvent, pValues, pCash);
789 } else {
790 formatCreditStockTakeOver(pEvent, pValues);
791 }
792 }
793
794
795
796
797
798
799
800
801 private void formatDebitStockAndCashTakeOver(final MoneyWiseXAnalysisEvent pEvent,
802 final MoneyWiseXAnalysisSecurityValues pValues,
803 final OceanusMoney pCash) {
804
805 final OceanusMoney myStock = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.XFERREDVALUE);
806 final OceanusMoney myConsideration = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.CONSIDERATION);
807 final OceanusMoney myCostXfer = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST);
808 final OceanusRatio myCostDilution = pValues.getRatioValue(MoneyWiseXAnalysisSecurityAttr.COSTDILUTION);
809 final OceanusMoney myAllowedCost = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.ALLOWEDCOST);
810 final OceanusMoney myGain = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.CAPITALGAIN);
811 final OceanusMoney myTotalGains = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.REALISEDGAINS);
812 final MoneyWiseCashType myCashType = pValues.getEnumValue(MoneyWiseXAnalysisSecurityAttr.CASHTYPE, MoneyWiseCashType.class);
813
814
815 formatValue(MoneyWiseXAnalysisSecurityAttr.RETURNEDCASH, pCash);
816 formatValue(MoneyWiseXAnalysisSecurityAttr.CASHTYPE, myCashType);
817 formatValue(MoneyWiseXAnalysisSecurityAttr.XFERREDVALUE, myStock);
818 formatAddition(MoneyWiseXAnalysisSecurityAttr.CONSIDERATION, myConsideration, pCash, myStock);
819
820
821 final MoneyWiseXAnalysisSecurityValues myPreviousValues = theSecurity.getPreviousValuesForEvent(pEvent);
822 final OceanusMoney myOriginalCost = myPreviousValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
823
824
825 if (myCostDilution != null) {
826 formatDivision(MoneyWiseXAnalysisSecurityAttr.COSTDILUTION, myCostDilution, pCash, myConsideration);
827 formatMultiplication(MoneyWiseXAnalysisSecurityAttr.ALLOWEDCOST, myAllowedCost, myOriginalCost, myCostDilution);
828 } else {
829 formatValue(MoneyWiseXAnalysisSecurityAttr.ALLOWEDCOST, myAllowedCost);
830 }
831 formatSubtraction(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST, myCostXfer, myOriginalCost, myAllowedCost);
832
833
834 if (myGain != null) {
835 formatSubtraction(MoneyWiseXAnalysisSecurityAttr.CAPITALGAIN, myGain, pCash, myAllowedCost);
836 formatValue(MoneyWiseXAnalysisSecurityAttr.REALISEDGAINS, myTotalGains);
837 }
838 }
839
840
841
842
843
844
845
846 private void formatCreditStockTakeOver(final MoneyWiseXAnalysisEvent pEvent,
847 final MoneyWiseXAnalysisSecurityValues pValues) {
848
849 final OceanusPrice myPrice = pValues.getPriceValue(MoneyWiseXAnalysisSecurityAttr.PRICE);
850 final OceanusUnits myUnits = theSecurity.getUnitsDeltaForEvent(pEvent, MoneyWiseXAnalysisSecurityAttr.UNITS);
851 final OceanusMoney myValueXfer = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.XFERREDVALUE);
852 final OceanusMoney myCostXfer = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST);
853 final OceanusMoney myResidualCost = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
854 final OceanusRatio myXchangeRate = pValues.getRatioValue(MoneyWiseXAnalysisSecurityAttr.EXCHANGERATE);
855
856
857 final MoneyWiseXAnalysisSecurityValues myPreviousValues = theSecurity.getPreviousValuesForEvent(pEvent);
858 final OceanusUnits myNewUnits = pValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
859 final OceanusUnits myOriginalUnits = myPreviousValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
860 formatAddition(MoneyWiseXAnalysisSecurityAttr.UNITS, myNewUnits, myOriginalUnits, myUnits);
861
862
863 formatValuation(MoneyWiseXAnalysisSecurityAttr.XFERREDVALUE, myValueXfer, myUnits, myPrice, myXchangeRate);
864 formatValue(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST, myCostXfer);
865 formatValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST, myResidualCost);
866 }
867
868
869
870
871
872
873
874 private void formatPortfolioXfer(final MoneyWiseXAnalysisEvent pEvent,
875 final MoneyWiseXAnalysisSecurityValues pValues) {
876
877 formatBasicTransaction(pEvent);
878
879
880 final OceanusMoney myCostXfer = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST);
881 formatValue(MoneyWiseXAnalysisSecurityAttr.XFERREDCOST, myCostXfer);
882
883 final OceanusUnits myUnits = theSecurity.getUnitsDeltaForEvent(pEvent, MoneyWiseXAnalysisSecurityAttr.UNITS);
884 if (myUnits.isPositive()) {
885
886 final MoneyWiseXAnalysisSecurityValues myPreviousValues = theSecurity.getPreviousValuesForEvent(pEvent);
887 final OceanusUnits myNewUnits = pValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
888 final OceanusUnits myOriginalUnits = myPreviousValues.getUnitsValue(MoneyWiseXAnalysisSecurityAttr.UNITS);
889 formatAddition(MoneyWiseXAnalysisSecurityAttr.UNITS, myNewUnits, myOriginalUnits, myUnits);
890 final OceanusMoney myCost = pValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
891 final OceanusMoney myOriginalCost = myPreviousValues.getMoneyValue(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST);
892 formatAddition(MoneyWiseXAnalysisSecurityAttr.RESIDUALCOST, myCost, myOriginalCost, myCostXfer);
893 }
894 }
895
896 @Override
897 public MoneyWiseXAnalysisFilter<?, ?> processFilter(final Object pSource) {
898 return null;
899 }
900
901 @Override
902 public MetisHTMLTable createDelayedTable(final DelayedTable pTable) {
903 return null;
904 }
905 }