64 lines
1.6 KiB
Go
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,
|
|
}
|
|
}
|