MoneyWiseValidateCash.java

/*
 * MoneyWise: Finance Application
 * Copyright 2012-2026. Tony Washer
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.  You may obtain a copy
 * of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package io.github.tonywasher.joceanus.moneywise.data.validate;

import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicDataType;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseBasicResource;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseCash;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseCash.MoneyWiseCashList;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseCashCategory;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseCashCategory.MoneyWiseCashCategoryList;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWiseDataValidator.MoneyWiseDataValidatorAutoCorrect;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee;
import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCashCategoryClass;
import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;
import io.github.tonywasher.joceanus.prometheus.views.PrometheusEditSet;

import java.util.Iterator;

/**
 * Validator for Cash.
 */
public class MoneyWiseValidateCash
        extends MoneyWiseValidateAccount<MoneyWiseCash>
        implements MoneyWiseDataValidatorAutoCorrect<MoneyWiseCash> {
    /**
     * New Account name.
     */
    private static final String NAME_NEWACCOUNT = MoneyWiseBasicResource.CASH_NEWACCOUNT.getValue();

    /**
     * The infoSet validator.
     */
    private final MoneyWiseValidateCashInfoSet theInfoSet;

    /**
     * Constructor.
     */
    MoneyWiseValidateCash() {
        theInfoSet = new MoneyWiseValidateCashInfoSet();
    }

    @Override
    public void setEditSet(final PrometheusEditSet pEditSet) {
        super.setEditSet(pEditSet);
        theInfoSet.storeEditSet(pEditSet);
    }

    @Override
    public void validate(final PrometheusDataItem pCash) {
        final MoneyWiseCash myCash = (MoneyWiseCash) pCash;
        final MoneyWisePayee myParent = myCash.getParent();
        final MoneyWiseCashCategory myCategory = myCash.getCategory();
        final MoneyWiseCurrency myCurrency = myCash.getAssetCurrency();

        /* Validate base components */
        super.validate(pCash);

        /* Category must be non-null */
        if (myCategory == null) {
            pCash.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.CATEGORY_NAME);
        } else if (myCategory.getCategoryTypeClass().isParentCategory()) {
            pCash.addError(ERROR_BADCATEGORY, MoneyWiseBasicResource.CATEGORY_NAME);
        }

        /* Parent must be null */
        if (myParent != null) {
            pCash.addError(PrometheusDataItem.ERROR_EXIST, MoneyWiseBasicResource.ASSET_PARENT);
        }

        /* Currency must be non-null and enabled */
        if (myCurrency == null) {
            pCash.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseStaticDataType.CURRENCY);
        } else if (!myCurrency.getEnabled()) {
            pCash.addError(PrometheusDataItem.ERROR_DISABLED, MoneyWiseStaticDataType.CURRENCY);
        }

        /* If we have an infoSet */
        if (myCash.getInfoSet() != null) {
            /* Validate the InfoSet */
            theInfoSet.validate(myCash.getInfoSet());
        }

        /* Set validation flag */
        if (!pCash.hasErrors()) {
            pCash.setValidEdit();
        }
    }

    @Override
    public void setDefaults(final MoneyWiseCash pCash) throws OceanusException {
        /* Set values */
        final MoneyWiseCashList myList = pCash.getList();
        pCash.setName(getUniqueName(myList, NAME_NEWACCOUNT));
        pCash.setCategory(getDefaultCategory());
        pCash.setAssetCurrency(getReportingCurrency());
        pCash.setClosed(Boolean.FALSE);
        autoCorrect(pCash);
    }

    @Override
    public void autoCorrect(final MoneyWiseCash pCash) throws OceanusException {
        /* autoCorrect the infoSet */
        theInfoSet.autoCorrect(pCash.getInfoSet());
    }

    /**
     * Obtain default category for new cash account.
     *
     * @return the default category
     */
    private MoneyWiseCashCategory getDefaultCategory() {
        /* loop through the categories */
        final MoneyWiseCashCategoryList myCategories
                = getEditSet().getDataList(MoneyWiseBasicDataType.CASHCATEGORY, MoneyWiseCashCategoryList.class);
        final Iterator<MoneyWiseCashCategory> myIterator = myCategories.iterator();
        while (myIterator.hasNext()) {
            final MoneyWiseCashCategory myCategory = myIterator.next();

            /* Ignore deleted categories */
            if (myCategory.isDeleted()) {
                continue;
            }

            /* If the category is not a parent */
            if (!myCategory.isCategoryClass(MoneyWiseCashCategoryClass.PARENT)) {
                return myCategory;
            }
        }

        /* Return no category */
        return null;
    }
}