FJFrigo · Manutenção › 48

Configuração SIAT (Bolívia)

Pontos de venda do SIN por filial (sucursal, ponto, código do sistema e token delegado), CUIS/CUFD e leyendas, para emitir factura electrónica pela Venda 2333. Só o master grava.

Tabelas: siat_punto_venta, siat_cufd, siat_leyendaEndpoint: /lancamento/nfe/bolivia/pontosPrograma antigo: nenhum (porte do PDV FjBeefClub)

Teste

Caso sugerido para QA: o que fazer, o que esperar e como conferir no banco.

Bloqueia

Recusa com a mensagem exata (HTTP 400, mostrada na tela).

Atenção

Limitação, pendência ou ponto em que o código e a ajuda não coincidem.

A

O que a tela é e faz

Identidade

Cadastro dos pontos de venda do SIAT (Impuestos Nacionales, Bolívia) da filial da sessão: sucursal, ponto de venda, código do sistema e token delegado, mais as ações "Testar e pedir CUIS/CUFD" e "Sincronizar leyendas". É a base para emitir factura electrónica en línea pela Venda (2333) com o pacote nfe.bolivia (porte do PDV FjBeefClub). Não existe no legado Harbour (o nfeBO antigo do funcoesNfe é outro modelo e não emite). Tela ConfiguracaoSiat.vue; controlador nfe.bolivia.SiatConfiguracaoController (/lancamento/nfe/bolivia).

Menu: 4-Manutenção › 8-Configuração SIAT (48), com idOpcao: null (sem linha em opcao_sistema; todo usuário com o menu a vê, em qualquer país). Ajuda 48.md/.es.md. Texto da tela em i18n/textos/siat.js. Status PARCIAL (status-porte.csv, 26/09/2026): falta rodar o script de banco, o envio real ao piloto do SIN, a validação por XSD contra o piloto e o teste de tela.

Não há outra opção que abra esta tela. O que a usa: a Venda 2333 (botão FACTURA na barra de NF-e), o cadastro de tipo de faturamento 185 (combo de setor SIAT), o 183/194 (código do produto SIN), o 15 (tipo de documento de identidade) e o 18U (unidade de medida com código fiscal).

B

Campos, botões e opções

Padrões e regras
Campo / botãoDefaultRegraEfeito
Sucursal0 (casa matriz)Inteiro ≥ 0; sucursal + "-" + ponto não passa de 5 caracteresVai no CUF, no XML e, como "sucursal-pdv", em faturamento_nfe.serie
Ponto de venda0Inteiro ≥ 0Idem
Código do sistemavazioObrigatório (máx. 40); trim ao usarEntregue pelo SIN; vai na credencial
Token delegadovazioCampo senha. Gravado, nunca volta para a tela (só tokenPreenchido); em branco ao alterar mantém o gravadoAutentica a empresa no SIN (cabeçalho HTTP apikey: TokenApi <token>)
Ativo (usado na emissão)desmarcadoSó um ativo por filial: marcar um desmarca os outros da filial (na mesma transação)A Venda emite pelo ponto ativo; sem ativo: "A filial N nao tem ponto de venda SIAT ativo - cadastre em Configuracao SIAT..."
Novo / Gravar / Excluir—Só master vê os botões; ver DGrava em siat_punto_venta. Trocar sucursal, ponto ou enviar token apaga CUIS e CUFD do ponto
Testar e pedir CUIS/CUFD—Master; ponto selecionadoTesta a comunicação, pede CUIS novo e CUFD novo; mostra "Comunicação: OK · AMBIENTE · CUIS · CUFD válido até"
Sincronizar leyendas—Master; ponto selecionadoBaixa as leyendas do SIN e substitui siat_leyenda (sem leyenda a emissão para)

A grade mostra sucursal, ponto, código do sistema, token (preenchido ou não), CUIS, vigência do CUIS e Ativo; a lista é só dos pontos da filial da sessão. Catálogos de apoio (sem botão nesta tela; usados pelos cadastros 183/194/18U/17P/15): GET /pontos/{id}/catalogo/{actividades|productos|unidades|monedas|metodos-pago|documentos}.

C

De onde vem cada dado

Tabelas, CUIS/CUFD, ambiente
DadoTabela / colunaOrigem
Ponto de vendasiat_punto_venta: idfilial, codigo_sucursal, codigo_punto_venta, codigo_sistema, token (TEXT), cuis, cuis_vigencia, ativo (T/F), data_alteracao, idusuario_alterou. Único: (idfilial, sucursal, ponto)Digitado pelo master
CUFDsiat_cufd: codigo, codigo_control, direccion, fecha_vigencia (o mais novo vale)Resposta do SIN (SiatClient.cufd)
Leyendassiat_leyenda: codigo_actividad, descripcionSIN (sincronizarListaLeyendasFactura); sorteada por atividade na emissão
NIT da emissãofilial.cnpj (só dígitos)Cadastro da filial; sem NIT: "A filial N nao tem NIT (filial.cnpj)."
Atividade econômica (CAEB)filial_trib.codigo_atividade_economica, descricao_atividade_economicaGenéricas: o Paraguai também as lê
Ambientesystem_config.AMBIENTE_NFEBO (valor_string)Config. Globais (botão do 41), "Ambiente factura Bolívia": HOMOLOGACAO = piloto (codigoAmbiente 2), PRODUCAO = 1
Setor do documentotipo_faturamento.siat_documento_sectorVazio = 1 (compra-venta); 35 = compra-venta bonificaciones; 45 = exportação preço de venda (combo no 185)
Produto / unidade / moeda / pagamento / pessoaproduto.codigo_produto_sin, almoxarifado_produto.codigo_produto_sin, ibge_unidade_medida.codigo_fiscal, moeda.codigo_fiscal, tipo_pagamento.codigo_fiscal, emitente.tipo_documento_identidade, emitente.complemento_documentoCadastros que a factura exige (script de banco)

O que "Testar e pedir CUIS/CUFD" faz (SiatCodigosService)

Uso na emissão (contexto, não faz parte da tela)

D

Permissões, travas e mensagens

Só master grava

Ver é livre; gravar, pedir códigos e sincronizar são do master (RegraAcessoService.ehMaster): o token delegado é segredo e autentica a empresa no SIN (mesmo corte da Config. Globais). O front só mostra os botões a quem tem podeGravar, mas a checagem é repetida no servidor.

Bloqueia

So o master grava a configuracao SIAT.

QuandoPOST/PUT/DELETE de ponto, "codigos" ou "sincronizar" por usuário que não é master.

Bloqueia

Informe a sucursal e o ponto de venda (0 ou mais).

QuandoSucursal ou ponto nulos ou negativos.

Bloqueia

Informe o codigo do sistema entregue pelo SIN.

QuandoCódigo do sistema vazio.

Bloqueia

Sucursal e ponto de venda juntos passam de 5 caracteres (faturamento_nfe.serie).

QuandoPor exemplo sucursal 100 e ponto 10 ("100-10" tem 6).

Bloqueia

Este ponto de venda e de outra filial.

QuandoId de ponto de outra filial (URL/API direta).

Bloqueia

Este ponto de venda ja emitiu N factura(s) - desative em vez de excluir.

QuandoExcluir ponto com facturas em faturamento_nfe (modelo BO, mesma filial, serie = 'sucursal-pdv').

Bloqueia

Este banco nao tem as tabelas do SIAT (rode scripts/sql/siat_bolivia.sql).

QuandoTabelas siat_punto_venta/siat_cufd ausentes; a tela mostra o aviso equivalente e esconde os botões.

Bloqueia

Ponto de venda SIAT sem codigo do sistema. / Ponto de venda SIAT sem token delegado.

QuandoTestar/emitir com o ponto incompleto. (O SiatClient tem outra redação: "Ponto de venda SIAT sem token delegado cadastrado.")

Bloqueia

A filial N nao tem NIT (filial.cnpj).

QuandoFilial sem NIT.

Bloqueia

O SIAT recusou o token delegado (HTTP 401|403). Confira o token do ponto de venda e o ambiente.

QuandoToken errado, vencido ou ambiente trocado (piloto × produção).

Bloqueia

O SIAT nao entregou o CUIS: ... / O SIAT nao entregou o CUFD: ... / O SIAT nao permitiu ...: ...

QuandoResposta do SIN sem código ou com transaccion=false; a mensagem do SIN vai junto.

Bloqueia

O SIAT devolveu a lista de leyendas vazia.

QuandoSincronizar leyendas e o SIN devolve lista vazia (a lista antiga é preservada).

Bloqueia

Sessao sem filial ativa. / Catalogo desconhecido: x

QuandoSessão sem filial; nome de catálogo fora da lista.

Bloqueia

A filial N nao tem ponto de venda SIAT ativo ... / A filial N tem M pontos de venda SIAT ativos - deixe so um ativo.

QuandoEmitir factura sem exatamente um ponto ativo na filial (sai na Venda, não nesta tela).

E

Configuração e scripts de banco

system_config e SQL
OndeItemEfeito
system_configAMBIENTE_NFEBOHOMOLOGACAO (padrão do catálogo) = piloto; PRODUCAO = valendo. Valor mal digitado cai em piloto e loga aviso. Aceita PRODUCAO/PRODUCCION/1 e HOMOLOGACAO/HOMOLOGACION/TESTE/TEST/PRUEBA/2
Bancoscripts/sql/siat_bolivia.sql (idempotente, precisa do cliente mysql por causa do DELIMITER da trigger)Cria siat_punto_venta, siat_cufd, siat_leyenda, ibge_unidade_medida (com trigger de numeração) e as colunas de filial_trib, produto, almoxarifado_produto, moeda, tipo_pagamento, emitente e tipo_faturamento. Não rodado em banco nenhum (status 26/09). Depois, reiniciar o backend (cache do ColunasDaTabela)
Bancoscripts/sql/tipo_faturamento_siat_setor.sqlSó a coluna tipo_faturamento.siat_documento_sector; não rodado
CódigoCUIS 5 dias, CUFD 4 h, 15 s de timeout de conexãoConstantes em SiatCodigosService e SiatClient
Rotinas / e-mail—Nenhuma rotina agendada (CUIS/CUFD são renovados na emissão) e nenhum e-mail. O aviso de vencimento do CUIS fica em 4-Manutenção › A-Vencimentos (49): lista ponto que parou de emitir
F

Casos de teste sugeridos

QA
Teste

Banco sem o script

FazerAbrir 48 em tenant que ainda não rodou siat_bolivia.sql.

EsperadoA janela mostra "Este banco não tem as tabelas do SIAT - peça ao suporte para rodar scripts/sql/siat_bolivia.sql e reiniciar o backend."; sem botões de gravação; listar devolve disponivel=false.

ConferirSELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name LIKE 'siat\_%'

Teste

Usuário comum só vê

FazerEntrar sem ser master e abrir 48.

EsperadoGrade visível, campos desabilitados, aviso "Só o master grava a configuração SIAT.", sem Novo/Gravar/Excluir/Testar/Sincronizar. Chamada direta à API de gravação: "So o master grava a configuracao SIAT.".

Teste

Incluir ponto (master)

FazerNovo, sucursal 0, ponto 0, código do sistema e token do piloto, Ativo marcado, Gravar.

Esperado"Ponto de venda gravado."; a linha aparece com token "preenchido" e CUIS vazio; token nunca aparece de volta (reabrir o formulário: campo vazio com a dica "em branco mantém o gravado").

ConferirSELECT id, idfilial, codigo_sucursal, codigo_punto_venta, codigo_sistema, token IS NOT NULL tem_token, cuis, ativo, idusuario_alterou FROM siat_punto_venta

Teste

Só um ativo por filial

FazerIncluir um segundo ponto com Ativo marcado; depois alterar o primeiro para Ativo.

EsperadoSempre exatamente um ativo='T' por filial; o anterior passa a F na mesma gravação.

ConferirSELECT idfilial, COUNT(*) FROM siat_punto_venta WHERE ativo = 'T' GROUP BY idfilial HAVING COUNT(*) > 1 deve voltar vazio.

Teste

Validações de gravação

FazerSucursal 100 + ponto 10; sucursal vazia; código do sistema vazio.

EsperadoMensagens da seção D.

Teste

Alterar sem digitar token

FazerAlterar só o código do sistema, token em branco, Gravar.

EsperadoToken e CUIS preservados. Alterando sucursal/ponto, ou digitando qualquer token, o CUIS e os CUFD do ponto são apagados.

ConferirSELECT cuis, cuis_vigencia FROM siat_punto_venta WHERE id = :id e SELECT COUNT(*) FROM siat_cufd WHERE idsiat_punto_venta = :id

Teste

Testar e pedir CUIS/CUFD (piloto)

FazerCom token válido do piloto e AMBIENTE_NFEBO = HOMOLOGACAO, clicar no botão.

EsperadoMensagem "Comunicação: OK · PILOTO · CUIS <código> · CUFD válido até <data>"; a grade mostra o CUIS e a vigência; siat_cufd ganha uma linha. Token errado: "O SIAT recusou o token delegado (HTTP 401)...". Em servidor de teste do grupo o ambiente é sempre PILOTO, mesmo com PRODUCAO no banco.

ConferirSELECT codigo_control, direccion, fecha_vigencia FROM siat_cufd WHERE idsiat_punto_venta = :id ORDER BY id DESC LIMIT 1

Teste

Sincronizar leyendas

FazerClicar "Sincronizar leyendas".

Esperado"N leyendas sincronizadas."; siat_leyenda é substituída por completo (se o SIN devolver vazio, erro e a lista antiga fica).

ConferirSELECT codigo_actividad, COUNT(*) FROM siat_leyenda GROUP BY codigo_actividad

Teste

Excluir ponto

FazerExcluir um ponto sem facturas; depois um que já emitiu.

EsperadoO primeiro some; o segundo recusa com "Este ponto de venda ja emitiu N factura(s) - desative em vez de excluir.".

ConferirSELECT COUNT(*) FROM faturamento_nfe fn JOIN siat_punto_venta p ON p.id = :id AND fn.idfilial = p.idfilial AND fn.modelonf = 'BO' AND fn.serie = CONCAT(p.codigo_sucursal,'-',p.codigo_punto_venta)

Teste

Emitir pela Venda 2333 (integração)

FazerCom ponto ativo, CUIS/CUFD e leyendas, emitir uma factura de uma venda (piloto).

EsperadoCabeçalho da factura com sucursal/ponto, CUF e CUFD do ponto; faturamento_nfe com modelo BO e cstat 908 quando validada. Envio real ao piloto ainda não foi feito (status PARCIAL): este teste é o que falta.

ConferirSELECT idfaturamento, modelonf, serie, cstat_nfe, motivo_nfe, nfe_nome_xml FROM faturamento_nfe WHERE modelonf = 'BO' ORDER BY id DESC LIMIT 5

Teste

Multi-filial

FazerCadastrar pontos em duas filiais, alternar a filial da sessão.

EsperadoA grade mostra só os pontos da filial da sessão; alterar/excluir/testar ponto de outra filial por id: "Este ponto de venda e de outra filial.".

G

Limitações, pendências e pontos de atenção

Achados da leitura do código
Atenção

Token em texto puro no banco

O token delegado fica em siat_punto_venta.token (TEXT) sem cifra. A tela nunca o devolve, mas quem lê a tabela o vê; a cifra reversível do projeto (FjCripto) não é usada aqui. Tratar como risco a decidir.

Atenção

Corrigido em 04/10/2026: catálogos de apoio sem checagem de master

GET /pontos/{id}/catalogo/{nome} passou a exigir master (exigirMaster), como incluir, alterar, excluir, códigos e sincronizar: usa o token e pode pedir CUIS novo (que grava). Só a lista (GET /pontos) continua livre. Nenhuma tela chama o catálogo hoje. Recusa: "So o master grava a configuracao SIAT.".

Atenção

Corrigido em 04/10/2026: ponto duplicado virava erro cru

Incluir e alterar conferem antes a chave única (idfilial, codigo_sucursal, codigo_punto_venta, desconsiderando o próprio ponto na alteração) e recusam com "Ja existe nesta filial um ponto de venda com a sucursal X e o ponto Y.".

Atenção

Menu visível em qualquer país

A opção não tem número em opcao_sistema e aparece para todos; fora da Bolívia a tela abre, mas a falta do script ou do NIT/token só aparece ao usar. A ajuda diz "só aparece com utilidade em empresa da Bolívia".

Atenção

HTTP dentro de transação nas leyendas

POST /pontos/{id}/sincronizar chama SiatCodigosService.sincronizarLeyendas dentro de Transacao.executar, que pode pedir CUIS ao SIN (rede lenta ou 401) com a transação aberta; o CUIS é pedido antes, fora da transação, para reduzir o risco, mas a chamada de leyendas em si segue lá dentro.

Atenção

Corrigido em 04/10/2026: duas redações para "sem token"

Uma só, SiatClient.SEM_TOKEN: "Ponto de venda SIAT sem token delegado cadastrado.", usada também pelo SiatCodigosService.credencial.

Atenção

Pendências registradas

Rodar scripts/sql/siat_bolivia.sql e o do setor; envio real ao piloto do SIN; a conferir no piloto o precioUnitario com 5 casas, a conversão de moeda estrangeira e, na nota de crédito, o rateio do desconto e o montoTotalOriginal; fora desta versão: contingência/pacotes/CAFC, verificação de NIT (codigoExcepcion), nota de débito, e-mail e demais setores. Teste de tela não feito.

Nada bate com essa busca. Tente um trecho menor, ou limpe os filtros.