View Javadoc
1   /*
2    * MoneyWise: Finance Application
3    * Copyright 2012-2026. Tony Washer
4    *
5    * Licensed under the Apache License, Version 2.0 (the "License"); you may not
6    * use this file except in compliance with the License.  You may obtain a copy
7    * of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
14   * License for the specific language governing permissions and limitations under
15   * the License.
16   */
17  package io.github.tonywasher.joceanus.moneywise.quicken.file;
18  
19  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransaction;
20  import io.github.tonywasher.joceanus.moneywise.quicken.definitions.MoneyWiseQActionType;
21  import io.github.tonywasher.joceanus.moneywise.quicken.definitions.MoneyWiseQPortfolioLineType;
22  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFAccount.MoneyWiseQIFXferAccountLine;
23  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFEventCategory.MoneyWiseQIFCategoryAccountLine;
24  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFEventCategory.MoneyWiseQIFCategoryLine;
25  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFClearedLine;
26  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFDateLine;
27  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFMoneyLine;
28  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFPriceLine;
29  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFRatioLine;
30  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFStringLine;
31  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFUnitsLine;
32  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFPayee.MoneyWiseQIFPayeeLine;
33  import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFSecurity.MoneyWiseQIFSecurityLine;
34  import io.github.tonywasher.joceanus.oceanus.date.OceanusDate;
35  import io.github.tonywasher.joceanus.oceanus.date.OceanusDateFormatter;
36  import io.github.tonywasher.joceanus.oceanus.decimal.OceanusDecimalParser;
37  import io.github.tonywasher.joceanus.oceanus.decimal.OceanusMoney;
38  import io.github.tonywasher.joceanus.oceanus.decimal.OceanusPrice;
39  import io.github.tonywasher.joceanus.oceanus.decimal.OceanusRatio;
40  import io.github.tonywasher.joceanus.oceanus.decimal.OceanusUnits;
41  import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
42  
43  import java.util.List;
44  
45  /**
46   * Class representing a QIF Portfolio Event record.
47   */
48  public class MoneyWiseQIFPortfolioEvent
49          extends MoneyWiseQIFEventRecord<MoneyWiseQPortfolioLineType> {
50      /**
51       * The register.
52       */
53      private final MoneyWiseQIFRegister theRegister;
54  
55      /**
56       * The Date.
57       */
58      private final OceanusDate theDate;
59  
60      /**
61       * The Cleared Flag.
62       */
63      private final Boolean isCleared;
64  
65      /**
66       * The Action.
67       */
68      private final MoneyWiseQActionType theAction;
69  
70      /**
71       * Constructor.
72       *
73       * @param pRegister the QIF Register
74       * @param pTrans    the transaction
75       * @param pAction   the action
76       */
77      protected MoneyWiseQIFPortfolioEvent(final MoneyWiseQIFRegister pRegister,
78                                           final MoneyWiseTransaction pTrans,
79                                           final MoneyWiseQActionType pAction) {
80          /* Call super-constructor */
81          super(MoneyWiseQPortfolioLineType.class);
82  
83          /* Store values */
84          theRegister = pRegister;
85          theDate = pTrans.getDate();
86          isCleared = pTrans.isReconciled();
87          theAction = pAction;
88  
89          /* Add the lines */
90          addLine(new MoneyWiseQIFPortfolioDateLine(theDate));
91          addLine(new MoneyWiseQIFPortfolioActionLine(theAction));
92          addLine(new MoneyWiseQIFPortfolioClearedLine(isCleared));
93  
94          /* Add the comment line if it exists */
95          final String myComment = pTrans.getComments();
96          if (myComment != null) {
97              addLine(new MoneyWiseQIFPortfolioCommentLine(myComment));
98          }
99      }
100 
101     /**
102      * Constructor.
103      *
104      * @param pRegister  the QIF register
105      * @param pFormatter the Data Formatter
106      * @param pLines     the data lines
107      */
108     protected MoneyWiseQIFPortfolioEvent(final MoneyWiseQIFRegister pRegister,
109                                          final OceanusDataFormatter pFormatter,
110                                          final List<String> pLines) {
111         /* Call super-constructor */
112         super(MoneyWiseQPortfolioLineType.class);
113 
114         /* Determine details */
115         theRegister = pRegister;
116         OceanusDate myDate = null;
117         MoneyWiseQActionType myAction = null;
118         Boolean myCleared = null;
119 
120         /* Obtain parsers */
121         final OceanusDateFormatter myDateParser = pFormatter.getDateFormatter();
122         final OceanusDecimalParser myDecParser = pFormatter.getDecimalParser();
123 
124         /* Loop through the lines */
125         for (String myLine : pLines) {
126             /* Determine the category */
127             final MoneyWiseQPortfolioLineType myType = MoneyWiseQPortfolioLineType.parseLine(myLine);
128             if (myType != null) {
129                 /* Access data */
130                 final String myData = myLine.substring(myType.getSymbol().length());
131 
132                 /* Switch on line type */
133                 switch (myType) {
134                     case DATE:
135                         final OceanusDate myDateDay = myDateParser.parseDateBase(myData, MoneyWiseQIFConstants.QIF_BASEYEAR);
136                         addLine(new MoneyWiseQIFPortfolioDateLine(myDateDay));
137                         myDate = myDateDay;
138                         break;
139                     case CLEARED:
140                         final Boolean myFlag = myData.equals(MoneyWiseQIFLine.QIF_RECONCILED);
141                         addLine(new MoneyWiseQIFPortfolioClearedLine(myFlag));
142                         myCleared = myFlag;
143                         break;
144                     case AMOUNT:
145                         OceanusMoney myMoney = myDecParser.parseMoneyValue(myData);
146                         addLine(new MoneyWiseQIFPortfolioAmountLine(myMoney));
147                         break;
148                     case COMMENT:
149                         addLine(new MoneyWiseQIFPortfolioCommentLine(myData));
150                         break;
151                     case ACTION:
152                         myAction = MoneyWiseQActionType.parseLine(myData);
153                         addLine(new MoneyWiseQIFPortfolioActionLine(myAction));
154                         break;
155                     case PRICE:
156                         final OceanusPrice myPrice = myDecParser.parsePriceValue(myData);
157                         addLine(new MoneyWiseQIFPortfolioPriceLine(myPrice));
158                         break;
159                     case COMMISSION:
160                         myMoney = myDecParser.parseMoneyValue(myData);
161                         addLine(new MoneyWiseQIFPortfolioCommissionLine(myMoney));
162                         break;
163                     case PAYEE:
164                         addLine(new MoneyWiseQIFPortfolioPayeeDescLine(myData));
165                         break;
166                     case QUANTITY:
167                         final OceanusUnits myUnits = myDecParser.parseUnitsValue(myData);
168                         addLine(new MoneyWiseQIFPortfolioQuantityLine(myUnits));
169                         break;
170                     case SECURITY:
171                         addLine(new MoneyWiseQIFPortfolioSecurityLine(pRegister.getSecurity(myData)));
172                         break;
173                     case XFERACCOUNT:
174                         /* Look for account, category and classes */
175                         final MoneyWiseQIFAccount myAccount = MoneyWiseQIFEvent.parseAccount(pRegister, myData);
176                         final MoneyWiseQIFEventCategory myCategory = MoneyWiseQIFEvent.parseCategory(pRegister, myData);
177                         List<MoneyWiseQIFClass> myClasses = MoneyWiseQIFEvent.parseAccountClasses(pRegister, myData);
178                         if (myAccount == null) {
179                             myClasses = MoneyWiseQIFEvent.parseCategoryClasses(pRegister, myData);
180                             addLine(new MoneyWiseQIFPortfolioCategoryLine(myCategory, myClasses));
181                             convertPayee();
182                         } else if (myCategory == null) {
183                             addLine(new MoneyWiseQIFPortfolioAccountLine(myAccount, myClasses));
184                         } else {
185                             addLine(new MoneyWiseQIFPortfolioCategoryAccountLine(myCategory, myAccount, myClasses));
186                             convertPayee();
187                         }
188                         break;
189                     case XFERAMOUNT:
190                         myMoney = myDecParser.parseMoneyValue(myData);
191                         addLine(new MoneyWiseQIFPortfolioXferAmountLine(myMoney));
192                         break;
193                     default:
194                         break;
195                 }
196             }
197         }
198 
199         /* Convert any split */
200         if (MoneyWiseQActionType.STKSPLIT.equals(myAction)) {
201             convertSplit();
202         }
203 
204         /* Build details */
205         theDate = myDate;
206         theAction = myAction;
207         isCleared = myCleared;
208     }
209 
210     @Override
211     public OceanusDate getDate() {
212         return theDate;
213     }
214 
215     @Override
216     public Boolean isCleared() {
217         return isCleared;
218     }
219 
220     /**
221      * Obtain the action.
222      *
223      * @return the action.
224      */
225     public MoneyWiseQActionType getAction() {
226         return theAction;
227     }
228 
229     /**
230      * record security.
231      *
232      * @param pSecurity the security
233      */
234     protected void recordSecurity(final MoneyWiseQIFSecurity pSecurity) {
235         /* Add security line */
236         addLine(new MoneyWiseQIFPortfolioSecurityLine(pSecurity));
237     }
238 
239     /**
240      * record category.
241      *
242      * @param pCategory the category
243      */
244     protected void recordCategory(final MoneyWiseQIFEventCategory pCategory) {
245         /* Add category line */
246         addLine(new MoneyWiseQIFPortfolioCategoryLine(pCategory));
247     }
248 
249     /**
250      * record category.
251      *
252      * @param pCategory the category
253      * @param pClasses  the classes
254      */
255     protected void recordCategory(final MoneyWiseQIFEventCategory pCategory,
256                                   final List<MoneyWiseQIFClass> pClasses) {
257         /* Add category line */
258         addLine(new MoneyWiseQIFPortfolioCategoryLine(pCategory, pClasses));
259     }
260 
261     /**
262      * record amount.
263      *
264      * @param pAmount the amount
265      */
266     protected void recordAmount(final OceanusMoney pAmount) {
267         /* Add amount line */
268         addLine(new MoneyWiseQIFPortfolioAmountLine(pAmount));
269     }
270 
271     /**
272      * record payee.
273      *
274      * @param pPayee the payee
275      */
276     protected void recordPayee(final String pPayee) {
277         /* Add payee line */
278         addLine(new MoneyWiseQIFPortfolioPayeeDescLine(pPayee));
279     }
280 
281     /**
282      * record payee.
283      *
284      * @param pPayee the payee
285      */
286     protected void recordPayee(final MoneyWiseQIFPayee pPayee) {
287         /* Add payee line */
288         addLine(new MoneyWiseQIFPortfolioPayeeLine(pPayee));
289     }
290 
291     /**
292      * record transfer.
293      *
294      * @param pAccount the transfer account
295      * @param pAmount  the transfer amount
296      */
297     protected void recordXfer(final MoneyWiseQIFAccount pAccount,
298                               final OceanusMoney pAmount) {
299         /* Add transfer lines */
300         addLine(new MoneyWiseQIFPortfolioAccountLine(pAccount));
301         addLine(new MoneyWiseQIFPortfolioXferAmountLine(pAmount));
302     }
303 
304     /**
305      * record transfer.
306      *
307      * @param pAccount the transfer account
308      * @param pClasses the classes
309      * @param pAmount  the transfer amount
310      */
311     protected void recordXfer(final MoneyWiseQIFAccount pAccount,
312                               final List<MoneyWiseQIFClass> pClasses,
313                               final OceanusMoney pAmount) {
314         /* Add transfer lines */
315         addLine(new MoneyWiseQIFPortfolioAccountLine(pAccount, pClasses));
316         addLine(new MoneyWiseQIFPortfolioXferAmountLine(pAmount));
317     }
318 
319     /**
320      * record transfer.
321      *
322      * @param pCategory the transfer category
323      * @param pAmount   the transfer amount
324      */
325     protected void recordXfer(final MoneyWiseQIFEventCategory pCategory,
326                               final OceanusMoney pAmount) {
327         /* Add transfer lines */
328         addLine(new MoneyWiseQIFPortfolioCategoryLine(pCategory));
329         addLine(new MoneyWiseQIFPortfolioXferAmountLine(pAmount));
330     }
331 
332     /**
333      * record quantity.
334      *
335      * @param pQuantity the units quantity
336      */
337     protected void recordQuantity(final OceanusUnits pQuantity) {
338         /* Add quantity line */
339         addLine(new MoneyWiseQIFPortfolioQuantityLine(pQuantity));
340     }
341 
342     /**
343      * record quantity.
344      *
345      * @param pRatio the split ratio
346      */
347     protected void recordQuantity(final OceanusRatio pRatio) {
348         /* Add quantity line */
349         addLine(new MoneyWiseQIFPortfolioSplitRatioLine(pRatio));
350     }
351 
352     /**
353      * record price.
354      *
355      * @param pPrice the price
356      */
357     protected void recordPrice(final OceanusPrice pPrice) {
358         /* Add price line */
359         addLine(new MoneyWiseQIFPortfolioPriceLine(pPrice));
360     }
361 
362     /**
363      * record commission.
364      *
365      * @param pCommission the commission
366      */
367     protected void recordCommission(final OceanusMoney pCommission) {
368         /* Add commission line */
369         addLine(new MoneyWiseQIFPortfolioCommissionLine(pCommission));
370     }
371 
372     /**
373      * Convert Payee.
374      */
375     private void convertPayee() {
376         /* Look for a payee line */
377         final MoneyWiseQIFLine<MoneyWiseQPortfolioLineType> myLine = getLine(MoneyWiseQPortfolioLineType.PAYEE);
378         if (myLine instanceof MoneyWiseQIFPortfolioPayeeDescLine myDesc) {
379             /* Access payee */
380             final String myName = myDesc.getValue();
381 
382             /* Register the payee */
383             final MoneyWiseQIFPayee myPayee = theRegister.registerPayee(myName);
384             addLine(new MoneyWiseQIFPortfolioPayeeLine(myPayee));
385         }
386     }
387 
388     /**
389      * Convert Split.
390      */
391     private void convertSplit() {
392         /* Look for an action line */
393         final MoneyWiseQIFLine<MoneyWiseQPortfolioLineType> myLine = getLine(MoneyWiseQPortfolioLineType.QUANTITY);
394         if (myLine instanceof MoneyWiseQIFPortfolioQuantityLine myQuantity) {
395             /* Extract action */
396             final OceanusUnits myUnits = myQuantity.getUnits();
397 
398             /* Convert to ratio line */
399             final OceanusRatio myRatio = new OceanusRatio(myUnits);
400             addLine(new MoneyWiseQIFPortfolioSplitRatioLine(myRatio));
401         }
402     }
403 
404     /**
405      * The Portfolio Date line.
406      */
407     public static class MoneyWiseQIFPortfolioDateLine
408             extends MoneyWiseQIFDateLine<MoneyWiseQPortfolioLineType> {
409         /**
410          * Constructor.
411          *
412          * @param pDate the Date
413          */
414         protected MoneyWiseQIFPortfolioDateLine(final OceanusDate pDate) {
415             /* Call super-constructor */
416             super(pDate);
417         }
418 
419         @Override
420         public MoneyWiseQPortfolioLineType getLineType() {
421             return MoneyWiseQPortfolioLineType.DATE;
422         }
423     }
424 
425     /**
426      * The Portfolio Comment line.
427      */
428     public static class MoneyWiseQIFPortfolioCommentLine
429             extends MoneyWiseQIFStringLine<MoneyWiseQPortfolioLineType> {
430         /**
431          * Constructor.
432          *
433          * @param pComment the comment
434          */
435         protected MoneyWiseQIFPortfolioCommentLine(final String pComment) {
436             /* Call super-constructor */
437             super(pComment);
438         }
439 
440         @Override
441         public MoneyWiseQPortfolioLineType getLineType() {
442             return MoneyWiseQPortfolioLineType.COMMENT;
443         }
444 
445         /**
446          * Obtain Comment.
447          *
448          * @return the comment
449          */
450         public String getComment() {
451             return getValue();
452         }
453     }
454 
455     /**
456      * The Portfolio Cleared line.
457      */
458     public static class MoneyWiseQIFPortfolioClearedLine
459             extends MoneyWiseQIFClearedLine<MoneyWiseQPortfolioLineType> {
460         /**
461          * Constructor.
462          *
463          * @param pCleared is the event cleared?
464          */
465         protected MoneyWiseQIFPortfolioClearedLine(final Boolean pCleared) {
466             /* Call super-constructor */
467             super(pCleared);
468         }
469 
470         @Override
471         public MoneyWiseQPortfolioLineType getLineType() {
472             return MoneyWiseQPortfolioLineType.CLEARED;
473         }
474     }
475 
476     /**
477      * The Portfolio Amount line.
478      */
479     public static class MoneyWiseQIFPortfolioAmountLine
480             extends MoneyWiseQIFMoneyLine<MoneyWiseQPortfolioLineType> {
481         /**
482          * Constructor.
483          *
484          * @param pAmount the amount
485          */
486         protected MoneyWiseQIFPortfolioAmountLine(final OceanusMoney pAmount) {
487             /* Call super-constructor */
488             super(pAmount);
489         }
490 
491         @Override
492         public MoneyWiseQPortfolioLineType getLineType() {
493             return MoneyWiseQPortfolioLineType.AMOUNT;
494         }
495 
496         /**
497          * Obtain Amount.
498          *
499          * @return the amount
500          */
501         public OceanusMoney getAmount() {
502             return getMoney();
503         }
504     }
505 
506     /**
507      * The Portfolio Commission line.
508      */
509     public static class MoneyWiseQIFPortfolioCommissionLine
510             extends MoneyWiseQIFMoneyLine<MoneyWiseQPortfolioLineType> {
511         /**
512          * Constructor.
513          *
514          * @param pCommission the commission
515          */
516         protected MoneyWiseQIFPortfolioCommissionLine(final OceanusMoney pCommission) {
517             /* Call super-constructor */
518             super(pCommission);
519         }
520 
521         @Override
522         public MoneyWiseQPortfolioLineType getLineType() {
523             return MoneyWiseQPortfolioLineType.COMMISSION;
524         }
525 
526         /**
527          * Obtain Commission.
528          *
529          * @return the commission
530          */
531         public OceanusMoney getCommission() {
532             return getMoney();
533         }
534     }
535 
536     /**
537      * The Portfolio Price line.
538      */
539     public static class MoneyWiseQIFPortfolioPriceLine
540             extends MoneyWiseQIFPriceLine<MoneyWiseQPortfolioLineType> {
541         /**
542          * Constructor.
543          *
544          * @param pPrice the price
545          */
546         protected MoneyWiseQIFPortfolioPriceLine(final OceanusPrice pPrice) {
547             /* Call super-constructor */
548             super(pPrice);
549         }
550 
551         @Override
552         public MoneyWiseQPortfolioLineType getLineType() {
553             return MoneyWiseQPortfolioLineType.PRICE;
554         }
555     }
556 
557     /**
558      * The Portfolio Quantity line.
559      */
560     public static class MoneyWiseQIFPortfolioQuantityLine
561             extends MoneyWiseQIFUnitsLine<MoneyWiseQPortfolioLineType> {
562         /**
563          * Constructor.
564          *
565          * @param pUnits the units
566          */
567         protected MoneyWiseQIFPortfolioQuantityLine(final OceanusUnits pUnits) {
568             /* Call super-constructor */
569             super(pUnits);
570         }
571 
572         @Override
573         public MoneyWiseQPortfolioLineType getLineType() {
574             return MoneyWiseQPortfolioLineType.QUANTITY;
575         }
576     }
577 
578     /**
579      * The Portfolio Split Ratio line.
580      */
581     public static class MoneyWiseQIFPortfolioSplitRatioLine
582             extends MoneyWiseQIFRatioLine<MoneyWiseQPortfolioLineType> {
583         /**
584          * Constructor.
585          *
586          * @param pRatio the ratio
587          */
588         protected MoneyWiseQIFPortfolioSplitRatioLine(final OceanusRatio pRatio) {
589             /* Call super-constructor */
590             super(pRatio);
591         }
592 
593         @Override
594         public MoneyWiseQPortfolioLineType getLineType() {
595             return MoneyWiseQPortfolioLineType.QUANTITY;
596         }
597     }
598 
599     /**
600      * The Portfolio Action line.
601      */
602     public static class MoneyWiseQIFPortfolioActionLine
603             extends MoneyWiseQIFLine<MoneyWiseQPortfolioLineType> {
604         /**
605          * The action type.
606          */
607         private final MoneyWiseQActionType theAction;
608 
609         /**
610          * Constructor.
611          *
612          * @param pAction the action type
613          */
614         protected MoneyWiseQIFPortfolioActionLine(final MoneyWiseQActionType pAction) {
615             /* Store the data */
616             theAction = pAction;
617         }
618 
619         @Override
620         public MoneyWiseQPortfolioLineType getLineType() {
621             return MoneyWiseQPortfolioLineType.ACTION;
622         }
623 
624         /**
625          * Obtain the security.
626          *
627          * @return the security
628          */
629         public MoneyWiseQActionType getAction() {
630             return theAction;
631         }
632 
633         @Override
634         protected void formatData(final OceanusDataFormatter pFormatter,
635                                   final StringBuilder pBuilder) {
636             /* Add the action */
637             pBuilder.append(theAction.getSymbol());
638         }
639     }
640 
641     /**
642      * The Portfolio Security line.
643      */
644     public static class MoneyWiseQIFPortfolioSecurityLine
645             extends MoneyWiseQIFSecurityLine<MoneyWiseQPortfolioLineType> {
646         /**
647          * Constructor.
648          *
649          * @param pSecurity the security
650          */
651         protected MoneyWiseQIFPortfolioSecurityLine(final MoneyWiseQIFSecurity pSecurity) {
652             /* Call super-constructor */
653             super(pSecurity);
654         }
655 
656         @Override
657         public MoneyWiseQPortfolioLineType getLineType() {
658             return MoneyWiseQPortfolioLineType.SECURITY;
659         }
660     }
661 
662     /**
663      * The Portfolio Payee Account line.
664      */
665     public static class MoneyWiseQIFPortfolioPayeeLine
666             extends MoneyWiseQIFPayeeLine<MoneyWiseQPortfolioLineType> {
667         /**
668          * Constructor.
669          *
670          * @param pPayee the payee
671          */
672         protected MoneyWiseQIFPortfolioPayeeLine(final MoneyWiseQIFPayee pPayee) {
673             /* Call super-constructor */
674             super(pPayee);
675         }
676 
677         @Override
678         public MoneyWiseQPortfolioLineType getLineType() {
679             return MoneyWiseQPortfolioLineType.PAYEE;
680         }
681     }
682 
683     /**
684      * The Portfolio Payee Description line.
685      */
686     public static class MoneyWiseQIFPortfolioPayeeDescLine
687             extends MoneyWiseQIFStringLine<MoneyWiseQPortfolioLineType> {
688         /**
689          * Constructor.
690          *
691          * @param pPayee the payee description
692          */
693         protected MoneyWiseQIFPortfolioPayeeDescLine(final String pPayee) {
694             /* Call super-constructor */
695             super(pPayee);
696         }
697 
698         @Override
699         public MoneyWiseQPortfolioLineType getLineType() {
700             return MoneyWiseQPortfolioLineType.PAYEE;
701         }
702     }
703 
704     /**
705      * The Portfolio Account line.
706      */
707     public static class MoneyWiseQIFPortfolioAccountLine
708             extends MoneyWiseQIFXferAccountLine<MoneyWiseQPortfolioLineType> {
709         /**
710          * Constructor.
711          *
712          * @param pAccount the account
713          */
714         protected MoneyWiseQIFPortfolioAccountLine(final MoneyWiseQIFAccount pAccount) {
715             /* Call super-constructor */
716             super(pAccount);
717         }
718 
719         /**
720          * Constructor.
721          *
722          * @param pAccount the account
723          * @param pClasses the account classes
724          */
725         protected MoneyWiseQIFPortfolioAccountLine(final MoneyWiseQIFAccount pAccount,
726                                                    final List<MoneyWiseQIFClass> pClasses) {
727             /* Call super-constructor */
728             super(pAccount, pClasses);
729         }
730 
731         @Override
732         public MoneyWiseQPortfolioLineType getLineType() {
733             return MoneyWiseQPortfolioLineType.XFERACCOUNT;
734         }
735     }
736 
737     /**
738      * The Portfolio Category line.
739      */
740     public static class MoneyWiseQIFPortfolioCategoryLine
741             extends MoneyWiseQIFCategoryLine<MoneyWiseQPortfolioLineType> {
742         /**
743          * Constructor.
744          *
745          * @param pCategory the category
746          */
747         protected MoneyWiseQIFPortfolioCategoryLine(final MoneyWiseQIFEventCategory pCategory) {
748             /* Call super-constructor */
749             super(pCategory);
750         }
751 
752         /**
753          * Constructor.
754          *
755          * @param pCategory the category
756          * @param pClasses  the account classes
757          */
758         protected MoneyWiseQIFPortfolioCategoryLine(final MoneyWiseQIFEventCategory pCategory,
759                                                     final List<MoneyWiseQIFClass> pClasses) {
760             /* Call super-constructor */
761             super(pCategory, pClasses);
762         }
763 
764         @Override
765         public MoneyWiseQPortfolioLineType getLineType() {
766             return MoneyWiseQPortfolioLineType.XFERACCOUNT;
767         }
768     }
769 
770     /**
771      * The Portfolio Category line.
772      */
773     public static class MoneyWiseQIFPortfolioCategoryAccountLine
774             extends MoneyWiseQIFCategoryAccountLine<MoneyWiseQPortfolioLineType> {
775         /**
776          * Constructor.
777          *
778          * @param pCategory the category
779          * @param pAccount  the account
780          */
781         protected MoneyWiseQIFPortfolioCategoryAccountLine(final MoneyWiseQIFEventCategory pCategory,
782                                                            final MoneyWiseQIFAccount pAccount) {
783             /* Call super-constructor */
784             super(pCategory, pAccount);
785         }
786 
787         /**
788          * Constructor.
789          *
790          * @param pCategory the category
791          * @param pAccount  the account
792          * @param pClasses  the account classes
793          */
794         protected MoneyWiseQIFPortfolioCategoryAccountLine(final MoneyWiseQIFEventCategory pCategory,
795                                                            final MoneyWiseQIFAccount pAccount,
796                                                            final List<MoneyWiseQIFClass> pClasses) {
797             /* Call super-constructor */
798             super(pCategory, pAccount, pClasses);
799         }
800 
801         @Override
802         public MoneyWiseQPortfolioLineType getLineType() {
803             return MoneyWiseQPortfolioLineType.XFERACCOUNT;
804         }
805     }
806 
807     /**
808      * The Portfolio Transfer Amount line.
809      */
810     public static class MoneyWiseQIFPortfolioXferAmountLine
811             extends MoneyWiseQIFMoneyLine<MoneyWiseQPortfolioLineType> {
812         /**
813          * Constructor.
814          *
815          * @param pAmount the amount
816          */
817         protected MoneyWiseQIFPortfolioXferAmountLine(final OceanusMoney pAmount) {
818             /* Call super-constructor */
819             super(pAmount);
820         }
821 
822         @Override
823         public MoneyWiseQPortfolioLineType getLineType() {
824             return MoneyWiseQPortfolioLineType.XFERAMOUNT;
825         }
826 
827         /**
828          * Obtain Amount.
829          *
830          * @return the amount
831          */
832         public OceanusMoney getAmount() {
833             return getMoney();
834         }
835     }
836 }