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