...
"salesDocumentType"
para "ZCPP - Consulta Preço"
ou "ZCPI - Consulta Imposto"
, respectivamente.
A Execução do Payload pode ser visto no comando abaixo. Para este caso, a chamada dos preços, vendas totais e impostos serão para o documento ZDX.
Code Block |
---|
for row in df_payload.rdd.collect():
payload_retorno_s4_hana_interno = payload_retorno_s4_hana
if row["DOC_TYPE"] == 'ZDX - Venda Normal':
payload_chamada_json["schedule"]["Item"]["salesDocumentItem"] = row["ITM_NUMBER"]
payload_chamada_json["schedule"]["Item"]["scheduleLineDate"] = today
payload_chamada_json["rotationHeader"]["termsOfPaymentKey"] = row["PMNTTRMS"]
payload_chamada_json["rotationHeader"]["shippingConditions"] = row["SHIP_COND"]
payload_chamada_json["rotationHeader"]["sdDocumentCurrency"] = row["CURRENCY"]
payload_chamada_json["rotationHeader"]["salesOrganization"] = row["SALES_ORG"]
payload_chamada_json["rotationHeader"]["salesOffice"] = row["SALES_OFF"]
payload_chamada_json["rotationHeader"]["salesGroup"] = row["SALES_GRP"]
payload_chamada_json["rotationHeader"]["salesDocumentType"] = row["DOC_TYPE"]
payload_chamada_json["rotationHeader"]["salesDistrict"] = row["SALES_DIST"]
payload_chamada_json["rotationHeader"]["priceListType"] = row["PRICE_LIST"]
payload_chamada_json["rotationHeader"]["incotermsPart2"] = row["INCOTERMS2"]
payload_chamada_json["rotationHeader"]["incotermsPart1"] = row["INCOTERMS1"]
payload_chamada_json["rotationHeader"]["division"] = row["DIVISION"]
payload_chamada_json["rotationHeader"]["distributionChannel"] = row["DISTR_CHAN"]
payload_chamada_json["rotationHeader"]["customerGroup"] = row["CUST_GROUP"]
payload_chamada_json["rotationHeader"]["cup"] = row["cup"]
payload_chamada_json["quotePartners"]["Item"]["partnerFunction"] = row["PARTN_ROLE"]
payload_chamada_json["quotePartners"]["Item"]["customerNumber"] = row["PARTN_NUMB"]
payload_chamada_json["quoteItems"]["Item"]["salesDocumentItem"] = row["ITM_NUMBER"]
payload_chamada_json["quoteItems"]["Item"]["plant"] = row["PLANT"]
payload_chamada_json["quoteItems"]["Item"]["materialNumber"] = row["MATERIAL"]
payload_chamada_json["guuid"] = row["uuid"]
payload_chamada_str = json.dumps(payload_chamada_json)
payload_saida = chamada_simulate_api(payload_chamada_str)
payload_retorno_str = payload_saida.text
if (payload_retorno_str[:5] == "<?xml"):
payload_retorno_str = payload_retorno
payload_retorno_str = payload_retorno_str.replace("Sem Erros!", "ERRO: Retorno enviado em XML!")
payload_retorno_str = payload_retorno_str[:-1]
payload_retorno_str = payload_retorno_str[1:]
payload_chamada_str = payload_chamada_str[:-1]
else :
payload_chamada_str = payload_chamada_str[:-1]
payload_retorno_str = payload_retorno_str[:-2]
payload_retorno_str = payload_retorno_str[2:]
merge_json = payload_chamada_str +","+ payload_retorno_str + "}"
print(merge_json)
payload_gravar = json.loads(merge_json)
print(payload_gravar)
if (payload_gravar["quoteConditions"][0]["otherCosts"] == "NULL" or
payload_gravar["quoteConditions"][0]["otherCosts"] == "null" or
payload_gravar["quoteConditions"][0]["otherCosts"] == None
):
payload_gravar["quoteConditions"][0]["otherCosts"] = 0.0
if (payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == "NULL" or
payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == "null" or
payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == None
):
payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] = 0.0
if (payload_gravar["quoteConditions"][0]["commercialCost"] == "NULL" or
payload_gravar["quoteConditions"][0]["commercialCost"] == "null" or
payload_gravar["quoteConditions"][0]["commercialCost"] == None
):
payload_gravar["quoteConditions"][0]["commercialCost"] = 0.0
if (payload_gravar["quoteConditions"][0]["manufacturingCost"] == "NULL" or
payload_gravar["quoteConditions"][0]["manufacturingCost"] == "null" or
payload_gravar["quoteConditions"][0]["manufacturingCost"] == None
):
payload_gravar["quoteConditions"][0]["manufacturingCost"] = 0.0
if (payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == "NULL" or
payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == "null" or
payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == None
):
payload_gravar["quoteConditions"][0]["valueAdditionalSale"] = 0.0
if (len(payload_gravar["quotationItems"]) != 0):
payload_gravar["sapReturn"] = payload_retorno_json["sapReturn"]
if (len(payload_gravar["quotationItems"]) == 0):
payload_gravar["quotationItems"] = payload_retorno_json["quotationItems"]
payload_gravar["quoteConditions"] = payload_retorno_json["quoteConditions"]
jsonData = json.dumps(payload_gravar)
print(jsonData)
jsonDataList = []
jsonDataList.append(jsonData)
jsonRDD = sc.parallelize(jsonDataList)
df = spark.read.json(jsonRDD)
df.write.format("delta").mode("append").saveAsTable(simulate_table_name) |
Para os casos de ZCPP e ZCPI, é só atribuir a cláusula else para o primeiro condição if para o Tipo de Documento do ZDX assim:
Code Block |
---|
else:
#if row["DOC_TYPE"] == "ZDX - Consulta Venda":
payload_chamada_json["schedule"]["Item"]["salesDocumentItem"] = row["ITM_NUMBER"]
payload_chamada_json["schedule"]["Item"]["scheduleLineDate"] = today
payload_chamada_json["rotationHeader"]["termsOfPaymentKey"] = row["PMNTTRMS"]
payload_chamada_json["rotationHeader"]["shippingConditions"] = row["SHIP_COND"]
payload_chamada_json["rotationHeader"]["sdDocumentCurrency"] = row["CURRENCY"]
payload_chamada_json["rotationHeader"]["salesOrganization"] = row["SALES_ORG"]
payload_chamada_json["rotationHeader"]["salesOffice"] = row["SALES_OFF"]
payload_chamada_json["rotationHeader"]["salesGroup"] = row["SALES_GRP"]
payload_chamada_json["rotationHeader"]["salesDocumentType"] = row["DOC_TYPE"]
payload_chamada_json["rotationHeader"]["salesDistrict"] = row["SALES_DIST"]
payload_chamada_json["rotationHeader"]["priceListType"] = row["PRICE_LIST"]
payload_chamada_json["rotationHeader"]["incotermsPart2"] = row["INCOTERMS2"]
payload_chamada_json["rotationHeader"]["incotermsPart1"] = row["INCOTERMS1"]
payload_chamada_json["rotationHeader"]["division"] = row["DIVISION"]
payload_chamada_json["rotationHeader"]["distributionChannel"] = row["DISTR_CHAN"]
payload_chamada_json["rotationHeader"]["customerGroup"] = row["CUST_GROUP"]
payload_chamada_json["rotationHeader"]["cup"] = row["cup"]
payload_chamada_json["quotePartners"]["Item"]["partnerFunction"] = row["PARTN_ROLE"]
payload_chamada_json["quotePartners"]["Item"]["customerNumber"] = row["PARTN_NUMB"]
payload_chamada_json["quoteItems"]["Item"]["salesDocumentItem"] = row["ITM_NUMBER"]
payload_chamada_json["quoteItems"]["Item"]["plant"] = row["PLANT"]
payload_chamada_json["quoteItems"]["Item"]["materialNumber"] = row["MATERIAL"]
payload_chamada_json["guuid"] = row["uuid"]
payload_chamada_str = json.dumps(payload_chamada_json)
payload_saida = chamada_simulate_api(payload_chamada_str)
payload_retorno_str = payload_saida.text
if (payload_retorno_str[:5] == "<?xml"):
payload_retorno_str = payload_retorno
payload_retorno_str = payload_retorno_str.replace("Sem Erros!", "ERRO: Retorno enviado em XML!")
payload_retorno_str = payload_retorno_str[:-1]
payload_retorno_str = payload_retorno_str[1:]
payload_chamada_str = payload_chamada_str[:-1]
else :
payload_chamada_str = payload_chamada_str[:-1]
payload_retorno_str = payload_retorno_str[:-2]
payload_retorno_str = payload_retorno_str[2:]
merge_json = payload_chamada_str +","+ payload_retorno_str + "}"
payload_gravar = json.loads(merge_json)
if (payload_gravar["quoteConditions"][0]["otherCosts"] == "NULL" or
payload_gravar["quoteConditions"][0]["otherCosts"] == "null" or
payload_gravar["quoteConditions"][0]["otherCosts"] == None
):
payload_gravar["quoteConditions"][0]["otherCosts"] = 0.0
if (payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == "NULL" or
payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == "null" or
payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == None
):
payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] = 0.0
if (payload_gravar["quoteConditions"][0]["commercialCost"] == "NULL" or
payload_gravar["quoteConditions"][0]["commercialCost"] == "null" or
payload_gravar["quoteConditions"][0]["commercialCost"] == None
):
payload_gravar["quoteConditions"][0]["commercialCost"] = 0.0
if (payload_gravar["quoteConditions"][0]["manufacturingCost"] == "NULL" or
payload_gravar["quoteConditions"][0]["manufacturingCost"] == "null" or
payload_gravar["quoteConditions"][0]["manufacturingCost"] == None
):
payload_gravar["quoteConditions"][0]["manufacturingCost"] = 0.0
if (payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == "NULL" or
payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == "null" or
payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == None
):
payload_gravar["quoteConditions"][0]["valueAdditionalSale"] = 0.0
if (len(payload_gravar["quotationItems"]) != 0):
payload_gravar["sapReturn"] = payload_retorno_json["sapReturn"]
if (len(payload_gravar["quotationItems"]) == 0):
payload_gravar["quotationItems"] = payload_retorno_json["quotationItems"]
payload_gravar["quoteConditions"] = payload_retorno_json["quoteConditions"]
jsonData = json.dumps(payload_gravar)
#print(jsonData)
jsonDataList = []
jsonDataList.append(jsonData)
jsonRDD = sc.parallelize(jsonDataList)
df = spark.read.json(jsonRDD)
df.write.format("delta").mode("append").saveAsTable(simulate_table_name) |
Throubleshoot
Para validar corretamento a chamada da API deve-se atentar a três principais etapas: header da função da chamada da simulate; parâmetros da chamada no formato json e verificação da execução do payload para o formato especificado no header.
Header da Função da Chamada Simulate
O desenvolvimento do notebook para realizar a requisição da API foi desenvolvido com a passagem de parâmetros no formato json. A primeira etapa é verificar se a definição da função da chamada simulate está contemplando este formato. Isto pode ser visto na especificação do header da url.
...
Parâmetros da Chamada Simulate
Um dos principais problemas que podem ocorrer com o retorno da chamada simulate é a definição dos parâmetros. A solução para este problema foi desenvolvida pelos testes de especificação um a um de cada parâmetro. O modelo ideal para a requisição ocorrer de maneira com êxito é definida no formato abaixo. Este formato pode ser usado para todas as chamadas.
Code Block |
---|
payload_chamada = json.dumps({
"schedule": {
"Item": {
"scheduleLineDate": "",
"salesDocumentItem": "000150",
"orderQuantityInSalesUnits": "10"
}
},
"rotationHeader": {
"yourReference": "SF",
"valueShipping": "0",
"valueAccessoryCosts": "0",
"termsOfPaymentKey": "B028",
"shippingConditions": "Standard",
"sdDocumentCurrency": "BRL",
"salesOrganization": "DC01",
"salesOffice": "DB03",
"salesGroup": "091",
"salesDocumentType": "ZDX - Venda Normal",
"salesDistrict": "Deca - MG Região 07",
"requestedDeliveryDate": "",
"priceListType": "Não",
"incotermsPart2": "CIF - Custo, seguro & frete",
"incotermsPart1": "CIF - Custo, seguro & frete",
"division": "MS",
"distributionChannel": "40",
"dateForPricingAndExchangeRate": None,
"customerPurchaseOrderNumber": "",
"customerPurchaseOrderDate": "2020-07-30",
"customerGroup": "false",
"cup": "Revenda",
"completeDeliveryDefinedForEachSalesOrder": ""
},
"quotePartners": {
"Item": {
"partnerFunction": "EmissorOrdem",
"customerNumber": "0000032611"
}
},
"quoteItems": {
"Item": {
"salesDocumentItem": "000150",
"rateConditionRound": "0",
"rateConditionAmountOrPercentage": "0.00",
"plant": "D085",
"materialNumber": "4688.931"
}
},
"guuid": None,
"extension": {
"Item": {
"dataPartOfBapiExtensionParameter3": None,
"dataPartOfBapiExtensionParameter2": "",
"dataPartOfBapiExtensionParameter1": None,
"dataPartOfBapiExtensionParameter": ""
}
}
})
payload_chamada_json = json.loads(payload_chamada) |
A ideia usada para Throubleshoot é adicionar parâmetro por parâmetro e executar o seguinte comando:
Code Block |
---|
payload_chamada_str = json.dumps(payload_chamada_json)
payload_saida = chamada_simulate_api(payload_chamada_str)
payload_retorno_str = payload_saida.text
print(payload_chamada_str) |
Ao adicionar cada parâmetro e executar, se dar o erro no próprio parâmetro que foi especificado, então foi colocado de maneira errada. Caso, dê erro no próximo parâmetro (por não estar especificado. Lembre-se a adição é um a um), então significa que o parâmetro foi definido de maneira certo.
Observações: atentar aos parâmetros de "guuid"
, "dataPartOfBapiExtensionParameter3"
e "dataPartOfBapiExtensionParameter1"
. No caso do postman, atribui null para estes parâmetros. Aqui no Databricks não deve ser especificado como “null”, e sim como None.