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.MoneyWiseBasicDataType;
20  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
21  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataValidator.MoneyWiseDataValidatorAutoCorrect;
22  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDeposit;
23  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDeposit.MoneyWiseDepositList;
24  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDepositCategory;
25  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDepositCategory.MoneyWiseDepositCategoryList;
26  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee;
27  import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee.MoneyWisePayeeList;
28  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
29  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseDepositCategoryClass;
30  import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
31  import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
32  import io.github.tonywasher.joceanus.prometheus.data.PrometheusData.PrometheusDataItemCtl;
33  import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
34  import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
35  
36  import java.util.Iterator;
37  import java.util.Objects;
38  
39  /**
40   * Validator for Deposit.
41   */
42  public class MoneyWiseValidateDeposit
43          extends MoneyWiseValidateAccount<MoneyWiseDeposit>
44          implements MoneyWiseDataValidatorAutoCorrect<MoneyWiseDeposit> {
45      /**
46       * New Account name.
47       */
48      private static final String NAME_NEWACCOUNT = MoneyWiseBasicResource.DEPOSIT_NEWACCOUNT.getValue();
49  
50      /**
51       * The infoSet validator.
52       */
53      private final MoneyWiseValidateDepositInfoSet theInfoSet;
54  
55      /**
56       * Constructor.
57       */
58      MoneyWiseValidateDeposit() {
59          theInfoSet = new MoneyWiseValidateDepositInfoSet();
60      }
61  
62      @Override
63      public void setEditSet(final PrometheusEditSet pEditSet) {
64          super.setEditSet(pEditSet);
65          theInfoSet.storeEditSet(pEditSet);
66      }
67  
68      @Override
69      public void validate(final PrometheusDataItemCtl pDeposit) {
70          final MoneyWiseDeposit myDeposit = (MoneyWiseDeposit) pDeposit;
71          final MoneyWisePayee myParent = myDeposit.getParent();
72          final MoneyWiseDepositCategory myCategory = myDeposit.getCategory();
73          final MoneyWiseCurrency myCurrency = myDeposit.getAssetCurrency();
74          final MoneyWiseDepositCategoryClass myClass = myDeposit.getCategoryClass();
75  
76          /* Validate base components */
77          super.validate(pDeposit);
78  
79          /* Category must be non-null */
80          if (myCategory == null) {
81              myDeposit.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.CATEGORY_NAME);
82          } else if (Objects.requireNonNull(myCategory.getCategoryTypeClass()).isParentCategory()) {
83              myDeposit.addError(ERROR_BADCATEGORY, MoneyWiseBasicResource.CATEGORY_NAME);
84          }
85  
86          /* Currency must be non-null and enabled */
87          if (myCurrency == null) {
88              myDeposit.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseStaticDataType.CURRENCY);
89          } else if (!myCurrency.getEnabled()) {
90              myDeposit.addError(PrometheusDataItem.ERROR_DISABLED, MoneyWiseStaticDataType.CURRENCY);
91          }
92  
93          /* Deposit must be a child */
94          if (!myClass.isChild()) {
95              myDeposit.addError(PrometheusDataItem.ERROR_EXIST, MoneyWiseBasicResource.ASSET_PARENT);
96  
97              /* Must have parent */
98          } else if (myParent == null) {
99              myDeposit.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.ASSET_PARENT);
100         } else {
101             /* Parent must be suitable */
102             if (!myParent.getCategoryClass().canParentDeposit(myClass)) {
103                 myDeposit.addError(ERROR_BADPARENT, MoneyWiseBasicResource.ASSET_PARENT);
104             }
105 
106             /* If we are open then parent must be open */
107             if (!Boolean.TRUE.equals(myDeposit.isClosed())
108                     && Boolean.TRUE.equals(myParent.isClosed())) {
109                 myDeposit.addError(ERROR_PARCLOSED, MoneyWiseBasicResource.ASSET_CLOSED);
110             }
111         }
112 
113         /* If we have an infoSet */
114         if (myDeposit.getInfoSet() != null) {
115             /* Validate the InfoSet */
116             theInfoSet.validate(myDeposit.getInfoSet());
117         }
118 
119         /* Set validation flag */
120         if (!myDeposit.hasErrors()) {
121             myDeposit.setValidEdit();
122         }
123     }
124 
125     @Override
126     public void setDefaults(final MoneyWiseDeposit pDeposit) throws OceanusException {
127         /* Set values */
128         final MoneyWiseDepositList myList = pDeposit.getList();
129         pDeposit.setName(getUniqueName(myList, NAME_NEWACCOUNT));
130         pDeposit.setCategory(getDefaultCategory());
131         pDeposit.setAssetCurrency(getReportingCurrency());
132         pDeposit.setClosed(Boolean.FALSE);
133         autoCorrect(pDeposit);
134     }
135 
136     @Override
137     public void autoCorrect(final MoneyWiseDeposit pDeposit) throws OceanusException {
138         /* Ensure that we have a valid parent */
139         final MoneyWiseDepositCategoryClass myClass = pDeposit.getCategoryClass();
140         final MoneyWisePayee myParent = pDeposit.getParent();
141         if (myParent == null
142                 || !myParent.getCategoryClass().canParentDeposit(myClass)) {
143             pDeposit.setParent(getDefaultParent(pDeposit));
144         }
145 
146         /* autoCorrect the infoSet */
147         theInfoSet.autoCorrect(pDeposit.getInfoSet());
148     }
149 
150     /**
151      * Obtain default category for new deposit account.
152      *
153      * @return the default category
154      */
155     private MoneyWiseDepositCategory getDefaultCategory() {
156         /* loop through the categories */
157         final MoneyWiseDepositCategoryList myCategories
158                 = getEditSet().getDataList(MoneyWiseBasicDataType.DEPOSITCATEGORY, MoneyWiseDepositCategoryList.class);
159         final Iterator<MoneyWiseDepositCategory> myIterator = myCategories.iterator();
160         while (myIterator.hasNext()) {
161             final MoneyWiseDepositCategory myCategory = myIterator.next();
162 
163             /* Ignore deleted categories */
164             if (myCategory.isDeleted()) {
165                 continue;
166             }
167 
168             /* If the category is not a parent */
169             if (!myCategory.isCategoryClass(MoneyWiseDepositCategoryClass.PARENT)) {
170                 return myCategory;
171             }
172         }
173 
174         /* Return no category */
175         return null;
176     }
177 
178     /**
179      * Obtain default parent for new deposit.
180      *
181      * @param pDeposit the deposit
182      * @return the default parent
183      */
184     private MoneyWisePayee getDefaultParent(final MoneyWiseDeposit pDeposit) {
185         /* Access details */
186         final MoneyWisePayeeList myPayees = getEditSet().getDataList(MoneyWiseBasicDataType.PAYEE, MoneyWisePayeeList.class);
187         final MoneyWiseDepositCategoryClass myClass = pDeposit.getCategoryClass();
188 
189         /* loop through the payees */
190         final Iterator<MoneyWisePayee> myIterator = myPayees.iterator();
191         while (myIterator.hasNext()) {
192             final MoneyWisePayee myPayee = myIterator.next();
193 
194             /* Ignore deleted and closed payees */
195             if (myPayee.isDeleted() || Boolean.TRUE.equals(myPayee.isClosed())) {
196                 continue;
197             }
198 
199             /* If the payee can parent */
200             if (myPayee.getCategoryClass().canParentDeposit(myClass)) {
201                 return myPayee;
202             }
203         }
204 
205         /* Return no payee */
206         return null;
207     }
208 }