    
    /**
     ********************************************************** 
     *    db    888888 888888 88b 88  dP""b8    db     dP"Yb  * 
     *   dPYb     88   88__   88Yb88 dP   `"   dPYb   dP   Yb * 
     *  dP__Yb    88   88""   88 Y88 Yb       dP__Yb  Yb   dP * 
     * dP""""Yb   88   888888 88  Y8  YboodP dP""""Yb  YbodP  * 
     ********************************************************** 
     *
     ************ DISCLAIMER ************
     * Optei escrever esse ws em nodejs *
     * pois python nao possui suporte a *
     * criptografia sha512 com password *
     ************************************
     *
     * 
     * Ao final do arquivo ha uma sessao de emails trocados com o cliente
     * e o suporte da stone que nos ajudaram a encontrar o caminho
     * 
    */
    
    
    /**
     * Classe responsavel pela comunicacao do webservise da stone
     */
    class stone
    {
        /**
         * Construtor
         */
        constructor(
            refererDay      , // ~
            affiliationkey  , // ~
            stoneCodes      , // ~ 
            txtOutptCb        // ~ 
        ){
            this.request = require( "request") ; 
            this.crypto  = require(  "crypto") ; 
            this.parser  = require('xml2json') ; 
            this.fs      = require(      'fs') ; 
            
            // process.argv[3] = '178022600' ; // VARIOS
            // process.argv[3] = '189910799' ; // ZERO
            // process.argv[3] = '125880636' ; // ZERO
            // process.argv[3] = '150050904' ; // 1
            
            this.dateRefere     = refererDay             ; 
            this.affiliakey     = affiliationkey         ; 
            this.stoneCodes     = stoneCodes .split(' ') ; 
            this.saveOnFile     = txtOutptCb             ; 
            
            this.arquivo = new Array();
            
            // this.fakeReturn = require("./examples/20190506.json");
            
            this.url = `https://conciliation.stone.com.br/conciliation-file/v2.2/${this.dateRefere}` ; 
            
            this.idData = {
                "ClientApplicationKey"       : "Bearer 2a1a90ed-54bd-4248-98b3-6b6e838ef996"      , 
                "ClientEncryptionString"     : '888888 888888 88     88 88""Yb 888888     8888b.   dP"Yb  88 8888b.  888888 88""Yb    db    |88__   88__   88     88 88__dP 88__        8I  Yb dP   Yb 88  8I  Yb 88__   88__dP   dPYb   |88""   88""   88  .o 88 88"""  88""        8I  dY Yb   dP 88  8I  dY 88""   88"Yb   dP__Yb  |88     888888 88ood8 88 88     888888     8888Y"   YbodP  88 8888Y"  888888 88  Yb dP""""Yb |', 
                "ClientApplicationSecretKey" : this.affiliakey , 
            };
            
            this.process();
        }
        
        
        
        /**
         * Inicia o processamento, tenmto um ddevio para simular
         */
        process()
        {
            if (this.fakeReturn) {
                this.processReturn(this.fakeReturn);
            } else {
                this.makeRequestByStoneCode();
            }
        }
        
        
        /**
         * Monta a chave secreta
         */
        getSignature(){
            //return "c27d3831f1300f7dfc19120390d3f8711ef1382acfb614e8469a33bb34300b0b007befa76785db0dce7ada083cfb040664ba272e57a1b148c37ec5f8fab8b841" ; 
            return this.cryptoKey(
                this.idData.ClientEncryptionString, 
                this.idData.ClientApplicationSecretKey
            ) ; 
        }
        
        
        /**
         * Monta os options para o recquest 
         * 
         * @param {string} stonecode 
         */
        getRequestOptions(stonecode)
        {
            let options = { 
                method : "GET",
                url    : this.url,
                qs     : { 
                    // maquina stone, uma por chamada
                    affiliationCode : stonecode
                },
                headers: {
                    "x-authorization-encrypted-data" : this.getSignature()                , 
                    "x-authorization-raw-data"       : this.idData.ClientEncryptionString , 
                    "authorization"                  : this.idData.ClientApplicationKey   , 
                }
            } ; 
            return options ; 
        }
        
        
        /**
         * Faz os requests usando promise 
         */
        makeRequestByStoneCode()
        {
            // array de promises
            let promecas = new Array();
            
            // para cada stonecode sera um request
            this.stoneCodes.forEach(stonecode=>{
                // faz o request e devolve um promisse para o array
                promecas.push(this.makeRequest(stonecode));
            });
            
            // apos todos acabare, monta o arquivo de saida
            Promise.all(promecas).then(()=>{
                this.saveFile ( ) ; 
            });
        }
        
        
        
        /**
         * faz o request
         * @param {Number} stonecode 
         * @return {Promise} 
         */
        makeRequest(stonecode)
        {
            // retorna um promise 
            return new Promise((resolve, reject) => {
                // faz o requestt
                this.request(
                    // pega os options
                    this.getRequestOptions(stonecode) , 
                    // callback
                    (error, response, body) => { 
                        // erro
                        // if (error){return reject()}
                        
                        // sai do promise
                        return resolve(
                            // apos o request 
                            this.returnRequest(error, response, body, stonecode)
                        );
                        
                    }
                );
            })
        }
        
        /**
         * Processa o retorno do request
         * 
         * @param {*} error 
         * @param {*} response 
         * @param {*} body 
         */
        returnRequest(error, response, body, stonecode)
        {
            if (error) throw new Error(error);
            
            // console.log(body);
            
            this.saveOnDisk(
                `/var/www/html/webservice/stone/examples/${this.dateRefere}-${stonecode}.xml`, 
                this.formatXml(body)
            );
            
            // convertr para json o xml retornado
            let stoneJson = JSON.parse(this.parser.toJson(body));
            
            // inicia a montagem do txt 
            this.processReturn(stoneJson);
        }
        
        
        /**
         * Inicia a montagem do TXT 
         * @param {*} stoneJson 
         */
        processReturn(stoneJson)
        {
            // this.stoneJson = stoneJson;
            
            this.createHeader   ( stoneJson ) ; 
            this.createPayments ( stoneJson ) ; 
            this.createTrailer  ( stoneJson ) ; 
        }
        
        
        
        createHeader(stoneJson)
        {
            if (!stoneJson["Conciliation"]){
                return ; 
            }
            
            
            let header = new Array();
            let Header = stoneJson["Conciliation"]["Header"];
            
            header.push(                        "0" ) ; // 05  WS-STN-HD-TIPO-REGISTRO   PIC  X(001)        VALUE SPACES.              * Constante '0' : identifica o tipo de registro header (in�cio do arquivo).
            header.push(                    "STONE" ) ; // 05  WS-STN-HD-EMPRESA-ADQUIR  PIC  X(005)        VALUE SPACES.              * Constante STONE.
            header.push(Header["GenerationDateTime"]) ; // 05  WS-STN-HD-DATA-GERACAO    PIC  9(014)        VALUE ZEROS.               * Datetime de gera��o do arquivo (Formato: aaaammddHHmmss)
            header.push(Header[         "StoneCode"]) ; // 05  WS-STN-HD-STONE-CODE      PIC  9(009)        VALUE ZEROS.               * C�digo identificador da loja
            header.push(Header[     "LayoutVersion"]) ; // 05  WS-STN-HD-LAYOUT-VERSAO   PIC  9(003)        VALUE ZEROS.               * Vers�o do Layout do arquivo
            header.push(Header[            "FileId"]) ; // 05  WS-STN-HD-FILLER          PIC  X(026)        VALUE SPACES.              * Data a que se refere o arquivo
            header.push(Header[     "ReferenceDate"]) ; // 05  WS-STN-HD-DATA-REFERENCIA PIC  9(008)        VALUE ZEROS.               * Data a que se refere o arquivo
            header.push("") ; 
            
            header = header.join('|');
            
            if (this.saveOnFile === "debug"){
                this.arquivo.push("##~~".repeat(5) + "DEBUG" + "##~~".repeat(5));
            }
            this.arquivo.push(header);
        }
        
        
        createPayments(stoneJson)
        {
            // let payments = new Array();
            let Payments = "Error" in stoneJson && !stoneJson ? "" : stoneJson["Conciliation"]["Payments"]["Payment"];
            
            if (!Payments){
                console.log("Error: ",stoneJson["Error"])
                return;
            }
            
            // Se tiver varios pagamentos, faz um foreach
            if (Payments.constructor.name === 'Array'){
                for (let Payment in Payments) {
                    this.createPayments_mount(stoneJson, Payments[Payment]);
                }
            } else
            
            // Se soh houver um, monta ele
            if (Payments.constructor.name === 'Object'){
                this.createPayments_mount(stoneJson, Payments);
            }
        }
        
        createPayments_mount(stoneJson, payment)
        {
            let payments = new Array();
            
            payments.push(                                              "1"  ); // 05  WS-STN-PA-TIPO-REGISTRO  PIC  X(001)        VALUE SPACES.              * Constante '1' identifica o tipo de registro de detalhe do Comprovante de Venda (CV).
            payments.push(payment[                                     "Id" ]); // 05  WS-STN-PA-ID-PGTO        PIC  9(009)        VALUE ZEROS.               * Identificador do pagamento (PaymentId)
            payments.push(payment[                           "WalletTypeId" ]); // 05  WS-STN-PA-ID-ARRANJO     PIC  9(002)        VALUE ZEROS.               * Identificador do arranjo do pagamento
            payments.push(payment[                            "TotalAmount" ]); // 05  WS-STN-PA-VLR-DEPOSITADO PIC  ZZZZZ9,999999 VALUE ZEROS.               * Valor total depositado na conta do lojista
            payments.push(payment[           "TotalFinancialAccountsAmount" ]); // 05  WS-STN-PA-VLR-DISPONIVEL PIC  9(013)        VALUE ZEROS.               * Valor total que o lojista tem dispon�vel para receber no dia
            payments.push(payment[                     "LastNegativeAmount" ]); // 05  WS-STN-PA-VLR-PENDENTE   PIC  9(013)        VALUE ZEROS.               * Valor negativo que o cliente tem pendente com a Stone
            payments.push(payment["FavoredBankAccount"][         "BankCode" ]); // 05  WS-STN-PA-BANCO          PIC  9(004)        VALUE ZEROS.               * C�digo do banco favorecido de acordo com o Banco Central
            payments.push(payment["FavoredBankAccount"][       "BankBranch" ]); // 05  WS-STN-PA-AGENCIA        PIC  X(010)        VALUE SPACES.              * C�digo da ag�ncia do banco de acordo com o Banco Central
            payments.push(payment["FavoredBankAccount"]["BankAccountNumber" ]); // 05  WS-STN-PA-CONTA          PIC  9(012)        VALUE ZEROS.               * N�mero da conta favorecida
            payments.push(                                               ""  ); 
            
            payments = payments.join("|");
            
            this.arquivo.push(payments);
            
            this.findTransaction(stoneJson, payment["Id"]);
        }
        
        
        
        
        findTransaction(stoneJson, id)
        {
            let Transactions = stoneJson["Conciliation"]["FinancialTransactionsAccounts"]["Transaction"];
            // let transId;
            
            // console.log(Transactions.constructor.name);
            
            if (Transactions.constructor.name === 'Object'){
                this.findTransaction_mount(Transactions, id);
            }else 
            
            if (Transactions.constructor.name === 'Array'){
                
                for (let Transaction of Transactions)
                {
                    this.findTransaction_mount(Transaction, id);
                }
            }
        }
        
        findTransaction_mount(Transaction, id)
        {
            let transId = Transaction['Installments']['Installment']['PaymentId'];
            
            if ( id == transId 
                && Transaction["Events"]["Payments"] == 1
                // && Transaction["Events"]["Capitures"] == 1
            ){
                let line=[]
                line.push(                                                           "2" ); // 05  WS-STN-TA-TIPO-REGISTRO     PIC  X(001)        VALUE SPACES.              * Constante '2' - Identifica o tipo de registro detalhe do RO.
                line.push(Transaction[                          "AcquirerTransactionKey"]); // 05  WS-STN-TA-NSU               PIC  9(014)        VALUE ZEROS.               * Identificador único da transação (NSU) gerado pela adquirente
                line.push(Transaction[                         "InitiatorTransactionKey"]); // 05  WS-STN-TA-COD-RECEBIDO      PIC  X(128)        VALUE SPACES.              * Código recebido pelo sistema cliente
                line.push(Transaction[                           "AuthorizationDateTime"]); // 05  WS-STN-TA-DATA-AUTORIZ      PIC  9(014)        VALUE ZEROS.               * Datetime da autorização (Formato: aaaammddHHmmss)
                line.push(Transaction[                            "CaptureLocalDateTime"]); // 05  WS-STN-TA-DATA-CAPTURA      PIC  9(014)        VALUE ZEROS.               * Datetime da captura (Formato: aaaammddHHmmss) no horario local da adquirente
                line.push(Transaction[                                 "InstallmentType"]); // 05  WS-STN-TA-TIPO-PARCELAMENTO PIC  X(060)        VALUE SPACES.              * Tipo de parcelamento utilizado na transação lojista/emissor
                line.push(Transaction[                            "NumberOfInstallments"]); // 05  WS-STN-TA-NRO-PARCELAS      PIC  9(004)        VALUE ZEROS.               * Número de parcelas
                line.push(Transaction[                                "AuthorizedAmount"]); // 05  WS-STN-TA-VLR-AUTORIZ       PIC  9(013)        VALUE ZEROS.               * Valor autorizado
                line.push(Transaction[                                  "CapturedAmount"]); // 05  WS-STN-TA-VLR-CAPTURADO     PIC  9(013)        VALUE ZEROS.               * Valor capturado
                line.push(Transaction[                                  "CanceledAmount"]); // 05  WS-STN-TA-TOT-CANCELADO     PIC  9(013)        VALUE ZEROS.               * Total cancelado
                line.push(Transaction[                       "AuthorizationCurrencyCode"]); // 05  WS-STN-TA-COD-MOEDA         PIC  X(019)        VALUE SPACES.              * Código da moeda de acordo com a ISO 4217
                line.push(Transaction[                         "IssuerAuthorizationCode"]); // 05  WS-STN-TA-COD-AUTORIZ       PIC  X(006)        VALUE SPACES.              * Código da autorização fornecido pelo emissor.
                line.push(Transaction[                                         "BrandId"]); // 05  WS-STN-TA-BANDEIRA          PIC  9(004)        VALUE ZEROS.               * Identificador da bandeira do cartão
                line.push(Transaction[                                      "CardNumber"]); // 05  WS-STN-TA-NRO-CARTAO        PIC  X(019)        VALUE SPACES.              * Número do cartão (truncado)
                line.push(Transaction["Installments"]["Installment"]["InstallmentNumber"]); // 05  WS-STN-TA-NRO-PARCELA       PIC  9(002)        VALUE ZEROS.               * Número da parcela
                line.push(Transaction["Installments"]["Installment"][      "GrossAmount"]); // 05  WS-STN-TA-VLR-BRUTO         PIC  9(013)        VALUE ZEROS.               * Valor bruto da parcela
                line.push(Transaction["Installments"]["Installment"][        "NetAmount"]); // 05  WS-STN-TA-VLR-LIQUIDO       PIC  9(013)        VALUE ZEROS.               * Valor liquido da parcela
                line.push(Transaction["Installments"]["Installment"][      "PaymentDate"]); // 05  WS-STN-TA-DATA-PGTO         PIC  9(008)        VALUE ZEROS.               * Data de pagamento da parcela
                
                line.push("");
                this.arquivo.push(line.join("|"));
            }
        }
        
        
        createTrailer(stoneJson)
        {
            let trailer = [];
            let Trailer = "Error" in stoneJson && !stoneJson ? "" : stoneJson["Conciliation"]["Trailer"];
            
            if (!Trailer){
                console.log("Error: ",stoneJson.Error)
                return;
            }
            
                trailer.push(                                    "9" ); // 05  WS-STN-TR-TIPO-REGISTRO  PIC  X(001)        VALUE SPACES.              * Constante '9' Identifica o tipo de registro de detalhe trailer (final do arquivo).
                trailer.push(Trailer[ "CapturedTransactionsQuantity"]);
                trailer.push(Trailer[ "CanceledTransactionsQuantity"]);
                trailer.push(Trailer[     "PaidInstallmentsQuantity"]);
                trailer.push(Trailer[ "ChargedCancellationsQuantity"]);
                trailer.push(Trailer[          "ChargebacksQuantity"]);
                trailer.push(Trailer[    "ChargebacksRefundQuantity"]);
                trailer.push(Trailer[   "ChargedChargebacksQuantity"]);
                trailer.push(Trailer["PaidChargebacksRefundQuantity"]);
                trailer.push(Trailer[           "PaidEventsQuantity"]);
                trailer.push(Trailer[        "ChargedEventsQuantity"]);
                trailer.push("");
            trailer = trailer.join("|");
            this.arquivo.push(trailer);
        }
        
        
        
        /**
         * Grava em disco o txt do cobol 
         */
        saveFile()
        {
            // faz o array virar um txt.
            this.arquivo = this.arquivo.join('\n');
            
            // se for debug, nao grava em disco, so mostra em tela
            if (this.saveOnFile === "debug"){
                return console.log(this.arquivo);
            }
            
            return this.saveOnDisk(this.saveOnFile, this.arquivo);
            
        }
        
        
        
        saveOnDisk(path, file)
        {
            this.fs.writeFile(
                path ,                                  //  caminho 
                file ,                                  // conteudo 
                (err)=>{                                // callback 
                    if(err) {return console.log(err);}  // em caso de erro 
                    console.log(`${path} saved!`); // Se gravou com sucesso 
                }
            ); 
        }
        
        
        
        formatXml(xml)
        {
            var formatted = '';
            var reg = /(>)(<)(\/*)/g;
            xml = xml.toString().replace(reg, '$1\r\n$2$3');
            var pad = 0;
            var nodes = xml.split('\r\n');
            for(var n in nodes) {
                var node = nodes[n];
                var indent = 0;
                if (node.match(/.+<\/\w[^>]*>$/)) {
                    indent = 0;
                } else if (node.match(/^<\/\w/)) {
                if (pad !== 0) {
                    pad -= 1;
                    }
                } else if (node.match(/^<\w[^>]*[^\/]>.*$/)) {
                    indent = 1;
                } else {
                    indent = 0;
                }
                
                var padding = '';
                for (var i = 0; i < pad; i++) {
                    padding += '    ';
                }
                
                formatted += padding + node + '\r\n';
                pad += indent;
            }
            return formatted;
        }
        
        
        
        /**
         * Monta um hash sha512 com salt
         * 
         * @param {string} text 
         * @param {string}  key 
         */
        cryptoKey (text, key) { 
            var hash = this.crypto.createHmac("sha512", key) ; 
            hash.update(text)                                ; 
            let retorno = hash.digest("hex")                 ; 
            console.log(retorno)                             ; 
            return retorno                                   ; 
        } 
    };
    
    // console.log(process.argv);
    
    /**
     * Roda o codigo 
    **/
    new stone(
        refererDay = process.argv[2] , 
        affiliakey = process.argv[3] , 
        stoneCodes = process.argv[4] , 
        txtOutptCb = process.argv[5]   
    );
    // */
    
    // //*
    // for(let x=1; x<=31; x++){
    //     if (x.toString().length==1){
    //         x=`0${x}`;
    //     }
    //     // console.log(`201904${x}`);
    //     setTimeout(()=>{
    //         try{
    //             console.log(`201904${x}`);
    //             new stone(
    //                 refererDay = `201904${x}`    , 
    //                 stoneCodes = process.argv[3] , 
    //                 txtOutptCb = process.argv[4] , 
    //             );
    //         }catch(e){}
    //     }, x*10000);
    // }
    // // */
    
    
    
    
    /*
        segue o email da stone com as credenciais, 
        está faltando a da CR Hozello  assim que receber te envio
        
        Abaixo encaminho suas credenciais, com o Stone Code 178022600, 189910799, 150050904 e 125880636 vinculados. // ! 340312425 
        
        
        outras adquirentes que encaminham os arquivos via VAN, 
        nós utilizamos uma API para gerarmos os arquivos de conciliação. 
        Logo na Stone o parceiro é responsável por consultar nossa API e gerar o arquivo. 
        Lembrando que os arquivos sempre estarão disponíveis para consulta, sem limite de tempo.
        
        Suporte Stone: O time de integrações é responsável por ajudar o parceiro com suas dúvidas relacionadas 
        a API de Conciliação. Não nos envolvemos com código ou desenvolvimento da aplicação do lado deles.
        
        Conciliação V2.2: Na nova versão a aplicação que realiza a conciliação tem uma credencial e todos os 
        Stonecode que esta aplicação precisar conciliar são associados à sua credencial.
        
        
        Pontos de destaque na documentação API de Conciliação:  
        - Preciso que o parceiro leia com muita atenção nossa documentação onde estão todos os detalhes 
        necessários para o bom uso da aplicação.
        - Introdução - https://conciliacao.stone.com.br/reference
        - Estrutura do arquivo - https://conciliacao.stone.com.br/reference#overview-da-api
        - Como trabalhar com as credenciais - https://conciliacao.stone.com.br/reference#introducao
        - FAQ - https://conciliacao.stone.com.br/reference#faq-perguntas-e-respostas
        - Canal para tirar dúvidas durante a integração – suporteintegracoes@stone.com.br
        - Canal de atendimento para dúvidas sobre o arquivo e suas informações - alodigital@stone.com.br
        
        Qualquer dúvida, estamos à disposição.
        
        Abs,
        Time de Parcerias Stone
        stone.com.br/parcerias
        
        
        
        
        
        
        Seguem alguns esclarecimentos quanto suas dúvidas! 
        
        1) Quando busco as informações através da API, os pagamentos relacionados ocorrerão no mesmo dia?
            Os arquivos de conciliação da Stone mostram todos eventos ocorridos data de consulta 
            “ReferenceDate”, desde capturas, cancelamentos, chargebacks, cancelamentos e etc, 
            eles podem ser consultados em D+1, ou seja, hoje disponibilizamos em nossa API todos eventos que 
            ocorreram para um determinado Stonecode ontem.
        
        2) Qual a ligação do pagamento com a transação?
            2.1) Por exemplo, como identificar que o pagamento em questão, pertence ao qual número de NSU?
                Qualquer evento que ocorra com uma transação possuí a TAG <AcquirerTransactionKey> 
                que se refere ao StoneID ou NSU da transação. Todo evento de uma transação inciará num container <Transaction> 
                acompanhado pela descrição do evento. Que possui valor “1”para a TAG que ele representa. 
                Exemplo para Captura: 
                    <FinancialTransactions>
                        ...
                        <Transaction>
                            <Events>
                                <CancellationCharges>0</CancellationCharges>
                                <Cancellations>0</Cancellations>
                                <Captures>1</Captures>
                                <ChargebackRefunds>0</ChargebackRefunds>
                                <Chargebacks>0</Chargebacks>
                                <Payments>0</Payments>
                            </Events>
                            
                Exemplo para Pagamento:
                    <Transaction>
                            <Events>
                                <CancellationCharges>0</CancellationCharges>
                                <Cancellations>0</Cancellations>
                                <Captures>0</Captures>
                                <ChargebackRefunds>0</ChargebackRefunds>
                                <Chargebacks>0</Chargebacks>
                                <Payments>1</Payments>
                            </Events>
                Os eventos de pagamento
        
        3) Qual a ligação entre os Container?
            Os eventos de pagamento referente a liquidação da Stone para a conta do cliente são 
            demostrados ao final do arquivo no Container <FinancialEventAccounts> descritos como <Payments>, 
            eles mostram os lotes de pagamentos enviados para CIP  separados por modalidade e bandeira, 
            exemplo Visa / Crédito, Visa / Débito, Master / Crédito, Master / Débito etc: 
            Esse campo bate com somatório dos eventos <Transaction> / <Payments>1</Payments> 
            onde você pode consultar as transações que compõem os pagamentos. 
            
            Nosso time do alodigital@stone.com.br presta suporte ao entendimento do arquivo e dúvidas referentes a API, 
            nessa fase de implementação de um sistema o indicado é que você entre em contato com nosso 
            time de Integrações que atende pelo e-mail: integracoes@stone.com.br, 
            infelizmente eles não têm um numero de telefone, mas poderão te auxiliar com maior profundidade nesse primeiro contato!  
            
        Espero ter ajudado, qualquer coisa só chamar! 
        
        Abraços,
        Bruno Quintanilha l RT Digital
        Stone Co.
        
    */  
    
    
    /**
     * alodigital@stone.com.br alodigital@stone.com.br por  74b9enzy8rr4.41-e72reaq.na76.bnc.salesforce.com 
        sex, 17 de mai 18:57 (há 4 dias)
        para anselmo@softdib.com.br, luiz@softdib.com.br
        
        Olá, Anselmo! Tudo bem?
        
        O comprovante de venda em anexo é referente à transação de Stone ID 19593228303589, realizada no estabelecimento BUONA VITA - CNPJ 80394042000193 (SC 340312425).
        Você nos enviou em anexo os arquivos de conciliação dos SCs 189910799, 178022600, 150050904 e 125880636, mas não do 340312425.
        
        Processei o arquivo de conciliação do dia 05/04/2019 do SC 340312425 e achei a venda em questão:
     */
    
    
    /**
    * *node  /var/www/html/webservice/stone/stone.js '20190209' 'ZTVkOTg4ZjYtMmZmNC00OTk1LTk1YTAtMjk5M2VhMWYwN2E3' '178022600 189910799 150050904 125880636 340312425' 'debug'
    * *node  /var/www/html/webservice/stone/stone.js '20190209' 'ae5c0c28521d416e83a261cf32e12f3c' '340312425' 'debug'
    * *node  /var/www/html/webservice/stone/stone.js '20190209' 'ab7b9d2f945e4e5abbcbab882739e651' '151861156' 'debug'
    * 
    * *node  /var/www/html/webservice/stone/stone.js '20190519' 'ZTVkOTg4ZjYtMmZmNC00OTk1LTk1YTAtMjk5M2VhMWYwN2E3' '340312425' 'debug'
    */
    
    
    