1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.metis.field.MetisFieldRequired;
21 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseAssetBase;
22 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
23 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
24 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataValidator.MoneyWiseDataValidatorAutoCorrect;
25 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee;
26 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee.MoneyWisePayeeList;
27 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurity;
28 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurity.MoneyWiseSecurityDataMap;
29 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurity.MoneyWiseSecurityList;
30 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurityHolding;
31 import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseSecurityInfoSet;
32 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseAccountInfoClass;
33 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
34 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePayeeClass;
35 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseSecurityClass;
36 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseSecurityType;
37 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseSecurityType.MoneyWiseSecurityTypeList;
38 import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
39 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
40 import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataResource;
41 import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;
42
43 import java.util.Iterator;
44
45
46
47
48 public class MoneyWiseValidateSecurity
49 extends MoneyWiseValidateAccount<MoneyWiseSecurity>
50 implements MoneyWiseDataValidatorAutoCorrect<MoneyWiseSecurity> {
51
52
53
54 private static final String NAME_NEWACCOUNT = MoneyWiseBasicResource.SECURITY_NEWACCOUNT.getValue();
55
56
57
58
59 private final MoneyWiseValidateSecurityInfoSet theInfoSet;
60
61
62
63
64 MoneyWiseValidateSecurity() {
65 theInfoSet = new MoneyWiseValidateSecurityInfoSet();
66 }
67
68 @Override
69 public void setEditSet(final PrometheusEditSet pEditSet) {
70 super.setEditSet(pEditSet);
71 theInfoSet.storeEditSet(pEditSet);
72 }
73
74 @Override
75 public void validate(final PrometheusDataItem pSecurity) {
76 final MoneyWiseSecurity mySecurity = (MoneyWiseSecurity) pSecurity;
77 final MoneyWiseSecurityList myList = mySecurity.getList();
78 final MoneyWisePayee myParent = mySecurity.getParent();
79 final MoneyWiseSecurityType mySecType = mySecurity.getCategory();
80 final MoneyWiseCurrency myCurrency = mySecurity.getAssetCurrency();
81 final String mySymbol = mySecurity.getSymbol();
82
83
84 super.validate(pSecurity);
85
86
87 if (mySecType == null) {
88 pSecurity.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.CATEGORY_NAME);
89 } else {
90
91 final MoneyWiseSecurityClass myClass = mySecType.getSecurityClass();
92
93
94 if (!mySecType.getEnabled()) {
95 pSecurity.addError(PrometheusDataItem.ERROR_DISABLED, MoneyWiseBasicResource.CATEGORY_NAME);
96 }
97
98
99 if (myClass.isSingular()) {
100
101 final MoneyWiseSecurityDataMap myMap = myList.getDataMap();
102 if (!myMap.validSingularCount(myClass)) {
103 pSecurity.addError(PrometheusDataItem.ERROR_MULT, MoneyWiseBasicResource.CATEGORY_NAME);
104 }
105 }
106 }
107
108
109 if (myCurrency == null) {
110 pSecurity.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseStaticDataType.CURRENCY);
111 } else if (!myCurrency.getEnabled()) {
112 pSecurity.addError(PrometheusDataItem.ERROR_DISABLED, MoneyWiseStaticDataType.CURRENCY);
113 }
114
115
116 if (myParent == null) {
117 pSecurity.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.ASSET_PARENT);
118 } else {
119
120 if (!mySecurity.isClosed() && Boolean.TRUE.equals(myParent.isClosed())) {
121 pSecurity.addError(ERROR_PARCLOSED, MoneyWiseBasicResource.ASSET_CLOSED);
122 }
123
124
125 if (mySecType != null) {
126
127 final MoneyWiseSecurityClass myClass = mySecType.getSecurityClass();
128 final MoneyWisePayeeClass myParClass = myParent.getCategoryClass();
129
130
131 if (!myParClass.canParentSecurity(myClass)) {
132 pSecurity.addError(ERROR_BADPARENT, MoneyWiseBasicResource.ASSET_PARENT);
133 }
134 }
135 }
136
137
138 if (mySecType != null) {
139
140 if (mySecType.getSecurityClass().needsSymbol()) {
141 if (mySymbol == null) {
142 pSecurity.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseSecurityInfoSet.getFieldForClass(MoneyWiseAccountInfoClass.SYMBOL));
143 } else if (!myList.validSymbolCount(mySymbol)) {
144 pSecurity.addError(PrometheusDataItem.ERROR_DUPLICATE, MoneyWiseSecurityInfoSet.getFieldForClass(MoneyWiseAccountInfoClass.SYMBOL));
145 }
146 } else if (mySymbol != null) {
147 pSecurity.addError(PrometheusDataItem.ERROR_EXIST, MoneyWiseSecurityInfoSet.getFieldForClass(MoneyWiseAccountInfoClass.SYMBOL));
148 }
149 }
150
151
152 if (mySecurity.getInfoSet() != null) {
153
154 theInfoSet.validate(mySecurity.getInfoSet());
155 }
156
157
158 if (!pSecurity.hasErrors()) {
159 pSecurity.setValidEdit();
160 }
161 }
162
163 @Override
164 public void validateName(final MoneyWiseAssetBase pSecurity,
165 final String pName) {
166
167 super.validateName(pSecurity, pName);
168
169
170 if (pName.equals(MoneyWiseSecurityHolding.SECURITYHOLDING_NEW)
171 || pName.equals(MoneyWiseValidatePortfolio.NAME_CASHACCOUNT)) {
172 pSecurity.addError(ERROR_RESERVED, PrometheusDataResource.DATAITEM_FIELD_NAME);
173 }
174 }
175
176
177
178
179
180
181
182 public MetisFieldRequired isClassRequired(final MoneyWiseAccountInfoClass pClass) {
183 return theInfoSet.isClassRequired(pClass);
184 }
185
186 @Override
187 public void setDefaults(final MoneyWiseSecurity pSecurity) throws OceanusException {
188
189 final MoneyWiseSecurityList myList = pSecurity.getList();
190 pSecurity.setName(getUniqueName(myList, NAME_NEWACCOUNT));
191 pSecurity.setCategory(getDefaultSecurityType());
192 pSecurity.setAssetCurrency(getReportingCurrency());
193 pSecurity.setSymbol(pSecurity.getName());
194 pSecurity.setClosed(Boolean.FALSE);
195 autoCorrect(pSecurity);
196 }
197
198 @Override
199 public void autoCorrect(final MoneyWiseSecurity pSecurity) throws OceanusException {
200
201 final MoneyWiseSecurityClass myClass = pSecurity.getCategoryClass();
202 final MoneyWisePayee myParent = pSecurity.getParent();
203
204
205 if (myParent == null
206 || myParent.getCategoryClass().canParentSecurity(myClass)) {
207 pSecurity.setParent(getDefaultParent(pSecurity));
208 }
209
210
211 theInfoSet.autoCorrect(pSecurity.getInfoSet());
212 }
213
214
215
216
217
218
219 private MoneyWiseSecurityType getDefaultSecurityType() {
220
221 final MoneyWiseSecurityTypeList myTypes
222 = getEditSet().getDataList(MoneyWiseStaticDataType.SECURITYTYPE, MoneyWiseSecurityTypeList.class);
223 final Iterator<MoneyWiseSecurityType> myIterator = myTypes.iterator();
224 while (myIterator.hasNext()) {
225 final MoneyWiseSecurityType myType = myIterator.next();
226
227
228 if (!myType.isDeleted()) {
229 return myType;
230 }
231 }
232
233
234 return null;
235 }
236
237
238
239
240
241
242
243 private MoneyWisePayee getDefaultParent(final MoneyWiseSecurity pSecurity) {
244
245 final MoneyWisePayeeList myPayees = getEditSet().getDataList(MoneyWiseBasicDataType.PAYEE, MoneyWisePayeeList.class);
246 final MoneyWiseSecurityClass myClass = pSecurity.getCategoryClass();
247
248
249 final Iterator<MoneyWisePayee> myIterator = myPayees.iterator();
250 while (myIterator.hasNext()) {
251 final MoneyWisePayee myPayee = myIterator.next();
252
253
254 if (myPayee.isDeleted() || Boolean.TRUE.equals(myPayee.isClosed())) {
255 continue;
256 }
257
258
259 if (myPayee.getCategoryClass().canParentSecurity(myClass)) {
260 return myPayee;
261 }
262 }
263
264
265 return null;
266 }
267 }