EN · DE · RU · FR · ES

#1675: AuftragsCacheTest.kt

projectforge-business/src/test/kotlin/org/projectforge/business/fibu/AuftragsCacheTest.kt Type : Kotlin · Rôle : Test · Source : projectforge-business/src/test/kotlin/org/projectforge/business/fibu/AuftragsCacheTest.kt 179 lignes · 145 code · 26 commentaires · 8 vides
Test unitaire/d'intégration pour AuftragsCache. Valide l'exactitude du comportement de la classe de production correspondante.

Structure du code

Annotations : Test, Autowired

Classes : AuftragsCacheTest

Supertype(s) : AbstractTestBase

Fonctions (1) : assertValues

Propriétés (6) : auftragDao, auftragsCache, rechnungDao, order, order, invoice

Importations : 6 paquetages

Paquetage : org.projectforge.business.fibu

Code source (abrégé)

package org.projectforge.business.fibu

import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.projectforge.commons.test.TestUtils.Companion.assertSame
import org.projectforge.business.test.AbstractTestBase
import org.springframework.beans.factory.annotation.Autowired
import java.time.LocalDate

class AuftragsCacheTest : AbstractTestBase() {
    @Autowired
    private lateinit var auftragDao: AuftragDao

    @Autowired
    private lateinit var auftragsCache: AuftragsCache

    @Autowired
    private lateinit var rechnungDao: RechnungDao

    @Test
    fun `test du workflow de commande avec factures`() {
        val order = AuftragDO().also {
            it.addPosition(AuftragsPositionDO().also { pos ->
                pos.titel = "Pos 1"
                pos.nettoSumme = 100.toBigDecimal()
                pos.status = AuftragsStatus.GELEGT
            })
            it.addPosition(AuftragsPositionDO().also { pos ->
                pos.titel = "Pos 2"
                pos.nettoSumme = 200.toBigDecimal()
                pos.status = AuftragsStatus.GELEGT
            })
            it.addPosition(AuftragsPositionDO().also { pos ->
                pos.titel = "Pos 3"
                pos.nettoSumme = 400.toBigDecimal()
                pos.status = AuftragsStatus.GELEGT
            })
            it.status = AuftragsStatus.GELEGT
            it.nummer = auftragDao.nextNumber
        }
        auftragDao.insert(order, checkAccess = false)
        auftragsCache.getOrderInfo(order.id).also { orderInfo ->
            assertValues(orderInfo, akquiseSum = 700, netSum = 700)
        }
        order.status = AuftragsStatus.BEAUFTRAGT
        order.positionen!!.find { it.titel == "Pos 1" }!!.status = AuftragsStatus.BEAUFTRAGT
        order.positionen!!.find { it.titel == "Pos 2" }!!.status = AuftragsStatus.ABGELEHNT
        order.positionen!!.find { it.titel == "Pos 3" }!!.status = AuftragsStatus.OPTIONAL
        auftragDao.update(order, checkAccess = false)
        auftragsCache.getOrderInfo(order.id).let { orderInfo ->
            assertValues(orderInfo, akquiseSum = 400, netSum = 500, orderedNetSum = 100, notYetInvoicedSum = 100)
        }
        order.positionen!!.find { it.titel == "Pos 1" }!!.status = AuftragsStatus.ABGESCHLOSSEN
        auftragDao.update(order, checkAccess = false)
        auftragsCache.getOrderInfo(order.id).also { orderInfo ->
            assertValues(
                orderInfo, akquiseSum = 400, netSum = 500, orderedNetSum = 100,
                toBeInvoicedSum = 100, notYetInvoicedSum = 100, toBeInvoiced = true
            )
        }
        order.addPaymentSchedule(PaymentScheduleDO().also { schedule ->
            schedule.amount = 50.toBigDecimal()
            schedule.reached = true
        })
        auftragDao.update(order, checkAccess = false)
        auftragsCache.getOrderInfo(order.id).also { orderInfo ->
            // 100 pour la position à facturer et 50 par échéance de paiement atteinte non attribuée à une position.
            assertValues(
                orderInfo, akquiseSum = 400, netSum = 500, orderedNetSum = 100,
                toBeInvoicedSum = 150, notYetInvoicedSum = 100, toBeInvoiced = true
            )
        }
        order.addPaymentSchedule(PaymentScheduleDO().also { schedule ->
            schedule.amount = 25.toBigDecimal()
            schedule.reached = true
            schedule.vollstaendigFakturiert = true
        })
        order.addPaymentSchedule(PaymentScheduleDO().also { schedule ->
            schedule.amount = 80.toBigDecimal()
            schedule.reached = true
            schedule.positionNumber = order.positionen!!.find { it.titel == "Pos 1" }!!.number
        })
        auftragDao.update(order, checkAccess = false)
        auftragsCache.getOrderInfo(order.id).also { orderInfo ->
            // (25) est ignoré (déjà entièrement facturé).
            // 80 pour la position à facturer est "écrasé" par 80 de l'échéance de paiement.
            // 50 par échéance de paiement atteinte non attribuée à une position.
            assertValues(
                orderInfo, akquiseSum = 400, netSum = 500, orderedNetSum = 100,
                toBeInvoicedSum = 130, notYetInvoicedSum = 100, toBeInvoiced = true
            )
        }
    }

        @Test
    fun `test de commande en acquisition avec factures`() {
        val order = AuftragDO().also {
            it.addPosition(AuftragsPositionDO().also { pos ->
                pos.titel = "Pos 1"
                pos.nettoSumme = 100.toBigDecimal()
                pos.status = AuftragsStatus.GELEGT
            })
            it.addPosition(AuftragsPositionDO().also { pos ->
                pos.titel = "Pos 2"
                pos.nettoSumme = 200.toBigDecimal()
                pos.status = AuftragsStatus.GELEGT
            })
            it.status = AuftragsStatus.GELEGT
            it.nummer = auftragDao.nextNumber
        }
        auftragDao.insert(order, checkAccess = false)
        auftragsCache.getOrderInfo(order.id).let { orderInfo ->
            assertValues(orderInfo, akquiseSum = 300, netSum = 300)
        }
        val invoice = RechnungDO().also {
            it.addPosition(RechnungsPositionDO().also { pos -> // 50 sur 100
                pos.auftragsPosition = order.positionen!!.get(0)
                pos.menge = 5.toBigDecimal()
                pos.einzelNetto = 10.toBigDecimal()
// ... (tronqué, total 157 lignes)

Historique Git

868d6abb7 2025 -> 2026
63081666f En-têtes des fichiers source : 2024 -> 2025.
42dc9fa16 Commandes : ordonné -> commissionné.
176cb32d7 WIP : Gradle
ae2c04ee0 Migration en cours... (tous les tests de tous les paquetages : OK).