Two rolls of the same fabric specification from different dye lots are not interchangeable — they differ in shade enough to be visible in a finished garment. Dye lot therefore has to be tracked at the roll, reserved to the cut, and carried through every subsequent operation.

Shade, and why it drives the data model

A shirt whose body and sleeves came from different lots is a reject. Not marginally worse — a reject. So the fabric roll, not the fabric item, is the unit the system has to reason about.

Practically that means lot tracking down to the roll, shade band recorded at receipt, and reservation of specific rolls against a cutting order before cutting begins. Allocating at item level and resolving the lot on the floor moves the decision to the person least equipped to carry its consequences.

The route through production

OperationUsually performedWhat the system must hold
CuttingIn houseMarker consumption against actual fabric used.
StitchingIn house or subcontractedWIP quantity and location, by bundle.
Washing / dyeingSubcontractedMaterial issued out, expected return, shrinkage allowance.
Embroidery / printingSubcontractedSame, plus a quality gate on return.
Finishing and packingIn houseFinal yield against the order.

Inventory you cannot see

Codeunit 50230 Subcontracting PO Generator.al
codeunit 50230 "Subcontracting PO Generator"
{
    Access = Public;
    Subtype = Normal;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Calculate Subcontract Order", 'OnBeforeCreateSubcontractPO', '', false, false)]
    local procedure GenerateSubcontractPO(var ProdOrderRoutingLine: Record "Prod. Order Routing Line"; var IsHandled: Boolean)
    var
        WorkCenter: Record "Work Center";
        PurchaseHeader: Record "Purchase Header";
        PurchaseLine: Record "Purchase Line";
    begin
        if not WorkCenter.Get(ProdOrderRoutingLine."No.") then
            exit;

        if WorkCenter."Subcontractor No." = '' then
            exit;

        // Generate Subcontractor Purchase Order for Outsource Operation (Washing, Embroidery, Dyeing)
        PurchaseHeader.Init();
        PurchaseHeader."Document Type" := PurchaseHeader."Document Type"::Order;
        PurchaseHeader.Insert(true);
        PurchaseHeader.Validate("Buy-from Vendor No.", WorkCenter."Subcontractor No.");
        PurchaseHeader.Modify(true);

        PurchaseLine.Init();
        PurchaseLine."Document Type" := PurchaseHeader."Document Type";
        PurchaseLine."Document No." := PurchaseHeader."No.";
        PurchaseLine."Line No." := 10000;
        PurchaseLine.Validate(Type, PurchaseLine.Type::"Work Center");
        PurchaseLine.Validate("No.", WorkCenter."No.");
        PurchaseLine.Validate(Quantity, ProdOrderRoutingLine."Run Time");
        PurchaseLine."Prod. Order No." := ProdOrderRoutingLine."Prod. Order No.";
        PurchaseLine.Insert(true);

        Message('Subcontractor Purchase Order %1 generated for Vendor %2 (Operation: %3).',
            PurchaseHeader."No.",
            WorkCenter."Subcontractor No.",
            ProdOrderRoutingLine.Description);

        IsHandled := true;
    end;
}

Material at a subcontractor remains yours. The system needs to show quantity issued, quantity expected back, and the age of anything outstanding — because fabric that went out for washing four weeks ago and has not returned is either a problem or a loss, and the difference is time-sensitive.

In most garment operations the largest single inventory position at any moment is sitting in somebody else's factory. An ERP that only sees your own four walls is reporting on a minority of your working capital.

Fabric consumption variance

The marker says how much fabric a garment should take. The cutting room says how much it took. The gap is the number to watch, and it reads cleanly:

  • One style, persistent overuse — the marker is wrong for the actual fabric width.
  • All styles, one fabric — the fabric is off specification.
  • One shift — cutting practice, which is a conversation rather than a system change.

Fabric is the dominant cost in most garments. A two per cent consumption variance unexamined for a season is a margin problem that no amount of price negotiation recovers.