Objetivo
Este documento tem como objetivo explicar o funcionamento da integração do Pedido de Venda.
Pré-Requisitos e Restrições
- Necessário a instalação do serviço winthor-pedido-venda.
- Caso o atributo "seller" não seja enviado na requisição, a API consultará o RCA definido no parâmetro "4012 - Código do RCA para cadastro de clientes na Ciashop" da rotina 132- Parâmetros da Presidência.
- A região padrão de preço deverá ser informada na opção 4257-CODREGIAOPRECOCIASHOP da rotina 132- Parâmetros da Presidência.
- A precificação deverá ser realizada por Filial no parâmetro 2277 - Tipo de precificação selecionando o tipo de precificação conforme necessidade.
- A tabela PCLOGPEDIDOAPI, é responsável por guardar os retornos dos pedidos importados via integração, sendo Operação (I - inclusão, A - alteração, C - cancelamento) e Status (A - Aceito, R - Rejeitado, P - Processando).
- Através da lista de pedidos é possível pesquisar por Filial ou Multifiliais (separado por vírgula) para obter os dados.
- Os dados de Razão social do intermediador e CNPJ do intermediador serão representados pelos campos, "intermediaryCompanyName" e "idIntermediaryEmployer" respectivamente.
- Considera-se na totalização do pedido frete e outras despesas.
- Ao inserir um pedido através da API, o campo "PCPEDI.PBASERCA" gravará de acordo com o campo “PCPEDI.PTABELA”, não é necessário enviá-lo pela API.
- Será persistidos os dados de cartão que a operadora do cartão retorna como o NSU e DTNSU (data de aprovação do cartão).
- No envio do JSON deve-se enviar no campo productSKUERPReferenceKey o código auxiliar seguido do código do produto. Exemplo: 100-1
- Ao inserir um pedido, deverá enviar a informação do atributo acceptOrderWithoutTax. As figuras tributárias consideradas são referente a rotina 271 ou rotina 514 em caso de tributação por estado (parâmetro 1092 - Usar tributação por estado (UF), rotina 132) para o item. Caso não tenha a informação da figura tributária em alguma das rotinas e o atributo "acceptOrderWithoutTax" esteja sendo enviado com "false" , o pedido será rejeitado, do contrário se o parâmetro não for enviado, ou for enviado como "true", mesmo que não haja tributação vinculada o pedido será registrado, porém com o valor "0" na coluna PCPEDI.CODST e demais colunas de imposto.
- Caso o processo de desconto por item seja utilizado, o valor do desconto deve ser informado no campo listOfOrderItem.discountValue no body do json de envio do pedido. O campo sellPrice deve conter o valor correspondente ao valor tabela - valor do desconto. O preço tabela corresponderá ao preço de venda + o valor do desconto, e o percentual do desconto será calculado automaticamente. É necessário que haja uma política de desconto cadastrada na Rotina 561 para o conjunto de dados que serão enviados, de forma a controlar o percentual de desconto aplicado. Caso não haja política cadastrada, o pedido será integrado com a posição "Bloqueado".
- Ainda sobre o processo de desconto por item, a API está validando o parâmetro 1463 - % Máximo de desconto Médio nos Orçamentos e Pedidos de Venda da Rotina 132, de forma que mesmo havendo política de desconto que permita o percentual informado, o pedido não será integrado se o percentual for superior ao informado no parâmetro. Caso o parâmetro esteja com o valor "0", essa validação será desconsiderada e o pedido será integrado bloqueado.
- Ao enviar os atributos "deductionsCmv": {"discountsCofins": 0,"discountsIcms": 0,"discountsPis": 0} no corpo da requisição, será reduzido o valor do CMV considerando os descontos de: PIS, COFINS e ISENÇÃO de ICMS (Rotina 514- Figura triutária) os valores enviados serão apenas gravados. Esses mesmos dados serão retornados na API de consulta de pedido.
- Sugestão do time de produto modificar o parâmetro(4591) para não permitir alterar o Código Auxiliar ver Link DDRET-6481 DT Criar Parâmetro para Edição de CODAUXILIAR
- Para o processo de múltiplas cobranças, o mesmo só poderá ser utilizado caso o parâmetro 3968 - Permite incluir multiplas cobranças? da Rotina 132 esteja marcado como "Sim". Para cobranças do tipo cartão, o envio do campo "nsu" é obrigatório.
- Ao enviar um item no pedido que seja bonificado/brinde o campo "gift" precisa está como "true", além disso o parâmetro 3045 da rotina 132 deve esta liberado (marcado igual a Sim).
- Ao inserir um pedido, é possível passar o parâmetro booleano "acceptSearchAutomaticFreightType" para permitir ou não a definição automática do tipo de frete baseado no que foi cadastrado para o fornecedor daquela venda. Caso você não informe o tipo de frete (parâmetro "freightDispatch"), e você informe o campo do fornecedor (parâmetro "carrierId"), ele consulte qual o tipo de envio é o padrão para aquele fornecedor, e faça a definição da venda com o mesmo tipo.
- Para validar se o pedido já existe, a api utiliza os campos orderIdHube e orderIdMktplace da requisição (correspondente aos campos pcpedc.numpedhube e pcpedc.numpedmktplace do banco). É utilizada a combinação dos dois campos para validar se o pedido já existe, portanto só serão integrados os pedidos se os dois campos forem distintos de algum registro já existente no banco.
Sobre o preenchimento do campo de percentual de IPI, esse valor é preenchido quando o método da API busca as informações do produto, com valores cadastrados na rotina 271.
A partir da versão 1.2.14.4, ao passar pela rotina de cálculo de IPI, será verificado o valor do parâmetro 4753 - Define o valor do percentual do IPI configurado no produto (BUSCAVALORPERCENTUALIPIAPIPEDIDO) , que tem o valor padrão "Sim". Se mantido como "Sim", o sistema continuará definindo o valor preenchido para o percentual de IPI na rotina 271. Caso seja definido como "Não", o sistema atribuirá o valor do percentual de IPI como 0.- Para recalculo do valor do IPI o parâmetro 4681 - Habilita cálculo reverso para impostos dos itens de valor agregado no pedido de venda deve está marcado igual a sim, o valor de IPI será calculado caso o campo sellPriceIPI não seja informado.
Importante:
- Para que seja calculado o valor do IPI, é necessário as seguintes condições:
- Não tenha valor de IPI já calculado ou enviado no JSON pelo campo sellPriceIPI.
- Tenha percentual de IPI Venda, isso é cadastrado na rotina 271.
- Tenha preço de venda.
- O parâmetro 4681 - Habilita cálculo reverso para impostos dos itens de valor agregado no pedido de venda (FIL_CALCREVERSOPEDIDOVENDA) esteja com valor "Sim".
- Se for enviado valor de IPI pelo campo sellPriceIPI na API, esse valor será gravado na tabela normalmente.
- Para que seja calculado o valor do IPI, é necessário as seguintes condições:
- Observação sobre a utilização do processo de múltiplas cobranças:
- Mesmo enviando a lista de múltiplas cobranças (listPayment) faz-se necessário o envio dos atributos chargingId e paymentPlanId no cabeçalho do pedido. Essas informações serão gravadas na tabela PCPEDC, mas no momento de faturar o pedido serão desconsideradas, pois será considerado o que está gravado na tabela PCFORMAPGTOPEDIDO.
- Será inserido a data atual no campo PCPEDC.DTCALCFRETE sempre que o valor de frete PCPEDC.VLFRETE referente ao campo do JSON "valueFreight" for maior que zero.
Integração
A integração consiste em receber e enviar dados do pedido que serão utilizados no E-Commerce.
Os dados integrados são:
API | PCPEDC | PCPEDI | Descrição | Tipo | Obrigatório |
createData | pcpedc.data | pcpedi.data | Data de criação do pedido | Data (DD/MM/YYYY) | Sim |
id | pcpedc.codcli | pcpedi.codcli | Identificador do Cliente | Numérico | Sim |
orderId | pcpedc.numped | pcpedi.numped | Identificador do pedido | Numérico | Não |
orderStatus | pcpedc.posicao | Estado do pedido - Veja mais | Texto | Não | |
chargingId | pcpedc.codcob | Identificador de cobrança. Caso não informada no cabeçalho do pedido, será gravada a cobrança padrão "BK"; | Texto | Não | |
TotalPrice | pcpedc.vltotal | Preço total do pedido | Numérico | Não | |
paymentPlanId | pcpedc.codplpag | Identificador do plano de pagamento | Texto | Sim | |
saleType | pcpedc.condvenda | Tipo de venda "1" - Venda normal "5" - Bonificação ou brinde.* "7" - Venda para Entrega Futura* "8" - Simples Remessa de Venda para Entrega Futura*
| Numérico | Sim | |
branchId | pcpedc.codfilial | Código da Filial | Texto | Sim | |
saleOrigin | pcpedc.origemped | Origem do pedido do Winthor ex: B=Balcão | Texto | Não | |
comissionPercent | pcpedi.percom | Percentual de comissão | Numérico | Não | |
productSKUERPReferenceKey | pcpedi.codprod | Embalagem do produto | Texto | Sim | |
sellPrice | pcpedi.pvenda | Preço do produto | Numérico | Sim | |
quantity | pcpedi.qt | Quantidade do produto | Numérico | Sim | |
realCost | pcpedi.vlcustoreal | Custo Real | Numérico | Não | |
warehouseBranchId | pcpedi.codfilialretira | Filial Retira, Caso não informado assume a filial do pedido branchId | Texto | Sim | |
position | pcpedi.numseq | Sequência do pedido | Numérico | Não | |
taxFigureId | pcpedi.codst | Figura tributária da rotina 514 | Numérico | Não | |
discountValue | pcpedi.perdesc | Percentual de desconto aplicado no item | Numérico | Não | |
valueFreight | pcpedc.vlfrete | Valor de frete | Numérico | Não | |
pcpedc.dtcalcfrete | Caso seja enviado o valor de frete (valueFreight) maior que zero, o campo (DTCALCFRETE) será preenchido. | Data (DD/MM/YYYY) | Não | ||
intermediaryCompanyName | pcpedc.descintermediador | Razão Social do Intermediador marketplace ou e-commerce | Texto | Não | |
idIntermediaryEmployer | pcpedc.cnpjintermediador | CNPJ do Intermediador marketplace ou e-commerce | Texto | Não | |
carrierId | pcpedc.codfornecfrete | Identificado da transportadora | Numérico | Não | |
seller | pcpedc.codusur | pcpedi.codusur | Código do RCA, caso não enviado será utilizado o definido no parâmetro "4012 - Código do RCA para cadastro de clientes na Ciashop" da rotina 132- Parâmetros da Presidência | Numérico | Não |
lastChange | pcpedc.dtfat (prioridade 1) | Data de faturamento do pedido | Data (DD/MM/YYYY) | Não | |
lastChange | pcpedc.data (prioridade 2) | Data de emissão do pedido | Data (DD/MM/YYYY) | Não | |
orderIdHube | pcpedc.numpedhube | Número do pedido realizado via hube ou conector | Texto | Não | |
orderIdMktplace | pcpedc.numpedmktplace | Número do pedido realizado via marketplace | Texto | Não | |
freightDispatch | pcpedc.fretedespacho | Utiliza despacho de frete (freteiros) Valores: "C" - CIF - Contratação do Frete por conta do Remetente ( Tag ModFrete Nfe= 0) "F" - FOB - Contratação do Frete por conta do Destinatário ( Tag ModFrete Nfe= 1) "T" - Contratação do Frete por conta de Terceiros ( Tag ModFrete Nfe= 2) "R" - Transporte Próprio por conta do Remetente ( Tag ModFrete Nfe= 3) "D" - Transporte Próprio por conta do Destinatário ( Tag ModFrete Nfe= 4) "G" - Gratuito - Sem Ocorrência de Transporte ( Tag ModFrete Nfe= 9)
| Texto | Não | |
uniqueSequentialNumber | pcpedc.nsu | NSUTEF - Apenas para forma de pagamento cartão | Numérico | Não | |
dateUniqueSequentialNumber | pcpedc.dtnsu | Data do número sequencial único do cartão de crédito | Data (DD/MM/YYYY) | Não | |
otherExpenses | pcpedc.vloutrasdesp | Outras despesas | Numérico | Não | |
gift | pcpedi.bonific | Item bonificado/brinde | Boolean | Não | |
observation | pcpedc.obs | Observação do pedido | String | Não | |
deliveryType | pcpedi.tipoentrega | Tipo de entrega Valores: *Obs: disponível a partir da versão: 1.2.0.1078 | String | Não | |
deliveryStatus | Status Entrega Valores: *Obs: disponível a partir da versão: 1.2.0.1078 | String | Não | ||
deliveryAddressId | pcpedc.codendentcli | Código do endereço de entrega *Obs: disponível a partir da versão: 1.2.0.1097 | Numérico | Não | |
sellPriceIPI | pcpedi.vlipi | Valor do IPI | Numérico | Não | |
shippingTrackingCodeSale | pcpedc.codigorastreiofretevenda | Código de rastreio do frete para uma venda | String | Não | |
Exemplo do envio da requisição:
method: 'POST', url: '/api/wholesale/v1/orders/'
{ "createData": "2020-03-23T13:24:36.955102+13:24", "orderIdHube": "string", "orderIdMktplace": "string", "orderStatus": "string", "chargingId": "string", "carrierId": 0, "seller": 0, "paymentPlanId": 0, "observation": 0, "saleType": 0, "freightDispatch": "string", "branchId": "string", "TotalPrice": 0, "saleOrigin": "W", "uniqueSequentialNumber": "string", "dateUniqueSequentialNumber": "string", "intermediaryCompanyName": "string", "idIntermediaryEmployer": "string", "valueFreight": 0, "CustomerVendorInternalId": "string", "position": 0, "otherExpenses": 0 "deliveryAddressId":0, "shippingTrackingCodeSale": "AA1234567892", "customer": { "id": 0 }, "permissions": { "acceptOrderWithoutTax": true, "acceptSearchAutomaticFreightType": false }, /** Somente enviado para a utilização do cenário de múltiplas cobranças **/ "listPayment": [ { "chargingId" : "string", "paymentPlanId" : 0, "expirationDate" : "0000-00-00T00:00:00", "value" : 0.0, "nsu" : 0 } ], "listOfOrderItem": [ { "productSKUERPReferenceKey": "string", "sellPrice":0, "discountValue":0, "quantity": 0.0, "realCost": 0.0, "warehouseBranchId": "string", "gift": true, "giftPrice": 0, "taxFigureId": 0, "deliveryType": "RI" "deductionsCmv": { "discountsCofins": 0, "discountsIcms": 0, "discountsPis": 0 } } ] }
{ "branchId": "string", "carrierId": 0, "chargingId": "string", "createData": "2021-08-06T15:40:00.000000+15:40", "customer": { "activityId": 0, "addressInfo": "", "billingAddress": "", "billingZipCode": "", "businessDistrict": "", "cityId": 0, "commercialAddress": "", "commercialZipCode": "", "corporate": false, "corporatePhone": "", "countryId": 0, "email": "", "finalCostumer": false, "id": 0, "paymentPlanId": 0, "sellerId": 0, "squareId": 0, "stateInscription": "", "tradeName": "" }, "lastChange": "2021-08-06T15:40:00", /** Somente retornado em caso de utilização do cenário de múltiplas cobranças **/ "listPayment": [ { "chargingId" : "string", "paymentPlanId" : 0, "expirationDate" : "0000-00-00T00:00:00", "value" : 0.0, "nsu" : 0 } ], "listOfOrderItem": [ { "accountingCost": 0.0, "basePriceRCA": 0.0, "comissionPercent": 0, "discountPercentage": 0, "fecp": 0, "financialCost": 0.0, "gift": false, "giftPrice": 0, "packingId": 0, "position": 0, "productId": 0, "productSKUERPReferenceKey": "00000-00", "quantity": 0.0, "realCost": 0.0, "replacementCost": 0.0, "resourceValueCMV": 0, "resourceValueCustumerCMV": 0, "sellPrice": 0.0, "sellPriceBaseST": 0, "sellPriceIPI": 0, "sellPriceST": 0, "stGNRE": 0, "tablePrice": 0.0, "tablePriceIPI": 0, "tablePriceST": 0, "taxFigureId": 0, "truncItem": false, "wantageQuantity": 0, "warehouseBranchId": "string", "deliveryType": "RI", "deliveryStatus": "R" } ], "permissions": { "acceptOrderWithoutTax": true, "acceptSearchAutomaticFreightType": false }, "orderId": "string", "orderIdHube": "string", "orderIdMktplace: "string", "orderStatus": "string", "otherExpenses": 0, "paymentPlanId": 0, "saleOrigin": "W", "saleType": 0, "saleTypePayment": "string", "totalValue": "0.0", "observation": "string", "shippingTrackingCodeSale": "string" }
As consultas referente aos pedido, apresentam o JSON na resposta da requisição:
method: 'GET', url: '/api/wholesale/v1/orders/' -> Passar no Parms o campo orderId, para obter dados do pedido. OU url: '/api/wholesale/v1/orders/list' -> Passar na requisição os dados do Parms abaixo.
branchId : 0 - Código da Filial **requerido daysOfSearch : 0 - Dias de Pesquisa (Se não informado, o padrão será 15 dias) orderId : 0 - Número Pedido lastChange : 2021-03-02T16:43:00 - Última alteração viewDocument : true/ false - Dados da nota fiscal saleOrigin : T - Origem Venda (Todas existentes no Winthor) Padrão W order : lastChange - Ordenação de busca orderStatus : C - Status do Pedido page : 1 - Número Página pageSize : 10 - Tamanho da página hasOrderIdHube : true/ false - Pedidos que com id de Hube - Disponível a partir da versão 1.0.84.229(Winthor-pedido-venda) hasOrderIdMktplace: true/ false - Pedidos que com id de Marketplace - Disponível a partir da versão 1.0.84.229(Winthor-pedido-venda) integrationOrigin : - Filtra pela coluna ORIGEMINTEGRACAO - Disponível a partir da versão 1.3.0.40(Winthor-pedido-venda)
{ "branchId": "string", "carrierId": 0, "chargingId": "string", "createData": "2021-08-06T15:40:00.000000+15:40", "customer": { "activityId": 0, "addressInfo": "", "billingAddress": "", "billingZipCode": "", "businessDistrict": "", "cityId": 0, "commercialAddress": "", "commercialZipCode": "", "corporate": false, "corporatePhone": "", "countryId": 0, "email": "", "finalCostumer": false, "id": 0, "paymentPlanId": 0, "sellerId": 0, "squareId": 0, "stateInscription": "", "tradeName": "" }, "document": { "createData": "1900-01-01T00:00:00", "documentNumber": 0, "keyDocument": "", "lastChange": "1900-01-01T00:00:00" }, "lastChange": "2021-08-06T15:40:00", /** Somente retornado em caso de utilização do cenário de múltiplas cobranças **/ "listPayment": [ { "chargingId" : "string", "paymentPlanId" : 0, "expirationDate" : "0000-00-00T00:00:00", "value" : 0.0, "nsu" : 0 } ], "listOfOrderItem": [ { "accountingCost": 0.0, "basePriceRCA": 0.0, "comissionPercent": 0, "discountPercentage": 0, "fecp": 0, "financialCost": 0.0, "gift": false, "giftPrice": 0, "packingId": 0, "position": 0, "productId": 0, "productSKUERPReferenceKey": "00000-00", "quantity": 0.0, "realCost": 0.0, "replacementCost": 0.0, "resourceValueCMV": 0, "resourceValueCustumerCMV": 0, "sellPrice": 0.0, "sellPriceBaseST": 0, "sellPriceIPI": 0, "sellPriceST": 0, "sellPriceIcmsPart": 0, "stGNRE": 0, "tablePrice": 0.0, "tablePriceIPI": 0, "tablePriceST": 0, "taxFigureId": 0, "truncItem": false, "wantageQuantity": 0, "warehouseBranchId": "string" } "deductionsCmv": { "discountsCofins": 0, "discountsIcms": 0, "discountsPis": 0 } ], "permissions": { "acceptOrderWithoutTax": true, "acceptSearchAutomaticFreightType": false }, "orderId": "string", "orderIdHube": "string", "orderIdMktplace: "string", "orderStatus": "string", "otherExpenses": 0, "paymentPlanId": 0, "saleOrigin": "W", "saleType": 0, "saleTypePayment": "string", "totalValue": "0.0", "observation": "string", "shippingTrackingCodeSale": "string" }
As requisições de Cancelamento referente aos pedido, apresentam o JSON na resposta da requisição:
method: 'DELETE', url: '/api/wholesale/v1/orders/' -> Passar no Parms o campo id e Motivo para cancelar o pedido
Id : 0 - ID/Número Pedido (Obrigatório) sendMessageRca : true/ false - Enviar mensagem pro RCA? reasonCancellation : C - Motivo Cancelamento (Obrigatório)
Observação: Os pedidos com itens do tipomerc = CB (CESTA BASICA) terão os itens da cesta gravados na tabela PCPEDICESTA no campo CODPRODMP.