Escrito por

BPLus Tecnologia
Artigo André Dienes Friedrich · Jul. 4, 2023 5m read

Utilizando Python no Iris

Olá, Criei este artigo inicialmente para demonstrar a usabilidade do Python dentro do Iris e sua funcionalidade, no código abaixo trago um exemplo de algo muito próximo que utilizamos para a solução de um problema, nele recebemos uma Global contendo um XML com mais de 7.000.000 de caractéres, onde fazemos as tratativas de limpeza, organização, conversão para um arquivo JSON e retornamos ele como resposta uma Global.

Class AXS.BP.Exemplo Extends (Ens.BusinessProcess, %XML.Adaptor) [ ClassType = persistent 

{

Method OnRequest(pRequest As AXS.BP.Req.ExemploBPRequest, Output pResponse As AXS.BP.Resp.ExemploBPResponse) As %Status

{

    Set tSC = $System.Status.OK()

    Try

    {          

        Set tRequest = ##Class(AXS.BO.BOT.Req.ExemploRequest).%New()

        Do pRequest.xml.Rewind()

        Do tRequest.fatura.CopyFrom(..RetornaJSON(pRequest.xml))

        $$$THROWONERROR(tSC,..SendRequestSync("Exemplo",tRequest,.tResponse))

        If $IsObject(tResponse) {

            Set pResponse=##class(AXS.BP.Resp.ExemploBPResponse).%New()

            If tResponse.status '= 200 {

            } Else {

                Set pResponse.retorno = tResponse.retorno

                Set pResponse.status = tResponse.status

            }       

        }  

    }

    Catch tException

    {

        Set:'$$$ISERR(tSC) tSC=tException.AsStatus()

        Set tSC = $System.Status.GetErrorText(tSC)

    }

    Quit tSC

}

ClassMethod RetornaJSON(XML As %Stream.GlobalCharacter) As %Stream.GlobalCharacter [ Language = python ]

{

    import xmltodict

    import json

    from datetime import datetime

    import iris

    XML.Rewind()

    xmllido = ""

    while XML.AtEnd == 0:

        xmlle = XML.ReadLine(9000)

        xmllido = xmllido + str(xmlle)

    def converte_xml_para_json(xml_file):

        xml_data = xml_file

        json_data = xmltodict.parse(xml_data)

        json_output = json.dumps(json_data, indent=4)

        return json_output

    def filtro_array_tres_meses(json_data):

        data_atual = datetime.now()

        dados_corretos = []

        dados_errados = []

        for item in json_data["Relatorio"]["Linha"]:

            if 'Periodo' in item:

                periodo = item['Periodo']

                periodo_date = datetime.strptime(periodo, "%Y/%m")

                diferenca_meses = (data_atual.year - periodo_date.year) * 12 + data_atual.month - periodo_date.month

                if diferenca_meses <= 3:

                    if len(item) == 15:

                        dados_corretos.append(item)

                    else:

                        dados_errados.append(item)

        return dados_corretos, dados_errados

    def converter_maiusculas_para_minusculas(dados_json):

        if isinstance(dados_json, dict):

            novo_dict = {}

            for chave, valor in dados_json.items():

                nova_chave = chave.lower()

                novo_valor = converter_maiusculas_para_minusculas(valor)

                novo_dict[nova_chave] = novo_valor

            return novo_dict

        elif isinstance(dados_json, list):

            novo_lista = []

            for item in dados_json:

                novo_item = converter_maiusculas_para_minusculas(item)

                novo_lista.append(novo_item)

            return novo_lista

        elif isinstance(dados_json, str):

            return dados_json.lower()

        else:

            return dados_json

    json_data = converte_xml_para_json(xmllido)

    dados_convertidos = json.loads(json_data)

    dados_corretos, dados_errados = filtro_array_tres_meses(dados_convertidos)

    json_saida = {}

    json_saida["Fatura"] = dados_corretos

    json_saida["Erro"] = dados_errados

    total_objetos = len(json_saida['Fatura'])

    for i in range(total_objetos):

        if json_saida["Fatura"][i]["Per_prox_saldo_exp"] == None:

            json_saida["Fatura"][i]["Per_prox_saldo_exp"] = ""

    json_combinado_saida = json.dumps(json_saida, indent=4)

    dados_convertidos = converter_maiusculas_para_minusculas(json_combinado_saida)

    jsonPronto = iris.cls('%Stream.GlobalCharacter')._New() 

    for linha in dados_convertidos:

        jsonPronto.Write(linha)

    return jsonPronto

}

Storage Default

{

<Type>%Storage.Persistent</Type>

}

}