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