feat(raw-materials): wax and propolis lots consumed by production batches
- RawMaterialLot (beeswax, propolis) in grams with origin (apiary, harvest); stock in the same movement ledger: withdrawals, inventory counts, and the new movement type CONSUMPTION. - Production batches take inputs (raw lot + grams); batch and consumption are one transaction, never more than a lot has left. Deleting a mistaken batch gives the material back as its own movement. - Traceability both ways: batch -> inputs, raw lot -> usedIn. - Movement belongs to exactly one of bottling / production / raw lot (CHECK); raw material changes do not trigger the shop webhook. - Permissions raw-material:*, granted to roles that maintain production batches. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
41c2af7284
commit
e73c8b2cb4
15 files changed
+986
-32
No files matched your search
@@ -122,6 +122,7 @@ model User {
|
||||
bottlingBatches BottlingBatch[]
|
||||
productionBatches ProductionBatch[]
|
||||
batchMovements BatchMovement[]
|
||||
rawMaterialLots RawMaterialLot[]
|
||||
notifications Notification[]
|
||||
queenEvaluations QueenEvaluation[]
|
||||
webhookSubscriptions WebhookSubscription[]
|
||||
@@ -239,6 +240,7 @@ model Apiary {
|
||||
colonyMoves ColonyApiaryHistory[]
|
||||
harvests Harvest[]
|
||||
treatments Treatment[]
|
||||
rawMaterialLots RawMaterialLot[]
|
||||
|
||||
@@index([status])
|
||||
}
|
||||
@@ -761,6 +763,7 @@ model Harvest {
|
||||
|
||||
colonies HarvestColony[]
|
||||
extractions ExtractionHarvest[]
|
||||
rawMaterialLots RawMaterialLot[]
|
||||
|
||||
@@index([apiaryId, date])
|
||||
}
|
||||
@@ -1097,15 +1100,73 @@ model ProductionBatch {
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
movements BatchMovement[]
|
||||
// Woraus die Charge hergestellt wurde (Rueckverfolgung Rohstoff -> Ware).
|
||||
inputs ProductionInput[]
|
||||
|
||||
@@index([productId])
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Rohstoffe (Wachs, Propolis) und ihr Verbrauch in der Herstellung
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
enum RawMaterialKind {
|
||||
BEESWAX
|
||||
PROPOLIS
|
||||
}
|
||||
|
||||
// Eine Rohstoff-Charge, z. B. "Wachs 2026-01: 4200 g" aus dem Entdeckeln
|
||||
// oder "Propolis 2026-02: 180 g" vom Abkratzen der Gitter. Menge in Gramm;
|
||||
// der Rest folgt wie bei allen Chargen aus dem Bewegungsbuch.
|
||||
model RawMaterialLot {
|
||||
id String @id @default(cuid())
|
||||
kind RawMaterialKind
|
||||
lotNumber String @unique
|
||||
// Gewinnungsdatum
|
||||
date DateTime
|
||||
// Gewonnene Menge in Gramm - Ausgangsmenge fuer den Rest.
|
||||
quantity Int
|
||||
// Herkunft, optional: Stand und/oder Ernte, aus der der Rohstoff stammt.
|
||||
apiaryId String?
|
||||
apiary Apiary? @relation(fields: [apiaryId], references: [id])
|
||||
harvestId String?
|
||||
harvest Harvest? @relation(fields: [harvestId], references: [id])
|
||||
notes String?
|
||||
userId String?
|
||||
user User? @relation(fields: [userId], references: [id])
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
movements BatchMovement[]
|
||||
usedIn ProductionInput[]
|
||||
|
||||
@@index([kind])
|
||||
}
|
||||
|
||||
// Verbrauch einer Rohstoff-Charge in einer Herstellungscharge. Die
|
||||
// Abbuchung selbst steht als CONSUMPTION im Bewegungsbuch des Rohstoffs.
|
||||
model ProductionInput {
|
||||
id String @id @default(cuid())
|
||||
productionBatchId String
|
||||
productionBatch ProductionBatch @relation(fields: [productionBatchId], references: [id], onDelete: Cascade)
|
||||
rawMaterialLotId String
|
||||
rawMaterialLot RawMaterialLot @relation(fields: [rawMaterialLotId], references: [id], onDelete: Restrict)
|
||||
// Verbrauchte Menge in Gramm.
|
||||
quantity Int
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@index([productionBatchId])
|
||||
@@index([rawMaterialLotId])
|
||||
}
|
||||
|
||||
enum BatchMovementType {
|
||||
SHOP_SALE
|
||||
SHOP_RETURN
|
||||
WITHDRAWAL
|
||||
CORRECTION
|
||||
// Rohstoff in einer Herstellungscharge verbraucht (minus) bzw. beim
|
||||
// Loeschen einer irrtuemlich angelegten Charge zurueckgegeben (plus).
|
||||
CONSUMPTION
|
||||
}
|
||||
|
||||
enum WithdrawalReason {
|
||||
@@ -1126,6 +1187,8 @@ model BatchMovement {
|
||||
bottlingBatch BottlingBatch? @relation(fields: [bottlingBatchId], references: [id], onDelete: Restrict)
|
||||
productionBatchId String?
|
||||
productionBatch ProductionBatch? @relation(fields: [productionBatchId], references: [id], onDelete: Restrict)
|
||||
rawMaterialLotId String?
|
||||
rawMaterialLot RawMaterialLot? @relation(fields: [rawMaterialLotId], references: [id], onDelete: Restrict)
|
||||
type BatchMovementType
|
||||
// Mit Vorzeichen: minus = raus, plus = rein.
|
||||
quantity Int
|
||||
@@ -1140,6 +1203,7 @@ model BatchMovement {
|
||||
|
||||
@@index([bottlingBatchId])
|
||||
@@index([productionBatchId])
|
||||
@@index([rawMaterialLotId])
|
||||
@@index([shopRequestId])
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user