#1000: KostZuweisungDO.kt
projectforge-business/src/main/kotlin/org/projectforge/business/fibu/kost/KostZuweisungDO.kt Type : Entité JPA (DO) · Objectif : Affectation des coûts liant factures/salaires à Kost1/Kost2 · Source : projectforge-business/src/main/kotlin/org/projectforge/business/fibu/kost/KostZuweisungDO.kt 266 lignes · 190 code · 55 commentaires · 21 vides
Représente une affectation de coûts (KostZuweisung) — l'allocation de montants de factures ou de paiements de salaires d'employés à des centres de coûts spécifiques (Kost1 et Kost2). Chaque affectation enregistre un montant net et est liée à exactement un des éléments suivants : une position de facture sortante, une position de facture entrante ou une entrée de salaire d'employé.
Conception de l'entité
| Champ | Type | Colonne DB | Description |
index | Short | INT | Index dans la liste d'affectations de la position |
netto | BigDecimal? | DECIMAL(12,2) | Montant net alloué à ce centre de coûts |
kost1 | Kost1DO? | FK kost1_fk | Centre de coûts niveau 1 (ManyToOne, lazy) |
kost2 | Kost2DO? | FK kost2_fk | Centre de coûts niveau 2 (ManyToOne, lazy) |
rechnungsPosition | RechnungsPositionDO? | FK rechnungs_pos_fk | Position de facture sortante (nullable) |
eingangsrechnungsPosition | EingangsrechnungsPositionDO? | FK eingangsrechnungs_pos_fk | Position de facture entrante (nullable) |
employeeSalary | EmployeeSalaryDO? | FK employee_salary_fk | Entrée de salaire d'employé (nullable) |
comment | String? | VARCHAR(4000) | Commentaire optionnel |
Propriétés calculées (transitoires)
| Propriété | Type | Description |
brutto | BigDecimal | Montant brut calculé à partir du net + TVA de la position parente |
kost1Id | Long? | Raccourci pour kost1.id |
kost2Id | Long? | Raccourci pour kost2.id |
isEmpty | Boolean | Vrai si netto est nul ou zéro |
Contrainte d'exclusion mutuelle
Une KostZuweisung doit être affectée à exactement un objet financier. Le setter pour chacune des trois références applique l'exclusivité mutuelle au niveau Java : définir rechnungsPosition lève une exception si eingangsrechnungsPosition ou employeeSalary est déjà défini, et vice versa. La méthode hasErrors() valide qu'exactement un est assigné (retourne une clé d'erreur i18n si violé).
Détails de persistance
- Mappé à
T_FIBU_KOST_ZUWEISUNG
- Trois contraintes uniques, une pour chaque type d'objet financier : (index, rechnungs_pos_fk, kost1_fk, kost2_fk), (index, eingangsrechnungs_pos_fk, kost1_fk, kost2_fk), (index, employee_salary_fk, kost1_fk, kost2_fk)
- Cinq index pour la performance des requêtes basées sur les FK
- Étend
DefaultBaseDO, implémente DisplayNameCapable
@JsonBackReference sur rechnungsPosition et eingangsrechnungsPosition empêche la récursion infinie lors de la sérialisation JSON
@JsonSerialize(using = IdOnlySerializer) sur toutes les références ManyToOne pour des réponses API compactes
Méthodes utilitaires
setAbstractRechnungsPosition(position) — setter polymorphe dispatchant par type
newClone() — crée une copie profonde (sans IDs) pour le clonage de facture
- Equals/hashCode basé sur l'index + les IDs de la position parente (clé métier pour les trois types parents)
Code source (abrégé)
@Entity @Indexed @Table(name = "T_FIBU_KOST_ZUWEISUNG", ...)
open class KostZuweisungDO : DefaultBaseDO(), DisplayNameCapable {
open var index: Short = 0
open var netto: BigDecimal? = null
open var kost1: Kost1DO? = null
open var kost2: Kost2DO? = null
open var rechnungsPosition: RechnungsPositionDO? = null
set(value) { if (value != null && (eingangsrechnungsPosition != null
|| employeeSalary != null)) throw IllegalStateException(...) }
val brutto: BigDecimal
@Transient get() {
val vat = when {
rechnungsPosition != null -> rechnungsPosition!!.vat
eingangsrechnungsPosition != null -> eingangsrechnungsPosition!!.vat
else -> null
}
return CurrencyHelper.getGrossAmount(netto, vat)
}
// newClone(), hasErrors(), setAbstractRechnungsPosition(), etc.
}
Historique Git
868d6abb7 2025 -> 2026
63081666f En-têtes des fichiers source : 2024 -> 2025.
0237d5eba Json : IdOnlySerializer et IdsOnlySerializer.
db2599ab8 Historique dans le carnet d'ordres, les factures et les projets.
c8f8ed935 Toutes les entités FetchType.LAZY.
b04a74ffb DisplayHistoryEntry : nouveau concept.
0b32a3f37 Trucs de migration...
4c04cfd65 CHANGEMENT-MAJEUR ! IDs Integer vers IDs Long.
f984352a0 JsonBackReference/JsonManagedReference : KostZuweisungDO
ca27394ef Constantes refactorisées.
b78b870bd ShortDisplayNameCapable -> DisplayNameCapable.
8675a1dbe Entités JPA Kotlin déclarées open (correctif chargement paresseux)
1cf12f943 Kostzuweisung : boucle infinie dans la sérialisation json corrigée.
812b5b751 Gros WIP : refactoring du tueur de perf (Eingangs)Rechnung*
339e017b4 @PropertyInfo supporté pour les méthodes getter.
3bd2b6e9d RechnungRest : Ajouter liste de positions
100cc30f0 KostZuweisungDO.java -> KostZuweisungDO.kt