get-sinapi 3.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. get_sinapi-3.1.0/LICENSE +21 -0
  2. get_sinapi-3.1.0/PKG-INFO +236 -0
  3. get_sinapi-3.1.0/README.md +207 -0
  4. get_sinapi-3.1.0/pyproject.toml +48 -0
  5. get_sinapi-3.1.0/setup.cfg +4 -0
  6. get_sinapi-3.1.0/src/get_sinapi.egg-info/PKG-INFO +236 -0
  7. get_sinapi-3.1.0/src/get_sinapi.egg-info/SOURCES.txt +54 -0
  8. get_sinapi-3.1.0/src/get_sinapi.egg-info/dependency_links.txt +1 -0
  9. get_sinapi-3.1.0/src/get_sinapi.egg-info/entry_points.txt +2 -0
  10. get_sinapi-3.1.0/src/get_sinapi.egg-info/requires.txt +19 -0
  11. get_sinapi-3.1.0/src/get_sinapi.egg-info/top_level.txt +1 -0
  12. get_sinapi-3.1.0/src/getsinapi/__init__.py +2 -0
  13. get_sinapi-3.1.0/src/getsinapi/api/__init__.py +1 -0
  14. get_sinapi-3.1.0/src/getsinapi/api/main.py +791 -0
  15. get_sinapi-3.1.0/src/getsinapi/bootstrap.py +422 -0
  16. get_sinapi-3.1.0/src/getsinapi/cli.py +206 -0
  17. get_sinapi-3.1.0/src/getsinapi/collectors/__init__.py +1 -0
  18. get_sinapi-3.1.0/src/getsinapi/collectors/caixa.py +386 -0
  19. get_sinapi-3.1.0/src/getsinapi/collectors/history.py +238 -0
  20. get_sinapi-3.1.0/src/getsinapi/config.py +60 -0
  21. get_sinapi-3.1.0/src/getsinapi/domain.py +74 -0
  22. get_sinapi-3.1.0/src/getsinapi/exporter.py +189 -0
  23. get_sinapi-3.1.0/src/getsinapi/extractors/__init__.py +1 -0
  24. get_sinapi-3.1.0/src/getsinapi/extractors/compositions.py +213 -0
  25. get_sinapi-3.1.0/src/getsinapi/extractors/price_tables.py +151 -0
  26. get_sinapi-3.1.0/src/getsinapi/extractors/reference_workbook.py +68 -0
  27. get_sinapi-3.1.0/src/getsinapi/extractors/sinapi_parser.py +158 -0
  28. get_sinapi-3.1.0/src/getsinapi/extractors/workbooks.py +126 -0
  29. get_sinapi-3.1.0/src/getsinapi/normalizers.py +114 -0
  30. get_sinapi-3.1.0/src/getsinapi/pipeline/__init__.py +1 -0
  31. get_sinapi-3.1.0/src/getsinapi/pipeline/normalize.py +114 -0
  32. get_sinapi-3.1.0/src/getsinapi/services/__init__.py +1 -0
  33. get_sinapi-3.1.0/src/getsinapi/services/costing.py +332 -0
  34. get_sinapi-3.1.0/src/getsinapi/storage/__init__.py +1 -0
  35. get_sinapi-3.1.0/src/getsinapi/storage/sqlite.py +342 -0
  36. get_sinapi-3.1.0/tests/test_api.py +222 -0
  37. get_sinapi-3.1.0/tests/test_api_connection_lifecycle.py +31 -0
  38. get_sinapi-3.1.0/tests/test_api_literal_search.py +49 -0
  39. get_sinapi-3.1.0/tests/test_bootstrap.py +57 -0
  40. get_sinapi-3.1.0/tests/test_caixa_collector.py +303 -0
  41. get_sinapi-3.1.0/tests/test_compositions.py +100 -0
  42. get_sinapi-3.1.0/tests/test_config.py +35 -0
  43. get_sinapi-3.1.0/tests/test_config_finite_backoff.py +11 -0
  44. get_sinapi-3.1.0/tests/test_costing.py +140 -0
  45. get_sinapi-3.1.0/tests/test_domain.py +22 -0
  46. get_sinapi-3.1.0/tests/test_exporter.py +88 -0
  47. get_sinapi-3.1.0/tests/test_historical_catalog.py +149 -0
  48. get_sinapi-3.1.0/tests/test_normalizers.py +50 -0
  49. get_sinapi-3.1.0/tests/test_normalizers_non_finite.py +21 -0
  50. get_sinapi-3.1.0/tests/test_price_tables.py +106 -0
  51. get_sinapi-3.1.0/tests/test_reference_workbook.py +120 -0
  52. get_sinapi-3.1.0/tests/test_sinapi_parser.py +43 -0
  53. get_sinapi-3.1.0/tests/test_storage.py +236 -0
  54. get_sinapi-3.1.0/tests/test_storage_manifest_validation.py +38 -0
  55. get_sinapi-3.1.0/tests/test_storage_nullable_price_keys.py +62 -0
  56. get_sinapi-3.1.0/tests/test_workbook_extractor.py +76 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 NR Data Analysis
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,236 @@
1
+ Metadata-Version: 2.4
2
+ Name: get-sinapi
3
+ Version: 3.1.0
4
+ Summary: Pipeline rastreável de dados públicos do SINAPI/CAIXA
5
+ Author: NR TECH
6
+ License-Expression: MIT
7
+ Requires-Python: >=3.11
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: requests>=2.31
11
+ Requires-Dist: curl-cffi>=0.7
12
+ Requires-Dist: beautifulsoup4>=4.12
13
+ Requires-Dist: python-dotenv>=1.0
14
+ Requires-Dist: pandas>=2.2
15
+ Requires-Dist: openpyxl>=3.1
16
+ Requires-Dist: xlrd>=2.0
17
+ Requires-Dist: PyYAML>=6.0
18
+ Requires-Dist: SQLAlchemy>=2.0
19
+ Requires-Dist: fastapi>=0.110
20
+ Requires-Dist: uvicorn[standard]>=0.27
21
+ Requires-Dist: reportlab>=4.2
22
+ Provides-Extra: dev
23
+ Requires-Dist: pytest>=8.0; extra == "dev"
24
+ Requires-Dist: pytest-cov>=5.0; extra == "dev"
25
+ Requires-Dist: ruff>=0.5; extra == "dev"
26
+ Requires-Dist: requests-mock>=1.12; extra == "dev"
27
+ Requires-Dist: httpx>=0.27; extra == "dev"
28
+ Dynamic: license-file
29
+
30
+ <div align="center">
31
+
32
+ <img src="assets/gets-inapi-hero.svg" alt="GET-SINAPI — plataforma privada para consulta e análise de custos SINAPI" width="100%">
33
+
34
+ # GET-SINAPI
35
+
36
+ ### PLATAFORMA DESKTOP · CONSULTA SINAPI · ENGENHARIA DE CUSTOS
37
+
38
+ Aplicação privada para Windows que transforma publicações oficiais da CAIXA/SINAPI em consultas, análises, comparações e orçamentos rastreáveis.
39
+
40
+ ![Python](https://img.shields.io/badge/Python-3.11%2B-1677C8?style=for-the-badge&logo=python&logoColor=white)
41
+ ![React](https://img.shields.io/badge/Frontend-React%20%2B%20Vite-087BCE?style=for-the-badge&logo=react&logoColor=white)
42
+ ![FastAPI](https://img.shields.io/badge/API-FastAPI-009688?style=for-the-badge&logo=fastapi&logoColor=white)
43
+ ![SQLite](https://img.shields.io/badge/Database-SQLite-21B8D5?style=for-the-badge&logo=sqlite&logoColor=white)
44
+ ![Windows](https://img.shields.io/badge/Platform-Windows-1677C8?style=for-the-badge&logo=windows&logoColor=white)
45
+
46
+ **Dados oficiais. Processamento local. Decisões de engenharia com rastreabilidade.**
47
+
48
+ </div>
49
+
50
+ ---
51
+
52
+ ## Visão geral
53
+
54
+ O GET-SINAPI é um aplicativo desktop privado para Windows. Ele reúne uma interface React, uma API local FastAPI, processamento Python e persistência SQLite. O launcher inicia os serviços na própria máquina e abre a plataforma no navegador padrão; o usuário não precisa iniciar manualmente os servidores.
55
+
56
+ O produto utiliza o PulseSINAPI como referência de experiência funcional, mas mantém pipeline e regras próprias para ingestão, qualidade, cálculo e rastreabilidade dos dados oficiais.
57
+
58
+ > **Distribuição atual:** executável Windows privado. A aplicação não é um serviço web público nem possui autenticação centralizada na nuvem.
59
+
60
+ ## Funcionalidades disponíveis na aplicação
61
+
62
+ - Dashboard com indicadores derivados da base efetivamente carregada.
63
+ - Consulta de insumos com pesquisa, filtros e paginação.
64
+ - Consulta de composições e detalhamento de componentes e coeficientes.
65
+ - Comparação de preços por UF e competência, conforme cobertura disponível.
66
+ - Cesta de orçamento e cálculo de totais.
67
+ - Histórico das competências presentes na base local.
68
+ - Relatórios e exportações disponibilizados pela versão atual.
69
+ - Atualização da base com acompanhamento de estado e progresso.
70
+ - Integridade, auditoria e informações de origem dos dados.
71
+ - Gestão local de contas de acesso.
72
+
73
+ A disponibilidade de resultados depende das competências e dos arquivos oficiais efetivamente baixados, processados e validados. O sistema não deve apresentar dados ausentes como se fossem preços iguais a zero.
74
+
75
+ ## Capturas e arquitetura
76
+
77
+ <p align="center">
78
+ <img src="assets/gets-inapi-architecture.svg" alt="Arquitetura local do GET-SINAPI: launcher Windows, React, FastAPI, Python e SQLite" width="100%">
79
+ </p>
80
+
81
+ A arquitetura é inteiramente local na distribuição atual:
82
+
83
+ | Componente | Tecnologia | Responsabilidade |
84
+ |---|---|---|
85
+ | Aplicação desktop | Python / PyInstaller | Inicialização e encerramento dos serviços |
86
+ | Interface | React + Vite + TypeScript | Navegação, filtros, tabelas e visualizações |
87
+ | API | FastAPI | Consultas, autenticação local e operações |
88
+ | Processamento | Python | Coleta, validação, normalização e cálculos |
89
+ | Persistência | SQLite | Dados SINAPI e informações locais |
90
+ | Autenticação | PBKDF2 + sessão local | Login e controle de contas neste computador |
91
+
92
+ ## Autenticação local
93
+
94
+ O primeiro acesso permite configurar a conta administradora. O identificador pode ser o e-mail do usuário, acompanhado de uma senha com no mínimo 12 caracteres.
95
+
96
+ - O primeiro usuário cadastrado recebe o perfil de administrador.
97
+ - O administrador pode cadastrar outras contas locais pela área de gestão de acessos.
98
+ - As senhas não são armazenadas em texto puro: o backend deriva o hash com PBKDF2-HMAC-SHA256 e salt individual.
99
+ - A sessão local tem duração de até oito horas.
100
+ - Os registros de autenticação são mantidos no arquivo `security/users.json`, dentro do diretório de dados da aplicação.
101
+
102
+ **Limite importante:** as contas são locais e pertencem ao diretório de dados daquele computador. Cadastrar usuários em uma instalação não cria automaticamente contas nas instalações dos demais engenheiros. Ainda não há login centralizado, revogação remota, sincronização de contas ou compartilhamento central de orçamentos.
103
+
104
+ ## Armazenamento e diretório de dados
105
+
106
+ A aplicação utiliza SQLite local. O diretório de dados pode ser definido por configuração de ambiente; na distribuição desktop, o launcher prepara o ambiente de execução e mantém logs locais.
107
+
108
+ Não compartilhe o arquivo de banco ou o diretório de autenticação contendo dados operacionais sem avaliar previamente as implicações de segurança e consistência. Para vários engenheiros trabalharem com a mesma base e os mesmos orçamentos, será necessária uma camada de sincronização central — não faz parte do modelo atual.
109
+
110
+ ## Instalação e utilização
111
+
112
+ 1. Baixe o pacote Windows disponibilizado na área de Releases ou no artefato de build autorizado.
113
+ 2. Extraia o ZIP em uma pasta local.
114
+ 3. Execute `GET-SINAPI-V3.exe`.
115
+ 4. No primeiro acesso, configure o usuário administrador e a senha.
116
+ 5. Nos acessos seguintes, entre com as credenciais locais.
117
+
118
+ O launcher inicia a API e o frontend localmente, aguarda os serviços responderem e então abre a interface no navegador padrão.
119
+
120
+ ## Exportação em lote pelo terminal
121
+
122
+ Além do executável desktop, o pacote Python disponibiliza a interface de terminal pelo comando `getsinapi`. O menu interativo permite selecionar:
123
+
124
+ - Todas as categorias ou apenas insumos, composições e componentes.
125
+ - Uma competência específica ou todas as competências carregadas.
126
+ - Uma UF específica ou todas as UFs disponíveis.
127
+ - Regime de desoneração e modalidade de encargos.
128
+ - Pesquisa por código ou descrição.
129
+ - Saída em Excel (.xlsx), CSV ou nos dois formatos.
130
+
131
+ A exportação completa gera uma visão consolidada com os registros selecionados e arquivos/abas individualizados por categoria. No Excel, o consolidado e cada categoria ficam em abas próprias; no CSV, são gerados um arquivo consolidado e arquivos separados por categoria. Os CSVs usam UTF-8 com BOM e delimitador ponto e vírgula para melhor abertura no Excel em configurações regionais brasileiras.
132
+
133
+ ### Instalação e execução
134
+
135
+ Após a publicação da versão que contém essa funcionalidade no PyPI:
136
+
137
+ ```powershell
138
+ python -m pip install --upgrade get-sinapi
139
+ getsinapi
140
+ ```
141
+
142
+ Ou execute diretamente o menu de exportação:
143
+
144
+ ```powershell
145
+ getsinapi export
146
+ ```
147
+
148
+ O comando consulta a base SQLite local já carregada; não refaz o download dos pacotes oficiais a cada exportação. Na instalação desktop, utiliza o mesmo diretório de dados configurado pelo launcher. Em instalações independentes, defina `GETSINAPI_DATABASE_PATH` para apontar ao arquivo `getsinapi.sqlite3` correto. A funcionalidade de terminal não substitui nem altera o executável Windows.
149
+
150
+ ## Desenvolvimento local
151
+
152
+ Requisitos: Python 3.11+ e Node.js 20+.
153
+
154
+ ### Backend
155
+
156
+ ```powershell
157
+ py -3.11 -m venv .venv
158
+ .\.venv\Scripts\Activate.ps1
159
+ python -m pip install --upgrade pip
160
+ pip install -e ".[dev]"
161
+ $env:GETSINAPI_DATABASE_PATH = "data/getsinapi.sqlite3"
162
+ uvicorn getsinapi.api.main:app --reload
163
+ ```
164
+
165
+ API local: `http://127.0.0.1:8000`
166
+ Health check: `http://127.0.0.1:8000/api/health`
167
+ Documentação OpenAPI: `http://127.0.0.1:8000/docs`
168
+
169
+ ### Frontend
170
+
171
+ Em outro terminal:
172
+
173
+ ```powershell
174
+ cd frontend
175
+ npm install
176
+ npm run dev
177
+ ```
178
+
179
+ Frontend de desenvolvimento: `http://localhost:5173`. O Vite encaminha as chamadas `/api` para a API local.
180
+
181
+ ### Qualidade e testes
182
+
183
+ ```powershell
184
+ ruff check .
185
+ pytest -v
186
+ ```
187
+
188
+ O workflow Windows também compila o frontend, empacota a aplicação com PyInstaller e executa um smoke test da interface e do endpoint de saúde antes de publicar o artefato.
189
+
190
+ ## Pipeline e integridade dos dados
191
+
192
+ | Camada | Responsabilidade |
193
+ |---|---|
194
+ | Bronze | Preservação dos pacotes oficiais recebidos |
195
+ | Staging | Extração controlada e inventário dos arquivos |
196
+ | Silver | Normalização, tipagem e validação |
197
+ | Gold | Estruturas consolidadas para consulta e análise |
198
+ | Aplicação | Consulta, comparação, cálculo e orçamento |
199
+
200
+ Princípios:
201
+
202
+ - Publicações oficiais da CAIXA como fonte de referência.
203
+ - Nenhum dado sintético em produção.
204
+ - Distinção entre zero publicado, valor ausente e falha de extração.
205
+ - Preservação de competência, UF, regime e origem.
206
+ - Valores monetários e coeficientes tratados com precisão decimal.
207
+ - Atualizações incrementais e idempotentes, preservando o histórico válido.
208
+ - Rastreabilidade até publicação, arquivo e referência de origem, conforme metadados disponíveis.
209
+
210
+ ## Cobertura e limitações conhecidas
211
+
212
+ - A cobertura histórica depende dos pacotes efetivamente publicados, coletados e processados.
213
+ - Os layouts legados anteriores a 2025 exigem tratamento específico; não se deve presumir cobertura histórica integral.
214
+ - O armazenamento é SQLite local.
215
+ - A autenticação é local, sem provedor externo.
216
+ - Não há sincronização de dados ou orçamentos entre computadores.
217
+ - A distribuição atual é desktop Windows; uma versão web hospedada não faz parte do escopo vigente.
218
+
219
+ ## Stack tecnológica
220
+
221
+ Python · React · TypeScript · Vite · FastAPI · SQLite · SQLAlchemy · Pandas · Pytest · Ruff · PyInstaller · GitHub Actions.
222
+
223
+ ## Licença e dados de terceiros
224
+
225
+ O código-fonte é distribuído sob a licença MIT, conforme o arquivo [LICENSE](LICENSE). Essa licença não altera os direitos, termos de uso ou atribuição aplicáveis às publicações, marcas e dados de terceiros, incluindo os dados oficiais do SINAPI.
226
+
227
+ ---
228
+
229
+ <div align="center">
230
+
231
+ **GET-SINAPI**
232
+ NR TECH · Engenharia de Dados e Custos
233
+
234
+ *Precisão na origem. Consistência no processamento. Confiança na consulta.*
235
+
236
+ </div>
@@ -0,0 +1,207 @@
1
+ <div align="center">
2
+
3
+ <img src="assets/gets-inapi-hero.svg" alt="GET-SINAPI — plataforma privada para consulta e análise de custos SINAPI" width="100%">
4
+
5
+ # GET-SINAPI
6
+
7
+ ### PLATAFORMA DESKTOP · CONSULTA SINAPI · ENGENHARIA DE CUSTOS
8
+
9
+ Aplicação privada para Windows que transforma publicações oficiais da CAIXA/SINAPI em consultas, análises, comparações e orçamentos rastreáveis.
10
+
11
+ ![Python](https://img.shields.io/badge/Python-3.11%2B-1677C8?style=for-the-badge&logo=python&logoColor=white)
12
+ ![React](https://img.shields.io/badge/Frontend-React%20%2B%20Vite-087BCE?style=for-the-badge&logo=react&logoColor=white)
13
+ ![FastAPI](https://img.shields.io/badge/API-FastAPI-009688?style=for-the-badge&logo=fastapi&logoColor=white)
14
+ ![SQLite](https://img.shields.io/badge/Database-SQLite-21B8D5?style=for-the-badge&logo=sqlite&logoColor=white)
15
+ ![Windows](https://img.shields.io/badge/Platform-Windows-1677C8?style=for-the-badge&logo=windows&logoColor=white)
16
+
17
+ **Dados oficiais. Processamento local. Decisões de engenharia com rastreabilidade.**
18
+
19
+ </div>
20
+
21
+ ---
22
+
23
+ ## Visão geral
24
+
25
+ O GET-SINAPI é um aplicativo desktop privado para Windows. Ele reúne uma interface React, uma API local FastAPI, processamento Python e persistência SQLite. O launcher inicia os serviços na própria máquina e abre a plataforma no navegador padrão; o usuário não precisa iniciar manualmente os servidores.
26
+
27
+ O produto utiliza o PulseSINAPI como referência de experiência funcional, mas mantém pipeline e regras próprias para ingestão, qualidade, cálculo e rastreabilidade dos dados oficiais.
28
+
29
+ > **Distribuição atual:** executável Windows privado. A aplicação não é um serviço web público nem possui autenticação centralizada na nuvem.
30
+
31
+ ## Funcionalidades disponíveis na aplicação
32
+
33
+ - Dashboard com indicadores derivados da base efetivamente carregada.
34
+ - Consulta de insumos com pesquisa, filtros e paginação.
35
+ - Consulta de composições e detalhamento de componentes e coeficientes.
36
+ - Comparação de preços por UF e competência, conforme cobertura disponível.
37
+ - Cesta de orçamento e cálculo de totais.
38
+ - Histórico das competências presentes na base local.
39
+ - Relatórios e exportações disponibilizados pela versão atual.
40
+ - Atualização da base com acompanhamento de estado e progresso.
41
+ - Integridade, auditoria e informações de origem dos dados.
42
+ - Gestão local de contas de acesso.
43
+
44
+ A disponibilidade de resultados depende das competências e dos arquivos oficiais efetivamente baixados, processados e validados. O sistema não deve apresentar dados ausentes como se fossem preços iguais a zero.
45
+
46
+ ## Capturas e arquitetura
47
+
48
+ <p align="center">
49
+ <img src="assets/gets-inapi-architecture.svg" alt="Arquitetura local do GET-SINAPI: launcher Windows, React, FastAPI, Python e SQLite" width="100%">
50
+ </p>
51
+
52
+ A arquitetura é inteiramente local na distribuição atual:
53
+
54
+ | Componente | Tecnologia | Responsabilidade |
55
+ |---|---|---|
56
+ | Aplicação desktop | Python / PyInstaller | Inicialização e encerramento dos serviços |
57
+ | Interface | React + Vite + TypeScript | Navegação, filtros, tabelas e visualizações |
58
+ | API | FastAPI | Consultas, autenticação local e operações |
59
+ | Processamento | Python | Coleta, validação, normalização e cálculos |
60
+ | Persistência | SQLite | Dados SINAPI e informações locais |
61
+ | Autenticação | PBKDF2 + sessão local | Login e controle de contas neste computador |
62
+
63
+ ## Autenticação local
64
+
65
+ O primeiro acesso permite configurar a conta administradora. O identificador pode ser o e-mail do usuário, acompanhado de uma senha com no mínimo 12 caracteres.
66
+
67
+ - O primeiro usuário cadastrado recebe o perfil de administrador.
68
+ - O administrador pode cadastrar outras contas locais pela área de gestão de acessos.
69
+ - As senhas não são armazenadas em texto puro: o backend deriva o hash com PBKDF2-HMAC-SHA256 e salt individual.
70
+ - A sessão local tem duração de até oito horas.
71
+ - Os registros de autenticação são mantidos no arquivo `security/users.json`, dentro do diretório de dados da aplicação.
72
+
73
+ **Limite importante:** as contas são locais e pertencem ao diretório de dados daquele computador. Cadastrar usuários em uma instalação não cria automaticamente contas nas instalações dos demais engenheiros. Ainda não há login centralizado, revogação remota, sincronização de contas ou compartilhamento central de orçamentos.
74
+
75
+ ## Armazenamento e diretório de dados
76
+
77
+ A aplicação utiliza SQLite local. O diretório de dados pode ser definido por configuração de ambiente; na distribuição desktop, o launcher prepara o ambiente de execução e mantém logs locais.
78
+
79
+ Não compartilhe o arquivo de banco ou o diretório de autenticação contendo dados operacionais sem avaliar previamente as implicações de segurança e consistência. Para vários engenheiros trabalharem com a mesma base e os mesmos orçamentos, será necessária uma camada de sincronização central — não faz parte do modelo atual.
80
+
81
+ ## Instalação e utilização
82
+
83
+ 1. Baixe o pacote Windows disponibilizado na área de Releases ou no artefato de build autorizado.
84
+ 2. Extraia o ZIP em uma pasta local.
85
+ 3. Execute `GET-SINAPI-V3.exe`.
86
+ 4. No primeiro acesso, configure o usuário administrador e a senha.
87
+ 5. Nos acessos seguintes, entre com as credenciais locais.
88
+
89
+ O launcher inicia a API e o frontend localmente, aguarda os serviços responderem e então abre a interface no navegador padrão.
90
+
91
+ ## Exportação em lote pelo terminal
92
+
93
+ Além do executável desktop, o pacote Python disponibiliza a interface de terminal pelo comando `getsinapi`. O menu interativo permite selecionar:
94
+
95
+ - Todas as categorias ou apenas insumos, composições e componentes.
96
+ - Uma competência específica ou todas as competências carregadas.
97
+ - Uma UF específica ou todas as UFs disponíveis.
98
+ - Regime de desoneração e modalidade de encargos.
99
+ - Pesquisa por código ou descrição.
100
+ - Saída em Excel (.xlsx), CSV ou nos dois formatos.
101
+
102
+ A exportação completa gera uma visão consolidada com os registros selecionados e arquivos/abas individualizados por categoria. No Excel, o consolidado e cada categoria ficam em abas próprias; no CSV, são gerados um arquivo consolidado e arquivos separados por categoria. Os CSVs usam UTF-8 com BOM e delimitador ponto e vírgula para melhor abertura no Excel em configurações regionais brasileiras.
103
+
104
+ ### Instalação e execução
105
+
106
+ Após a publicação da versão que contém essa funcionalidade no PyPI:
107
+
108
+ ```powershell
109
+ python -m pip install --upgrade get-sinapi
110
+ getsinapi
111
+ ```
112
+
113
+ Ou execute diretamente o menu de exportação:
114
+
115
+ ```powershell
116
+ getsinapi export
117
+ ```
118
+
119
+ O comando consulta a base SQLite local já carregada; não refaz o download dos pacotes oficiais a cada exportação. Na instalação desktop, utiliza o mesmo diretório de dados configurado pelo launcher. Em instalações independentes, defina `GETSINAPI_DATABASE_PATH` para apontar ao arquivo `getsinapi.sqlite3` correto. A funcionalidade de terminal não substitui nem altera o executável Windows.
120
+
121
+ ## Desenvolvimento local
122
+
123
+ Requisitos: Python 3.11+ e Node.js 20+.
124
+
125
+ ### Backend
126
+
127
+ ```powershell
128
+ py -3.11 -m venv .venv
129
+ .\.venv\Scripts\Activate.ps1
130
+ python -m pip install --upgrade pip
131
+ pip install -e ".[dev]"
132
+ $env:GETSINAPI_DATABASE_PATH = "data/getsinapi.sqlite3"
133
+ uvicorn getsinapi.api.main:app --reload
134
+ ```
135
+
136
+ API local: `http://127.0.0.1:8000`
137
+ Health check: `http://127.0.0.1:8000/api/health`
138
+ Documentação OpenAPI: `http://127.0.0.1:8000/docs`
139
+
140
+ ### Frontend
141
+
142
+ Em outro terminal:
143
+
144
+ ```powershell
145
+ cd frontend
146
+ npm install
147
+ npm run dev
148
+ ```
149
+
150
+ Frontend de desenvolvimento: `http://localhost:5173`. O Vite encaminha as chamadas `/api` para a API local.
151
+
152
+ ### Qualidade e testes
153
+
154
+ ```powershell
155
+ ruff check .
156
+ pytest -v
157
+ ```
158
+
159
+ O workflow Windows também compila o frontend, empacota a aplicação com PyInstaller e executa um smoke test da interface e do endpoint de saúde antes de publicar o artefato.
160
+
161
+ ## Pipeline e integridade dos dados
162
+
163
+ | Camada | Responsabilidade |
164
+ |---|---|
165
+ | Bronze | Preservação dos pacotes oficiais recebidos |
166
+ | Staging | Extração controlada e inventário dos arquivos |
167
+ | Silver | Normalização, tipagem e validação |
168
+ | Gold | Estruturas consolidadas para consulta e análise |
169
+ | Aplicação | Consulta, comparação, cálculo e orçamento |
170
+
171
+ Princípios:
172
+
173
+ - Publicações oficiais da CAIXA como fonte de referência.
174
+ - Nenhum dado sintético em produção.
175
+ - Distinção entre zero publicado, valor ausente e falha de extração.
176
+ - Preservação de competência, UF, regime e origem.
177
+ - Valores monetários e coeficientes tratados com precisão decimal.
178
+ - Atualizações incrementais e idempotentes, preservando o histórico válido.
179
+ - Rastreabilidade até publicação, arquivo e referência de origem, conforme metadados disponíveis.
180
+
181
+ ## Cobertura e limitações conhecidas
182
+
183
+ - A cobertura histórica depende dos pacotes efetivamente publicados, coletados e processados.
184
+ - Os layouts legados anteriores a 2025 exigem tratamento específico; não se deve presumir cobertura histórica integral.
185
+ - O armazenamento é SQLite local.
186
+ - A autenticação é local, sem provedor externo.
187
+ - Não há sincronização de dados ou orçamentos entre computadores.
188
+ - A distribuição atual é desktop Windows; uma versão web hospedada não faz parte do escopo vigente.
189
+
190
+ ## Stack tecnológica
191
+
192
+ Python · React · TypeScript · Vite · FastAPI · SQLite · SQLAlchemy · Pandas · Pytest · Ruff · PyInstaller · GitHub Actions.
193
+
194
+ ## Licença e dados de terceiros
195
+
196
+ O código-fonte é distribuído sob a licença MIT, conforme o arquivo [LICENSE](LICENSE). Essa licença não altera os direitos, termos de uso ou atribuição aplicáveis às publicações, marcas e dados de terceiros, incluindo os dados oficiais do SINAPI.
197
+
198
+ ---
199
+
200
+ <div align="center">
201
+
202
+ **GET-SINAPI**
203
+ NR TECH · Engenharia de Dados e Custos
204
+
205
+ *Precisão na origem. Consistência no processamento. Confiança na consulta.*
206
+
207
+ </div>
@@ -0,0 +1,48 @@
1
+ [build-system]
2
+ requires = ["setuptools>=69", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "get-sinapi"
7
+ version = "3.1.0"
8
+ description = "Pipeline rastreável de dados públicos do SINAPI/CAIXA"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = "MIT"
12
+ authors = [{ name = "NR TECH" }]
13
+ dependencies = [
14
+ "requests>=2.31",
15
+ "curl-cffi>=0.7",
16
+ "beautifulsoup4>=4.12",
17
+ "python-dotenv>=1.0",
18
+ "pandas>=2.2",
19
+ "openpyxl>=3.1",
20
+ "xlrd>=2.0",
21
+ "PyYAML>=6.0",
22
+ "SQLAlchemy>=2.0",
23
+ "fastapi>=0.110",
24
+ "uvicorn[standard]>=0.27",
25
+ "reportlab>=4.2"
26
+ ]
27
+
28
+ [project.optional-dependencies]
29
+ dev = ["pytest>=8.0", "pytest-cov>=5.0", "ruff>=0.5", "requests-mock>=1.12", "httpx>=0.27"]
30
+
31
+ [project.scripts]
32
+ getsinapi = "getsinapi.cli:main"
33
+
34
+ [tool.setuptools.packages.find]
35
+ where = ["src"]
36
+
37
+ [tool.pytest.ini_options]
38
+ testpaths = ["tests"]
39
+ pythonpath = ["src"]
40
+ addopts = "-ra"
41
+
42
+ [tool.ruff]
43
+ line-length = 100
44
+ target-version = "py311"
45
+ src = ["src"]
46
+
47
+ [tool.ruff.lint.isort]
48
+ known-first-party = ["getsinapi"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+