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.data.validate;
18  
19  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
20  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseCategoryBase;
21  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory;
22  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory.MoneyWiseTransCategoryDataMap;
23  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseTransCategory.MoneyWiseTransCategoryList;
24  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
25  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryClass;
26  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryType;
27  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseTransCategoryType.MoneyWiseTransCategoryTypeList;
28  import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
29  import io.github.tonywasher.joceanus.prometheus.data.PrometheusData.PrometheusDataItemCtl;
30  import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
31  import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataResource;
32  
33  /**
34   * Validator for TransCategory.
35   */
36  public class MoneyWiseValidateTransCategory
37          extends MoneyWiseValidateCategory<MoneyWiseTransCategory> {
38      /**
39       * Different Parent Error.
40       */
41      private static final String ERROR_DIFFPARENT = MoneyWiseBasicResource.TRANSCATEGORY_ERROR_DIFFPARENT.getValue();
42  
43      @Override
44      public void validate(final PrometheusDataItemCtl pCategory) {
45          /* Validate the base */
46          super.validate(pCategory);
47  
48          /* Access details */
49          final MoneyWiseTransCategory myCategory = (MoneyWiseTransCategory) pCategory;
50          final MoneyWiseTransCategoryList myList = myCategory.getList();
51          final MoneyWiseTransCategoryType myCatType = myCategory.getCategoryType();
52          final MoneyWiseTransCategory myParent = myCategory.getParentCategory();
53          final String myName = myCategory.getName();
54  
55          /* EventCategoryType must be non-null */
56          if (myCatType == null) {
57              myCategory.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseStaticDataType.TRANSTYPE);
58          } else {
59              /* Access the class */
60              final MoneyWiseTransCategoryClass myClass = myCatType.getCategoryClass();
61  
62              /* EventCategoryType must be enabled */
63              if (!myCatType.getEnabled()) {
64                  myCategory.addError(PrometheusDataItem.ERROR_DISABLED, MoneyWiseStaticDataType.TRANSTYPE);
65              }
66  
67              /* If the CategoryType is singular */
68              if (myClass.isSingular()) {
69                  /* Count the elements of this class */
70                  final MoneyWiseTransCategoryDataMap myMap = myList.getDataMap();
71                  if (!myMap.validSingularCount(myClass)) {
72                      myCategory.addError(PrometheusDataItem.ERROR_MULT, MoneyWiseStaticDataType.TRANSTYPE);
73                  }
74              }
75  
76              /* Switch on the category class */
77              switch (myClass) {
78                  case TOTALS:
79                      /* If parent exists */
80                      if (myParent != null) {
81                          myCategory.addError(PrometheusDataItem.ERROR_EXIST, PrometheusDataResource.DATAGROUP_PARENT);
82                      }
83                      break;
84                  case INCOMETOTALS:
85                  case EXPENSETOTALS:
86                  case SECURITYPARENT:
87                      /* Check parent */
88                      if (myParent == null) {
89                          myCategory.addError(PrometheusDataItem.ERROR_MISSING, PrometheusDataResource.DATAGROUP_PARENT);
90                      } else if (!myParent.isCategoryClass(MoneyWiseTransCategoryClass.TOTALS)) {
91                          myCategory.addError(ERROR_BADPARENT, PrometheusDataResource.DATAGROUP_PARENT);
92                      }
93                      break;
94                  default:
95                      /* Check parent requirement */
96                      final boolean isTransfer = myClass == MoneyWiseTransCategoryClass.TRANSFER;
97                      final boolean hasParent = myParent != null;
98                      if (hasParent == isTransfer) {
99                          if (isTransfer) {
100                             myCategory.addError(PrometheusDataItem.ERROR_EXIST, PrometheusDataResource.DATAGROUP_PARENT);
101                         } else {
102                             myCategory.addError(PrometheusDataItem.ERROR_MISSING, PrometheusDataResource.DATAGROUP_PARENT);
103                         }
104                     } else if (hasParent) {
105                         /* Check validity of parent */
106                         final MoneyWiseTransCategoryClass myParentClass = myParent.getCategoryTypeClass();
107                         if (!myParentClass.canParentCategory()) {
108                             myCategory.addError(ERROR_BADPARENT, PrometheusDataResource.DATAGROUP_PARENT);
109                         }
110                         if (myParentClass.isIncome() != myClass.isIncome()
111                                 || myParentClass.isSecurityTransfer() != myClass.isSecurityTransfer()) {
112                             myCategory.addError(ERROR_DIFFPARENT, PrometheusDataResource.DATAGROUP_PARENT);
113                         }
114 
115                         /* Check that name reflects parent */
116                         if (myName != null && !myName.startsWith(myParent.getName() + MoneyWiseCategoryBase.STR_SEP)) {
117                             myCategory.addError(ERROR_MATCHPARENT, PrometheusDataResource.DATAGROUP_PARENT);
118                         }
119                     }
120                     break;
121             }
122         }
123 
124         /* Set validation flag */
125         if (!myCategory.hasErrors()) {
126             myCategory.setValidEdit();
127         }
128     }
129 
130     @Override
131     public void setDefaults(final MoneyWiseTransCategory pParent,
132                             final MoneyWiseTransCategory pCategory) throws OceanusException {
133         /* Set values */
134         final MoneyWiseTransCategoryList myList = pCategory.getList();
135         final MoneyWiseTransCategoryTypeList myTypes
136                 = getEditSet().getDataList(MoneyWiseStaticDataType.TRANSTYPE, MoneyWiseTransCategoryTypeList.class);
137         final MoneyWiseTransCategoryClass myParentClass = pParent == null ? null : pParent.getCategoryTypeClass();
138         final MoneyWiseTransCategoryClass myNewClass;
139         if (myParentClass == null || myParentClass.isTotals()) {
140             myNewClass = MoneyWiseTransCategoryClass.EXPENSETOTALS;
141         } else if (myParentClass.isIncome()) {
142             myNewClass = MoneyWiseTransCategoryClass.TAXEDINCOME;
143         } else if (myParentClass.isTransfer()) {
144             myNewClass = MoneyWiseTransCategoryClass.STOCKSPLIT;
145         } else {
146             myNewClass = MoneyWiseTransCategoryClass.EXPENSE;
147         }
148         pCategory.setCategoryType(myTypes.findItemByClass(myNewClass));
149         pCategory.setParentCategory(pParent);
150         pCategory.setSubCategoryName(getUniqueName(myList, pParent));
151     }
152 }