// recibir_stock
// Inflow: external supplier delivers `cantidad` units into a Stock record.
// NOT conservation-bound: the units enter the system from outside.
//
// states.stock: the current Stock record.
// ids.stock:    its UUID (string).
// params:       { cantidad:i64, timestamp:str, movimiento_id:str }

let cantidad = input.params.cantidad;
if cantidad <= 0 {
    throw "cantidad debe ser positiva (la dirección la fija el morfismo)"
}
let mov_id = input.params.movimiento_id;
if type_of(mov_id) == "()" {
    throw "params.movimiento_id es obligatorio (idempotencia)"
}

[
    #{
        op: "set",
        path: #{ entity: "Stock", id: input.ids.stock, field: "cantidad" },
        value: input.states.stock.cantidad + cantidad,
    },
    #{
        op: "create",
        entity: "MovimientoStock",
        id: mov_id,
        data: #{
            id:        mov_id,
            stock_id:  input.ids.stock,
            delta:     cantidad,
            razon:     "recepcion",
            timestamp: input.params.timestamp,
        },
    },
]
