A proposta desse estudo é visualizar uma maneira em que a retaguarda envie arquivos de dados ao Sync Server, que serão processados pelo Sync Client no PDV. Isso não substitui a API, mas complementa o fluxo para situações em que seja mais eficiente carregar os dados dessa maneira.
Desafios gerados para esse estudo foram:
Na solução proposta foi desenhado o seguinte escopo:
Para esse fluxo, foi considerado o envio do arquivo pelo Bucked Cloud. No teste realizado, foi utilizado o bucket do GCP (biblioteca Google.Cloud.Storage).
Para o uso do bucket de arquivos do GCP, deve ser considerado as seguintes observações:
PRINCIPAIS RECURSOS:
✅Armazenamento escalável para grandes volumes de dados
✅ Alto desempenho para leitura e escrita de arquivos
✅ Suporte a múltiplos tipos de armazenamento (Standard, Nearline, Coldline e Archive)
✅ Integração com serviços Google (BigQuery, AI, Kubernetes, etc.)
✅ Segurança com criptografia automática e permissões IAM
✅ Versionamento e backup de arquivos
TIPOS DE STORAGE E CASOS DE USO:
Tipo de Armazenamento | Custo ($/GB/mês) | Recuperação | Uso Ideal |
---|---|---|---|
Standard | $$$ (Alto) | Rápido | Dados acessados frequentemente |
Nearline | $$ (Médio) | Leve atraso | Backups, arquivamento de médio prazo |
Coldline | $ (Baixo) | Demorado | Dados raramente acessados (1x por ano) |
Archive | $ (Muito Baixo) | Muito lento | Arquivamento de longo prazo |
Exemplo de Preços (EUA, Março/2024):
Standard: $0.023/GB
Nearline: $0.01/GB
Coldline: $0.004/GB
Archive: $0.0012/GB
Os preços variam conforme a região e volume de armazenamento.
Para o nosso caso, o tipo de armazenamento standard é o mais recomendado, visto que precisamos de um processo que a subida de arquivo seja feita de forma rápida e que o mesmo seja acessado frequentemente (subindo o arquivo uma vez e baixando o arquivo apenas uma vez na máquina local para o recebimento dos dados via arquivo).
✔ Escalabilidade → Suporta petabytes de dados sem limitação de tamanho.
✔ Segurança Avançada → Dados criptografados e integração com IAM.
✔ Baixa Latência → Alta performance para leitura e escrita de arquivos.
✔ Multi-Regional → Armazene dados em várias regiões para redundância.
✔ Integração com BigQuery, AI e Kubernetes.
❌ Custo pode ser alto para grandes volumes de dados em classes Standard.
❌ Cobrança por requisições e downloads → Cada leitura/escrita pode gerar custos extras.
❌ Necessidade de autenticação → Exige configuração de chaves e permissões via IAM.
❌ Recuperação lenta em Coldline/Archive → Pode levar horas para acessar arquivos arquivados.
No teste foi criado duas APIs simulando a subida e download de um arquivo via bucket cloud do GCP.
No GCP foi criado um bucket onde fosse possível armazenar os arquivos subidos através da API.
Para a criação do bucket foi necessário colocar permissão de envio/baixa de arquivo para o usuário utilizado no micro serviço de Controle que faz o acesso ao diretório através da aplicação.
Após a criação do bucket, foi criado as APIs POST para envio do arquivo e a API GET para a baixa do arquivo.
API POST - Carga Loja - Envio:
API GET - Baixa do Arquivo:
Para a solução proposta, é necessário que o arquivo enviado esteja criptografado. Para isso, iremos utilizar o modelo AES, já utilizado dentro do PDV SYNC, na criptografia de senhas do banco de dados dos serviços do client.
Para isso, podemos utilizar o modelo abaixo para criptografia do arquivo, uma vez que o arquivo enviado já tem que estar devidamente criptografado.
using System; using System.IO; using System.Security.Cryptography; using System.Text; class AESFileEncryption { static void Main() { string filePath = "C:\\Temp\\arquivo.txt"; // Arquivo original string encryptedFilePath = "C:\\Temp\\arquivo_encrypted.aes"; // Arquivo criptografado string decryptedFilePath = "C:\\Temp\\arquivo_decrypted.txt"; // Arquivo descriptografado // Gerar chave e IV AES-256 byte[] key = GenerateRandomKey(32); // 256 bits byte[] iv = GenerateRandomKey(16); // 128 bits Console.WriteLine($"🔑 Chave AES-256: {Convert.ToBase64String(key)}"); Console.WriteLine($"🌀 IV: {Convert.ToBase64String(iv)}"); // Criptografar arquivo EncryptFile(filePath, encryptedFilePath, key, iv); Console.WriteLine("✅ Arquivo criptografado com sucesso!"); // Descriptografar arquivo DecryptFile(encryptedFilePath, decryptedFilePath, key, iv); Console.WriteLine("✅ Arquivo descriptografado com sucesso!"); } // Método para gerar chave e IV aleatórios static byte[] GenerateRandomKey(int size) { using (var rng = new RNGCryptoServiceProvider()) { byte[] key = new byte[size]; rng.GetBytes(key); return key; } } // Método para descriptografar um arquivo public static void DecryptFile(string inputFile, string outputFile, byte[] key, byte[] iv) { using (Aes aes = Aes.Create()) { aes.Key = key; aes.IV = iv; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; using (FileStream fsInput = new FileStream(inputFile, FileMode.Open)) using (CryptoStream cryptoStream = new CryptoStream(fsInput, aes.CreateDecryptor(), CryptoStreamMode.Read)) using (FileStream fsOutput = new FileStream(outputFile, FileMode.Create)) { cryptoStream.CopyTo(fsOutput); } } } } |
Para a baixa de arquivo de carga, o modelo ideal para a proposta seria a seguinte:
O solução proposta unindo todos esses pontos é eficiente, rápido e eficaz, uma vez que o processo de leitura/gravação de dados por arquivo já está implementado no client, com a baixa de dados via Function, e com o modelo de dados proposto para o envio do arquivo para o server, vai gerar mais fluidez para o processo de carga inicial de uma loja. Dito isso, as issues de história que devemos considerar para que esse modelo acima seja seguido são:
[ { "CodigoTipo": "12", "TipoDado": "AssociacaoProdutoClassificacao", "Dados": [ { "ProdutoIdRetaguarda": "PRD1000010", //string "ClassificacaoProdutoIdRetaguarda": "APCP1000010", //string "Ordem": 1, //int "Situacao": 1, //int "IdRetaguarda": "APC1000010", //string "Id": 0, //long "DataCadastro": "0001-01-01T00:00:00", //DateTime "DataAtualizacao": "0001-01-01T00:00:00" //DateTime } ] }, { "CodigoTipo": "11", "TipoDado": "ClassificacaoProduto", "Dados": [ { "Descricao": "MALHAS", //string "Nome": "MALHAS E TECIDOS", //string "Sigla": "MT", //string "ClassificacaoProdutoPaiIdRetaguarda": "", //string "Situacao": 1, //integer "IdRetaguarda": "CP01", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:41:40.2134Z", //DateTime "DataAtualizacao": "2025-04-01T20:41:40.213426Z" //DateTime } ] }, { "CodigoTipo": "0", "TipoDado": "Cliente", "Dados": [ { "Nome": "Carolina Dias Herrera", //string "Endereco": "", //string "Numero": "", //string "Complemento": "", //string "Bairro": "IPANEMA", //string "Cidade": "Rio de Janeiro", //string "Estado": "", //string "Cep": "1350065005", //string "Telefone": "", //string "Celular": "21955058770", //string "Email": "[email protected]", //string "DataNascimento": "1987-01-15T16:58:17.727-02:00", //DateTime "PessoaFisica": 0, //integer "CpfCnpj": "22665113007", //string "RgInscricao": "418509307", //string "Sexo": 0, //integer "EstadoCivil": 0, //integer "AvatarUrl": "", //string "Enviarpnet": 0, //integer "Atividade": "", //string "Cracha": "", //string "IdRetaguardaProfissional": null, //string "IdRetaguardaRamoAtividade": null, //string "IdRetaguardaRedeCliente": null, //string "IdRetaguardaClientePrincipal": null, //string "IdRetaguardaPraca": null, //string "IdRetaguardaRegiao": null, //string "UtilizaPrecoAtacado": false, //booleano "Situacao": 1, //integer "IdRetaguarda": "CLI101003", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:33:26.808123Z", //DateTime "DataAtualizacao": "2025-04-01T20:33:26.808154Z" //DateTime } ] }, { "CodigoTipo": "56", "TipoDado": "ClienteEndereco", "Dados": [ { "Bairro": "PARAISO", //string "Cep": "16500251", //string "Cidade": "ARAÇATUBA", //string "ClienteIdRetaguarda": "CLI101001", //string "Complemento": "", //string "Endereco": "AVENIDA MARCÍLIO DIAS", //string "Estado": "SP", //string "IdCliente": 6082, //long "Numero": "3270", //string "DescricaoTipo": "RESIDENCIAL", //string "EnviarPnet": 0, //integer "Situacao": 1, //integer "IdRetaguarda": "CLIEND1001002", //string "Id": 0, //long "DataCadastro": "2025-04-01T21:07:45.77272Z", //DateTime "DataAtualizacao": "2025-04-01T21:07:45.77272Z" //DateTime } ] }, { "CodigoTipo": "12", "TipoDado": "CodigoProduto", "Dados": [ { "ProdutoIdRetagurada": "PRD1000010", //string "Codigo": "10011004", //string "CodigoExterno": null, //string "Descricao": "PRODUTO TESTE - AUTENTICADOR", //string "Situacao": 0, //integer "IdRetaguarda": "CPPRD1000010", //string "Id": 0, //long "DataCadastro": "2024-03-28T13:13:11.127Z", //DateTime "DataAtualizacao": "2024-03-28T13:13:11.127Z" //DateTime } ] }, { "CodigoTipo": "16", "TipoDado": "DadoComplementarPagto", "Dados": [ { "Descricao": "TESTE", //string "Tipo": 0, //Integer "Obrigatorio": 10, //Integer "Tamanho": 10, //Integer "TipoCampoTef": null, //Integer "Situacao": 1, //Integer "IdRetaguarda": "DCP00001", //String "Id": 0, //Long "DataCadastro": "2025-04-01T20:52:48.188076Z", //DateTime "DataAtualizacao": "2025-04-01T20:52:48.188077Z" //DateTime } ] }, { "CodigoTipo": "14", "TipoDado" : "Estoque", "Dados": [ { "Saldo": 50.0, //decimal "Sincronizado": 1, //Integer "ProdutoIdRetaguarda": "7891132001453-55", //String "ProdutoLote": [ { "Quantidade": 10.0, //decimal "IdentificacaoLote": "string" //String "DataValidade": "2025-04-01T20:43:54.873766Z", //DateTime "EstoqueIdRetaguarda": "string", //string "IdRetaguarda": "string", //string "Situacao": 0, //integer "DataCadastro": "2025-04-01T20:43:54.873766Z", //DateTime "DataAtualizacao": "2025-04-01T20:43:54.873766Z" //DateTime } ], "Situacao": 1, //integer "IdRetaguarda": "EST00026", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:43:54.873766Z", //DateTime "DataAtualizacao": "2025-04-01T20:43:54.873766Z" //DateTime } ] }, { "CodigoTipo": "18", "TipoDado": "FormaPagto", "Dados": [ { "Descricao": "CREDITO", //string "DescricaoFiscal": "CREDITO", //string "CodigoImpressora": null, //string "PagamentoValorTotal": null, //integer "PermiteTroco": 1, //integer "FormaPagamentoTrocoIdRetaguarda": "", //string "ValorMinimoAceito": "5", //string "CodigoSistemaExterno": "10", //string "CodigoModalidadePagamento": 0, integer "Tipo": 1, //integer "IdPagamentoFormaMestre": null, //integer "TipoCliente": 1, //integer "ClienteConsumidor": null, //booleano "UtilizaLimiteCredito": false, //booleano "Situacao": 1, //integer "IdRetaguarda": "FP0010", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:48:32.417083Z", //DateTime "DataAtualizacao": "2025-04-01T20:48:32.417084Z" //DateTime } ] }, { "CodigoTipo": "21", "TipoDado": "Grupo", "Dados": [ { "IdRetaguardaLoja": "9999", //string "IdRetaguardaCliente": "3168", //string "IdRetaguardaGrupo": "GP0004", //string "Situacao": 1, //integer "IdRetaguarda": "GP0004", //string "Id": 0, //long "DataCadastro": "0001-01-01T00:00:00", //DateTime "DataAtualizacao": "0001-01-01T00:00:00" //DateTime } ] }, { "CodigoTipo": "7", "TipoDado": "Imposto", "Dados": [ { "AliquotaTributo": "5", //string "Tipo": "1", //string "Modalidade": "Teste", //string "IndiceTributoImpressora": null, //string "ReducaoBaseCalculo": "0", //string "Simbolo": "TESTE", //string "Cfop": "10", //string "CstCsosn": "10", //string "Situacao": 0, //integer "IdRetaguarda": "IMP00011", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:35:15.025273Z", //DateTime "DataAtualizacao": "2025-04-01T20:35:15.025313Z" //DateTime } ] }, { "CodigoTipo": "2", "TipoDado": "Motivo", "Dados": [ { "Descricao": "Motivo Teste 3", //string "Tipo": 1, //integer "IdPromocaoMotorPromocaoTerceiro": null, //string "TipoMecanica": null, //integer "Situacao": 1, //integer "IdRetaguarda": "10", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:34:12.844775Z", //DateTime "DataAtualizacao": "2025-04-01T20:34:12.844803Z" //DateTime } ] }, { "CodigoTipo": "8", "TipoDado": "Ncm", "Dados": [ { "CodigoNcm": "12345678", //string "CodigoExcecao": "20", //string "AliquotaNacional": "3.0", //string "AliquotaImportada": "2.0", //string "AliquotaEstadual": "1.0", //string "AliquotaMunicipal": "1.0", //string "Chave": "TESTE", //string "Fonte": "ARIAL 12", //string "CodigoCest": "1234567", //string "Situacao": 1, //integer "IdRetaguarda": "NCM00002", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:35:35.746964Z", //DateTime "DataAtualizacao": "2025-04-01T20:35:35.746964Z" //DateTime } ] }, { "CodigoTipo": "15", "TipoDado": "Operadora", "Dados": [ { "Descricao": "ELO", //string "CodigoTef": "10", //string "Administradora": "ELO", //string "TipoTransacao": 1, //integer "Situacao": 1, //integer "IdRetaguarda": "OP100010", //string "Id": 0, //Login "DataCadastro": "2025-04-01T20:47:46.432391Z", //DateTime "DataAtualizacao": "2025-04-01T20:47:46.432418Z" //DateTime } ] }, { "CodigoTipo": "3", "TipoDado": "Perfil", "Dados": [ { "Nome": "Supervisor Geral", //string "TipoPerfil": 1, //integer "DescontoMaximoItem": 100.0, //decimal "DescontoMaximoTotal": 100.0, //decimal "Situacao": 1, //integer "IdRetaguarda": "18", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:34:29.842174Z", //DateTime "DataAtualizacao": "2025-04-01T20:34:29.842175Z" //DateTime } ] }, { "CodigoTipo": "9", "TipoDado": "PisCofins", "Dados": [ { "CstPis": "1", //string "AliquotaPis": "8.0", //string "CstCofins": "1", //string "AliquotaCofins": "5.0", //string "Situacao": 1, //integer "IdRetaguarda": "PC00010", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:41:02.264344Z", //DateTime "DataAtualizacao": "2025-04-01T20:41:02.264345Z" //DateTime } ] }, { "CodigoTipo": "13", "TipoDado": "Preco", "Dados": [ { "ProdutoIdRetaguarda": "PRD00003", //string "ProdutoEmbalagemIdRetaguarda": "PRDEMB0001", //string "DataVigenciaInicial": "2024-10-28T16:26:14.977-03:00", //DateTime "DataVigenciaFinal": "2025-03-28T16:26:14.977-03:00", //DateTime "Valor": "20.0", //string "SincronizadoEtiquetaEletronica": 0, //integer "PrecoPromocional": "5.0", //string "Custo": 1.0, //decimal "RegiaoIdRetaguarda": "", //string "Margem": 0.0, //decimal "PrecoOrigem": "", //string "PrecoPrincipal": true, //booleano "ValorAtacado": 17.0, //decimal "IndicePreco": "", //string "Situacao": 1, //integer "IdRetaguarda": "PRE00001010", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:43:03.804015Z", //DateTime "DataAtualizacao": "2025-04-01T20:43:03.80404Z" //DateTime } ] }, { "CodigoTipo": "12", "TipoDado": "Produto", "Dados": [ { "Descricao": "PRODUTO TESTE - AUTENTICADOR", //string "ImpostoIdRetaguarda": null, //string "Imposto": { "AliquotaTributo": "string", //string "Tipo": "string", //string "Modalidade": "string", //string "IndiceTributoImpressora": "string", //string "ReducaoBaseCalculo": "string", //string "Simbolo": "string", //string "Cfop": "string",//string "CstCsosn": "string", //string "IdRetaguarda": "PRE00001010", //string "DataCadastro": "2025-04-01T20:43:03.804015Z", //DateTime "DataAtualizacao": "2025-04-01T20:43:03.80404Z" //DateTime }, "NcmIdRetaguarda": null, //string "UnidadeMedida": "UN", //string "DescontoMaximo": "3", //string "TipoArredondaTrunca": "0", //string "CodigoProduto": "10011004", //string "CodigoAlternativo": "1001100405958579", //string "OrigemProduto": "0", //string "PisCofinsIdRetaguarda": null, //string "Imagem": "", //string "TipoProduto": 0, //integer "Fracionado": true, //booleano "CnpjFornecedor": "05054526000178", //string "EscalaRelevante": true, //booleano "ValorBaseFcp": "0", //string "CodigoBeneficioFiscal": "", //string "PercentualFcp": "0", //string "CstIcms": null, //string "PercentualReducaoIcms": "1", //string "AliquotaIcms": "1", //string "VlIcmsRet": "0", //string "MotivoDesoneracaoIcms": 0, //integer "DescontaDesoneracaoNf": false, //booleano "Cest": "10", //string "ValorPautaIcms": null, //string "Encomenda": false, //booleano "PesoBruto": 315.0, //decimal "PesoLiquido": 300.0, //decimal "QuantidadeMovimentacao": 100.0, //decimal "IdRetaguardaProdutoPrincipal": null, //string "QuantidadeValorAtacado": 10.0, //decimal "IdRetaguardaCategoria": null, //string "IdRetaguardaDepartamento": null, //string "IdRetaguardaFornecedor": null, //string "IdRetaguardaMarca": null, //string "IdRetaguardaSecao": null, //string "IdRetaguardaSubCategoria": null, //string "ControlaLote": false, //booleano "Situacao": 1, //integer "IdRetaguarda": "PRD1000010", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:42:05.523853Z", //DateTime "DataAtualizacao": "2025-04-01T20:42:05.523853Z" //DateTime } ] }, { "CodigoTipo": "12", "TipoDado": "ProdutoEmbalagem", "Dados": [ { "CodigoBarras": "8314961742676478", //string "Descricao": "PRODUTO TESTE - AUTENTICADOR", //string "PesoBruto": 1.0, //decimal "PesoLiquido": 1.0, //decimal "Quantidade": 1.0, //decimal "UnidadeMedida": "UN", //string "QuantidadeValorAtacado": 0.0, //decimal "Situacao": 1, //int "IdRetaguarda": "PE010101010", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:42:05.523853Z", //Datetime "DataAtualizacao": "2025-04-01T20:42:05.523853Z" //DateTime } ] }, { "CodigoTipo": "58", "TipoDado": "RamoAtividade", "Dados": [ { "Descricao": "SERVICOS EM MANUTENCAO DE EQUIPAMENTOS", //string "IdRetaguardaAtividadePrincipal": null, //string "PercentualTaxa": 8.5, //decimal "Situacao": 1, //integer "IdRetaguarda": "RA00001", //string "Id": 0, //long "DataCadastro": "2025-04-01T21:08:15.71412Z", //DateTime "DataAtualizacao": "2025-04-01T21:08:15.714148Z" //DateTime } ] }, { "CodigoTipo": "4", "TipoDado": "Usuario", "Dados": [ { "PerfilIdRetaguarda": "12", //string "Nome": "Marilsa Cardoso Damato", //string "Cpf": "86683259062", //string "Login": "marilsa.damato", //string "Senha": "WXYZ", //string "SenhaCriptografada": "", //string "Administrador": 0, //integer "Matricula": "150006", //string "Situacao": 1, //integer "IdRetaguarda": "102", //string "Id": 0, //long "DataCadastro": "2025-04-01T20:34:42.938532Z", //DateTime "DataAtualizacao": "2025-04-01T20:34:42.938532Z" //DateTime } ] } ] |