MoneyWiseValidatePayee.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.MoneyWiseBasicResource;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee.MoneyWisePayeeDataMap;
import io.github.tonywasher.joceanus.moneywise.data.basic.MoneyWisePayee.MoneyWisePayeeList;
import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseCurrency;
import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePayeeClass;
import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePayeeType;
import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWisePayeeType.MoneyWisePayeeTypeList;
import io.github.tonywasher.joceanus.moneywise.data.statics.MoneyWiseStaticDataType;
import io.github.tonywasher.joceanus.prometheus.data.PrometheusDataItem;

import java.util.Iterator;

/**
 * Validator for Payee.
 */
public class MoneyWiseValidatePayee
        extends MoneyWiseValidateAccount<MoneyWisePayee> {
    /**
     * New Account name.
     */
    private static final String NAME_NEWACCOUNT = MoneyWiseBasicResource.PAYEE_NEWACCOUNT.getValue();

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

    /**
     * Constructor.
     */
    MoneyWiseValidatePayee() {
        theInfoSet = new MoneyWiseValidatePayeeInfoSet();
    }

    @Override
    public void validate(final PrometheusDataItem pPayee) {
        final MoneyWisePayee myPayee = (MoneyWisePayee) pPayee;
        final MoneyWisePayeeList myList = myPayee.getList();
        final MoneyWisePayeeType myPayeeType = myPayee.getCategory();
        final MoneyWisePayee myParent = myPayee.getParent();
        final MoneyWiseCurrency myCurrency = myPayee.getAssetCurrency();

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

        /* PayeeType must be non-null */
        if (myPayeeType == null) {
            pPayee.addError(PrometheusDataItem.ERROR_MISSING, MoneyWiseBasicResource.CATEGORY_NAME);
        } else {
            /* Access the class */
            final MoneyWisePayeeClass myClass = myPayeeType.getPayeeClass();

            /* PayeeType must be enabled */
            if (!myPayeeType.getEnabled()) {
                pPayee.addError(PrometheusDataItem.ERROR_DISABLED, MoneyWiseBasicResource.CATEGORY_NAME);
            }

            /* If the PayeeType is singular */
            if (myClass.isSingular()) {
                /* Count the elements of this class */
                final MoneyWisePayeeDataMap myMap = myList.getDataMap();
                if (!myMap.validSingularCount(myClass)) {
                    pPayee.addError(PrometheusDataItem.ERROR_MULT, MoneyWiseBasicResource.CATEGORY_NAME);
                }
            }
        }

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

        /* Currency must be null */
        if (myCurrency != null) {
            pPayee.addError(PrometheusDataItem.ERROR_EXIST, MoneyWiseStaticDataType.CURRENCY);
        }

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

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

    @Override
    public void setDefaults(final MoneyWisePayee pPayee) throws OceanusException {
        /* Set values */
        final MoneyWisePayeeList myList = pPayee.getList();
        pPayee.setCategory(getDefaultPayeeType());
        pPayee.setName(getUniqueName(myList, NAME_NEWACCOUNT));
        pPayee.setClosed(Boolean.FALSE);
    }

    @Override
    public void autoCorrect(final MoneyWisePayee pItem) throws OceanusException {
        theInfoSet.autoCorrect(pItem.getInfoSet());
    }

    /**
     * Obtain payee type for new payee account.
     *
     * @return the payee type
     */
    private MoneyWisePayeeType getDefaultPayeeType() {
        /* Access payee types */
        final MoneyWisePayeeTypeList myTypes
                = getEditSet().getDataList(MoneyWiseStaticDataType.PAYEETYPE, MoneyWisePayeeTypeList.class);

        /* loop through the payee types */
        final Iterator<MoneyWisePayeeType> myIterator = myTypes.iterator();
        while (myIterator.hasNext()) {
            final MoneyWisePayeeType myType = myIterator.next();

            /* Ignore deleted and singular types */
            if (!myType.isDeleted() && !myType.getPayeeClass().isSingular()) {
                return myType;
            }
        }

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