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