So o master grava a configuracao SIAT.
QuandoPOST/PUT/DELETE de ponto, "codigos" ou "sincronizar" por usuário que não é master.
Caso sugerido para QA: o que fazer, o que esperar e como conferir no banco.
Recusa com a mensagem exata (HTTP 400, mostrada na tela).
Limitação, pendência ou ponto em que o código e a ajuda não coincidem.
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).
| Campo / botão | Default | Regra | Efeito |
|---|---|---|---|
| Sucursal | 0 (casa matriz) | Inteiro ≥ 0; sucursal + "-" + ponto não passa de 5 caracteres | Vai no CUF, no XML e, como "sucursal-pdv", em faturamento_nfe.serie |
| Ponto de venda | 0 | Inteiro ≥ 0 | Idem |
| Código do sistema | vazio | Obrigatório (máx. 40); trim ao usar | Entregue pelo SIN; vai na credencial |
| Token delegado | vazio | Campo senha. Gravado, nunca volta para a tela (só tokenPreenchido); em branco ao alterar mantém o gravado | Autentica a empresa no SIN (cabeçalho HTTP apikey: TokenApi <token>) |
| Ativo (usado na emissão) | desmarcado | Só 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 D | Grava em siat_punto_venta. Trocar sucursal, ponto ou enviar token apaga CUIS e CUFD do ponto |
| Testar e pedir CUIS/CUFD | — | Master; ponto selecionado | Testa a comunicação, pede CUIS novo e CUFD novo; mostra "Comunicação: OK · AMBIENTE · CUIS · CUFD válido até" |
| Sincronizar leyendas | — | Master; ponto selecionado | Baixa 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}.
| Dado | Tabela / coluna | Origem |
|---|---|---|
| Ponto de venda | siat_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 |
| CUFD | siat_cufd: codigo, codigo_control, direccion, fecha_vigencia (o mais novo vale) | Resposta do SIN (SiatClient.cufd) |
| Leyendas | siat_leyenda: codigo_actividad, descripcion | SIN (sincronizarListaLeyendasFactura); sorteada por atividade na emissão |
| NIT da emissão | filial.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_economica | Genéricas: o Paraguai também as lê |
| Ambiente | system_config.AMBIENTE_NFEBO (valor_string) | Config. Globais (botão do 41), "Ambiente factura Bolívia": HOMOLOGACAO = piloto (codigoAmbiente 2), PRODUCAO = 1 |
| Setor do documento | tipo_faturamento.siat_documento_sector | Vazio = 1 (compra-venta); 35 = compra-venta bonificaciones; 45 = exportação preço de venda (combo no 185) |
| Produto / unidade / moeda / pagamento / pessoa | produto.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_documento | Cadastros que a factura exige (script de banco) |
verificarComunicacion → "OK" ou o texto de mensagens do SIN.cuis e cuis_vigencia.America/La_Paz), qualquer que seja o fuso do servidor.AmbienteFiscal.producao (HOMOLOGACAO/valor não reconhecido = piloto pilotosiatservicios.impuestos.gob.bo; PRODUCAO = siatrest.impuestos.gob.bo). Servidor de teste do grupo (fjsistemas.no-ip.org, 10.1.1.25) sempre emite em piloto, mesmo com PRODUCAO no banco. Mesma trava dos outros documentos eletrônicos.comunicacao, ambiente (PILOTO/PRODUCAO), cuis, cufdVigencia, direccion.SiatPuntoVentaRepository.ativo: exige exatamente um). CUF montado por CufBolivia (conferido contra o PDV: 2.000 de 2.000 iguais, e contra quatro facturas reais da BFC), numeração em numeracao_nota (prefixo "sucursal-pdv", tipo_doc = setor), XML assinado (enveloped, rsa-sha256) e validado nos XSD oficiais antes de enviar.faturamento_nfe: modelo 'BO', CUF em nfe_nome_xml, código de recepção em digval_nfe, cstat_nfe 908 = validada, 902 = rechazada.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.
So o master grava a configuracao SIAT.
QuandoPOST/PUT/DELETE de ponto, "codigos" ou "sincronizar" por usuário que não é master.
Informe a sucursal e o ponto de venda (0 ou mais).
QuandoSucursal ou ponto nulos ou negativos.
Informe o codigo do sistema entregue pelo SIN.
QuandoCódigo do sistema vazio.
Sucursal e ponto de venda juntos passam de 5 caracteres (faturamento_nfe.serie).
QuandoPor exemplo sucursal 100 e ponto 10 ("100-10" tem 6).
Este ponto de venda e de outra filial.
QuandoId de ponto de outra filial (URL/API direta).
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').
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.
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.")
A filial N nao tem NIT (filial.cnpj).
QuandoFilial sem NIT.
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).
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.
O SIAT devolveu a lista de leyendas vazia.
QuandoSincronizar leyendas e o SIN devolve lista vazia (a lista antiga é preservada).
Sessao sem filial ativa. / Catalogo desconhecido: x
QuandoSessão sem filial; nome de catálogo fora da lista.
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).
| Onde | Item | Efeito |
|---|---|---|
system_config | AMBIENTE_NFEBO | HOMOLOGACAO (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 |
| Banco | scripts/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) |
| Banco | scripts/sql/tipo_faturamento_siat_setor.sql | Só a coluna tipo_faturamento.siat_documento_sector; não rodado |
| Código | CUIS 5 dias, CUFD 4 h, 15 s de timeout de conexão | Constantes 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 |
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\_%'
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.".
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
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.
Validações de gravação
FazerSucursal 100 + ponto 10; sucursal vazia; código do sistema vazio.
EsperadoMensagens da seção D.
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
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
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
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)
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
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.".
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.
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.".
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.".
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".
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.
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.
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.