// Append-only ledger once posted. Correct mistakes with a linked reversal.
// One row per part/location: signed deltas preserve quarantine and physical counts.
model StockMovement {
  id                String          @id @default(cuid()) @db.VarChar(30)
  number            String          @unique @db.VarChar(80)
  idempotencyKey    String          @unique @db.VarChar(100)
  balanceId         String          @db.VarChar(30)
  type              MovementType
  source            MovementSource  @default(MANUAL)
  quantity          Int             @db.UnsignedInt
  physicalDelta     Int
  quarantineDelta   Int             @default(0)
  unitCost          Decimal         @default(0) @db.Decimal(18, 2)
  approval          ApprovalStatus  @default(PENDING)
  actorId           String?         @db.VarChar(30)
  requesterName     String?         @db.VarChar(191)
  approvedById      String?         @db.VarChar(30)
  approvedAt        DateTime?       @db.DateTime(3)
  postedAt          DateTime?       @db.DateTime(3)
  occurredAt        DateTime        @default(now()) @db.DateTime(3)
  workOrderId       String?         @db.VarChar(30)
  quarantineId      String?         @db.VarChar(30)
  externalReference String?         @db.VarChar(191)
  urgent            Boolean         @default(false)
  notes             String?         @db.Text
  reversalOfId      String?         @unique @db.VarChar(30)
  createdAt         DateTime        @default(now()) @db.DateTime(3)
  balance           StockBalance    @relation(fields: [balanceId], references: [id], onDelete: Restrict)
  actor             User?           @relation("MovementActor", fields: [actorId], references: [id], onDelete: Restrict)
  approvedBy        User?           @relation("MovementApprover", fields: [approvedById], references: [id], onDelete: Restrict)
  workOrder         WorkOrder?      @relation(fields: [workOrderId], references: [id], onDelete: Restrict)
  quarantine        QuarantineCase? @relation(fields: [quarantineId], references: [id], onDelete: Restrict)
  reversalOf        StockMovement?  @relation("Reversal", fields: [reversalOfId], references: [id], onDelete: Restrict, onUpdate: NoAction)
  reversal          StockMovement?  @relation("Reversal")
  notifications     Notification[]

  @@index([balanceId, occurredAt])
  @@index([workOrderId, type])
  @@index([approval, occurredAt])
  @@index([type, postedAt])
  @@index([actorId])
  @@index([approvedById])
  @@index([quarantineId])
}
