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.MoneyWisePayee;
22  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee.MoneyWisePayeeDataMap;
23  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee.MoneyWisePayeeList;
24  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
25  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePayeeClass;
26  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePayeeType;
27  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePayeeType.MoneyWisePayeeTypeList;
28  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
29  import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
30  
31  import java.util.Iterator;
32  
33  /**
34   * Validator for Payee.
35   */
36  public class MoneyWiseValidatePayee
37          extends MoneyWiseValidateAccount<MoneyWisePayee> {
38      /**
39       * New Account name.
40       */
41      private static final String NAME_NEWACCOUNT = MoneyWiseBasicResource.PAYEE_NEWACCOUNT.getValue();
42  
43      /**
44       * The infoSet validator.
45       */
46      private final MoneyWiseValidatePayeeInfoSet theInfoSet;
47  
48      /**
49       * Constructor.
50       */
51      MoneyWiseValidatePayee() {
52          theInfoSet = new MoneyWiseValidatePayeeInfoSet();
53      }
54  
55      @Override
56      public void validate(final PrometheusDataItem pPayee) {
57          final MoneyWisePayee myPayee = (MoneyWisePayee) pPayee;
58          final MoneyWisePayeeList myList = myPayee.getList();
59          final MoneyWisePayeeType myPayeeType = myPayee.getCategory();
60          final MoneyWisePayee myParent = myPayee.getParent();
61          final MoneyWiseCurrency myCurrency = myPayee.getAssetCurrency();
62  
63          /* Validate base components */
64          super.validate(pPayee);
65  
66          /* PayeeType must be non-null */
67          if (myPayeeType == null) {
68              pPayee.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.CATEGORY_NAME);
69          } else {
70              /* Access the class */
71              final MoneyWisePayeeClass myClass = myPayeeType.getPayeeClass();
72  
73              /* PayeeType must be enabled */
74              if (!myPayeeType.getEnabled()) {
75                  pPayee.addError(PrometheusDataItem.ERROR_DISABLED, MoneyWiseBasicResource.CATEGORY_NAME);
76              }
77  
78              /* If the PayeeType is singular */
79              if (myClass.isSingular()) {
80                  /* Count the elements of this class */
81                  final MoneyWisePayeeDataMap myMap = myList.getDataMap();
82                  if (!myMap.validSingularCount(myClass)) {
83                      pPayee.addError(PrometheusDataItem.ERROR_MULT, MoneyWiseBasicResource.CATEGORY_NAME);
84                  }
85              }
86          }
87  
88          /* Parent must be null */
89          if (myParent != null) {
90              pPayee.addError(PrometheusDataItem.ERROR_EXIST, MoneyWiseBasicResource.ASSET_PARENT);
91          }
92  
93          /* Currency must be null */
94          if (myCurrency != null) {
95              pPayee.addError(PrometheusDataItem.ERROR_EXIST, MoneyWiseStaticDataType.CURRENCY);
96          }
97  
98          /* If we have an infoSet */
99          if (myPayee.getInfoSet() != null) {
100             /* Validate the InfoSet */
101             theInfoSet.validate(myPayee.getInfoSet());
102         }
103 
104         /* Set validation flag */
105         if (!pPayee.hasErrors()) {
106             pPayee.setValidEdit();
107         }
108     }
109 
110     @Override
111     public void setDefaults(final MoneyWisePayee pPayee) throws OceanusException {
112         /* Set values */
113         final MoneyWisePayeeList myList = pPayee.getList();
114         pPayee.setCategory(getDefaultPayeeType());
115         pPayee.setName(getUniqueName(myList, NAME_NEWACCOUNT));
116         pPayee.setClosed(Boolean.FALSE);
117     }
118 
119     @Override
120     public void autoCorrect(final MoneyWisePayee pItem) throws OceanusException {
121         theInfoSet.autoCorrect(pItem.getInfoSet());
122     }
123 
124     /**
125      * Obtain payee type for new payee account.
126      *
127      * @return the payee type
128      */
129     private MoneyWisePayeeType getDefaultPayeeType() {
130         /* Access payee types */
131         final MoneyWisePayeeTypeList myTypes
132                 = getEditSet().getDataList(MoneyWiseStaticDataType.PAYEETYPE, MoneyWisePayeeTypeList.class);
133 
134         /* loop through the payee types */
135         final Iterator<MoneyWisePayeeType> myIterator = myTypes.iterator();
136         while (myIterator.hasNext()) {
137             final MoneyWisePayeeType myType = myIterator.next();
138 
139             /* Ignore deleted and singular types */
140             if (!myType.isDeleted() && !myType.getPayeeClass().isSingular()) {
141                 return myType;
142             }
143         }
144 
145         /* Return no category */
146         return null;
147     }
148 }