/*
 * 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.
*/
package org.apache.ofbiz.accounting.payment

import org.apache.ofbiz.base.util.UtilNumber
import org.apache.ofbiz.entity.condition.EntityCondition
import org.apache.ofbiz.entity.condition.EntityOperator

basePaymentId = parameters.paymentId
basePayment = from('Payment').where('paymentId', basePaymentId).queryOne()

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 = from('Payment').where(topCond).orderBy('effectiveDate').queryList()

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 < basePaymentToApply) {
                paymentMap.amountToApply = paymentToApply
           } else {
                paymentMap.amountToApply = basePaymentToApply
            }
            paymentsMapList.add(paymentMap)
        }
    }
}
context.payments = paymentsMapList
