2026-05-26 18:27:37 +02:00

64 lines
1.6 KiB
Go

package printjob
import (
"fmt"
"printer.backend/internal/model"
)
// CollectImageRefs returns all order images in job order (orders, then images within each order).
func CollectImageRefs(orders []model.Order) []model.PrintJobImageRef {
var refs []model.PrintJobImageRef
for _, o := range orders {
for _, img := range o.Images {
refs = append(refs, model.PrintJobImageRef{
OrderID: o.ID,
ImageID: img.ID,
})
}
}
return refs
}
// AssignSlots maps images to layout slots (at most one image per slot).
func AssignSlots(refs []model.PrintJobImageRef, preview model.LayoutPreview) []model.PrintJobSlotAssignment {
limit := len(preview.Positions)
if len(refs) < limit {
limit = len(refs)
}
out := make([]model.PrintJobSlotAssignment, 0, limit)
for i := 0; i < limit; i++ {
out = append(out, model.PrintJobSlotAssignment{
Slot: i,
Image: refs[i],
Position: preview.Positions[i],
})
}
return out
}
// Summary builds validation and slot assignments for a print job.
func Summary(orders []model.Order, preview model.LayoutPreview) model.PrintJobSummary {
refs := CollectImageRefs(orders)
slots := preview.Count
imageCount := len(refs)
overflow := imageCount > slots
var warning string
if overflow {
warning = fmt.Sprintf(
"%d Bilder für %d Item-Positionen: %d Bilder werden nicht platziert",
imageCount, slots, imageCount-slots,
)
}
return model.PrintJobSummary{
ImageCount: imageCount,
SlotCount: slots,
ImageOverflow: overflow,
Warning: warning,
Assignments: AssignSlots(refs, preview),
Preview: preview,
}
}