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.moneywise.data.basic.MoneyWiseTransCategory;
20 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryClass;
21 import io.github.tonywasher.joceanus.moneywise.quicken.definitions.MoneyWiseQCategoryLineType;
22 import io.github.tonywasher.joceanus.moneywise.quicken.definitions.MoneyWiseQLineType;
23 import io.github.tonywasher.joceanus.moneywise.quicken.file.MoneyWiseQIFLine.MoneyWiseQIFStringLine;
24 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
25
26 import java.util.Iterator;
27 import java.util.List;
28 import java.util.Objects;
29
30
31
32
33 public class MoneyWiseQIFEventCategory
34 extends MoneyWiseQIFRecord<MoneyWiseQCategoryLineType>
35 implements Comparable<MoneyWiseQIFEventCategory> {
36
37
38
39 protected static final String QIF_ITEM = "Cat";
40
41
42
43
44 private final String theName;
45
46
47
48
49 private final String theDesc;
50
51
52
53
54 private final boolean isIncome;
55
56
57
58
59
60
61 public MoneyWiseQIFEventCategory(final MoneyWiseTransCategory pCategory) {
62
63 super(MoneyWiseQCategoryLineType.class);
64
65
66 theName = pCategory.getName();
67 theDesc = pCategory.getDesc();
68
69
70 final MoneyWiseTransCategoryClass myClass = pCategory.getCategoryTypeClass();
71 isIncome = myClass.isIncome();
72
73
74 addLine(new MoneyWiseQIFCategoryNameLine(theName));
75 if (theDesc != null) {
76 addLine(new MoneyWiseQIFCategoryDescLine(theDesc));
77 }
78 if (isIncome) {
79 addLine(new MoneyWiseQIFCategoryIncomeLine());
80 } else {
81 addLine(new MoneyWiseQIFCategoryExpenseLine());
82 }
83 }
84
85
86
87
88
89
90 protected MoneyWiseQIFEventCategory(final List<String> pLines) {
91
92 super(MoneyWiseQCategoryLineType.class);
93
94
95 String myName = null;
96 String myDesc = null;
97 boolean bIsIncome = false;
98
99
100 for (String myLine : pLines) {
101
102 final MoneyWiseQCategoryLineType myType = MoneyWiseQCategoryLineType.parseLine(myLine);
103 if (myType != null) {
104
105 final String myData = myLine.substring(myType.getSymbol().length());
106
107
108 switch (myType) {
109 case NAME:
110 addLine(new MoneyWiseQIFCategoryNameLine(myData));
111 myName = myData;
112 break;
113 case DESCRIPTION:
114 addLine(new MoneyWiseQIFCategoryDescLine(myData));
115 myDesc = myData;
116 break;
117 case INCOME:
118 addLine(new MoneyWiseQIFCategoryIncomeLine());
119 bIsIncome = true;
120 break;
121 case EXPENSE:
122 addLine(new MoneyWiseQIFCategoryExpenseLine());
123 bIsIncome = false;
124 break;
125 case TAX:
126 default:
127 break;
128 }
129 }
130 }
131
132
133 theName = myName;
134 theDesc = myDesc;
135 isIncome = bIsIncome;
136 }
137
138 @Override
139 public String toString() {
140 return getName();
141 }
142
143
144
145
146
147
148 public String getName() {
149 return theName;
150 }
151
152
153
154
155
156
157 public String getDesc() {
158 return theDesc;
159 }
160
161
162
163
164
165
166 public boolean isIncome() {
167 return isIncome;
168 }
169
170
171
172
173
174
175 public boolean isExpense() {
176 return !isIncome;
177 }
178
179 @Override
180 public int compareTo(final MoneyWiseQIFEventCategory pThat) {
181 return theName.compareTo(pThat.getName());
182 }
183
184
185
186
187 public static class MoneyWiseQIFCategoryNameLine
188 extends MoneyWiseQIFStringLine<MoneyWiseQCategoryLineType> {
189
190
191
192
193
194 protected MoneyWiseQIFCategoryNameLine(final String pName) {
195
196 super(pName);
197 }
198
199 @Override
200 public MoneyWiseQCategoryLineType getLineType() {
201 return MoneyWiseQCategoryLineType.NAME;
202 }
203
204
205
206
207
208
209 public String getName() {
210 return getValue();
211 }
212 }
213
214
215
216
217 public static class MoneyWiseQIFCategoryDescLine
218 extends MoneyWiseQIFStringLine<MoneyWiseQCategoryLineType> {
219
220
221
222
223
224 protected MoneyWiseQIFCategoryDescLine(final String pDesc) {
225
226 super(pDesc);
227 }
228
229 @Override
230 public MoneyWiseQCategoryLineType getLineType() {
231 return MoneyWiseQCategoryLineType.DESCRIPTION;
232 }
233
234
235
236
237
238
239 public String getDescription() {
240 return getValue();
241 }
242 }
243
244
245
246
247 public static class MoneyWiseQIFCategoryIncomeLine
248 extends MoneyWiseQIFLine<MoneyWiseQCategoryLineType> {
249
250
251
252 protected MoneyWiseQIFCategoryIncomeLine() {
253 }
254
255 @Override
256 public MoneyWiseQCategoryLineType getLineType() {
257 return MoneyWiseQCategoryLineType.INCOME;
258 }
259
260 @Override
261 public String toString() {
262 return getLineType().getSymbol();
263 }
264
265 @Override
266 protected void formatData(final OceanusDataFormatter pFormatter,
267 final StringBuilder pBuilder) {
268
269 }
270 }
271
272
273
274
275 public static class MoneyWiseQIFCategoryExpenseLine
276 extends MoneyWiseQIFLine<MoneyWiseQCategoryLineType> {
277
278
279
280 protected MoneyWiseQIFCategoryExpenseLine() {
281 }
282
283 @Override
284 public MoneyWiseQCategoryLineType getLineType() {
285 return MoneyWiseQCategoryLineType.EXPENSE;
286 }
287
288 @Override
289 public String toString() {
290 return getLineType().getSymbol();
291 }
292
293 @Override
294 protected void formatData(final OceanusDataFormatter pFormatter,
295 final StringBuilder pBuilder) {
296
297 }
298 }
299
300
301
302
303 public static class MoneyWiseQIFCategoryTaxLine
304 extends MoneyWiseQIFLine<MoneyWiseQCategoryLineType> {
305
306
307
308 protected MoneyWiseQIFCategoryTaxLine() {
309 }
310
311 @Override
312 public MoneyWiseQCategoryLineType getLineType() {
313 return MoneyWiseQCategoryLineType.TAX;
314 }
315
316 @Override
317 public String toString() {
318 return getLineType().getSymbol();
319 }
320
321 @Override
322 protected void formatData(final OceanusDataFormatter pFormatter,
323 final StringBuilder pBuilder) {
324
325 }
326 }
327
328
329
330
331
332
333 public abstract static class MoneyWiseQIFCategoryLine<X extends MoneyWiseQLineType>
334 extends MoneyWiseQIFLine<X> {
335
336
337
338 private final MoneyWiseQIFEventCategory theCategory;
339
340
341
342
343 private final List<MoneyWiseQIFClass> theClasses;
344
345
346
347
348
349
350 protected MoneyWiseQIFCategoryLine(final MoneyWiseQIFEventCategory pCategory) {
351 this(pCategory, null);
352 }
353
354
355
356
357
358
359
360 protected MoneyWiseQIFCategoryLine(final MoneyWiseQIFEventCategory pCategory,
361 final List<MoneyWiseQIFClass> pClasses) {
362
363 theCategory = pCategory;
364 theClasses = pClasses;
365 }
366
367 @Override
368 public String toString() {
369 return theCategory.toString();
370 }
371
372
373
374
375
376
377 public MoneyWiseQIFEventCategory getEventCategory() {
378 return theCategory;
379 }
380
381
382
383
384
385
386 public List<MoneyWiseQIFClass> getClassList() {
387 return theClasses;
388 }
389
390 @Override
391 protected void formatData(final OceanusDataFormatter pFormatter,
392 final StringBuilder pBuilder) {
393
394 pBuilder.append(theCategory.getName());
395
396
397 if (theClasses != null) {
398
399 pBuilder.append(MoneyWiseQIFConstants.QIF_CLASS);
400
401
402 final Iterator<MoneyWiseQIFClass> myIterator = theClasses.iterator();
403 while (myIterator.hasNext()) {
404 final MoneyWiseQIFClass myClass = myIterator.next();
405
406
407 pBuilder.append(myClass.getName());
408 if (myIterator.hasNext()) {
409 pBuilder.append(MoneyWiseQIFConstants.QIF_CLASSSEP);
410 }
411 }
412 }
413 }
414
415 @Override
416 public boolean equals(final Object pThat) {
417
418 if (this == pThat) {
419 return true;
420 }
421 if (pThat == null) {
422 return false;
423 }
424
425
426 if (!getClass().equals(pThat.getClass())) {
427 return false;
428 }
429
430
431 final MoneyWiseQIFCategoryLine<?> myLine = (MoneyWiseQIFCategoryLine<?>) pThat;
432
433
434 if (!getLineType().equals(myLine.getLineType())) {
435 return false;
436 }
437
438
439 if (!theCategory.equals(myLine.getEventCategory())) {
440 return false;
441 }
442
443
444 final List<MoneyWiseQIFClass> myClasses = myLine.getClassList();
445 if (theClasses == null) {
446 return myClasses == null;
447 } else if (myClasses == null) {
448 return true;
449 }
450 return theClasses.equals(myClasses);
451 }
452
453 @Override
454 public int hashCode() {
455 return Objects.hash(getLineType(), theClasses, theCategory);
456 }
457 }
458
459
460
461
462
463
464 public abstract static class MoneyWiseQIFCategoryAccountLine<X extends MoneyWiseQLineType>
465 extends MoneyWiseQIFLine<X> {
466
467
468
469 private final MoneyWiseQIFEventCategory theCategory;
470
471
472
473
474 private final MoneyWiseQIFAccount theAccount;
475
476
477
478
479 private final List<MoneyWiseQIFClass> theClasses;
480
481
482
483
484
485
486
487 protected MoneyWiseQIFCategoryAccountLine(final MoneyWiseQIFEventCategory pCategory,
488 final MoneyWiseQIFAccount pAccount) {
489 this(pCategory, pAccount, null);
490 }
491
492
493
494
495
496
497
498
499 protected MoneyWiseQIFCategoryAccountLine(final MoneyWiseQIFEventCategory pCategory,
500 final MoneyWiseQIFAccount pAccount,
501 final List<MoneyWiseQIFClass> pClasses) {
502
503 theCategory = pCategory;
504 theAccount = pAccount;
505 theClasses = pClasses;
506 }
507
508
509
510
511
512
513 public MoneyWiseQIFEventCategory getEventCategory() {
514 return theCategory;
515 }
516
517
518
519
520
521
522 public MoneyWiseQIFAccount getAccount() {
523 return theAccount;
524 }
525
526
527
528
529
530
531 public List<MoneyWiseQIFClass> getClassList() {
532 return theClasses;
533 }
534
535 @Override
536 protected void formatData(final OceanusDataFormatter pFormatter,
537 final StringBuilder pBuilder) {
538
539 pBuilder.append(theCategory.getName());
540 pBuilder.append(MoneyWiseQIFConstants.QIF_CATSEP);
541 pBuilder.append(MoneyWiseQIFConstants.QIF_XFERSTART);
542 pBuilder.append(theAccount.getName());
543 pBuilder.append(MoneyWiseQIFConstants.QIF_XFEREND);
544
545
546 if (theClasses != null) {
547
548 pBuilder.append(MoneyWiseQIFConstants.QIF_CLASS);
549
550
551 final Iterator<MoneyWiseQIFClass> myIterator = theClasses.iterator();
552 while (myIterator.hasNext()) {
553 final MoneyWiseQIFClass myClass = myIterator.next();
554
555
556 pBuilder.append(myClass.getName());
557 if (myIterator.hasNext()) {
558 pBuilder.append(MoneyWiseQIFConstants.QIF_CLASSSEP);
559 }
560 }
561 }
562 }
563
564 @Override
565 public boolean equals(final Object pThat) {
566
567 if (this == pThat) {
568 return true;
569 }
570 if (pThat == null) {
571 return false;
572 }
573
574
575 if (!getClass().equals(pThat.getClass())) {
576 return false;
577 }
578
579
580 final MoneyWiseQIFCategoryAccountLine<?> myLine = (MoneyWiseQIFCategoryAccountLine<?>) pThat;
581
582
583 if (!getLineType().equals(myLine.getLineType())) {
584 return false;
585 }
586
587
588 if (!theCategory.equals(myLine.getEventCategory())) {
589 return false;
590 }
591
592
593 if (!theAccount.equals(myLine.getAccount())) {
594 return false;
595 }
596
597
598 final List<MoneyWiseQIFClass> myClasses = myLine.getClassList();
599 if (theClasses == null) {
600 return myClasses == null;
601 } else if (myClasses == null) {
602 return true;
603 }
604 return theClasses.equals(myClasses);
605 }
606
607 @Override
608 public int hashCode() {
609 return Objects.hash(getLineType(), theClasses, theAccount, theCategory);
610 }
611 }
612 }