Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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