{"openapi":"3.1.0","info":{"title":"PUT /api/v1/inventory/landed-cost-allocations/{bill_id}","version":"1.0.0","description":"Replace a bill's landed cost allocations"},"servers":[{"url":"https://api.ondayzero.com","description":"Production"}],"paths":{"/api/v1/inventory/landed-cost-allocations/{bill_id}":{"put":{"tags":["inventory:landed_cost_allocations"],"summary":"Replace a bill's landed cost allocations","description":"Set the full list of landed-cost allocations for a bill. Existing allocations are reversed first, then the requested targets are applied to the cost snapshots — idempotent. The allocated total may not exceed the bill amount.","operationId":"replace_allocations_api_v1_inventory_landed_cost_allocations__bill_id__put","parameters":[{"name":"bill_id","in":"path","required":true,"schema":{"type":"string","title":"Bill Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-business-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Business-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandedCostAllocationCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope_LandedCostAllocationListResponse_"}}}},"400":{"description":"Bad Request - Invalid input","content":{"application/json":{"example":{"detail":"Invalid request parameters"}}}},"401":{"description":"Unauthorized - Authentication required","content":{"application/json":{"example":{"detail":"Not authenticated"}}}},"403":{"description":"Forbidden - Insufficient permissions","content":{"application/json":{"example":{"detail":"Not enough permissions"}}}},"404":{"description":"Not Found - Resource does not exist","content":{"application/json":{"example":{"detail":"Resource not found"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AllocationBasis":{"type":"string","enum":["quantity","value"],"title":"AllocationBasis","description":"How a per-PO allocation amount is split across the PO's variants."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LandedCostAllocationCreateRequest":{"properties":{"targets":{"items":{"$ref":"#/components/schemas/LandedCostAllocationTarget"},"type":"array","title":"Targets"}},"type":"object","title":"LandedCostAllocationCreateRequest","description":"Replace the full set of allocations for a bill.\n\nThe service reverses any existing allocations for the bill before applying\nthese, so the request is the desired end state (idempotent)."},"LandedCostAllocationListResponse":{"properties":{"bill_id":{"type":"string","title":"Bill Id"},"bill_amount_cents":{"type":"integer","title":"Bill Amount Cents","default":0},"allocated_cents":{"type":"integer","title":"Allocated Cents","default":0},"unallocated_cents":{"type":"integer","title":"Unallocated Cents","default":0},"items":{"items":{"$ref":"#/components/schemas/LandedCostAllocationResponse"},"type":"array","title":"Items"}},"type":"object","required":["bill_id"],"title":"LandedCostAllocationListResponse","description":"All allocations for a bill plus a reconciliation summary."},"LandedCostAllocationResponse":{"properties":{"id":{"type":"string","title":"Id"},"bill_id":{"type":"string","title":"Bill Id"},"inventory_order_id":{"type":"string","title":"Inventory Order Id"},"po_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Po Number"},"cost_layer":{"$ref":"#/components/schemas/LandedCostLayer"},"allocation_basis":{"$ref":"#/components/schemas/AllocationBasis"},"amount_cents":{"type":"integer","title":"Amount Cents"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"variant_count":{"type":"integer","title":"Variant Count","default":0},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","bill_id","inventory_order_id","cost_layer","allocation_basis","amount_cents"],"title":"LandedCostAllocationResponse","description":"One persisted allocation row, enriched with PO display fields."},"LandedCostAllocationTarget":{"properties":{"inventory_order_id":{"type":"string","title":"Inventory Order Id","description":"Received PO whose goods absorb this cost."},"cost_layer":{"$ref":"#/components/schemas/LandedCostLayer","description":"Landed-cost layer the amount feeds (freight/duties/handling)."},"amount_cents":{"type":"integer","exclusiveMinimum":0.0,"title":"Amount Cents","description":"Slice of the bill assigned to this PO, in cents."},"allocation_basis":{"$ref":"#/components/schemas/AllocationBasis","description":"How the amount is spread across the PO's variants.","default":"quantity"},"note":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Note"}},"type":"object","required":["inventory_order_id","cost_layer","amount_cents"],"title":"LandedCostAllocationTarget","description":"A single ``(purchase order, layer, amount)`` allocation request."},"LandedCostLayer":{"type":"string","enum":["freight","duties","handling"],"title":"LandedCostLayer","description":"Landed-cost layer a bill allocation contributes to.\n\nMirrors the non-material, non-packaging layers on ``CostSnapshot``.\nMaterial/packaging/processing are derived from the PO/recipe, not from\nstandalone landed-cost bills, so they are intentionally excluded here."},"SuccessEnvelope_LandedCostAllocationListResponse_":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"data":{"anyOf":[{"$ref":"#/components/schemas/LandedCostAllocationListResponse"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"SuccessEnvelope[LandedCostAllocationListResponse]"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Token","description":"API token authentication. Format: `Bearer dz_...`"}}},"security":[{"BearerAuth":[]}]}