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