/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

import java.util.*;
import org.ofbiz.entity.*;
import org.ofbiz.base.util.*;
import org.ofbiz.base.util.collections.*;
import org.ofbiz.accounting.invoice.*;
import org.ofbiz.accounting.payment.*;
import org.ofbiz.accounting.util.UtilAccounting;
import java.text.DateFormat;
import java.math.*;
import org.ofbiz.entity.condition.EntityCondition;
import org.ofbiz.entity.condition.EntityConditionList;
import org.ofbiz.entity.condition.EntityExpr;
import org.ofbiz.entity.condition.EntityOperator;
import org.ofbiz.entity.model.*;
import java.text.NumberFormat;

basePaymentId = parameters.paymentId;
basePayment = delegator.findOne("Payment", [paymentId : basePaymentId], false);

decimals = UtilNumber.getBigDecimalScale("invoice.decimals");
rounding = UtilNumber.getBigDecimalRoundingMode("invoice.rounding");

paymentsMapList = [];  // to pass back to the screeen list of unapplied payments

// retrieve payments for the related parties which have not been (fully) applied yet
List payments = null;
exprList = [];
expr = EntityCondition.makeCondition("partyIdTo", EntityOperator.EQUALS, basePayment.getString("partyIdFrom"));
exprList.add(expr);
expr = EntityCondition.makeCondition("partyIdFrom", EntityOperator.EQUALS, basePayment.getString("partyIdTo"));
exprList.add(expr);
expr = EntityCondition.makeCondition("paymentId", EntityOperator.NOT_EQUAL, basePayment.getString("paymentId"));
exprList.add(expr);

// only payments with received and sent
exprListStatus = [];
expr = EntityCondition.makeCondition("statusId", EntityOperator.EQUALS, "PMNT_RECEIVED");
exprListStatus.add(expr);
expr = EntityCondition.makeCondition("statusId", EntityOperator.EQUALS, "PMNT_SENT");
exprListStatus.add(expr);
orCond = EntityCondition.makeCondition(exprListStatus, EntityOperator.OR);
exprList.add(orCond);

topCond = EntityCondition.makeCondition(exprList, EntityOperator.AND);

payments = delegator.findList("Payment", topCond, null, ["effectiveDate"], null, false);

if (payments)    {
    basePaymentApplied = PaymentWorker.getPaymentApplied(basePayment);
    basePaymentAmount = basePayment.getBigDecimal("amount");
    basePaymentToApply = basePaymentAmount.subtract(basePaymentApplied);
    payments.each { payment ->
        if (PaymentWorker.getPaymentNotApplied(payment).signum() == 1) {  // positiv not applied amount?
           // yes, put in the map
           paymentMap = [:];
           paymentMap.paymentId = basePaymentId;
           paymentMap.toPaymentId = payment.paymentId;
           paymentMap.currencyUomId = payment.currencyUomId;
           paymentMap.effectiveDate = payment.effectiveDate.toString().substring(0,10); // list as YYYY-MM-DD
           paymentMap.amount = payment.getBigDecimal("amount");
           paymentMap.amountApplied = PaymentWorker.getPaymentApplied(payment);
           paymentToApply = PaymentWorker.getPaymentNotApplied(payment);
           if (paymentToApply.compareTo(basePaymentToApply) < 0 ) {
                paymentMap.amountToApply = paymentToApply;
           } else {
                paymentMap.amountToApply = basePaymentToApply;
           }
           paymentsMapList.add(paymentMap);
        }
    }
}
context.payments = paymentsMapList;
