Gera picking-list(s) a partir de pedidos
POST/fulfillment/picking
Implementado em PHP. Recebe um array de IDOrder e gera uma ou mais picking-lists agrupadas por combinação de IDStockKeepingUnitLocationGroup dos itens dos pedidos. Idempotência: MD5 do array é colocado em Redis (orderFulfillmentPickingPost:<etag>, TTL 5 s) para impedir disparos duplicados.
Validações (a menos que bypasssvalidation=1):
- Cada pedido precisa existir para a empresa (ou suas relacionadas se
ShareDataWithRelatedCompanies=1). IDStatusOrder ∈ {1, 4, 20, 93}(Fechado, Finalizado picking, Em tratativa interna, Em produção).- Todos os pedidos no mesmo CD (
IDStockKeepingUnitDistributionCenter). - Parâmetro
CheckSalesChannelOrderStatusCreatePickingList=1: consulta o canal de venda; se cancelado, move o pedido para status13(Tratativa) com evento 29 e exclui da picking. - Parâmetro
OnlyAllowPickingWithLabel=1: só inclui pedido com etiqueta de canal disponível (ou recupera via/saleschannel/<path>/order/label.php).
Resolução de prioridade: o handler percorre PickingListConfiguration ativas (PickingListConfigurationStatus=1), ordenadas por PickingPriority, e usa a primeira que casa todos os filtros (IDCompanyIntegrationList, IDOrderTypeList, IDCarrierList, OrderPriority). Orders.OrderPriority (quando setado) vence as configurações. Com UseShippingHandlingTimeInPickingPriority=1, soma (ShippingEstimateDate - hoje) à prioridade base.
Saldo insuficiente (parâmetro IgnoreBalanceStartPickinglist != 1):
- Se há saldo em pulmão/blocado → pedido vai para
IDStatusOrder=24(Aguardando ressuprimento), movimentos marcados comIDTypeFulfillmentNonconformity=6(Ressuprimento). ParâmetroResupplyJobParameter=1dispara/sku/movement/resupply.php. - Se há produção própria + parâmetro habilitado → pedido vai para
IDStatusOrder=93(Em produção). - Senão → pedido vai para
IDStatusOrder=11(Sem saldo), movimentos comIDTypeFulfillmentNonconformity=5(Falta).
Geração: para cada combinação de LocationGroup dos pedidos com saldo, cria (ou reusa) uma PickingList em status 1 (Pendente). O parâmetro OrderQtyLimit controla o limite máximo de pedidos por lista (reusa a lista existente se ainda há vaga). Orders.IDStatusOrder vai para 3 (Pré-picking), IDPickingList é setado, PickingBasket recebe sequencial; insere OrderEvents com IDEvent=5.
Auto-start: parâmetros StartFinishPicking=1 (ou StartFinishPickingOwnProduction=1 para pedidos IDStatusOrder=93) fazem o handler executar imediatamente Start + Finish ao final, deixando a picking-list já em status 3.
Querystrings: bypasssvalidation=1 (pula validações), OnlyValidate=1 (retorna apenas {HasBalance, AvailableResupply} sem criar), OrderQtyLimit, IDPickingListConfiguration, IDTypePickingList (default 1), RecordUserCreatedStartPicking, PickingListPriority, OriginalPickingListPriority, IgnorePickingPreferenceByAllowResupplyLocation, PreferLocationMoreQuantity, debug=1.
Request
Responses
- 200
- 400
Sucesso. Sem OnlyValidate=1, retorna { "IDPickingList": <último id>, "Message": "Lista de picking gerada com sucesso" } ou, em caso de pedidos sem estoque, "Lista de picking gerada incompleta. N pedido(s) sem estoque". Com OnlyValidate=1, retorna { "HasBalance": 0|1, "AvailableResupply": 0|1 }.
Mensagens típicas (BusinessException):
Necessário selecionar pedidos para gerar lista picking— body vazio.Processo já esta rodando, favor aguardar— duplicidade detectada.Tipo picking list não existe.Pedido X não localizado.Pedido X esta em status que não permite iniciar picking.Pedidos selecionados estão em mais de um CD. A lista de separação só pode conter pedidos de um único CD.Problema ao gerar picking list— nenhum lista criada (ex.: todos sem batch alocável).- Propaga erros do
purchaseReceiptquando a integração com produção própria falha.