1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.moneywise.quicken.file;
18
19 import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
20 import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
21 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseCash;
22 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataSet;
23 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDeposit;
24 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee;
25 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee.MoneyWisePayeeList;
26 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePortfolio;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurityHolding;
28 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransAsset;
29 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory;
30 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory.MoneyWiseTransCategoryList;
31 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransTag;
32 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransaction;
33 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePayeeClass;
34 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryClass;
35 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransInfoClass;
36 import io.github.tonywasher.joceanus.moneywise.lethe.data.analysis.data.MoneyWiseAnalysis;
37 import io.github.tonywasher.joceanus.moneywise.quicken.definitions.MoneyWiseQIFType;
38
39 import java.util.ArrayList;
40 import java.util.Iterator;
41 import java.util.List;
42 import java.util.Objects;
43
44
45
46
47 public class MoneyWiseQIFBuilder {
48
49
50
51 private static final String QIF_XFER = "Transfer";
52
53
54
55
56 private static final String QIF_XFERFROM = " from ";
57
58
59
60
61 private static final String QIF_XFERTO = " to ";
62
63
64
65
66 private final MoneyWiseQIFFile theFile;
67
68
69
70
71 private final MoneyWiseQIFType theFileType;
72
73
74
75
76 private final MoneyWiseQIFPortfolioBuilder thePortBuilder;
77
78
79
80
81 private final MoneyWisePayee theTaxMan;
82
83
84
85
86 private final MoneyWiseTransCategory theTaxCategory;
87
88
89
90
91 private final MoneyWiseTransCategory theNatInsCategory;
92
93
94
95
96 private final MoneyWiseTransCategory theBenefitCategory;
97
98
99
100
101 private final MoneyWiseTransCategory theWithheldCategory;
102
103
104
105
106 private final MoneyWiseTransCategory theOpeningCategory;
107
108
109
110
111
112
113
114
115 protected MoneyWiseQIFBuilder(final MoneyWiseQIFFile pFile,
116 final MoneyWiseDataSet pData,
117 final MoneyWiseAnalysis pAnalysis) {
118
119 theFile = pFile;
120 theFileType = pFile.getFileType();
121
122
123 thePortBuilder = new MoneyWiseQIFPortfolioBuilder(this, pData, pAnalysis);
124
125
126 final MoneyWisePayeeList myPayees = pData.getPayees();
127 theTaxMan = myPayees.getSingularClass(MoneyWisePayeeClass.TAXMAN);
128
129
130 final MoneyWiseTransCategoryList myCategories = pData.getTransCategories();
131 theTaxCategory = myCategories.getEventInfoCategory(MoneyWiseTransInfoClass.TAXCREDIT);
132 theNatInsCategory = myCategories.getEventInfoCategory(MoneyWiseTransInfoClass.EMPLOYEENATINS);
133 theBenefitCategory = myCategories.getEventInfoCategory(MoneyWiseTransInfoClass.DEEMEDBENEFIT);
134 theWithheldCategory = myCategories.getEventInfoCategory(MoneyWiseTransInfoClass.WITHHELD);
135 theOpeningCategory = myCategories.getSingularClass(MoneyWiseTransCategoryClass.OPENINGBALANCE);
136 }
137
138
139
140
141
142
143 protected MoneyWiseQIFFile getFile() {
144 return theFile;
145 }
146
147
148
149
150
151
152 protected MoneyWiseQIFEventCategory getTaxCategory() {
153 return theFile.registerCategory(theTaxCategory);
154 }
155
156
157
158
159
160
161 protected MoneyWiseQIFPayee getTaxMan() {
162 return theFile.registerPayee(theTaxMan);
163 }
164
165
166
167
168
169
170 protected void processEvent(final MoneyWiseTransaction pTrans) {
171
172 final MoneyWiseTransAsset myAccount = pTrans.getAccount();
173 final MoneyWiseTransAsset myPartner = pTrans.getPartner();
174 final boolean bFrom = pTrans.getDirection().isFrom();
175
176
177 if (myPartner instanceof MoneyWisePayee myPayee) {
178
179 if (bFrom) {
180
181 processDebitPayee(myPayee, myAccount, pTrans);
182 } else {
183
184 processCreditPayee(myPayee, myAccount, pTrans);
185 }
186
187 } else if (bFrom) {
188
189 processTransfer(myPartner, myAccount, pTrans);
190 } else {
191
192 processTransfer(myAccount, myPartner, pTrans);
193 }
194 }
195
196
197
198
199
200
201
202
203 protected void processBalance(final MoneyWiseDeposit pDeposit,
204 final OceanusDate pStartDate,
205 final OceanusMoney pBalance) {
206
207 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pDeposit);
208
209
210 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pStartDate);
211 myEvent.recordAmount(pBalance);
212
213
214 if (theFileType.selfOpeningBalance()) {
215
216 myEvent.recordAccount(myAccount.getAccount());
217
218
219 } else {
220
221 final MoneyWiseQIFEventCategory myCategory = theFile.registerCategory(theOpeningCategory);
222 myEvent.recordCategory(myCategory);
223 }
224
225
226 myAccount.addEvent(myEvent);
227 }
228
229
230
231
232
233
234
235
236 protected void processDebitPayee(final MoneyWisePayee pPayee,
237 final MoneyWiseTransAsset pCredit,
238 final MoneyWiseTransaction pTrans) {
239
240 if (pCredit instanceof MoneyWiseCash myCash
241 && myCash.isAutoExpense()) {
242
243 processCashRecovery(pPayee, myCash, pTrans);
244
245
246 } else if (pCredit instanceof MoneyWiseSecurityHolding myHolding) {
247
248 thePortBuilder.processIncomeToSecurity(pPayee, myHolding, pTrans);
249
250
251 } else if (pCredit instanceof MoneyWisePortfolio myPortfolio) {
252
253 thePortBuilder.processIncomeToPortfolio(pPayee, myPortfolio, pTrans);
254
255
256 } else if (hasXtraDetail(pTrans)) {
257
258 processDetailedIncome(pPayee, pCredit, pTrans);
259
260 } else {
261
262 processStandardIncome(pPayee, pCredit, pTrans);
263 }
264 }
265
266
267
268
269
270
271
272
273 protected void processCreditPayee(final MoneyWisePayee pPayee,
274 final MoneyWiseTransAsset pDebit,
275 final MoneyWiseTransaction pTrans) {
276
277 if (pDebit instanceof MoneyWiseCash myCash
278 && myCash.isAutoExpense()) {
279
280 processCashPayment(pPayee, myCash, pTrans);
281
282
283 } else if (pDebit instanceof MoneyWiseSecurityHolding myHolding) {
284
285 thePortBuilder.processExpenseFromSecurity(pPayee, myHolding, pTrans);
286
287
288 } else if (pDebit instanceof MoneyWisePortfolio myPortfolio) {
289
290 thePortBuilder.processExpenseFromPortfolio(pPayee, myPortfolio, pTrans);
291
292
293 } else if (hasXtraDetail(pTrans)) {
294
295 processDetailedExpense(pPayee, pDebit, pTrans);
296
297 } else {
298
299 processStandardExpense(pPayee, pDebit, pTrans);
300 }
301 }
302
303
304
305
306
307
308
309
310 protected void processTransfer(final MoneyWiseTransAsset pDebit,
311 final MoneyWiseTransAsset pCredit,
312 final MoneyWiseTransaction pTrans) {
313
314 if (pCredit instanceof MoneyWiseCash myCash
315 && myCash.isAutoExpense()) {
316
317 processCashExpense(myCash, pDebit, pTrans);
318
319
320 } else if (pDebit instanceof MoneyWiseCash myCash
321 && myCash.isAutoExpense()) {
322
323 processCashReceipt(myCash, pCredit, pTrans);
324
325
326 } else if (pDebit instanceof MoneyWiseSecurityHolding myDebitHolding) {
327
328 if (pCredit instanceof MoneyWiseSecurityHolding myCreditHolding) {
329
330 thePortBuilder.processTransferBetweenSecurities(myDebitHolding, myCreditHolding, pTrans);
331 } else {
332
333 thePortBuilder.processTransferFromSecurity(myDebitHolding, pCredit, pTrans);
334 }
335
336 } else if (pCredit instanceof MoneyWiseSecurityHolding myCreditHolding) {
337
338 thePortBuilder.processTransferToSecurity(myCreditHolding, pDebit, pTrans);
339
340
341 } else if (pDebit instanceof MoneyWisePortfolio myDebitPortfolio) {
342
343 if (pCredit instanceof MoneyWisePortfolio myCreditPortfolio) {
344
345 thePortBuilder.processTransferBetweenPortfolios(myDebitPortfolio, myCreditPortfolio, pTrans);
346 } else {
347
348 thePortBuilder.processTransferFromPortfolio(myDebitPortfolio, pCredit, pTrans);
349 }
350
351 } else if (pCredit instanceof MoneyWisePortfolio myCreditPortfolio) {
352
353 thePortBuilder.processTransferToPortfolio(myCreditPortfolio, pDebit, pTrans);
354
355 } else {
356
357 final MoneyWiseTransCategoryClass myCat = Objects.requireNonNull(pTrans.getCategoryClass());
358
359
360 switch (myCat) {
361 case CASHBACK:
362
363 processCashBack(pDebit, pCredit, pTrans);
364 break;
365 case INTEREST:
366 case LOYALTYBONUS:
367
368 processInterest(pDebit, pCredit, pTrans);
369 break;
370 case LOANINTERESTEARNED:
371 case RENTALINCOME:
372 case ROOMRENTALINCOME:
373
374 processStandardIncome((MoneyWisePayee) pCredit.getParent(), pCredit, pTrans);
375 break;
376 case WRITEOFF:
377 case LOANINTERESTCHARGED:
378
379 processStandardExpense((MoneyWisePayee) pCredit.getParent(), pDebit, pTrans);
380 break;
381 default:
382
383 processStandardTransfer(pDebit, pCredit, pTrans);
384 break;
385 }
386 }
387 }
388
389
390
391
392
393
394
395 protected static boolean hasXtraDetail(final MoneyWiseTransaction pTrans) {
396 if (pTrans.getTaxCredit() != null) {
397 return true;
398 }
399 if (pTrans.getEmployeeNatIns() != null) {
400 return true;
401 }
402 if (pTrans.getDeemedBenefit() != null) {
403 return true;
404 }
405 return pTrans.getWithheld() != null;
406 }
407
408
409
410
411
412
413
414
415 protected void processStandardIncome(final MoneyWisePayee pPayee,
416 final MoneyWiseTransAsset pCredit,
417 final MoneyWiseTransaction pTrans) {
418
419 final MoneyWiseQIFPayee myPayee = theFile.registerPayee(pPayee);
420
421
422 final MoneyWiseQIFEventCategory myCategory = theFile.registerCategory(pTrans.getCategory());
423
424
425 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pCredit);
426
427
428 final List<MoneyWiseQIFClass> myList = getTransactionClasses(pTrans);
429
430
431 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
432 myEvent.recordAmount(pTrans.getAmount());
433 myEvent.recordPayee(myPayee);
434 myEvent.recordCategory(myCategory, myList);
435
436
437 myAccount.addEvent(myEvent);
438 }
439
440
441
442
443
444
445
446
447 protected void processDetailedIncome(final MoneyWisePayee pPayee,
448 final MoneyWiseTransAsset pCredit,
449 final MoneyWiseTransaction pTrans) {
450
451 final MoneyWiseQIFPayee myPayee = theFile.registerPayee(pPayee);
452 final MoneyWiseQIFPayee myTaxPayee = theFile.registerPayee(theTaxMan);
453
454
455 final MoneyWiseQIFEventCategory myCategory = theFile.registerCategory(pTrans.getCategory());
456
457
458 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pCredit);
459
460
461 final List<MoneyWiseQIFClass> myList = getTransactionClasses(pTrans);
462
463
464 OceanusMoney myAmount = pTrans.getAmount();
465
466
467 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
468 myEvent.recordPayee(myPayee);
469 myEvent.recordAmount(myAmount);
470
471
472 myAmount = new OceanusMoney(myAmount);
473 myEvent.recordSplitRecord(myCategory, myList, myAmount, myPayee.getName());
474
475
476 OceanusMoney myTaxCredit = pTrans.getTaxCredit();
477 if (myTaxCredit != null) {
478
479 myAmount.addAmount(myTaxCredit);
480 myTaxCredit = new OceanusMoney(myTaxCredit);
481 myTaxCredit.negate();
482
483
484 final MoneyWiseQIFEventCategory myTaxCategory = theFile.registerCategory(theTaxCategory);
485
486
487 myEvent.recordSplitRecord(myTaxCategory, myTaxCredit, myTaxPayee.getName());
488 }
489
490
491 OceanusMoney myNatIns = pTrans.getEmployeeNatIns();
492 if (myNatIns != null) {
493
494 myAmount.addAmount(myNatIns);
495 myNatIns = new OceanusMoney(myNatIns);
496 myNatIns.negate();
497
498
499 final MoneyWiseQIFEventCategory myInsCategory = theFile.registerCategory(theNatInsCategory);
500
501
502 myEvent.recordSplitRecord(myInsCategory, myNatIns, myTaxPayee.getName());
503 }
504
505
506 OceanusMoney myBenefit = pTrans.getDeemedBenefit();
507 if (myBenefit != null) {
508
509 final MoneyWiseQIFEventCategory myBenCategory = theFile.registerCategory(theBenefitCategory);
510
511
512 myEvent.recordSplitRecord(myBenCategory, myBenefit, myPayee.getName());
513
514
515 myBenefit = new OceanusMoney(myBenefit);
516 myBenefit.negate();
517
518
519 final MoneyWiseQIFEventCategory myWithCategory = theFile.registerCategory(theBenefitCategory);
520
521
522 myEvent.recordSplitRecord(myWithCategory, myBenefit, myPayee.getName());
523 }
524
525
526 OceanusMoney myWithheld = pTrans.getWithheld();
527 if (myWithheld != null) {
528
529 myAmount.addAmount(myWithheld);
530 myWithheld = new OceanusMoney(myWithheld);
531 myWithheld.negate();
532
533
534 final MoneyWiseQIFEventCategory myWithCategory = theFile.registerCategory(theWithheldCategory);
535
536
537 myEvent.recordSplitRecord(myWithCategory, myWithheld, myPayee.getName());
538 }
539
540
541 myAccount.addEvent(myEvent);
542 }
543
544
545
546
547
548
549
550
551 protected void processStandardExpense(final MoneyWisePayee pPayee,
552 final MoneyWiseTransAsset pDebit,
553 final MoneyWiseTransaction pTrans) {
554
555 final MoneyWiseQIFPayee myPayee = theFile.registerPayee(pPayee);
556
557
558 final MoneyWiseQIFEventCategory myCategory = theFile.registerCategory(pTrans.getCategory());
559
560
561 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pDebit);
562
563
564 final List<MoneyWiseQIFClass> myList = getTransactionClasses(pTrans);
565
566
567 final OceanusMoney myAmount = new OceanusMoney(pTrans.getAmount());
568 myAmount.negate();
569
570
571 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
572 myEvent.recordAmount(myAmount);
573 myEvent.recordPayee(myPayee);
574 myEvent.recordCategory(myCategory, myList);
575
576
577 myAccount.addEvent(myEvent);
578 }
579
580
581
582
583
584
585
586
587 protected void processDetailedExpense(final MoneyWisePayee pPayee,
588 final MoneyWiseTransAsset pDebit,
589 final MoneyWiseTransaction pTrans) {
590
591 final MoneyWiseQIFPayee myPayee = theFile.registerPayee(pPayee);
592 final MoneyWiseQIFPayee myTaxPayee = theFile.registerPayee(theTaxMan);
593
594
595 final MoneyWiseQIFEventCategory myCategory = theFile.registerCategory(pTrans.getCategory());
596
597
598 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pDebit);
599
600
601 final List<MoneyWiseQIFClass> myList = getTransactionClasses(pTrans);
602
603
604 OceanusMoney myAmount = new OceanusMoney(pTrans.getAmount());
605 myAmount.negate();
606
607
608 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
609 myEvent.recordPayee(myPayee);
610 myEvent.recordAmount(myAmount);
611
612
613 myAmount = new OceanusMoney(myAmount);
614 myEvent.recordSplitRecord(myCategory, myList, myAmount, myPayee.getName());
615
616
617 final OceanusMoney myTaxCredit = pTrans.getTaxCredit();
618 if (myTaxCredit != null) {
619
620 myAmount.subtractAmount(myTaxCredit);
621
622
623 final MoneyWiseQIFEventCategory myTaxCategory = theFile.registerCategory(theTaxCategory);
624
625
626 myEvent.recordSplitRecord(myTaxCategory, myTaxCredit, myTaxPayee.getName());
627 }
628
629
630 final OceanusMoney myNatIns = pTrans.getEmployeeNatIns();
631 if (myNatIns != null) {
632
633 myAmount.subtractAmount(myNatIns);
634
635
636 final MoneyWiseQIFEventCategory myInsCategory = theFile.registerCategory(theNatInsCategory);
637
638
639 myEvent.recordSplitRecord(myInsCategory, myNatIns, myTaxPayee.getName());
640 }
641
642
643 final OceanusMoney myBenefit = pTrans.getDeemedBenefit();
644 if (myBenefit != null) {
645
646 myAmount.subtractAmount(myBenefit);
647
648
649 final MoneyWiseQIFEventCategory myBenCategory = theFile.registerCategory(theBenefitCategory);
650
651
652 myEvent.recordSplitRecord(myBenCategory, myBenefit, myPayee.getName());
653 }
654
655
656 myAccount.addEvent(myEvent);
657 }
658
659
660
661
662
663
664
665
666 protected void processStandardTransfer(final MoneyWiseTransAsset pDebit,
667 final MoneyWiseTransAsset pCredit,
668 final MoneyWiseTransaction pTrans) {
669
670 final OceanusMoney myAmount = pTrans.getAmount();
671
672
673 final MoneyWiseQIFAccountEvents myDebitAccount = theFile.registerAccount(pDebit);
674 final MoneyWiseQIFAccountEvents myCreditAccount = theFile.registerAccount(pCredit);
675
676
677 final List<MoneyWiseQIFClass> myList = getTransactionClasses(pTrans);
678
679
680 MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
681 myEvent.recordAmount(myAmount);
682 myEvent.recordAccount(myDebitAccount.getAccount(), myList);
683
684
685 myEvent.recordPayee(buildXferFromPayee(pDebit));
686
687
688 myCreditAccount.addEvent(myEvent);
689
690
691 final OceanusMoney myOutAmount = new OceanusMoney(myAmount);
692 myOutAmount.negate();
693
694
695 myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
696 myEvent.recordAmount(myOutAmount);
697 myEvent.recordAccount(myCreditAccount.getAccount(), myList);
698
699
700 myEvent.recordPayee(buildXferToPayee(pCredit));
701
702
703 myDebitAccount.addEvent(myEvent);
704 }
705
706
707
708
709
710
711
712 protected String buildXferFromPayee(final MoneyWiseTransAsset pPartner) {
713
714 final boolean useSimpleTransfer = theFileType.useSimpleTransfer();
715
716
717 final StringBuilder myBuilder = new StringBuilder();
718 myBuilder.append(QIF_XFER);
719 if (!useSimpleTransfer) {
720 myBuilder.append(QIF_XFERFROM);
721 myBuilder.append(pPartner.getName());
722 }
723
724
725 return myBuilder.toString();
726 }
727
728
729
730
731
732
733
734 protected String buildXferToPayee(final MoneyWiseTransAsset pPartner) {
735
736 final boolean useSimpleTransfer = theFileType.useSimpleTransfer();
737
738
739 final StringBuilder myBuilder = new StringBuilder();
740 myBuilder.append(QIF_XFER);
741 if (!useSimpleTransfer) {
742 myBuilder.append(QIF_XFERTO);
743 myBuilder.append(pPartner.getName());
744 }
745
746
747 return myBuilder.toString();
748 }
749
750
751
752
753
754
755
756
757 protected void processInterest(final MoneyWiseTransAsset pDebit,
758 final MoneyWiseTransAsset pCredit,
759 final MoneyWiseTransaction pTrans) {
760
761 OceanusMoney myAmount = pTrans.getAmount();
762
763
764 final boolean isRecursive = pDebit.equals(pCredit);
765 final boolean hideBalancingTransfer = theFileType.hideBalancingSplitTransfer();
766 final boolean hasXtraDetail = hasXtraDetail(pTrans);
767
768
769 final MoneyWiseQIFAccountEvents myIntAccount = theFile.registerAccount(pDebit);
770
771
772 final MoneyWiseQIFPayee myPayee = theFile.registerPayee((MoneyWisePayee) pDebit.getParent());
773
774
775 final MoneyWiseQIFEventCategory myCategory = theFile.registerCategory(pTrans.getCategory());
776
777
778 final List<MoneyWiseQIFClass> myList = getTransactionClasses(pTrans);
779
780
781 if (isRecursive && !hasXtraDetail) {
782
783 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
784
785
786 myEvent.recordAmount(myAmount);
787 myEvent.recordPayee(myPayee);
788 myEvent.recordCategory(myCategory, myList);
789
790
791 myIntAccount.addEvent(myEvent);
792
793
794 } else {
795
796 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
797
798
799 myEvent.recordAmount(isRecursive
800 ? myAmount
801 : new OceanusMoney());
802 myEvent.recordPayee(myPayee);
803
804
805 myAmount = new OceanusMoney(myAmount);
806 myEvent.recordSplitRecord(myCategory, myList, myAmount, myPayee.getName());
807
808
809 OceanusMoney myTaxCredit = pTrans.getTaxCredit();
810 if (myTaxCredit != null) {
811
812 final MoneyWiseQIFPayee myTaxPayee = theFile.registerPayee(theTaxMan);
813
814
815 myAmount.addAmount(myTaxCredit);
816 myTaxCredit = new OceanusMoney(myTaxCredit);
817 myTaxCredit.negate();
818
819
820 final MoneyWiseQIFEventCategory myTaxCategory = theFile.registerCategory(theTaxCategory);
821
822
823 myEvent.recordSplitRecord(myTaxCategory, myTaxCredit, myTaxPayee.getName());
824 }
825
826
827 OceanusMoney myWithheld = pTrans.getWithheld();
828 if (myWithheld != null) {
829
830 myAmount.addAmount(myWithheld);
831 myWithheld = new OceanusMoney(myWithheld);
832 myWithheld.negate();
833
834
835 final MoneyWiseQIFEventCategory myWithCategory = theFile.registerCategory(theWithheldCategory);
836
837
838 myEvent.recordSplitRecord(myWithCategory, myWithheld, myPayee.getName());
839 }
840
841
842 if (!isRecursive) {
843
844 final OceanusMoney myOutAmount = new OceanusMoney(pTrans.getAmount());
845 myOutAmount.negate();
846
847
848 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pCredit);
849
850
851 myEvent.recordSplitRecord(myAccount.getAccount(), myOutAmount, null);
852 }
853
854
855 myIntAccount.addEvent(myEvent);
856 }
857
858
859 if (!isRecursive && !hideBalancingTransfer) {
860
861 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pCredit);
862
863
864 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
865
866
867 myEvent.recordAmount(pTrans.getAmount());
868 myEvent.recordAccount(myIntAccount.getAccount(), myList);
869
870
871 myEvent.recordPayee(buildXferFromPayee(pDebit));
872
873
874 myAccount.addEvent(myEvent);
875 }
876 }
877
878
879
880
881
882
883
884
885 protected void processCashBack(final MoneyWiseTransAsset pDebit,
886 final MoneyWiseTransAsset pCredit,
887 final MoneyWiseTransaction pTrans) {
888
889 OceanusMoney myAmount = pTrans.getAmount();
890
891
892 final boolean isRecursive = pDebit.equals(pCredit);
893 final boolean hideBalancingTransfer = theFileType.hideBalancingSplitTransfer();
894
895
896 final MoneyWiseQIFAccountEvents myBaseAccount = theFile.registerAccount(pDebit);
897
898
899 final MoneyWiseQIFPayee myPayee = theFile.registerPayee((MoneyWisePayee) pDebit.getParent());
900
901
902 final MoneyWiseQIFEventCategory myCategory = theFile.registerCategory(pTrans.getCategory());
903
904
905 final List<MoneyWiseQIFClass> myList = getTransactionClasses(pTrans);
906
907
908 if (isRecursive) {
909
910 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
911
912
913 myEvent.recordAmount(myAmount);
914 myEvent.recordPayee(myPayee);
915 myEvent.recordCategory(myCategory, myList);
916
917
918 myBaseAccount.addEvent(myEvent);
919
920
921 } else {
922
923 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
924
925
926 myEvent.recordAmount(new OceanusMoney());
927 myEvent.recordPayee(myPayee);
928
929
930 myAmount = new OceanusMoney(myAmount);
931 myEvent.recordSplitRecord(myCategory, myList, myAmount, myPayee.getName());
932
933
934 final OceanusMoney myOutAmount = new OceanusMoney(pTrans.getAmount());
935 myOutAmount.negate();
936
937
938 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pCredit);
939
940
941 myEvent.recordSplitRecord(myAccount.getAccount(), myOutAmount, null);
942
943
944 myBaseAccount.addEvent(myEvent);
945 }
946
947
948 if (!isRecursive && !hideBalancingTransfer) {
949
950 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pCredit);
951
952
953 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
954
955
956 myEvent.recordAmount(pTrans.getAmount());
957 myEvent.recordAccount(myBaseAccount.getAccount(), myList);
958
959
960 myEvent.recordPayee(buildXferFromPayee(pDebit));
961
962
963 myAccount.addEvent(myEvent);
964 }
965 }
966
967
968
969
970
971
972
973
974 protected void processCashRecovery(final MoneyWisePayee pPayee,
975 final MoneyWiseCash pCash,
976 final MoneyWiseTransaction pTrans) {
977
978 final MoneyWiseQIFPayee myPayee = theFile.registerPayee(pPayee);
979
980
981 final MoneyWiseQIFEventCategory myCategory = theFile.registerCategory(pTrans.getCategory());
982 final MoneyWiseQIFEventCategory myAutoCategory = theFile.registerCategory(pCash.getAutoExpense());
983
984
985 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pCash);
986
987
988 final List<MoneyWiseQIFClass> myList = getTransactionClasses(pTrans);
989
990
991 final OceanusMoney myInAmount = pTrans.getAmount();
992 final OceanusMoney myOutAmount = new OceanusMoney(myInAmount);
993 myOutAmount.negate();
994
995
996 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
997 myEvent.recordAmount(new OceanusMoney());
998 myEvent.recordPayee(myPayee);
999 myEvent.recordSplitRecord(myCategory, myList, myInAmount, myPayee.getName());
1000 myEvent.recordSplitRecord(myAutoCategory, myList, myOutAmount, pCash.getAutoPayee().getName());
1001
1002
1003 myAccount.addEvent(myEvent);
1004 }
1005
1006
1007
1008
1009
1010
1011
1012
1013 protected void processCashPayment(final MoneyWisePayee pPayee,
1014 final MoneyWiseCash pCash,
1015 final MoneyWiseTransaction pTrans) {
1016
1017 final MoneyWiseQIFPayee myPayee = theFile.registerPayee(pPayee);
1018
1019
1020 final MoneyWiseQIFEventCategory myCategory = theFile.registerCategory(pTrans.getCategory());
1021 final MoneyWiseQIFEventCategory myAutoCategory = theFile.registerCategory(pCash.getAutoExpense());
1022
1023
1024 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pCash);
1025
1026
1027 final List<MoneyWiseQIFClass> myList = getTransactionClasses(pTrans);
1028
1029
1030 final OceanusMoney myInAmount = pTrans.getAmount();
1031 final OceanusMoney myOutAmount = new OceanusMoney(myInAmount);
1032 myOutAmount.negate();
1033
1034
1035 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
1036 myEvent.recordAmount(new OceanusMoney());
1037 myEvent.recordPayee(myPayee);
1038 myEvent.recordSplitRecord(myAutoCategory, myList, myInAmount, pCash.getAutoPayee().getName());
1039 myEvent.recordSplitRecord(myCategory, myList, myOutAmount, myPayee.getName());
1040
1041
1042 myAccount.addEvent(myEvent);
1043 }
1044
1045
1046
1047
1048
1049
1050
1051
1052 protected void processCashExpense(final MoneyWiseCash pCash,
1053 final MoneyWiseTransAsset pDebit,
1054 final MoneyWiseTransaction pTrans) {
1055
1056 final MoneyWiseQIFPayee myPayee = theFile.registerPayee(pCash.getAutoPayee());
1057
1058
1059 final MoneyWiseQIFEventCategory myCategory = theFile.registerCategory(pCash.getAutoExpense());
1060
1061
1062 final List<MoneyWiseQIFClass> myList = getTransactionClasses(pTrans);
1063
1064
1065 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pDebit);
1066
1067
1068 final OceanusMoney myAmount = new OceanusMoney(pTrans.getAmount());
1069 myAmount.negate();
1070
1071
1072 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
1073 myEvent.recordAmount(myAmount);
1074 myEvent.recordPayee(myPayee);
1075 myEvent.recordCategory(myCategory, myList);
1076
1077
1078 myAccount.addEvent(myEvent);
1079 }
1080
1081
1082
1083
1084
1085
1086
1087
1088 protected void processCashReceipt(final MoneyWiseCash pCash,
1089 final MoneyWiseTransAsset pCredit,
1090 final MoneyWiseTransaction pTrans) {
1091
1092 final MoneyWiseQIFPayee myPayee = theFile.registerPayee(pCash.getAutoPayee());
1093
1094
1095 final MoneyWiseQIFEventCategory myCategory = theFile.registerCategory(pCash.getAutoExpense());
1096
1097
1098 final MoneyWiseQIFAccountEvents myAccount = theFile.registerAccount(pCredit);
1099
1100
1101 final List<MoneyWiseQIFClass> myList = getTransactionClasses(pTrans);
1102
1103
1104 final MoneyWiseQIFEvent myEvent = new MoneyWiseQIFEvent(theFile, pTrans);
1105 myEvent.recordAmount(pTrans.getAmount());
1106 myEvent.recordPayee(myPayee);
1107 myEvent.recordCategory(myCategory, myList);
1108
1109
1110 myAccount.addEvent(myEvent);
1111 }
1112
1113
1114
1115
1116
1117
1118
1119 protected List<MoneyWiseQIFClass> getTransactionClasses(final MoneyWiseTransaction pTrans) {
1120
1121 List<MoneyWiseQIFClass> myList = null;
1122
1123
1124 final List<MoneyWiseTransTag> myTags = pTrans.getTransactionTags();
1125
1126
1127 if (myTags != null) {
1128
1129 myList = new ArrayList<>();
1130
1131
1132 final Iterator<MoneyWiseTransTag> myIterator = myTags.iterator();
1133 while (myIterator.hasNext()) {
1134 final MoneyWiseTransTag myTag = myIterator.next();
1135
1136
1137 final MoneyWiseQIFClass myClass = theFile.registerClass(myTag);
1138
1139
1140 myList.add(myClass);
1141 }
1142 }
1143
1144
1145 return myList;
1146 }
1147 }