{
    "config": {
        "debug"         : true,
        "path_log"      : "/var/tmp/shopify.txt",
        "identifier"    : "shopify_id",
        "raw_type"      : "json"
    },

    "rotes": [
        {
            "id"                : 1,
            "rote"              : "products/sync",
            "handler"           : "sync_products",
            "active"            : true,
            "relacionaId"       : false,
            "send"              : false,
            "MD5"               : false,
            "use_softdib_api"   : false,
            "table"             : "TBPRODUTO",
            "methods"           : ["GET"]
        },
        {
            "id"                : 1.1,
            "rote"              : "products/sync_inventory",
            "handler"           : "sync_inventory",
            "active"            : true,
            "relacionaId"       : false,
            "send"              : false,
            "MD5"               : false,
            "use_softdib_api"   : false,
            "table"             : "TBPRODUTO",
            "methods"           : ["GET"]
        },
        {
            "id"            : 2,
            "_descricao"    : "Enviar grupos e subgrupos como custom_collections. Grupos raiz (CDSUBGRUPO=0) e subgrupos (CDSUBGRUPO>0) são enviados como coleções independentes, e a hierarquia é mantida via metafield que relaciona o ID da coleção filha ao ID da coleção pai.",
            "rote"          : "custom_collections",
            "active"        : true,
            "relacionaId"   : true,
            "send"          : true,
            "MD5"           : true,
            "primaryKey"    : "TBGRUPO.CDGRUPO + '.' + TBGRUPO.CDSUBGRUPO",
            "table"         : "TBGRUPO",
            "methods"       : ["PUT", "POST"],
            "control-id"    : "custom_collection/id",
            "fields": [
                { "dbfield" : "TBGRUPO.CDGRUPO + '.' + TBGRUPO.CDSUBGRUPO",                  "para"    : "id_externo",                         "desc"    : "Chave CDGRUPO.CDSUBGRUPO — referência interna, não enviada para Shopify" },
                { "dbfield" : "TBGRUPO.CDGRUPO",                                             "para"    : "cd_grupo",                           "desc"    : "Código do grupo pai — beforeSend usa para buscar o ID Shopify do pai em TBRELACIONAID" },
                { "dbfield" : "TBGRUPO.CDSUBGRUPO",                                          "para"    : "cd_subgrupo", "_type"   : "integer", "desc"    : "0 = categoria raiz | > 0 = subcategoria" },
                { "dbfield" : "REPLACE(TBGRUPO.DSGRUPO,'\"',\"'\")",                         "para"    : "titulo",                             "desc"    : "Nome da coleção → custom_collection.title" },
                { "dbfield" : "REPLACE(TBGRUPO.DSGRUPO,'\"',\"'\")",                         "para"    : "body_html",                          "desc"    : "Descrição → custom_collection.body_html (igual ao título por padrão)" }
            ],
            "orderBy": ["TBGRUPO.CDGRUPO, TBGRUPO.CDSUBGRUPO"]
        },
        {
            "id"                : 3,
            "rote"              : "products",
            "active"            : true,
            "relacionaId"       : true,
            "send"              : true,
            "MD5"               : true,
            "primaryKey"        : "TBPRODUTO.CDPRODUTO",
            "table"             : "TBPRODUTO",
            "methods"           : ["PUT", "POST"],
            "control-id"        : "product/id",
            "where": [
                "TBPRODUTO.FGSITUACAO = 0 AND TBPRODUTO.FGECOMMERCE = 'S' AND TBTABPRECOPRODUTO.CDTABELA = 'ECO'"
            ],
            "joins": [
                { "tbName" : "TBGRUPO",           "merge"  : "LEFT JOIN", "on"     : [ "TBGRUPO.CDGRUPO     = TBPRODUTO.CDGRUPO", "TBGRUPO.CDSUBGRUPO  = TBPRODUTO.CDSUBGRUPO", "(TBGRUPO.FGECOMMERCE = 'S' OR TBGRUPO.FGECOMMERCE = '')" ] },
                { "tbName" : "TBPRODUTOCOMPLE",   "merge"  : "LEFT JOIN", "on"     : [ "TBPRODUTOCOMPLE.CDPRODUTO     = TBPRODUTO.CDPRODUTO" ] },
                { "tbName":  "TBTABPRECOPRODUTO", "merge":   "LEFT JOIN", "on":      [ "TBTABPRECOPRODUTO.CDPRODUTO = TBPRODUTO.CDPRODUTO" ] }
            ],
            "fields": [
                { "dbfield" : "TBPRODUTO.CDPRODUTO",                                                                             "para"    : "sku",                                     "desc"    : "Código interno usado como SKU na Shopify" },
                { "dbfield" : "TBPRODUTO.CDCODIGOBARRAS",                                                                        "para"    : "codigo_barras",                           "desc"    : "EAN/código de barras → variants[0].barcode" },
                { "dbfield" : "REPLACE(CONCAT(TBPRODUTO.DSPRODUTO, COALESCE(TBPRODUTOCOMPLE.DSCOMPLEMENTAR, '')), '\"', \"'\")", "para"    : "titulo",                                  "desc"    : "Nome do produto → product.title" },
                { "dbfield" : "REPLACE(CONCAT(TBPRODUTO.DSPRODUTO, COALESCE(TBPRODUTOCOMPLE.DSCOMPLEMENTAR, '')), '\"', \"'\")", "para"    : "body_html",                               "desc"    : "Descrição completa → product.body_html. Usa DSCOMPLEMENTAR se existir, senão DSPRODUTO" },
                { "dbfield" : "(SELECT IF(TBPRODUTO.FGSITUACAO = 0, 'active', 'draft'))",                                        "para"    : "status",                                  "desc"    : "FGSITUACAO 0=active / qualquer outro=draft → product.status" },
                { "dbfield"  : "TBTABPRECOPRODUTO.VLPRODUTO",                                                                    "para"    : "preco", "_custom"  : "valor_produto",     "desc"     : "Preço de venda. Método valor_produto() divide por 100 para MT/M2 → variants[0].price" },
                { "dbfield" : "TBPRODUTO.VLPESOBRUTO",                                                                           "para"    : "peso",                                    "desc"    : "Peso bruto em KG → variants[0].weight (weight_unit fixo como kg no template)" },
                { "dbfield" : "TBPRODUTO.VLALTURA",                                                                              "para"    : "altura","_type"   : "integer",            "desc"    : "Altura em CM → metafield ou ignorado conforme necessidade" },
                { "dbfield" : "TBPRODUTO.VLLARGURA",                                                                             "para"    : "largura", "_type"   : "integer",          "desc"    : "Largura em CM" },
                { "dbfield" : "TBPRODUTO.VLCOMPRIMENTO",                                                                         "para"    : "comprimento", "_type"   : "integer",      "desc"    : "Comprimento/profundidade em CM" },
                { "dbfield" : "TBPRODUTO.CDNCM",                                                                                 "para"    : "ncm",                                     "desc"    : "NCM fiscal → incluído nas tags do produto" },
                { "dbfield" : "TBPRODUTO.NMUNIDADE",                                                                             "para"    : "unidade",                                 "desc"    : "Unidade de medida (UN, MT, M2...) → tag para controle" },
                { "dbfield"   : "TBPRODUTO.CDGRUPO + '.' + TBPRODUTO.CDSUBGRUPO",                                                "para"    : "categoria_id", "translate" : "TBGRUPO",   "desc"      : "Grupo+Subgrupo traduzido para o ID da custom_collection da Shopify via TBRELACIONAID" }
            ],
            "orderBy": ["TBPRODUTO.CDPRODUTO"]
        },
        {
            "id"            : 4,
            "rote"          : "inventory_levels/set",
            "active"        : true,
            "relacionaId"   : false,
            "send"          : true,
            "MD5"           : true,
            "primaryKey"    : "TBPRODUTO.CDPRODUTO",
            "table"         : "TBPRODUTO",
            "alias"         : "TBPRODUTO_INVENTORY",
            "methods"       : ["PUT", "POST"],
            "put_data"      : "body",
            "where": [
                "TBPRODUTO.FGSITUACAO = 0 AND TBPRODUTO.FGECOMMERCE = 'S' AND TBTABPRECOPRODUTO.CDTABELA = 'SHO'"
            ],
            "joins": [ 
                { "tbName": "TBTABPRECOPRODUTO", "merge": "LEFT JOIN", "on": [ "TBTABPRECOPRODUTO.CDPRODUTO = TBPRODUTO.CDPRODUTO" ] }
            ],
            "fields": [
                { "dbfield"   : "TBPRODUTO.CDPRODUTO",   "para"      : "inventory_item_id", "translate" : "TBPRODUTO_INVENTORY",        "desc"      : "inventory_item_id do variant — traduzido via TBRELACIONAID NMTABELA=TBPRODUTO_INVENTORY" },
                { "default"   : "",                      "para"      : "location_id",       "desc"      : "ID do depósito/loja na Shopify — preenchido no beforeSend_inventory_levels_set via TBTOKEN" },
                { "dbfield"   : "TBPRODUTO.VLQTDEATUAL", "para"      : "available",         "_custom"   : "quantidade_estoque_shopify", "_type"     : "integer", "desc"      : "Quantidade disponível — converte MT/M2 (multiplica por 100)" }
            ]
        },
        {
            "id"            : 5,
            "rote"          : "inventory_items/cost",
            "active"        : true,
            "relacionaId"   : false,
            "send"          : true,
            "MD5"           : true,
            "md5Fields"     : [{ "dbfield": "TBPRODUTO.VLVALORREPOSICAO" }],
            "primaryKey"    : "TBPRODUTO.CDPRODUTO",
            "table"         : "TBPRODUTO",
            "alias"         : "TBPRODUTO_INVENTORY",
            "methods"       : ["PUT"],
            "put_data"      : "body",
            "where": [
                "TBPRODUTO.FGSITUACAO = 0 AND TBPRODUTO.FGECOMMERCE = 'S' AND TBTABPRECOPRODUTO.CDTABELA = 'SHO'"
            ],
            "joins": [
                { "tbName": "TBTABPRECOPRODUTO", "merge": "LEFT JOIN", "on": [ "TBTABPRECOPRODUTO.CDPRODUTO = TBPRODUTO.CDPRODUTO" ] }
            ],
            "fields": [
                { "dbfield"   : "TBPRODUTO.CDPRODUTO",         "para"      : "inventory_item_id", "translate" : "TBPRODUTO_INVENTORY", "desc"      : "inventory_item_id via TBRELACIONAID NMTABELA=TBPRODUTO_INVENTORY" },
                { "dbfield"   : "TBTABPRECOPRODUTO.VLPRODUTO", "para"      : "custo",             "_custom"   : "valor_produto",       "desc"      : "Custo de reposição — converte MT/M2 igual ao preço" }
            ]
        },
        {
            "id"            : 9,
            "_descricao"    : "Atualiza SOMENTE o preco do variant na Shopify, via GraphQL productVariantsBulkUpdate (os endpoints REST /products e /variants estao deprecated desde a 2024-04). A rota products envia so no cadastro (POST) — os dados cadastrais do produto nao sao reenviados, apenas preco e estoque. O alias TBPRODUTO_PRECO e a chave de controle de MD5 desta rota.",
            "rote"          : "variants/price",
            "active"        : true,
            "relacionaId"   : false,
            "send"          : true,
            "MD5"           : true,
            "md5Fields"     : [{ "dbfield": "TBTABPRECOPRODUTO.VLPRODUTO" }],
            "primaryKey"    : "TBPRODUTO.CDPRODUTO",
            "table"         : "TBPRODUTO",
            "alias"         : "TBPRODUTO_PRECO",
            "methods"       : ["PUT"],
            "put_data"      : "body",
            "where": [
                "TBPRODUTO.FGSITUACAO = 0 AND TBPRODUTO.FGECOMMERCE = 'S' AND TBTABPRECOPRODUTO.CDTABELA = 'SHO'"
            ],
            "joins": [
                { "tbName": "TBTABPRECOPRODUTO", "merge": "LEFT JOIN", "on": [ "TBTABPRECOPRODUTO.CDPRODUTO = TBPRODUTO.CDPRODUTO" ] }
            ],
            "fields": [
                { "dbfield"   : "TBPRODUTO.CDPRODUTO",         "para"      : "variant_id", "translate" : "TBPRODUTO",         "desc"      : "variant_id da Shopify — e o que o products/sync grava em TBRELACIONAID NMTABELA=TBPRODUTO" },
                { "dbfield"   : "TBPRODUTO.CDPRODUTO",         "para"      : "product_id", "translate" : "TBPRODUTO_PRODUCT", "desc"      : "product_id da Shopify — exigido pela mutation. Nao existe no Softdib: e resolvido na Shopify e fica em cache nesta chave" },
                { "dbfield"   : "TBPRODUTO.CDPRODUTO",         "para"      : "sku",                                           "desc"      : "CDPRODUTO = SKU na Shopify — usado para localizar o variant quando o cache esta vazio" },
                { "dbfield"   : "TBTABPRECOPRODUTO.VLPRODUTO", "para"      : "preco",      "_custom"   : "valor_produto",     "desc"      : "Preco de venda (tabela SHO) — valor_produto() divide por 100 em MT/M2" }
            ],
            "orderBy": ["TBPRODUTO.CDPRODUTO"]
        },
        {
            "id"                : 6,
            "rote"              : "orders/search",
            "handler"           : "pedidos",
            "active"            : true,
            "relacionaId"       : true,
            "save_status"       : true,
            "send"              : true,
            "alwaysUpdateClient": true,
            "identifier"        : "id",
            "filter_by"         : "order_number",
            "use_softdib_api"   : true,
            "table"             : "TBPEDIDOSRETORNO",
            "methods"           : ["GET"],
            "pedido_fields" :[
                    { "integration" : "origem_integracao",                                             "para": "CDORIGEM",         "translate_by_branch":   "_origem" },
                    { "integration" : "updated_at",                                                    "para": "DTPEDIDO" },
                    { "integration" : "updated_at",                                                    "para": "DTULTIMAALTERACAO" },
                    { "integration" : "order_number",                                                  "para": "IDTBPEDIDO" },
                    { "integration" : "order_number",                                                  "para": "CDSEQPEDIDOEXTERNO" },
                    { "integration" : "customer/id",                                                   "para": "CDCLIENTE",        "translate":             "TBCLIENTE" },
                    { "integration":  "shipping_address/address1 && ` ` && shipping_address/address2", "para": "ENDERECO_ENT" },
                    { "integration":  "shipping_address/address1",                                     "para": "ENDERECO_NRO_ENT", "custom_translate":      "_capturar_numero_endereco" },
                    { "integration":  "shipping_address/city",                                         "para": "CIDADE_ENT" },
                    { "integration":  "shipping_address/province_code",                                "para": "ESTADO_ENT" },
                    { "integration":  "shipping_address/zip",                                          "para": "CEP_ENT" },
                    { "integration" : "cdtransportador",                                              "para": "CDTRANSPORTADOR"  },
                    { "integration" : "shipping_lines/0/method_id",                                    "para": "CDFRETE",          "translate_by_branch":   "forma_envio_frete" },
                    { "integration" : "total_shipping_price_set/shop_money/amount",                    "para": "VLFRETE" },
                    { "default"     : "",                                                              "para": "CDVENDEDOR",       "translate_by_branch":   "_vendedor" },
                    { "integration" : "payment_gateway_names/0",                                       "para": "CDCONDPGTO",       "translate_by_branch":   "_pagamentos" },
                    { "integration" : "total_price",                                                   "para": "VLTOTAL" },
                    { "integration" : "root",                                                          "para": "VLDESCONTO",       "translate_by_branch"  : "desconto" },
                    { "integration" : "note",                                                          "para": "DSOBSPEDIDO",      "translate_by_branch"  : "observacao" },
                    { "integration" : "customer/first_name && ` ` && customer/last_name",              "para": "RAZAO_SOCIAL",     "translate_by_branch"  : "razao_social" },
                    { "integration" : "customer/first_name && ` ` && customer/last_name",              "para": "NOME_FANTASIA" },
                    { "integration" : "documento_cliente",                                             "para": "CNPJ_CPF" },
                    { "integration" : "documento_cliente",                                             "para": "TIPO_PESSOA",      "custom_translate":      "_tipo_pessoa" },
                    { "integration" : "customer/email",                                                "para": "EMAIL" },
                    { "integration" : "customer/phone",                                                "para": "TELEFONE",         "translate_by_type":     "numero" },
                    { "integration" : "customer/phone",                                                "para": "DDD",              "translate_by_type":     "ddd" },
                    { "integration" : "customer/id",                                                   "para": "IDCLIENTEEXTERNO" },
                    { "integration" : "payment_method",                                                "para": "CDBANDEIRA" },
                    { "default"     : "0",                                                             "para": "VLQTDEPARCELAS" },
                    { "default"     : "0",                                                             "para": "VLPARCELA" },
                    { "integration" : "customAttributes",                                              "para": "CDIDCOTACAO"        , "custom_translate":  "_id_cotacao" },
                    { "integration" : "customAttributes",                                              "para": "CDIDMETODOENVIO"    , "custom_translate":  "_id_metodo_envio" },
                    { "integration" : "shipping_lines/0/source",                                       "para": "NMAPICOTACAO" },
                    { "integration" : "shipping_lines/0/price",                                        "para": "VLVALORCOTACAO" },
                    { "integration" : "transactions",                                                  "para": "TID", "translate_by_branch":   "_nsu" }

            ]
            ,   "itenscarrinho_fields" :[
                    { "integration" : "sku",            "para" :"CDPRODUTO"              },
                    { "integration" : "order_number",   "para" :"IDTBPEDIDO",            "custom_translate": "order_id" },
                    { "integration" : "quantity",       "para" :"VLQUANTIDADE" },
                    
                    { "integration" : "price",          "para" :"VLPRECOFINAL" },
                    { "integration" : "price",          "para" :"VLPRECOUNITARIO" },
                    { "integration" : "total_discount", "para" :"VLDESCONTO" }
            ]    
        },
        {
            
            "rote"          : "situacao/pedido/pedido_id",
            "active"        : true,
            "relacionaId"   : false,
            "send"          : true,
            "MD5"           : true,
            "primaryKey"    : "TBPEDIDOSSTATUS.IDTBPEDIDOSSTATUS",
            "table"         : "TBPEDIDOSSTATUS",
            "methods"       : ["PUT"],
            "post_bahavior" : "PUT",
            "custom_path"   : [{"de": "pedido_id", "para": "pedido_id"}],
            "control-id"    : "id",
            "fields": [
                { "dbfield" : "TBPEDIDOSSTATUS.CDPEDIDOEXTERNO",                                                                      "para"    : "pedido_id",  "desc"    : "ID do pedido na Shopify — substituído na URL via custom_path" },
                { "dbfield" : "(SELECT CDSTATUSEXTERNO FROM TBSTATUS WHERE CDSTATUS = TBPEDIDOSSTATUS.CDSTATUS AND NMAPI='shopify')", "para"    : "codigo",     "desc"    : "Código da ação na Shopify — definido em TBSTATUS.CDSTATUSEXTERNO" },
                { "dbfield" : "TBPEDIDOSSTATUS.NMOBSERVACAO",                                                                         "para"    : "observacao", "desc"    : "Observação do ERP (Softdib) enviada como reasonNotes do fulfillmentOrderReportProgress" }
            ]
        },
        {
            "id"            : 8,
            "_descricao"    : "Encaminha a NF-e emitida no Softdib para o pedido na Shopify, gravada como metafields do order (numero, chave de acesso e URL do XML/DANFE). O POST de metafield é upsert por namespace.key, então reenvio não duplica.",
            "rote"          : "orders/nota_fiscal",
            "handler"       : "nota_fiscal",               
            "active"        : true,
            "relacionaId"   : true,                       
            "send"          : true,
            "MD5"           : true,                        
            "primaryKey"    : "TBPEDIDOSFATURADOS.IDTBPEDIDOSFATURADOS",       
            "table"         : "TBPEDIDOSFATURADOS",                 
            "methods"       : ["POST"],
            "where": [ "TBPEDIDOSFATURADOS.CDPEDIDO IN (SELECT CDPEDIDO TBPEDIDOSRETORNO WHERE TBPEDIDOSRETORNO.NMAPI = 'shopify' AND TBPEDIDOSRETORNO.CDEMPRESA IN (@empresa, 0) AND TBPEDIDOSRETORNO.CDFILIAL IN (@filial, 0))" ],
            "fields": [
                { "dbfield" : "TBPEDIDOSFATURADOS.CDPEDIDOEXTERNO", "para"    : "pedido_id", "desc"    : "ID do pedido NA SHOPIFY. Se sua tabela guarda o nº interno do pedido, troque para o campo que tem o id externo, ou traduza via TBRELACIONAID no handler (ver nota_fiscal_handler)." },
                { "dbfield" : "TBPEDIDOSFATURADOS.VLNRODOC",        "para"    : "nf_numero", "desc"    : "Número da NF → metafield custom.nota_fiscal_numero" },
                { "dbfield" : "TBPEDIDOSFATURADOS.NMCHAVEACESSO",   "para"    : "nf_chave",  "desc"    : "Chave de acesso (44 dígitos) → metafield custom.nota_fiscal_chave" },
                { "dbfield" : "TBPEDIDOSFATURADOS.NMLINKXML",       "para"    : "nf_url",    "desc"    : "URL do XML/DANFE → metafield custom.nota_fiscal_url" }
            ],
            "orderBy": ["TBPEDIDOSFATURADOS.IDTBPEDIDOSFATURADOS"]
        }
    ]
}