Pular para o conteúdo principal

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 status 13 (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 com IDTypeFulfillmentNonconformity=6 (Ressuprimento). Parâmetro ResupplyJobParameter=1 dispara /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 com IDTypeFulfillmentNonconformity=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

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 }.