org.efaps.esjp.accounting.transaction.Action_Base.java Source code

Java tutorial

Introduction

Here is the source code for org.efaps.esjp.accounting.transaction.Action_Base.java

Source

/*
 * Copyright 2003 - 2016 The eFaps Team
 *
 * 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 org.efaps.esjp.accounting.transaction;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.efaps.admin.datamodel.Status;
import org.efaps.admin.event.Parameter;
import org.efaps.admin.event.Return;
import org.efaps.admin.program.esjp.EFapsApplication;
import org.efaps.admin.program.esjp.EFapsUUID;
import org.efaps.ci.CIType;
import org.efaps.db.AttributeQuery;
import org.efaps.db.CachedPrintQuery;
import org.efaps.db.Context;
import org.efaps.db.Insert;
import org.efaps.db.Instance;
import org.efaps.db.InstanceQuery;
import org.efaps.db.MultiPrintQuery;
import org.efaps.db.PrintQuery;
import org.efaps.db.QueryBuilder;
import org.efaps.db.SelectBuilder;
import org.efaps.esjp.accounting.Label;
import org.efaps.esjp.accounting.Period;
import org.efaps.esjp.accounting.util.Accounting.ActDef2Case4DocConfig;
import org.efaps.esjp.accounting.util.Accounting.ActDef2Case4IncomingConfig;
import org.efaps.esjp.accounting.util.Accounting.ArchiveConfig;
import org.efaps.esjp.ci.CIAccounting;
import org.efaps.esjp.ci.CIERP;
import org.efaps.esjp.ci.CISales;
import org.efaps.esjp.common.parameter.ParameterUtil;
import org.efaps.esjp.common.uiform.Field;
import org.efaps.esjp.db.InstanceUtils;
import org.efaps.esjp.erp.CurrencyInst;
import org.efaps.esjp.sales.PriceUtil;
import org.efaps.util.EFapsException;
import org.joda.time.DateTime;

/**
 * TODO comment!.
 *
 * @author The eFaps Team
 */
@EFapsUUID("ca033fa0-4682-49b8-aa4a-6efdeef44dbe")
@EFapsApplication("eFapsApp-Accounting")
public abstract class Action_Base {

    /**
     * Insert positions.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _transactionInstance Instance of the Transaction the position will
     *            be connected to
     * @param _instAction Instance of the Action defining the positions
     * @param _amount Amount of the position
     * @param _rateCurrInst Instance of the Currency for the amount
     * @throws EFapsException on error
     */
    public void insertPositions(final Parameter _parameter, final Instance _transactionInstance,
            final Instance _instAction, final BigDecimal _amount, final Instance _rateCurrInst)
            throws EFapsException {
        final Instance periodInst = getPeriodInstance(_parameter, _transactionInstance);

        final CurrencyInst periodCurInst = new Period().getCurrency(periodInst);
        final CurrencyInst rateCurInst = new CurrencyInst(_rateCurrInst);

        final QueryBuilder attrQueryBldr = new QueryBuilder(CIAccounting.CasePayroll);
        attrQueryBldr.addWhereAttrEqValue(CIAccounting.CasePayroll.PeriodAbstractLink, periodInst.getId());
        final AttributeQuery attrQuery = attrQueryBldr.getAttributeQuery(CIAccounting.CasePayroll.ID);

        final QueryBuilder attrQueryBldr2 = new QueryBuilder(CIAccounting.ActionDefinition2Case);
        attrQueryBldr2.addWhereAttrEqValue(CIAccounting.ActionDefinition2Case.FromLinkAbstract,
                _instAction.getId());
        attrQueryBldr2.addWhereAttrInQuery(CIAccounting.ActionDefinition2Case.ToLinkAbstract, attrQuery);
        final AttributeQuery attrQuery2 = attrQueryBldr2
                .getAttributeQuery(CIAccounting.ActionDefinition2Case.ToLinkAbstract);

        final QueryBuilder queryBldr = new QueryBuilder(CIAccounting.Account2CaseAbstract);
        queryBldr.addWhereAttrInQuery(CIAccounting.Account2CaseAbstract.ToCaseAbstractLink, attrQuery2);
        final MultiPrintQuery multi = queryBldr.getPrint();
        multi.addAttribute(CIAccounting.Account2CaseAbstract.Numerator,
                CIAccounting.Account2CaseAbstract.Denominator);
        final SelectBuilder selAccountInst = new SelectBuilder()
                .linkto(CIAccounting.Account2CaseAbstract.FromAccountAbstractLink).instance();
        multi.addSelect(selAccountInst);
        multi.execute();

        while (multi.next()) {
            final Instance accountInst = multi.<Instance>getSelect(selAccountInst);
            final BigDecimal numerator = new BigDecimal(
                    multi.<Integer>getAttribute(CIAccounting.Account2CaseAbstract.Numerator));
            final BigDecimal denominator = new BigDecimal(
                    multi.<Integer>getAttribute(CIAccounting.Account2CaseAbstract.Denominator));

            CIType type = null;
            boolean isDebitTrans = false;
            if (multi.getCurrentInstance().getType().isKindOf(CIAccounting.Account2CaseCredit.getType())) {
                type = CIAccounting.TransactionPositionCredit;
                isDebitTrans = false;
            } else if (multi.getCurrentInstance().getType().isKindOf(CIAccounting.Account2CaseDebit.getType())) {
                type = CIAccounting.TransactionPositionDebit;
                isDebitTrans = true;
            }
            if (type != null) {

                final PriceUtil util = new PriceUtil();
                final BigDecimal[] rates = util.getRates(getExchangeDate(_parameter, _transactionInstance),
                        periodCurInst.getInstance(), rateCurInst.getInstance());

                final Object[] rateObj = new Object[] { rateCurInst.isInvert() ? BigDecimal.ONE : rates[3],
                        rateCurInst.isInvert() ? rates[3] : BigDecimal.ONE };

                final BigDecimal rate = ((BigDecimal) rateObj[0]).divide((BigDecimal) rateObj[1], 12,
                        BigDecimal.ROUND_HALF_UP);
                final BigDecimal rateAmount = _amount.abs().setScale(8, BigDecimal.ROUND_HALF_UP);
                final BigDecimal amount = rateAmount.divide(rate, 12, BigDecimal.ROUND_HALF_UP);

                final BigDecimal rateAmount2 = rateAmount
                        .multiply(numerator.divide(denominator, 8, BigDecimal.ROUND_HALF_UP));
                final BigDecimal amount2 = amount
                        .multiply(numerator.divide(denominator, 8, BigDecimal.ROUND_HALF_UP));

                final Insert posInsert = new Insert(type);
                posInsert.add(CIAccounting.TransactionPositionAbstract.TransactionLink,
                        _transactionInstance.getId());
                posInsert.add(CIAccounting.TransactionPositionAbstract.AccountLink, accountInst.getId());
                posInsert.add(CIAccounting.TransactionPositionAbstract.CurrencyLink,
                        periodCurInst.getInstance().getId());
                posInsert.add(CIAccounting.TransactionPositionAbstract.RateCurrencyLink,
                        rateCurInst.getInstance().getId());
                posInsert.add(CIAccounting.TransactionPositionAbstract.Rate, rateObj);
                posInsert.add(CIAccounting.TransactionPositionAbstract.RateAmount,
                        isDebitTrans ? rateAmount2.negate() : rateAmount2);
                posInsert.add(CIAccounting.TransactionPositionAbstract.Amount,
                        isDebitTrans ? amount2.negate() : amount2);
                posInsert.execute();
            }
        }
    }

    /**
     * Gets the period instance.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _transactionInstance the transaction instance
     * @return the period instance
     * @throws EFapsException on error
     */
    protected Instance getPeriodInstance(final Parameter _parameter, final Instance _transactionInstance)
            throws EFapsException {
        final PrintQuery print = new PrintQuery(_transactionInstance);
        final SelectBuilder sel = new SelectBuilder().linkto(CIAccounting.TransactionAbstract.PeriodLink)
                .instance();
        print.addSelect(sel);
        print.executeWithoutAccessCheck();
        return print.<Instance>getSelect(sel);
    }

    /**
     * Gets the exchange date.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _transactionInstance the transaction instance
     * @return the exchange date
     * @throws EFapsException on error
     */
    protected DateTime getExchangeDate(final Parameter _parameter, final Instance _transactionInstance)
            throws EFapsException {
        final PrintQuery print = new PrintQuery(_transactionInstance);
        print.addAttribute(CIAccounting.TransactionAbstract.Date);
        print.executeWithoutAccessCheck();
        return print.<DateTime>getAttribute(CIAccounting.TransactionAbstract.Date);
    }

    /**
     * Create4 external.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _actionRelInst relation Instance
     * @throws EFapsException on error
     */
    public void create4External(final Parameter _parameter, final Instance _actionRelInst) throws EFapsException {
        final IncomingActionDef def = evalActionDef4Incoming(_parameter, _actionRelInst);
        if (def.isExecute()) {
            final Create create = new Create();
            create.create4ExternalMassive(def.getParameter());
            create.connectDocs2PurchaseRecord(def.getParameter(),
                    Instance.get(def.getParameter().getParameterValue("document")));
        }
    }

    /**
     * Eval action def4 incoming.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _actionRelInst relation Instance
     * @return the incoming action def
     * @throws EFapsException on error
     */
    protected IncomingActionDef evalActionDef4Incoming(final Parameter _parameter, final Instance _actionRelInst)
            throws EFapsException {
        final IncomingActionDef ret = getIncomingActionDef(_parameter);

        final PrintQuery print = new PrintQuery(_actionRelInst);
        final SelectBuilder selActionInst = SelectBuilder.get()
                .linkto(CIERP.ActionDefinition2DocumentAbstract.FromLinkAbstract).instance();
        final SelectBuilder selDocInst = SelectBuilder.get()
                .linkto(CIERP.ActionDefinition2DocumentAbstract.ToLinkAbstract).instance();
        final SelectBuilder selDocTypeInst = SelectBuilder.get()
                .linkto(CIERP.ActionDefinition2DocumentAbstract.ToLinkAbstract)
                .linkfrom(CIERP.Document2DocumentTypeAbstract.DocumentLinkAbstract)
                .linkto(CIERP.Document2DocumentTypeAbstract.DocumentTypeLinkAbstract).instance();
        final SelectBuilder selDocDate = SelectBuilder.get()
                .linkto(CIERP.ActionDefinition2DocumentAbstract.ToLinkAbstract)
                .attribute(CIERP.DocumentAbstract.Date);
        print.addSelect(selActionInst, selDocInst, selDocTypeInst, selDocDate);
        print.addAttribute(CIERP.ActionDefinition2DocumentAbstract.Date);
        print.execute();

        final DateTime acdDate = print.getAttribute(CIERP.ActionDefinition2DocumentAbstract.Date);
        if (acdDate != null) {
            ParameterUtil.setParameterValues(ret.getParameter(), "date", acdDate.toString());
        }
        ret.setActionInst(print.<Instance>getSelect(selActionInst));
        ret.setDocInst(print.<Instance>getSelect(selDocInst));
        ret.setDocTypeInst(print.<Instance>getSelect(selDocTypeInst));

        final QueryBuilder queryBldr = new QueryBuilder(CIAccounting.ActionDefinition2Case4IncomingAbstract);
        queryBldr.addWhereAttrEqValue(CIAccounting.ActionDefinition2Case4IncomingAbstract.FromLinkAbstract,
                ret.getActionInst());
        final MultiPrintQuery multi = queryBldr.getPrint();
        final SelectBuilder selCaseInst = SelectBuilder.get()
                .linkto(CIAccounting.ActionDefinition2Case4IncomingAbstract.ToLinkAbstract).instance();

        final SelectBuilder selLabelInst = SelectBuilder.get()
                .linkto(CIAccounting.ActionDefinition2Case4IncomingAbstract.LabelLink).instance();
        multi.addSelect(selCaseInst, selLabelInst);
        multi.addAttribute(CIAccounting.ActionDefinition2Case4IncomingAbstract.Config);
        multi.execute();
        while (multi.next()) {
            final List<ActDef2Case4IncomingConfig> configs = multi
                    .getAttribute(CIAccounting.ActionDefinition2Case4IncomingAbstract.Config);
            if (configs != null) {

                final Instance caseInst = multi.getSelect(selCaseInst);
                DateTime periodDate = null;
                if (multi.getInstanceList().size() > 1) {
                    if (configs.contains(ActDef2Case4DocConfig.PERIOD4ACTIONDATE)) {
                        periodDate = acdDate == null ? new DateTime() : acdDate;
                    } else if (configs.contains(ActDef2Case4DocConfig.PERIOD4DOCDATE)) {
                        periodDate = print.getSelect(selDocDate);
                    }
                }
                final Instance periodInst = evalSelectedPeriod(_parameter, caseInst, periodDate);
                if (InstanceUtils.isValid(periodInst)) {
                    boolean execute = true;
                    // for pettyCash receipt evaluation if legal document or not
                    if (ret.getDocInst().getType().isKindOf(CISales.PettyCashReceipt)) {
                        if (ret.getDocTypeInst() == null) {
                            execute = configs.contains(ActDef2Case4IncomingConfig.WITHOUTDOC);
                        } else {
                            execute = !configs.contains(ActDef2Case4IncomingConfig.WITHOUTDOC);
                        }
                    } else if (ret.getDocInst().getType().isKindOf(CISales.FundsToBeSettledReceipt)) {
                        if (ret.getDocTypeInst() == null) {
                            execute = configs.contains(ActDef2Case4IncomingConfig.WITHOUTDOC);
                        } else {
                            execute = !configs.contains(ActDef2Case4IncomingConfig.WITHOUTDOC);
                        }
                    }
                    if (execute) {
                        final Instance labelInst = multi.getSelect(selLabelInst);
                        if (labelInst != null && labelInst.isValid()) {
                            final List<Instance> labels = new Label().getLabelInst4Documents(_parameter,
                                    ret.getDocInst());
                            if (labels.contains(labelInst)) {
                                ret.setConfigs(configs);
                                ret.setCaseInst(caseInst);
                                break;
                            }
                        } else {
                            ret.setConfigs(configs);
                            ret.setCaseInst(caseInst);
                        }
                        break;
                    }
                }
            }
        }

        if (ret.getCaseInst() != null && ret.getCaseInst().isValid()) {
            ret.setExecute(true);
            if (ret.getConfigs().contains(ActDef2Case4IncomingConfig.PURCHASERECORD)) {
                final DateTime date = new DateTime();
                final QueryBuilder prQueryBldr = new QueryBuilder(CIAccounting.PurchaseRecord);
                prQueryBldr.addWhereAttrLessValue(CIAccounting.PurchaseRecord.Date, date.plusDays(1));
                prQueryBldr.addWhereAttrGreaterValue(CIAccounting.PurchaseRecord.DueDate, date.minusDays(1));
                prQueryBldr.addWhereAttrEqValue(CIAccounting.PurchaseRecord.Status,
                        Status.find(CIAccounting.PurchaseRecordStatus.Open));
                final InstanceQuery prQuery = prQueryBldr.getQuery();
                prQuery.execute();
                if (prQuery.next()) {
                    ParameterUtil.setParameterValues(ret.getParameter(), "purchaseRecord",
                            prQuery.getCurrentValue().getOid());
                }
            }
            if (ret.getConfigs().contains(ActDef2Case4IncomingConfig.TRANSACTION)) {
                ParameterUtil.setParameterValues(ret.getParameter(), "case", ret.getCaseInst().getOid());
                ParameterUtil.setParameterValues(ret.getParameter(), "document", ret.getDocInst().getOid());
                if (ret.getConfigs().contains(ActDef2Case4IncomingConfig.SUBJOURNAL)) {
                    final QueryBuilder sjQueryBldr = new QueryBuilder(CIAccounting.Report2Case);
                    sjQueryBldr.addWhereAttrEqValue(CIAccounting.Report2Case.ToLink, ret.getCaseInst());
                    final MultiPrintQuery sjMulti = sjQueryBldr.getPrint();
                    final SelectBuilder sel = new SelectBuilder().linkto(CIAccounting.Report2Case.FromLink).oid();
                    sjMulti.addSelect(sel);
                    sjMulti.execute();
                    if (sjMulti.next()) {
                        ParameterUtil.setParameterValues(ret.getParameter(), "subJournal",
                                sjMulti.<String>getSelect(sel));
                    }
                }
                if (ret.getConfigs().contains(ActDef2Case4IncomingConfig.SETSTATUS)) {
                    ParameterUtil.setParameterValues(ret.getParameter(), "archiveConfig",
                            Integer.toString(ArchiveConfig.ARCHIVED.getInt()));
                }
            }
        }
        return ret;
    }

    /**
     * Create4 petty cash receipt.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _actionRelInst relation Instance
     * @throws EFapsException on error
     */
    public void create4PettyCashReceipt(final Parameter _parameter, final Instance _actionRelInst)
            throws EFapsException {
        final IncomingActionDef def = evalActionDef4Incoming(_parameter, _actionRelInst);
        if (def.isExecute()) {
            final Create create = new Create();
            create.create4PettyCashMassive(def.getParameter());
            create.connectDocs2PurchaseRecord(def.getParameter(),
                    Instance.get(def.getParameter().getParameterValue("document")));
        }
    }

    /**
     * Create4 funds to be settled receipt.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _actionRelInst relation Instance
     * @throws EFapsException on error
     */
    public void create4FundsToBeSettledReceipt(final Parameter _parameter, final Instance _actionRelInst)
            throws EFapsException {
        final IncomingActionDef def = evalActionDef4Incoming(_parameter, _actionRelInst);
        if (def.isExecute()) {
            final Create create = new Create();
            create.create4FundsToBeSettledMassive(def.getParameter());
            create.connectDocs2PurchaseRecord(def.getParameter(),
                    Instance.get(def.getParameter().getParameterValue("document")));
        }
    }

    /**
     * Create4 incoming exchange.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _actionRelInst relation Instance
     * @throws EFapsException on error
     */
    public void create4IncomingExchange(final Parameter _parameter, final Instance _actionRelInst)
            throws EFapsException {
        final DocActionDef def = evalActionDef4Doc(_parameter, _actionRelInst);
        if (def.isExecute()) {
            final Create create = new Create();
            create.create4ExternalMassive(def.getParameter());
        }
    }

    /**
     * Create4 doc.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _actionRelInst relation Instance
     * @throws EFapsException on error
     */
    public void create4Doc(final Parameter _parameter, final Instance _actionRelInst) throws EFapsException {
        final DocActionDef def = evalActionDef4Doc(_parameter, _actionRelInst);
        if (def.isExecute()) {
            final Create create = new Create();
            create.create4DocMassive(def.getParameter());
        }
    }

    /**
     * Eval action def4 doc.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _actionRelInst the action rel inst
     * @return the doc action def
     * @throws EFapsException on error
     */
    protected DocActionDef evalActionDef4Doc(final Parameter _parameter, final Instance _actionRelInst)
            throws EFapsException {
        final DocActionDef ret = getDocActionDef(_parameter);
        final PrintQuery print = new PrintQuery(_actionRelInst);
        final SelectBuilder selActionInst = SelectBuilder.get()
                .linkto(CIERP.ActionDefinition2DocumentAbstract.FromLinkAbstract).instance();
        final SelectBuilder selDocInst = SelectBuilder.get()
                .linkto(CIERP.ActionDefinition2DocumentAbstract.ToLinkAbstract).instance();
        final SelectBuilder selDocDate = SelectBuilder.get()
                .linkto(CIERP.ActionDefinition2DocumentAbstract.ToLinkAbstract)
                .attribute(CIERP.DocumentAbstract.Date);
        print.addAttribute(CIERP.ActionDefinition2DocumentAbstract.Date);
        print.addSelect(selActionInst, selDocInst, selDocDate);
        print.execute();

        final DateTime acdDate = print.getAttribute(CIERP.ActionDefinition2DocumentAbstract.Date);
        if (acdDate != null) {
            ParameterUtil.setParameterValues(ret.getParameter(), "date", acdDate.toString());
        }

        ret.setActionInst(print.<Instance>getSelect(selActionInst));
        ret.setDocInst(print.<Instance>getSelect(selDocInst));
        final QueryBuilder queryBldr = new QueryBuilder(CIAccounting.ActionDefinition2Case4DocAbstract);
        queryBldr.addWhereAttrEqValue(CIAccounting.ActionDefinition2Case4DocAbstract.FromLinkAbstract,
                ret.getActionInst());
        final MultiPrintQuery multi = queryBldr.getPrint();
        final SelectBuilder selCaseInst = SelectBuilder.get()
                .linkto(CIAccounting.ActionDefinition2Case4DocAbstract.ToLinkAbstract).instance();
        final SelectBuilder selLabelInst = SelectBuilder.get()
                .linkto(CIAccounting.ActionDefinition2Case4IncomingAbstract.LabelLink).instance();
        multi.addSelect(selCaseInst, selLabelInst);
        multi.addAttribute(CIAccounting.ActionDefinition2Case4DocAbstract.Config);
        multi.execute();
        while (multi.next()) {
            final List<ActDef2Case4DocConfig> configs = multi
                    .getAttribute(CIAccounting.ActionDefinition2Case4DocAbstract.Config);
            if (configs != null) {
                DateTime periodDate = null;
                if (multi.getInstanceList().size() > 1) {
                    if (configs.contains(ActDef2Case4DocConfig.PERIOD4ACTIONDATE)) {
                        periodDate = acdDate == null ? new DateTime() : acdDate;
                    } else if (configs.contains(ActDef2Case4DocConfig.PERIOD4DOCDATE)) {
                        periodDate = print.getSelect(selDocDate);
                    }
                }
                final Instance caseInst = multi.getSelect(selCaseInst);
                if (InstanceUtils.isValid(evalSelectedPeriod(_parameter, caseInst, periodDate))) {
                    ret.getConfigs().addAll(configs);
                    // force the correct period by evaluating it now
                    ret.setExecute(true);
                    final Instance labelInst = multi.getSelect(selLabelInst);
                    if (labelInst != null && labelInst.isValid()) {
                        final List<Instance> labels = new Label().getLabelInst4Documents(_parameter,
                                ret.getDocInst());
                        if (labels.contains(labelInst)) {
                            ret.setConfigs(configs);
                            ret.setCaseInst(caseInst);
                            break;
                        }
                    } else {
                        ret.setConfigs(configs);
                        ret.setCaseInst(caseInst);
                    }
                    break;
                }
            }
        }
        if (ret.getCaseInst() != null && ret.getCaseInst().isValid()) {
            ParameterUtil.setParameterValues(ret.getParameter(), "document", ret.getDocInst().getOid());
            if (ret.getConfigs().contains(ActDef2Case4DocConfig.TRANSACTION)) {
                ParameterUtil.setParameterValues(ret.getParameter(), "case", ret.getCaseInst().getOid());
                if (ret.getConfigs().contains(ActDef2Case4DocConfig.SUBJOURNAL)) {
                    final QueryBuilder sjQueryBldr = new QueryBuilder(CIAccounting.Report2Case);
                    sjQueryBldr.addWhereAttrEqValue(CIAccounting.Report2Case.ToLink, ret.getCaseInst());
                    final MultiPrintQuery sjMulti = sjQueryBldr.getPrint();
                    final SelectBuilder sel = new SelectBuilder().linkto(CIAccounting.Report2Case.FromLink).oid();
                    sjMulti.addSelect(sel);
                    sjMulti.execute();
                    if (sjMulti.next()) {
                        ParameterUtil.setParameterValues(ret.getParameter(), "subJournal",
                                sjMulti.<String>getSelect(sel));
                    }
                }
            }
            if (ret.getConfigs().contains(ActDef2Case4DocConfig.MARKBOOKED)) {
                ParameterUtil.setParameterValues(ret.getParameter(), "archiveConfig",
                        Integer.toString(ArchiveConfig.ARCHIVED.getInt()));
            }
        }
        return ret;
    }

    /**
     * Eval selected period.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _caseInst the case inst
     * @param _periodDate the period date
     * @return the instance
     * @throws EFapsException on error
     */
    protected Instance evalSelectedPeriod(final Parameter _parameter, final Instance _caseInst,
            final DateTime _periodDate) throws EFapsException {
        Context.getThreadContext().setRequestAttribute(Period.REQKEY4CUR, null);
        final Instance periodInst = new Period().evaluateCurrentPeriod(_parameter, _caseInst);
        boolean eval;
        if (_periodDate != null) {
            final PrintQuery periodPrint = CachedPrintQuery.get4Request(periodInst);
            periodPrint.addAttribute(CIAccounting.Period.FromDate, CIAccounting.Period.ToDate);
            periodPrint.execute();
            final DateTime fromDate = periodPrint.getAttribute(CIAccounting.Period.FromDate);
            final DateTime toDate = periodPrint.getAttribute(CIAccounting.Period.ToDate);
            eval = fromDate.minusMinutes(1).isBefore(_periodDate) && toDate.plusMinutes(1).isAfter(_periodDate);
        } else {
            eval = true;
        }
        return eval ? periodInst : null;
    }

    /**
     * Create4 others pay.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _actionRelInst the action rel inst
     * @throws EFapsException on error
     */
    public void create4OthersPay(final Parameter _parameter, final Instance _actionRelInst) throws EFapsException {
        final DocActionDef def = evalActionDef4Doc(_parameter, _actionRelInst);
        if (def.isExecute()) {
            final Create create = new Create();
            if (def.getConfigs().contains(ActDef2Case4DocConfig.TRANSACTION)) {
                create.create4OthersPayMassiv(def.getParameter());
            } else if (def.getConfigs().contains(ActDef2Case4DocConfig.MARKBOOKED)) {
                create.markDocs4ArchiveConfig(_parameter, def.getDocInst());
            }
        }
    }

    /**
     * Create4 others collect.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @param _actionRelInst the action rel inst
     * @throws EFapsException on error
     */
    public void create4OthersCollect(final Parameter _parameter, final Instance _actionRelInst)
            throws EFapsException {
        final DocActionDef def = evalActionDef4Doc(_parameter, _actionRelInst);
        if (def.isExecute()) {
            final Create create = new Create();
            if (def.getConfigs().contains(ActDef2Case4DocConfig.TRANSACTION)) {
                create.create4OthersCollectMassive(def.getParameter());
            } else if (def.getConfigs().contains(ActDef2Case4DocConfig.MARKBOOKED)) {
                create.markDocs4ArchiveConfig(_parameter, def.getDocInst());
            }
        }
    }

    /**
     * Gets the doc action def.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @return the doc action def
     */
    protected DocActionDef getDocActionDef(final Parameter _parameter) {
        final DocActionDef ret = new DocActionDef();
        ret.setParameter(ParameterUtil.clone(_parameter, (Object) null));
        return ret;
    }

    /**
     * Gets the incoming action def.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @return the incoming action def
     */
    protected IncomingActionDef getIncomingActionDef(final Parameter _parameter) {
        final IncomingActionDef ret = new IncomingActionDef();
        ret.setParameter(ParameterUtil.clone(_parameter, (Object) null));
        return ret;
    }

    /**
     * Gets the label ui field value.
     *
     * @param _parameter Parameter as passed by the eFaps API
     * @return the label ui field value
     * @throws EFapsException on error
     */
    public Return getLabelUIFieldValue(final Parameter _parameter) throws EFapsException {
        final Field field = new Field() {
            @Override
            protected void add2QueryBuilder4List(final Parameter _parameter, final QueryBuilder _queryBldr)
                    throws EFapsException {
                super.add2QueryBuilder4List(_parameter, _queryBldr);
                _queryBldr.addWhereAttrEqValue(CIAccounting.Label.PeriodAbstractLink,
                        new Period().evaluateCurrentPeriod(_parameter));
            }
        };
        return field.dropDownFieldValue(_parameter);
    }

    /**
     * The Class AbstractActionDef.
     *
     * @author The eFaps Team
     */
    public abstract static class AbstractActionDef {

        /** The doc type inst. */
        private Instance docTypeInst;

        /**
         * Parameter used to simulate the forms.
         */
        private Parameter parameter;

        /**
         * Instance of the action.
         */
        private Instance actionInst;

        /**
         * Instance of the document.
         */
        private Instance docInst;

        /**
         * Instance of the document.
         */
        private Instance caseInst;

        /** The execute. */
        private boolean execute;

        /**
         * Getter method for the instance variable {@link #_parameter}.
         *
         * @return value of instance variable {@link #_parameter}
         */
        public Parameter getParameter() {
            return this.parameter;
        }

        /**
         * Setter method for instance variable {@link #_parameter}.
         *
         * @param _parameter the new parameter used to simulate the forms
         */
        public void setParameter(final Parameter _parameter) {
            //an action is for every document therfore one transaction wanted
            if (_parameter.getParameterValue("oneTransPerDoc") == null) {
                ParameterUtil.setParameterValues(_parameter, "oneTransPerDoc", "true");
            }
            //an action is inserted in the moment of the execution. therefor use the transaction date
            if (_parameter.getParameterValue("useDate") == null) {
                ParameterUtil.setParameterValues(_parameter, "useDate", "true");
            }
            this.parameter = _parameter;
        }

        /**
         * Getter method for the instance variable {@link #actionInst}.
         *
         * @return value of instance variable {@link #actionInst}
         */
        public Instance getActionInst() {
            return this.actionInst;
        }

        /**
         * Getter method for the instance variable {@link #docInst}.
         *
         * @return value of instance variable {@link #docInst}
         */
        public Instance getDocInst() {
            return this.docInst;
        }

        /**
         * Setter method for instance variable {@link #actionInst}.
         *
         * @param _actionInst value for instance variable {@link #actionInst}
         */
        public void setActionInst(final Instance _actionInst) {
            this.actionInst = _actionInst;
        }

        /**
         * Setter method for instance variable {@link #docInst}.
         *
         * @param _docInst value for instance variable {@link #docInst}
         */
        public void setDocInst(final Instance _docInst) {
            this.docInst = _docInst;
        }

        /**
         * Getter method for the instance variable {@link #docTypeInst}.
         *
         * @return value of instance variable {@link #docTypeInst}
         */
        public Instance getDocTypeInst() {
            return this.docTypeInst;
        }

        /**
         * Setter method for instance variable {@link #docTypeInst}.
         *
         * @param _docTypeInst value for instance variable {@link #docTypeInst}
         */
        public void setDocTypeInst(final Instance _docTypeInst) {
            this.docTypeInst = _docTypeInst;
        }

        /**
         * Getter method for the instance variable {@link #caseInst}.
         *
         * @return value of instance variable {@link #caseInst}
         */
        public Instance getCaseInst() {
            return this.caseInst;
        }

        /**
         * Setter method for instance variable {@link #caseInst}.
         *
         * @param _caseInst value for instance variable {@link #caseInst}
         */
        public void setCaseInst(final Instance _caseInst) {
            this.caseInst = _caseInst;
        }

        /**
         * Checks if is execute.
         *
         * @return the execute
         */
        public boolean isExecute() {
            return this.execute;
        }

        /**
         * Sets the execute.
         *
         * @param _execute the new execute
         */
        public void setExecute(final boolean _execute) {
            this.execute = _execute;
        }
    }

    /**
     * The Class DocActionDef.
     */
    public static class DocActionDef extends AbstractActionDef {
        /**
         * Configs.
         */
        private List<ActDef2Case4DocConfig> configs = new ArrayList<>();

        /**
         * Getter method for the instance variable {@link #configs}.
         *
         * @return value of instance variable {@link #configs}
         */
        public List<ActDef2Case4DocConfig> getConfigs() {
            return this.configs;
        }

        /**
         * Setter method for instance variable {@link #configs}.
         *
         * @param _configs value for instance variable {@link #configs}
         */
        public void setConfigs(final List<ActDef2Case4DocConfig> _configs) {
            this.configs = _configs;
        }
    }

    /**
     * The Class IncomingActionDef.
     *
     * @author The eFaps Team
     */
    public static class IncomingActionDef extends AbstractActionDef {

        /**
         * Configs.
         */
        private List<ActDef2Case4IncomingConfig> configs = new ArrayList<>();

        /**
         * Getter method for the instance variable {@link #configs}.
         *
         * @return value of instance variable {@link #configs}
         */
        public List<ActDef2Case4IncomingConfig> getConfigs() {
            return this.configs;
        }

        /**
         * Setter method for instance variable {@link #configs}.
         *
         * @param _configs value for instance variable {@link #configs}
         */
        public void setConfigs(final List<ActDef2Case4IncomingConfig> _configs) {
            this.configs = _configs;
        }
    }
}