Implemented calculating TotalAmounts
This commit is contained in:
parent
23ad5c6945
commit
2514e96b16
|
@ -0,0 +1,44 @@
|
||||||
|
package net.codinux.invoicing.calculator
|
||||||
|
|
||||||
|
import net.codinux.invoicing.mapper.MustangMapper
|
||||||
|
import net.codinux.invoicing.model.Invoice
|
||||||
|
import net.codinux.invoicing.model.TotalAmounts
|
||||||
|
import org.mustangproject.ZUGFeRD.IExportableTransaction
|
||||||
|
import org.mustangproject.ZUGFeRD.TransactionCalculator
|
||||||
|
import java.math.BigDecimal
|
||||||
|
|
||||||
|
open class AmountsCalculator {
|
||||||
|
|
||||||
|
protected open val mapper by lazy { MustangMapper() } // lazy to avoid circular dependency creation with MustangMapper
|
||||||
|
|
||||||
|
|
||||||
|
open fun calculateTotalAmounts(invoice: Invoice) =
|
||||||
|
calculateTotalAmounts(mapper.mapToTransaction(invoice))
|
||||||
|
|
||||||
|
open fun calculateTotalAmounts(invoice: IExportableTransaction): TotalAmounts {
|
||||||
|
val calculator = MustangTransactionCalculator(invoice)
|
||||||
|
|
||||||
|
return TotalAmounts(
|
||||||
|
lineTotalAmount = calculator.lineTotalAmount,
|
||||||
|
chargeTotalAmount = calculator.chargeTotal,
|
||||||
|
allowanceTotalAmount = calculator.allowanceTotal,
|
||||||
|
taxBasisTotalAmount = calculator.taxBasisTotalAmount,
|
||||||
|
taxTotalAmount = calculator.taxTotalAmount,
|
||||||
|
grandTotalAmount = calculator.grandTotal,
|
||||||
|
totalPrepaidAmount = calculator.totalPrepaidAmount,
|
||||||
|
duePayableAmount = calculator.duePayableAmount
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected open class MustangTransactionCalculator(invoice: IExportableTransaction): TransactionCalculator(invoice) {
|
||||||
|
val lineTotalAmount: BigDecimal = this.total
|
||||||
|
|
||||||
|
val taxBasisTotalAmount: BigDecimal = this.taxBasis
|
||||||
|
val taxTotalAmount: BigDecimal by lazy { this.getGrandTotal().subtract(this.taxBasis) }
|
||||||
|
|
||||||
|
val totalPrepaidAmount: BigDecimal = this.totalPrepaid
|
||||||
|
val duePayableAmount: BigDecimal by lazy { this.getGrandTotal().subtract(this.totalPrepaid) }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package net.codinux.invoicing.mapper
|
package net.codinux.invoicing.mapper
|
||||||
|
|
||||||
|
import net.codinux.invoicing.calculator.AmountsCalculator
|
||||||
import net.codinux.invoicing.model.AmountAdjustments
|
import net.codinux.invoicing.model.AmountAdjustments
|
||||||
import net.codinux.invoicing.model.ChargeOrAllowance
|
import net.codinux.invoicing.model.ChargeOrAllowance
|
||||||
import net.codinux.invoicing.model.InvoiceItem
|
import net.codinux.invoicing.model.InvoiceItem
|
||||||
|
@ -13,7 +14,9 @@ import java.time.LocalDate
|
||||||
import java.time.ZoneId
|
import java.time.ZoneId
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
open class MustangMapper {
|
open class MustangMapper(
|
||||||
|
protected open val calculator: AmountsCalculator = AmountsCalculator()
|
||||||
|
) {
|
||||||
|
|
||||||
open fun mapToTransaction(invoice: net.codinux.invoicing.model.Invoice): IExportableTransaction = Invoice().apply {
|
open fun mapToTransaction(invoice: net.codinux.invoicing.model.Invoice): IExportableTransaction = Invoice().apply {
|
||||||
this.number = invoice.invoiceNumber
|
this.number = invoice.invoiceNumber
|
||||||
|
@ -33,6 +36,10 @@ open class MustangMapper {
|
||||||
adjustments.charges.forEach { this.addCharge(mapCharge(it)) }
|
adjustments.charges.forEach { this.addCharge(mapCharge(it)) }
|
||||||
adjustments.allowances.forEach { this.addAllowance(mapAllowance(it)) }
|
adjustments.allowances.forEach { this.addAllowance(mapAllowance(it)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (invoice.totalAmounts == null) {
|
||||||
|
invoice.totalAmounts = calculator.calculateTotalAmounts(this)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun mapParty(party: Party): TradeParty = TradeParty(
|
open fun mapParty(party: Party): TradeParty = TradeParty(
|
||||||
|
@ -95,6 +102,8 @@ open class MustangMapper {
|
||||||
buyerReference = invoice.referenceNumber,
|
buyerReference = invoice.referenceNumber,
|
||||||
|
|
||||||
amountAdjustments = mapAmountAdjustments(invoice),
|
amountAdjustments = mapAmountAdjustments(invoice),
|
||||||
|
|
||||||
|
totalAmounts = calculator.calculateTotalAmounts(invoice)
|
||||||
)
|
)
|
||||||
|
|
||||||
open fun mapParty(party: TradeParty) = Party(
|
open fun mapParty(party: TradeParty) = Party(
|
||||||
|
|
Loading…
Reference in New Issue