openfatture 2.4.0__tar.gz → 2.4.2__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 (532) hide show
  1. openfatture-2.4.2/PKG-INFO +347 -0
  2. openfatture-2.4.2/README.md +241 -0
  3. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/__init__.py +1 -1
  4. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/openai.py +6 -2
  5. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/prompt.py +1 -0
  6. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/invoice_queries.py +79 -5
  7. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/fattura.py +64 -3
  8. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/de/cli.ftl +13 -0
  9. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/en/cli.ftl +13 -0
  10. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/es/cli.ftl +13 -0
  11. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/fr/cli.ftl +13 -0
  12. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/it/cli.ftl +13 -0
  13. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/payment_commands.py +30 -0
  14. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/payment_queries.py +12 -14
  15. openfatture-2.4.2/tests/ai/test_openai_tool_history.py +33 -0
  16. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_invoice.py +15 -4
  17. openfatture-2.4.2/tests/cli/test_historical_invoice_stats.py +19 -0
  18. openfatture-2.4.2/tests/payment/test_payment_balance_regressions.py +51 -0
  19. openfatture-2.4.0/PKG-INFO +0 -202
  20. openfatture-2.4.0/README.md +0 -96
  21. {openfatture-2.4.0 → openfatture-2.4.2}/.gitignore +0 -0
  22. {openfatture-2.4.0 → openfatture-2.4.2}/LICENSE +0 -0
  23. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/__init__.py +0 -0
  24. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/__init__.py +0 -0
  25. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/cash_flow_predictor.py +0 -0
  26. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/chat_agent.py +0 -0
  27. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/compliance/__init__.py +0 -0
  28. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/compliance/checker.py +0 -0
  29. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/compliance/heuristics.py +0 -0
  30. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/compliance/rules.py +0 -0
  31. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/compliance/sdi_patterns.py +0 -0
  32. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/invoice_assistant.py +0 -0
  33. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/models.py +0 -0
  34. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/payment_insight_agent.py +0 -0
  35. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/tax_advisor.py +0 -0
  36. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/__init__.py +0 -0
  37. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/config.py +0 -0
  38. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/memory.py +0 -0
  39. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/provider.py +0 -0
  40. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/strategy.py +0 -0
  41. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/tool_cache.py +0 -0
  42. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/config/__init__.py +0 -0
  43. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/config/settings.py +0 -0
  44. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/context/__init__.py +0 -0
  45. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/context/enrichment.py +0 -0
  46. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/__init__.py +0 -0
  47. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/agent.py +0 -0
  48. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/context.py +0 -0
  49. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/message.py +0 -0
  50. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/prompt.py +0 -0
  51. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/response.py +0 -0
  52. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/feedback/__init__.py +0 -0
  53. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/feedback/analytics.py +0 -0
  54. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/feedback/models.py +0 -0
  55. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/feedback/service.py +0 -0
  56. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/__init__.py +0 -0
  57. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/config.py +0 -0
  58. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/data_loader.py +0 -0
  59. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/features.py +0 -0
  60. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/models/__init__.py +0 -0
  61. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/models/ensemble.py +0 -0
  62. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/models/prophet_model.py +0 -0
  63. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/models/xgboost_model.py +0 -0
  64. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/__init__.py +0 -0
  65. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/config.py +0 -0
  66. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/evaluator.py +0 -0
  67. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/scheduler.py +0 -0
  68. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/triggers.py +0 -0
  69. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/versioning.py +0 -0
  70. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/__init__.py +0 -0
  71. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/human_loop.py +0 -0
  72. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/native_tools.py +0 -0
  73. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/parsers.py +0 -0
  74. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/react.py +0 -0
  75. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/resilience.py +0 -0
  76. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/states.py +0 -0
  77. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/workflows/__init__.py +0 -0
  78. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/workflows/cash_flow_analysis.py +0 -0
  79. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/workflows/compliance_check.py +0 -0
  80. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/workflows/invoice_creation.py +0 -0
  81. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/prompts/__init__.py +0 -0
  82. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/prompts/chat_assistant.yaml +0 -0
  83. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/prompts/invoice_assistant.yaml +0 -0
  84. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/prompts/tax_advisor.yaml +0 -0
  85. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/__init__.py +0 -0
  86. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/anthropic.py +0 -0
  87. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/base.py +0 -0
  88. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/factory.py +0 -0
  89. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/ollama.py +0 -0
  90. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/__init__.py +0 -0
  91. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/__init__.py +0 -0
  92. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/config.py +0 -0
  93. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/listeners.py +0 -0
  94. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/queue.py +0 -0
  95. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/service.py +0 -0
  96. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/tracker.py +0 -0
  97. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/config.py +0 -0
  98. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/embeddings.py +0 -0
  99. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/indexing.py +0 -0
  100. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/knowledge_indexer.py +0 -0
  101. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/retrieval.py +0 -0
  102. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/sources.json +0 -0
  103. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/vector_store.py +0 -0
  104. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/__init__.py +0 -0
  105. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/constants.py +0 -0
  106. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/contracts.py +0 -0
  107. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/graph.py +0 -0
  108. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/graph_backend.py +0 -0
  109. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/service.py +0 -0
  110. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/__init__.py +0 -0
  111. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/factory.py +0 -0
  112. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/file_store.py +0 -0
  113. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/manager.py +0 -0
  114. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/models.py +0 -0
  115. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/store.py +0 -0
  116. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/streaming/__init__.py +0 -0
  117. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/streaming/accumulator.py +0 -0
  118. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/streaming/events.py +0 -0
  119. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/__init__.py +0 -0
  120. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/batch_tools.py +0 -0
  121. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/client_tools.py +0 -0
  122. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/__init__.py +0 -0
  123. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/invoices.py +0 -0
  124. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/line_helpers.py +0 -0
  125. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/nota_credito.py +0 -0
  126. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/queries.py +0 -0
  127. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/righe.py +0 -0
  128. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/sdi.py +0 -0
  129. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/knowledge_tools.py +0 -0
  130. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/metrics.py +0 -0
  131. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/models.py +0 -0
  132. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/payment_tools.py +0 -0
  133. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/pdf_tools.py +0 -0
  134. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/preventivo_tools.py +0 -0
  135. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/prodotto_tools.py +0 -0
  136. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/registry/__init__.py +0 -0
  137. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/registry/core.py +0 -0
  138. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/registry/defaults.py +0 -0
  139. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/registry/policy.py +0 -0
  140. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/report_tools.py +0 -0
  141. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/sdi_tools.py +0 -0
  142. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/signature_tools.py +0 -0
  143. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/__init__.py +0 -0
  144. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/__init__.py +0 -0
  145. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/batch_ops.py +0 -0
  146. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/client_commands.py +0 -0
  147. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/client_queries.py +0 -0
  148. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/invoice_commands.py +0 -0
  149. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/nota_credito_ops.py +0 -0
  150. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/preventivo_ops.py +0 -0
  151. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/prodotto_ops.py +0 -0
  152. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/report_queries.py +0 -0
  153. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/batch/__init__.py +0 -0
  154. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/batch/invoice_processor.py +0 -0
  155. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/batch/operations.py +0 -0
  156. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/batch/processor.py +0 -0
  157. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/clienti/__init__.py +0 -0
  158. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/fatture/__init__.py +0 -0
  159. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/fatture/service.py +0 -0
  160. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/fiscale/__init__.py +0 -0
  161. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/preventivi/__init__.py +0 -0
  162. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/preventivi/service.py +0 -0
  163. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/prodotti/__init__.py +0 -0
  164. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/__init__.py +0 -0
  165. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/assistant_ui.py +0 -0
  166. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/__init__.py +0 -0
  167. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/assistant.py +0 -0
  168. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/cliente.py +0 -0
  169. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/config.py +0 -0
  170. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/init.py +0 -0
  171. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/interactive.py +0 -0
  172. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/status.py +0 -0
  173. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/config_file.py +0 -0
  174. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/database.py +0 -0
  175. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/__init__.py +0 -0
  176. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/base.py +0 -0
  177. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/factory.py +0 -0
  178. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/html.py +0 -0
  179. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/json.py +0 -0
  180. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/markdown.py +0 -0
  181. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/rich_formatter.py +0 -0
  182. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/stream_json.py +0 -0
  183. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/utils.py +0 -0
  184. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/lifespan.py +0 -0
  185. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/main.py +0 -0
  186. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/__init__.py +0 -0
  187. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/ai_events.py +0 -0
  188. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/analytics.py +0 -0
  189. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/base.py +0 -0
  190. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/batch_events.py +0 -0
  191. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/client_events.py +0 -0
  192. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/invoice_events.py +0 -0
  193. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/listeners.py +0 -0
  194. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/persistence.py +0 -0
  195. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/repository.py +0 -0
  196. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/sdi_events.py +0 -0
  197. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/exceptions.py +0 -0
  198. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/hooks/__init__.py +0 -0
  199. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/hooks/executor.py +0 -0
  200. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/hooks/listeners.py +0 -0
  201. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/hooks/models.py +0 -0
  202. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/hooks/registry.py +0 -0
  203. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/README.md +0 -0
  204. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/__init__.py +0 -0
  205. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/context.py +0 -0
  206. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/formatters.py +0 -0
  207. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/loader.py +0 -0
  208. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/de/common.ftl +0 -0
  209. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/de/email.ftl +0 -0
  210. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/en/common.ftl +0 -0
  211. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/en/email.ftl +0 -0
  212. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/es/common.ftl +0 -0
  213. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/es/email.ftl +0 -0
  214. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/fr/common.ftl +0 -0
  215. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/fr/email.ftl +0 -0
  216. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/it/common.ftl +0 -0
  217. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/it/email.ftl +0 -0
  218. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/translator.py +0 -0
  219. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/README.md +0 -0
  220. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/__init__.py +0 -0
  221. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/__init__.py +0 -0
  222. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/events.py +0 -0
  223. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/listeners.py +0 -0
  224. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/notifications/__init__.py +0 -0
  225. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/notifications/notifier.py +0 -0
  226. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/__init__.py +0 -0
  227. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/insight_service.py +0 -0
  228. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/matching_service.py +0 -0
  229. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/payment_overview.py +0 -0
  230. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/reconciliation_service.py +0 -0
  231. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/reminder_scheduler.py +0 -0
  232. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/tool_ops.py +0 -0
  233. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/domain/__init__.py +0 -0
  234. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/domain/enums.py +0 -0
  235. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/domain/models.py +0 -0
  236. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/domain/payment_allocation.py +0 -0
  237. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/domain/value_objects.py +0 -0
  238. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/__init__.py +0 -0
  239. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/__init__.py +0 -0
  240. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/base.py +0 -0
  241. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/csv_importer.py +0 -0
  242. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/factory.py +0 -0
  243. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/ofx_importer.py +0 -0
  244. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/presets.py +0 -0
  245. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/qif_importer.py +0 -0
  246. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/repository.py +0 -0
  247. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/__init__.py +0 -0
  248. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/base.py +0 -0
  249. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/composite.py +0 -0
  250. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/date_window.py +0 -0
  251. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/exact.py +0 -0
  252. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/fuzzy.py +0 -0
  253. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/iban.py +0 -0
  254. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/iban_formats.py +0 -0
  255. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/templates/reminder_email.html +0 -0
  256. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/templates/reminder_email.txt +0 -0
  257. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/__init__.py +0 -0
  258. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/components/__init__.py +0 -0
  259. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/components/footer.py +0 -0
  260. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/components/header.py +0 -0
  261. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/components/qrcode.py +0 -0
  262. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/components/table.py +0 -0
  263. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/generator.py +0 -0
  264. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/preventivo_generator.py +0 -0
  265. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/templates/__init__.py +0 -0
  266. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/templates/base.py +0 -0
  267. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/templates/branded.py +0 -0
  268. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/templates/minimalist.py +0 -0
  269. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/templates/professional.py +0 -0
  270. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/tool_ops.py +0 -0
  271. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/__init__.py +0 -0
  272. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/assistant_backends.py +0 -0
  273. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/async_bridge.py +0 -0
  274. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/config.py +0 -0
  275. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/datetime.py +0 -0
  276. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/__init__.py +0 -0
  277. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/i18n/en.json +0 -0
  278. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/i18n/it.json +0 -0
  279. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/models.py +0 -0
  280. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/renderer.py +0 -0
  281. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/sender.py +0 -0
  282. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/styles.py +0 -0
  283. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/base.html +0 -0
  284. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/base.txt +0 -0
  285. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/batch/riepilogo_batch.html +0 -0
  286. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/batch/riepilogo_batch.txt +0 -0
  287. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/invio_fattura.html +0 -0
  288. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/invio_fattura.txt +0 -0
  289. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_attestazione.html +0 -0
  290. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_attestazione.txt +0 -0
  291. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_consegna.html +0 -0
  292. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_consegna.txt +0 -0
  293. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_esito_accettata.html +0 -0
  294. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_esito_accettata.txt +0 -0
  295. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_esito_rifiutata.html +0 -0
  296. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_esito_rifiutata.txt +0 -0
  297. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_mancata_consegna.html +0 -0
  298. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_mancata_consegna.txt +0 -0
  299. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_scarto.html +0 -0
  300. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_scarto.txt +0 -0
  301. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/test/test_email.html +0 -0
  302. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/test/test_email.txt +0 -0
  303. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/extras.py +0 -0
  304. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/logging.py +0 -0
  305. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/metrics.py +0 -0
  306. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/rate_limiter.py +0 -0
  307. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/retry.py +0 -0
  308. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/security.py +0 -0
  309. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/validators.py +0 -0
  310. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/py.typed +0 -0
  311. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/__init__.py +0 -0
  312. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/application/__init__.py +0 -0
  313. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/application/invoice_sdi_ops.py +0 -0
  314. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/application/signature_ops.py +0 -0
  315. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/application/tool_ops.py +0 -0
  316. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/digital_signature/__init__.py +0 -0
  317. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/digital_signature/certificate_manager.py +0 -0
  318. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/digital_signature/signer.py +0 -0
  319. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/digital_signature/verifier.py +0 -0
  320. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/notifiche/__init__.py +0 -0
  321. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/notifiche/parser.py +0 -0
  322. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/notifiche/processor.py +0 -0
  323. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/pec_sender/__init__.py +0 -0
  324. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/pec_sender/sender.py +0 -0
  325. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/schemas/FatturaPA_v1.2.2.xsd +0 -0
  326. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/schemas/README.md +0 -0
  327. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/schemas/__init__.py +0 -0
  328. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/schemas/xmldsig-core-schema.xsd +0 -0
  329. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/validator/__init__.py +0 -0
  330. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/validator/xsd_validator.py +0 -0
  331. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/xml_builder/__init__.py +0 -0
  332. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/xml_builder/fatturapa.py +0 -0
  333. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/storage/__init__.py +0 -0
  334. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/storage/database/__init__.py +0 -0
  335. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/storage/database/base.py +0 -0
  336. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/storage/database/models.py +0 -0
  337. {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/storage/session.py +0 -0
  338. {openfatture-2.4.0 → openfatture-2.4.2}/pyproject.toml +0 -0
  339. {openfatture-2.4.0 → openfatture-2.4.2}/tests/__init__.py +0 -0
  340. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/__init__.py +0 -0
  341. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/cache/__init__.py +0 -0
  342. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/cache/test_cached_provider.py +0 -0
  343. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/cache/test_lru_cache.py +0 -0
  344. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/conftest.py +0 -0
  345. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/domain/test_message.py +0 -0
  346. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/domain/test_prompt.py +0 -0
  347. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/feedback/__init__.py +0 -0
  348. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/feedback/test_feedback_service.py +0 -0
  349. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/__init__.py +0 -0
  350. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/__init__.py +0 -0
  351. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/conftest.py +0 -0
  352. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/test_embeddings_performance.py +0 -0
  353. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/test_indexing_performance.py +0 -0
  354. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/test_retrieval_performance.py +0 -0
  355. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/test_vector_store_performance.py +0 -0
  356. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/test_auto_update.py +0 -0
  357. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/test_embeddings.py +0 -0
  358. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/test_reindex_queue_honesty.py +0 -0
  359. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/test_vector_store.py +0 -0
  360. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/session/__init__.py +0 -0
  361. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/session/test_factory.py +0 -0
  362. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/session/test_file_store.py +0 -0
  363. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/streaming/__init__.py +0 -0
  364. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/streaming/test_accumulator.py +0 -0
  365. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/streaming/test_events.py +0 -0
  366. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_anthropic_integration.py +0 -0
  367. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_assistant_backend_parity.py +0 -0
  368. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_assistant_runtime.py +0 -0
  369. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_cache_config.py +0 -0
  370. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_cash_flow_predictor_training.py +0 -0
  371. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_confirmation_gate.py +0 -0
  372. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_invoice_assistant_integration.py +0 -0
  373. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_invoice_assistant_unit.py +0 -0
  374. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_invoice_creation_workflow.py +0 -0
  375. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_invoice_workflows.py +0 -0
  376. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_native_tool_calling.py +0 -0
  377. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_ollama_integration.py +0 -0
  378. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_openai_integration.py +0 -0
  379. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_orchestration_states.py +0 -0
  380. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_property_based.py +0 -0
  381. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_react_e2e_ollama.py +0 -0
  382. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_react_orchestration.py +0 -0
  383. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_react_orchestration_integration.py +0 -0
  384. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_runtime_completion.py +0 -0
  385. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_streaming.py +0 -0
  386. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tax_advisor_integration.py +0 -0
  387. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_token_counter.py +0 -0
  388. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tool_confirmation.py +0 -0
  389. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tool_loop_graph.py +0 -0
  390. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tool_loop_parity.py +0 -0
  391. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tool_retry_policy.py +0 -0
  392. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_circuit_breaker.py +0 -0
  393. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_client.py +0 -0
  394. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_knowledge.py +0 -0
  395. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_models.py +0 -0
  396. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_payment_import.py +0 -0
  397. {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_registry_openai_format.py +0 -0
  398. {openfatture-2.4.0 → openfatture-2.4.2}/tests/billing/test_preventivo_service.py +0 -0
  399. {openfatture-2.4.0 → openfatture-2.4.2}/tests/billing/test_preventivo_service_extended.py +0 -0
  400. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/__init__.py +0 -0
  401. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/acceptance/__init__.py +0 -0
  402. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/e2e/__init__.py +0 -0
  403. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/formatters/__init__.py +0 -0
  404. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/formatters/test_formatters.py +0 -0
  405. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/formatters/test_formatters_integration.py +0 -0
  406. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/formatters/test_formatters_performance.py +0 -0
  407. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/performance/__init__.py +0 -0
  408. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_assistant_presentation.py +0 -0
  409. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_assistant_pty.py +0 -0
  410. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_cliente_commands.py +0 -0
  411. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_config_commands.py +0 -0
  412. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_credential_presentation.py +0 -0
  413. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_fattura_commands.py +0 -0
  414. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_fattura_events.py +0 -0
  415. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_fresh_database_commands.py +0 -0
  416. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_init_commands.py +0 -0
  417. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_public_surface.py +0 -0
  418. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_slash_commands.py +0 -0
  419. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_status_readiness.py +0 -0
  420. {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/ui/__init__.py +0 -0
  421. {openfatture-2.4.0 → openfatture-2.4.2}/tests/conftest.py +0 -0
  422. {openfatture-2.4.0 → openfatture-2.4.2}/tests/events/__init__.py +0 -0
  423. {openfatture-2.4.0 → openfatture-2.4.2}/tests/events/test_analytics.py +0 -0
  424. {openfatture-2.4.0 → openfatture-2.4.2}/tests/events/test_event_bus.py +0 -0
  425. {openfatture-2.4.0 → openfatture-2.4.2}/tests/events/test_event_persistence.py +0 -0
  426. {openfatture-2.4.0 → openfatture-2.4.2}/tests/events/test_repository.py +0 -0
  427. {openfatture-2.4.0 → openfatture-2.4.2}/tests/fixtures/minimal_fatturapa.xml +0 -0
  428. {openfatture-2.4.0 → openfatture-2.4.2}/tests/hooks/__init__.py +0 -0
  429. {openfatture-2.4.0 → openfatture-2.4.2}/tests/hooks/test_executor.py +0 -0
  430. {openfatture-2.4.0 → openfatture-2.4.2}/tests/hooks/test_integration.py +0 -0
  431. {openfatture-2.4.0 → openfatture-2.4.2}/tests/hooks/test_registry.py +0 -0
  432. {openfatture-2.4.0 → openfatture-2.4.2}/tests/i18n/__init__.py +0 -0
  433. {openfatture-2.4.0 → openfatture-2.4.2}/tests/i18n/test_basic.py +0 -0
  434. {openfatture-2.4.0 → openfatture-2.4.2}/tests/i18n/test_cli_translations.py +0 -0
  435. {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/__init__.py +0 -0
  436. {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/performance/__init__.py +0 -0
  437. {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/performance/conftest.py +0 -0
  438. {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/performance/test_e2e_performance.py +0 -0
  439. {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/test_invoice_workflow.py +0 -0
  440. {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/test_nota_credito_workflow.py +0 -0
  441. {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/test_preventivo_conversion.py +0 -0
  442. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/__init__.py +0 -0
  443. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/__init__.py +0 -0
  444. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/fake_listeners.py +0 -0
  445. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/notifications/__init__.py +0 -0
  446. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/notifications/test_notifier.py +0 -0
  447. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/notifications/test_notifier_autoescape.py +0 -0
  448. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/__init__.py +0 -0
  449. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/test_matching_service.py +0 -0
  450. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/test_payment_overview.py +0 -0
  451. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/test_reconciliation_service.py +0 -0
  452. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/test_reminder_scheduler.py +0 -0
  453. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/test_transaction_insight_service.py +0 -0
  454. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/test_event_listeners.py +0 -0
  455. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/conftest.py +0 -0
  456. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/domain/__init__.py +0 -0
  457. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/domain/test_enums.py +0 -0
  458. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/domain/test_models.py +0 -0
  459. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/domain/test_value_objects.py +0 -0
  460. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/fixtures/intesa_sanpaolo_sample.csv +0 -0
  461. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/fixtures/revolut_sample.csv +0 -0
  462. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/fixtures/sample_statement.ofx +0 -0
  463. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/fixtures/sample_statement.qif +0 -0
  464. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/fixtures/unicredit_sample.csv +0 -0
  465. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/__init__.py +0 -0
  466. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/__init__.py +0 -0
  467. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_base_importer_unit.py +0 -0
  468. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_csv_importer.py +0 -0
  469. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_csv_importer_unit.py +0 -0
  470. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_importer_factory_unit.py +0 -0
  471. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_ofx_importer.py +0 -0
  472. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_ofx_importer_unit.py +0 -0
  473. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_qif_importer.py +0 -0
  474. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/__init__.py +0 -0
  475. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_composite_matcher.py +0 -0
  476. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_composite_matcher_benchmark.py +0 -0
  477. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_date_window_matcher.py +0 -0
  478. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_exact_matcher.py +0 -0
  479. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_fuzzy_matcher.py +0 -0
  480. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_fuzzy_matcher_performance.py +0 -0
  481. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_iban_matcher.py +0 -0
  482. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_iban_matcher_sepa.py +0 -0
  483. {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/test_integration_workflow.py +0 -0
  484. {openfatture-2.4.0 → openfatture-2.4.2}/tests/pdf/__init__.py +0 -0
  485. {openfatture-2.4.0 → openfatture-2.4.2}/tests/pdf/test_pdf_generator.py +0 -0
  486. {openfatture-2.4.0 → openfatture-2.4.2}/tests/pdf/test_pdf_improvements.py +0 -0
  487. {openfatture-2.4.0 → openfatture-2.4.2}/tests/pdf/test_preventivo_pdf_generator.py +0 -0
  488. {openfatture-2.4.0 → openfatture-2.4.2}/tests/pdf/test_single_row_invoice_page_count.py +0 -0
  489. {openfatture-2.4.0 → openfatture-2.4.2}/tests/performance/README.md +0 -0
  490. {openfatture-2.4.0 → openfatture-2.4.2}/tests/performance/__init__.py +0 -0
  491. {openfatture-2.4.0 → openfatture-2.4.2}/tests/performance/fixtures.py +0 -0
  492. {openfatture-2.4.0 → openfatture-2.4.2}/tests/performance/report_generator.py +0 -0
  493. {openfatture-2.4.0 → openfatture-2.4.2}/tests/performance/utils.py +0 -0
  494. {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/__init__.py +0 -0
  495. {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/test_async_bridge.py +0 -0
  496. {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/test_config.py +0 -0
  497. {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/test_retry.py +0 -0
  498. {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/test_ssot.py +0 -0
  499. {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/test_validators.py +0 -0
  500. {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/__init__.py +0 -0
  501. {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/conftest.py +0 -0
  502. {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/performance/__init__.py +0 -0
  503. {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/performance/conftest.py +0 -0
  504. {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/performance/test_database_performance.py +0 -0
  505. {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/test_models.py +0 -0
  506. {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/test_session.py +0 -0
  507. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_ai_agent_models.py +0 -0
  508. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_ai_invoice_assistant.py +0 -0
  509. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_ai_tax_advisor.py +0 -0
  510. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_batch_operations.py +0 -0
  511. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_batch_processor.py +0 -0
  512. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_billing_application_queries.py +0 -0
  513. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_bollo_assolto_virtuale.py +0 -0
  514. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_core_boundaries.py +0 -0
  515. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_data_emissione_independent.py +0 -0
  516. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_digital_signature.py +0 -0
  517. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_email_templates.py +0 -0
  518. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_extras.py +0 -0
  519. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_invoice_service.py +0 -0
  520. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_issued_elsewhere_flag.py +0 -0
  521. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_line_helpers.py +0 -0
  522. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_logging.py +0 -0
  523. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_payment_terms_immediate.py +0 -0
  524. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_pdf_dati_riepilogo.py +0 -0
  525. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_pec_sender.py +0 -0
  526. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_rate_limiter.py +0 -0
  527. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_sdi_notifiche.py +0 -0
  528. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_security.py +0 -0
  529. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_validators_hypothesis.py +0 -0
  530. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_xml_builder.py +0 -0
  531. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_xml_xsd_validation.py +0 -0
  532. {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_xsd_validator.py +0 -0
@@ -0,0 +1,347 @@
1
+ Metadata-Version: 2.5
2
+ Name: openfatture
3
+ Version: 2.4.2
4
+ Summary: Open-source electronic invoicing for Italian freelancers - CLI-first with AI workflows
5
+ Project-URL: Homepage, https://github.com/gianlucamazza/openfatture
6
+ Project-URL: Repository, https://github.com/gianlucamazza/openfatture
7
+ Project-URL: Issues, https://github.com/gianlucamazza/openfatture/issues
8
+ Author-email: Gianluca Mazza <info@gianlucamazza.it>
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: ai,cli,fattura-elettronica,fatturapa,freelance,invoicing,sdi
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: End Users/Desktop
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Topic :: Office/Business :: Financial :: Accounting
19
+ Requires-Python: >=3.12
20
+ Requires-Dist: alembic>=1.13.1
21
+ Requires-Dist: asn1crypto>=1.5.1
22
+ Requires-Dist: babel>=2.14.0
23
+ Requires-Dist: click>=8.1.7
24
+ Requires-Dist: cryptography>=50.0.0
25
+ Requires-Dist: fluent-runtime>=0.4.0
26
+ Requires-Dist: httpx>=0.26.0
27
+ Requires-Dist: jinja2>=3.1.0
28
+ Requires-Dist: lxml>=5.1.0
29
+ Requires-Dist: ofxparse>=0.21
30
+ Requires-Dist: platformdirs>=4.0.0
31
+ Requires-Dist: pyasn1-modules>=0.3.0
32
+ Requires-Dist: pyasn1>=0.5.0
33
+ Requires-Dist: pydantic-settings>=2.1.0
34
+ Requires-Dist: pydantic>=2.6.0
35
+ Requires-Dist: python-dateutil>=2.8.2
36
+ Requires-Dist: python-dotenv>=1.0.0
37
+ Requires-Dist: pyyaml>=6.0.1
38
+ Requires-Dist: questionary>=2.0.0
39
+ Requires-Dist: rapidfuzz>=3.0.0
40
+ Requires-Dist: reportlab>=4.0.9
41
+ Requires-Dist: requests>=2.31.0
42
+ Requires-Dist: rich>=13.7.0
43
+ Requires-Dist: sqlalchemy>=2.0.25
44
+ Requires-Dist: structlog>=24.1.0
45
+ Requires-Dist: tomlkit>=0.13.0
46
+ Requires-Dist: typer>=0.12.0
47
+ Requires-Dist: urllib3>=2.8.0
48
+ Requires-Dist: xmlschema>=3.0.1
49
+ Provides-Extra: ai
50
+ Requires-Dist: anthropic>=0.71.0; extra == 'ai'
51
+ Requires-Dist: langgraph-sdk>=0.4.6; extra == 'ai'
52
+ Requires-Dist: langgraph>=1.2.14; extra == 'ai'
53
+ Requires-Dist: openai>=2.4.0; extra == 'ai'
54
+ Requires-Dist: tiktoken>=0.8.0; extra == 'ai'
55
+ Provides-Extra: all
56
+ Requires-Dist: anthropic>=0.71.0; extra == 'all'
57
+ Requires-Dist: apscheduler>=3.10.4; extra == 'all'
58
+ Requires-Dist: chromadb>=1.1.1; extra == 'all'
59
+ Requires-Dist: langgraph-sdk>=0.4.6; extra == 'all'
60
+ Requires-Dist: langgraph>=1.2.14; extra == 'all'
61
+ Requires-Dist: numpy>=1.26.0; extra == 'all'
62
+ Requires-Dist: openai>=2.4.0; extra == 'all'
63
+ Requires-Dist: pandas>=2.3.3; extra == 'all'
64
+ Requires-Dist: plotly>=6.3.1; extra == 'all'
65
+ Requires-Dist: prophet>=1.1.5; extra == 'all'
66
+ Requires-Dist: sentence-transformers>=2.6.0; extra == 'all'
67
+ Requires-Dist: tiktoken>=0.8.0; extra == 'all'
68
+ Requires-Dist: transformers>=5.5.0; extra == 'all'
69
+ Requires-Dist: xgboost>=2.1.0; extra == 'all'
70
+ Provides-Extra: dev
71
+ Requires-Dist: bump-my-version>=0.18.0; extra == 'dev'
72
+ Requires-Dist: hypothesis>=6.98.0; extra == 'dev'
73
+ Requires-Dist: lxml-stubs>=0.5.1; extra == 'dev'
74
+ Requires-Dist: mypy>=1.8.0; extra == 'dev'
75
+ Requires-Dist: pandas-stubs>=2.0.0; extra == 'dev'
76
+ Requires-Dist: pre-commit>=3.6.0; extra == 'dev'
77
+ Requires-Dist: pypdf>=6.21.4; extra == 'dev'
78
+ Requires-Dist: pytest-asyncio>=0.23.3; extra == 'dev'
79
+ Requires-Dist: pytest-benchmark>=4.0.0; extra == 'dev'
80
+ Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
81
+ Requires-Dist: pytest-mock>=3.12.0; extra == 'dev'
82
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
83
+ Requires-Dist: ruff<0.18,>=0.14.0; extra == 'dev'
84
+ Requires-Dist: types-pyasn1>=0.5.0; extra == 'dev'
85
+ Requires-Dist: types-python-dateutil>=2.9.0; extra == 'dev'
86
+ Requires-Dist: types-pyyaml>=6.0.0; extra == 'dev'
87
+ Requires-Dist: types-reportlab>=4.0.0; extra == 'dev'
88
+ Requires-Dist: types-requests>=2.31.0; extra == 'dev'
89
+ Provides-Extra: ml
90
+ Requires-Dist: apscheduler>=3.10.4; extra == 'ml'
91
+ Requires-Dist: numpy>=1.26.0; extra == 'ml'
92
+ Requires-Dist: pandas>=2.3.3; extra == 'ml'
93
+ Requires-Dist: plotly>=6.3.1; extra == 'ml'
94
+ Requires-Dist: prophet>=1.1.5; extra == 'ml'
95
+ Requires-Dist: xgboost>=2.1.0; extra == 'ml'
96
+ Provides-Extra: rag
97
+ Requires-Dist: anthropic>=0.71.0; extra == 'rag'
98
+ Requires-Dist: chromadb>=1.1.1; extra == 'rag'
99
+ Requires-Dist: langgraph-sdk>=0.4.6; extra == 'rag'
100
+ Requires-Dist: langgraph>=1.2.14; extra == 'rag'
101
+ Requires-Dist: openai>=2.4.0; extra == 'rag'
102
+ Requires-Dist: sentence-transformers>=2.6.0; extra == 'rag'
103
+ Requires-Dist: tiktoken>=0.8.0; extra == 'rag'
104
+ Requires-Dist: transformers>=5.5.0; extra == 'rag'
105
+ Description-Content-Type: text/markdown
106
+
107
+ # OpenFatture
108
+
109
+ **Open-source electronic invoicing for Italy.**
110
+
111
+ A local-first, CLI-first invoicing workspace for Italian freelancers and small
112
+ businesses. Generate FatturaPA invoices, manage financial workflows, and automate
113
+ repetitive tasks with optional AI assistance. Your data remains under your control.
114
+
115
+ [![Tests](https://github.com/gianlucamazza/openfatture/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/gianlucamazza/openfatture/actions/workflows/test.yml)
116
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue)](pyproject.toml)
117
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)
118
+
119
+ [Quick start](#quick-start) · [Capabilities](#what-you-can-do) ·
120
+ [Feature status](#feature-status) · [Documentation](#documentation) ·
121
+ [Issues](https://github.com/gianlucamazza/openfatture/issues)
122
+
123
+ ## Why OpenFatture?
124
+
125
+ Italian electronic invoicing involves more than producing a PDF: structured XML,
126
+ customer records, delivery notifications, and payment tracking must fit together.
127
+ OpenFatture brings these workflows into a terminal workspace you can inspect and
128
+ extend.
129
+
130
+ - **Work locally.** Keep the default SQLite database and generated documents on
131
+ your machine. Invoice calculations, XML generation, and PDF rendering do not
132
+ require an LLM or a cloud account.
133
+ - **Choose how to work.** Use deterministic client and invoice commands, or add an
134
+ assistant that calls application services through registered tools.
135
+ - **Automate around your workflow.** Reuse domain services, CSV and bank imports,
136
+ domain events, and user hook scripts.
137
+
138
+ Built for freelancers and small studios comfortable in a terminal. This repository
139
+ has **no browser frontend or web application surface**; it is distinct from
140
+ OpenFatture Cloud.
141
+
142
+ ## Quick Start
143
+
144
+ Requires **Python 3.12+**, Git, and [uv](https://docs.astral.sh/uv/).
145
+ Start with the core install; AI, retrieval, and forecasting are separate extras.
146
+
147
+ ```bash
148
+ git clone https://github.com/gianlucamazza/openfatture.git
149
+ cd openfatture
150
+ uv sync --frozen
151
+ uv run openfatture init
152
+ uv run openfatture status
153
+ ```
154
+
155
+ The setup wizard creates local storage and collects company settings. Use your
156
+ actual fiscal details and tax regime; AI configuration can be skipped.
157
+ `status --json` reports local readiness and next steps, without contacting providers
158
+ or verifying SDI delivery.
159
+
160
+ ### Create a draft and preview it without AI
161
+
162
+ Run this example in a fresh demo database. On an existing database, replace `1`
163
+ with the client and invoice IDs printed by the create commands. The sample client
164
+ uses a demo VAT number and is for a draft preview only.
165
+
166
+ ```bash
167
+ uv run openfatture cliente create --name "Demo Client" --piva 12345678903
168
+ uv run openfatture fattura create --client 1 --note "Demo draft"
169
+ uv run openfatture fattura add-line --invoice 1 \
170
+ --desc "Software consulting" --qty 3 --price 90 --iva 22
171
+ uv run openfatture fattura show 1
172
+ uv run openfatture fattura generate-pdf 1 --output demo-invoice.pdf
173
+ ```
174
+
175
+ This creates a draft for €270 plus €59.40 VAT and a human-readable PDF; it does
176
+ not transmit an invoice. The VAT rate is illustrative. Complete and verify both
177
+ issuer and customer fiscal details before preparing a real invoice.
178
+
179
+ Explore the current command surface with `uv run openfatture --help` and
180
+ `uv run openfatture fattura --help`.
181
+
182
+ ## What You Can Do
183
+
184
+ | Domain | Examples | Entry point |
185
+ | --- | --- | --- |
186
+ | Clients and invoices | Create clients, add invoice lines, inspect totals and draft status | `cliente`, `fattura` commands; application services |
187
+ | Documents | Generate FatturaPA XML, render PDF templates, create linked TD04 credit notes | `fattura generate-xml`, `generate-pdf`, `create-credit-note` |
188
+ | Delivery | Send XML through a configured PEC account and process SDI notification files | SDI services; opt-in assistant tools |
189
+ | Payments | Import bank statements and reconcile transactions with payments | Payment services; assistant tools |
190
+ | Business workflows | Quotes, product records, CSV import/export, batch updates, and reports | Application services; assistant tools |
191
+ | Automation | React to domain events with scripts and inspect persisted event records | Events and hooks; [hook examples](examples/hooks/) |
192
+
193
+ Core capabilities live in application/domain packages. The CLI exposes a subset;
194
+ other workflows use services or optional assistant tools, rather than a command
195
+ for every operation.
196
+
197
+ **XML generation and validation are separate concerns.** The current
198
+ `fattura generate-xml` command calls generation with validation disabled.
199
+ The service layer and `validate_invoice_xml` assistant tool provide validation;
200
+ a generated file alone is not evidence of XSD validity or SDI acceptance.
201
+ See [XSD validation](docs/XSD_VALIDATION.md).
202
+
203
+ ## AI-Assisted Workflows
204
+
205
+ Install only the assistant stack when you need natural-language access:
206
+
207
+ ```bash
208
+ uv sync --frozen --extra ai
209
+ ```
210
+
211
+ Configure `AI_PROVIDER`, `AI_MODEL`, and the provider credential or local endpoint
212
+ using the [configuration guide](docs/CONFIGURATION.md). Supported provider
213
+ adapters are OpenAI, Anthropic, and Ollama. Ollama requires a running local service
214
+ and an installed model; the extra does not install either.
215
+
216
+ Once configured, start with read-only requests:
217
+
218
+ ```bash
219
+ uv run openfatture status --json
220
+ uv run openfatture assistant "List my clients"
221
+ uv run openfatture assistant "Show invoice 1 and its line items"
222
+ uv run openfatture interactive start
223
+ ```
224
+
225
+ The assistant interprets the request; registered tools call application services
226
+ for business operations. Model responses are not proof that an operation ran:
227
+ inspect tool outcomes and the resulting records or files. Review fiscal inputs
228
+ and results yourself.
229
+
230
+ Tool access is controlled by `AI_ENABLED_TOOLS`, which defaults to read-only
231
+ invoice/client lookups. Creation, reconciliation, and export requests need their
232
+ respective tools enabled. `AI_ENABLED_TOOLS=all` enables non-transmit tools;
233
+ **it does not enable SDI/PEC send**. Sending requires explicit opt-in for
234
+ `send_invoice_to_sdi`.
235
+
236
+ `AI_TOOLS_REQUIRE_CONFIRMATION=true` is the default. Tools marked as requiring
237
+ confirmation need human approval: a terminal can prompt, while noninteractive
238
+ callers without approval are refused. The model cannot approve itself. Turning
239
+ this setting off skips confirmation but still requires transmit-tool opt-in.
240
+ See [AI architecture](docs/AI_ARCHITECTURE.md) for runtime details.
241
+
242
+ ## Architecture
243
+
244
+ ```mermaid
245
+ flowchart TD
246
+ CLI["Deterministic CLI"] --> APP["Application services"]
247
+ TERM["Terminal assistant (optional)"] --> AI["AI runtime and allowed tools"]
248
+ AI --> APP
249
+ AI <--> LLM["Local or cloud LLM provider"]
250
+ APP --> DOMAIN["Billing, SDI, payments, PDF"]
251
+ DOMAIN --> STORE["Database and document files"]
252
+ DOMAIN --> EVENTS["Domain events"]
253
+ EVENTS --> AUDIT["Event persistence and hooks"]
254
+ DOMAIN --> PEC["Configured PEC transport"]
255
+ ```
256
+
257
+ The CLI and AI tools route business operations through application services.
258
+ Core storage, billing, payment, SDI, and PDF modules
259
+ remain usable without optional model dependencies.
260
+ See [architecture](docs/ARCHITECTURE.md) and
261
+ [core, extras, and extensions](docs/CORE_VS_EXTENSIONS.md).
262
+
263
+ ## Data Ownership & Security
264
+
265
+ - **Persistence:** SQLite is the default; `DATABASE_URL`, `DATA_DIR`, and
266
+ `ARCHIVIO_DIR` control storage. `init` writes a user profile; `status` shows
267
+ configured paths. Persistent assistant sessions are also local files.
268
+ - **External data flow:** local-first does not mean every feature is offline.
269
+ Cloud LLM requests can include prompts and tool results; PEC transmits invoice
270
+ data. Choose providers and enabled tools accordingly.
271
+ - **Audit boundaries:** emitted domain events can be persisted to the database.
272
+ This is an operational audit trail, not a tamper-proof archive or a guarantee
273
+ that every action is durably recorded; persistence failures are logged without
274
+ aborting the business operation.
275
+ - **Credentials and extensions:** protect local profiles, secrets, and signing
276
+ material; never commit them. Diagnostic masking is not encryption at rest.
277
+ Hook scripts execute local code and should be trusted before enabling them.
278
+ - **Retention:** back up the database and documents. A local document archive
279
+ does not by itself establish compliant long-term preservation
280
+ (*conservazione a norma*).
281
+
282
+ See the [configuration guide](docs/CONFIGURATION.md) and
283
+ [security policy](SECURITY.md) for settings and vulnerability reporting.
284
+
285
+ ## Feature Status
286
+
287
+ The package identifies itself as **2.4.0**, with Beta metadata. These labels
288
+ describe implementation and dependencies, not certification or service guarantees.
289
+
290
+ | Capability | Status | Boundary |
291
+ | --- | --- | --- |
292
+ | Client and invoice CLI, PDF, FatturaPA XML, TD04 | Available in core | XML CLI generation does not run validation; fiscal inputs still need review |
293
+ | Bank import, reconciliation, quotes, batch, reports | Available in core services | Not all operations have direct CLI commands |
294
+ | PEC delivery and SDI notification processing | Implemented; configuration required | Requires real credentials and operator verification; local readiness is not a live delivery test |
295
+ | Events and user hooks | Available in core | Persistence and script execution have the boundaries described above |
296
+ | Assistant and conversational terminal | Optional: `ai` | Requires a configured provider; tool allowlist and confirmation rules apply |
297
+ | Retrieval and embeddings | Optional: `rag` (includes `ai`) | Requires indexing and the embedding/vector-store stack |
298
+ | Cash-flow forecasting | Optional / frozen: `ml` | Model-based estimates; not accounting guarantees |
299
+ | Browser frontend, TUI, in-process plugin API, voice, Lightning | Not supported | Outside the maintained product surface |
300
+
301
+ ### Compatibility and quality evidence
302
+
303
+ The [test workflow](.github/workflows/test.yml) defines Linux and macOS jobs on
304
+ Python 3.12/3.13, plus a core-only Linux smoke/test job. These are configured CI
305
+ targets, not a claim that every run passes. Follow the live Tests badge for results;
306
+ Windows is not in this workflow's test matrix.
307
+
308
+ The [test suite](tests/) covers CLI, billing, XML, PDF, payment, events, and hooks.
309
+ Coverage floors are **49%** for the full package and **75%** for payments, as
310
+ configured in [pyproject.toml](pyproject.toml) and the
311
+ [payment workflow](.github/workflows/payment-tests.yml). Floors are thresholds,
312
+ not measured coverage results. Historical reports are not current quality evidence.
313
+
314
+ ## Documentation
315
+
316
+ | Your goal | Start here |
317
+ | --- | --- |
318
+ | Set up and inspect the installation | [Configuration](docs/CONFIGURATION.md), then command-specific `--help` |
319
+ | Find CLI and conversational options | [CLI reference](docs/CLI_REFERENCE.md); use live `--help` for the current `cliente` / `fattura` surface |
320
+ | Understand document generation | [XSD validation](docs/XSD_VALIDATION.md), [PDF generation](docs/PDF_GENERATION.md) |
321
+ | Configure AI workflows | [AI architecture](docs/AI_ARCHITECTURE.md), [feature extras](docs/CORE_VS_EXTENSIONS.md) |
322
+ | Extend or contribute | [Architecture](docs/ARCHITECTURE.md), [hook examples](examples/hooks/), [contributing](CONTRIBUTING.md) |
323
+ | Review changes and limitations | [2.4.0 release notes](docs/releases/v2.4.0.md), [changelog](CHANGELOG.md), [technical debt](docs/TECHNICAL_DEBT.md) |
324
+
325
+ Some deeper guides retain earlier CLI or release descriptions. Prefer the current
326
+ command help and package metadata when they differ; material under `docs/history/`
327
+ is historical context.
328
+
329
+ ## Development & Contributing
330
+
331
+ The full development stack includes optional features and test/quality tools:
332
+
333
+ ```bash
334
+ uv sync --frozen --all-extras
335
+ uv run python -m pytest -q
336
+ uv run ruff check .
337
+ uv run ruff format --check .
338
+ uv run mypy openfatture/
339
+ ```
340
+
341
+ The default pytest selection excludes performance, benchmark, slow, end-to-end,
342
+ and Ollama tests. Those need explicit selection and, where applicable, external
343
+ services. See [contributing](CONTRIBUTING.md) for the development workflow.
344
+
345
+ Report bugs or propose improvements through
346
+ [GitHub issues](https://github.com/gianlucamazza/openfatture/issues).
347
+ OpenFatture is released under the [MIT License](LICENSE).
@@ -0,0 +1,241 @@
1
+ # OpenFatture
2
+
3
+ **Open-source electronic invoicing for Italy.**
4
+
5
+ A local-first, CLI-first invoicing workspace for Italian freelancers and small
6
+ businesses. Generate FatturaPA invoices, manage financial workflows, and automate
7
+ repetitive tasks with optional AI assistance. Your data remains under your control.
8
+
9
+ [![Tests](https://github.com/gianlucamazza/openfatture/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/gianlucamazza/openfatture/actions/workflows/test.yml)
10
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue)](pyproject.toml)
11
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)
12
+
13
+ [Quick start](#quick-start) · [Capabilities](#what-you-can-do) ·
14
+ [Feature status](#feature-status) · [Documentation](#documentation) ·
15
+ [Issues](https://github.com/gianlucamazza/openfatture/issues)
16
+
17
+ ## Why OpenFatture?
18
+
19
+ Italian electronic invoicing involves more than producing a PDF: structured XML,
20
+ customer records, delivery notifications, and payment tracking must fit together.
21
+ OpenFatture brings these workflows into a terminal workspace you can inspect and
22
+ extend.
23
+
24
+ - **Work locally.** Keep the default SQLite database and generated documents on
25
+ your machine. Invoice calculations, XML generation, and PDF rendering do not
26
+ require an LLM or a cloud account.
27
+ - **Choose how to work.** Use deterministic client and invoice commands, or add an
28
+ assistant that calls application services through registered tools.
29
+ - **Automate around your workflow.** Reuse domain services, CSV and bank imports,
30
+ domain events, and user hook scripts.
31
+
32
+ Built for freelancers and small studios comfortable in a terminal. This repository
33
+ has **no browser frontend or web application surface**; it is distinct from
34
+ OpenFatture Cloud.
35
+
36
+ ## Quick Start
37
+
38
+ Requires **Python 3.12+**, Git, and [uv](https://docs.astral.sh/uv/).
39
+ Start with the core install; AI, retrieval, and forecasting are separate extras.
40
+
41
+ ```bash
42
+ git clone https://github.com/gianlucamazza/openfatture.git
43
+ cd openfatture
44
+ uv sync --frozen
45
+ uv run openfatture init
46
+ uv run openfatture status
47
+ ```
48
+
49
+ The setup wizard creates local storage and collects company settings. Use your
50
+ actual fiscal details and tax regime; AI configuration can be skipped.
51
+ `status --json` reports local readiness and next steps, without contacting providers
52
+ or verifying SDI delivery.
53
+
54
+ ### Create a draft and preview it without AI
55
+
56
+ Run this example in a fresh demo database. On an existing database, replace `1`
57
+ with the client and invoice IDs printed by the create commands. The sample client
58
+ uses a demo VAT number and is for a draft preview only.
59
+
60
+ ```bash
61
+ uv run openfatture cliente create --name "Demo Client" --piva 12345678903
62
+ uv run openfatture fattura create --client 1 --note "Demo draft"
63
+ uv run openfatture fattura add-line --invoice 1 \
64
+ --desc "Software consulting" --qty 3 --price 90 --iva 22
65
+ uv run openfatture fattura show 1
66
+ uv run openfatture fattura generate-pdf 1 --output demo-invoice.pdf
67
+ ```
68
+
69
+ This creates a draft for €270 plus €59.40 VAT and a human-readable PDF; it does
70
+ not transmit an invoice. The VAT rate is illustrative. Complete and verify both
71
+ issuer and customer fiscal details before preparing a real invoice.
72
+
73
+ Explore the current command surface with `uv run openfatture --help` and
74
+ `uv run openfatture fattura --help`.
75
+
76
+ ## What You Can Do
77
+
78
+ | Domain | Examples | Entry point |
79
+ | --- | --- | --- |
80
+ | Clients and invoices | Create clients, add invoice lines, inspect totals and draft status | `cliente`, `fattura` commands; application services |
81
+ | Documents | Generate FatturaPA XML, render PDF templates, create linked TD04 credit notes | `fattura generate-xml`, `generate-pdf`, `create-credit-note` |
82
+ | Delivery | Send XML through a configured PEC account and process SDI notification files | SDI services; opt-in assistant tools |
83
+ | Payments | Import bank statements and reconcile transactions with payments | Payment services; assistant tools |
84
+ | Business workflows | Quotes, product records, CSV import/export, batch updates, and reports | Application services; assistant tools |
85
+ | Automation | React to domain events with scripts and inspect persisted event records | Events and hooks; [hook examples](examples/hooks/) |
86
+
87
+ Core capabilities live in application/domain packages. The CLI exposes a subset;
88
+ other workflows use services or optional assistant tools, rather than a command
89
+ for every operation.
90
+
91
+ **XML generation and validation are separate concerns.** The current
92
+ `fattura generate-xml` command calls generation with validation disabled.
93
+ The service layer and `validate_invoice_xml` assistant tool provide validation;
94
+ a generated file alone is not evidence of XSD validity or SDI acceptance.
95
+ See [XSD validation](docs/XSD_VALIDATION.md).
96
+
97
+ ## AI-Assisted Workflows
98
+
99
+ Install only the assistant stack when you need natural-language access:
100
+
101
+ ```bash
102
+ uv sync --frozen --extra ai
103
+ ```
104
+
105
+ Configure `AI_PROVIDER`, `AI_MODEL`, and the provider credential or local endpoint
106
+ using the [configuration guide](docs/CONFIGURATION.md). Supported provider
107
+ adapters are OpenAI, Anthropic, and Ollama. Ollama requires a running local service
108
+ and an installed model; the extra does not install either.
109
+
110
+ Once configured, start with read-only requests:
111
+
112
+ ```bash
113
+ uv run openfatture status --json
114
+ uv run openfatture assistant "List my clients"
115
+ uv run openfatture assistant "Show invoice 1 and its line items"
116
+ uv run openfatture interactive start
117
+ ```
118
+
119
+ The assistant interprets the request; registered tools call application services
120
+ for business operations. Model responses are not proof that an operation ran:
121
+ inspect tool outcomes and the resulting records or files. Review fiscal inputs
122
+ and results yourself.
123
+
124
+ Tool access is controlled by `AI_ENABLED_TOOLS`, which defaults to read-only
125
+ invoice/client lookups. Creation, reconciliation, and export requests need their
126
+ respective tools enabled. `AI_ENABLED_TOOLS=all` enables non-transmit tools;
127
+ **it does not enable SDI/PEC send**. Sending requires explicit opt-in for
128
+ `send_invoice_to_sdi`.
129
+
130
+ `AI_TOOLS_REQUIRE_CONFIRMATION=true` is the default. Tools marked as requiring
131
+ confirmation need human approval: a terminal can prompt, while noninteractive
132
+ callers without approval are refused. The model cannot approve itself. Turning
133
+ this setting off skips confirmation but still requires transmit-tool opt-in.
134
+ See [AI architecture](docs/AI_ARCHITECTURE.md) for runtime details.
135
+
136
+ ## Architecture
137
+
138
+ ```mermaid
139
+ flowchart TD
140
+ CLI["Deterministic CLI"] --> APP["Application services"]
141
+ TERM["Terminal assistant (optional)"] --> AI["AI runtime and allowed tools"]
142
+ AI --> APP
143
+ AI <--> LLM["Local or cloud LLM provider"]
144
+ APP --> DOMAIN["Billing, SDI, payments, PDF"]
145
+ DOMAIN --> STORE["Database and document files"]
146
+ DOMAIN --> EVENTS["Domain events"]
147
+ EVENTS --> AUDIT["Event persistence and hooks"]
148
+ DOMAIN --> PEC["Configured PEC transport"]
149
+ ```
150
+
151
+ The CLI and AI tools route business operations through application services.
152
+ Core storage, billing, payment, SDI, and PDF modules
153
+ remain usable without optional model dependencies.
154
+ See [architecture](docs/ARCHITECTURE.md) and
155
+ [core, extras, and extensions](docs/CORE_VS_EXTENSIONS.md).
156
+
157
+ ## Data Ownership & Security
158
+
159
+ - **Persistence:** SQLite is the default; `DATABASE_URL`, `DATA_DIR`, and
160
+ `ARCHIVIO_DIR` control storage. `init` writes a user profile; `status` shows
161
+ configured paths. Persistent assistant sessions are also local files.
162
+ - **External data flow:** local-first does not mean every feature is offline.
163
+ Cloud LLM requests can include prompts and tool results; PEC transmits invoice
164
+ data. Choose providers and enabled tools accordingly.
165
+ - **Audit boundaries:** emitted domain events can be persisted to the database.
166
+ This is an operational audit trail, not a tamper-proof archive or a guarantee
167
+ that every action is durably recorded; persistence failures are logged without
168
+ aborting the business operation.
169
+ - **Credentials and extensions:** protect local profiles, secrets, and signing
170
+ material; never commit them. Diagnostic masking is not encryption at rest.
171
+ Hook scripts execute local code and should be trusted before enabling them.
172
+ - **Retention:** back up the database and documents. A local document archive
173
+ does not by itself establish compliant long-term preservation
174
+ (*conservazione a norma*).
175
+
176
+ See the [configuration guide](docs/CONFIGURATION.md) and
177
+ [security policy](SECURITY.md) for settings and vulnerability reporting.
178
+
179
+ ## Feature Status
180
+
181
+ The package identifies itself as **2.4.0**, with Beta metadata. These labels
182
+ describe implementation and dependencies, not certification or service guarantees.
183
+
184
+ | Capability | Status | Boundary |
185
+ | --- | --- | --- |
186
+ | Client and invoice CLI, PDF, FatturaPA XML, TD04 | Available in core | XML CLI generation does not run validation; fiscal inputs still need review |
187
+ | Bank import, reconciliation, quotes, batch, reports | Available in core services | Not all operations have direct CLI commands |
188
+ | PEC delivery and SDI notification processing | Implemented; configuration required | Requires real credentials and operator verification; local readiness is not a live delivery test |
189
+ | Events and user hooks | Available in core | Persistence and script execution have the boundaries described above |
190
+ | Assistant and conversational terminal | Optional: `ai` | Requires a configured provider; tool allowlist and confirmation rules apply |
191
+ | Retrieval and embeddings | Optional: `rag` (includes `ai`) | Requires indexing and the embedding/vector-store stack |
192
+ | Cash-flow forecasting | Optional / frozen: `ml` | Model-based estimates; not accounting guarantees |
193
+ | Browser frontend, TUI, in-process plugin API, voice, Lightning | Not supported | Outside the maintained product surface |
194
+
195
+ ### Compatibility and quality evidence
196
+
197
+ The [test workflow](.github/workflows/test.yml) defines Linux and macOS jobs on
198
+ Python 3.12/3.13, plus a core-only Linux smoke/test job. These are configured CI
199
+ targets, not a claim that every run passes. Follow the live Tests badge for results;
200
+ Windows is not in this workflow's test matrix.
201
+
202
+ The [test suite](tests/) covers CLI, billing, XML, PDF, payment, events, and hooks.
203
+ Coverage floors are **49%** for the full package and **75%** for payments, as
204
+ configured in [pyproject.toml](pyproject.toml) and the
205
+ [payment workflow](.github/workflows/payment-tests.yml). Floors are thresholds,
206
+ not measured coverage results. Historical reports are not current quality evidence.
207
+
208
+ ## Documentation
209
+
210
+ | Your goal | Start here |
211
+ | --- | --- |
212
+ | Set up and inspect the installation | [Configuration](docs/CONFIGURATION.md), then command-specific `--help` |
213
+ | Find CLI and conversational options | [CLI reference](docs/CLI_REFERENCE.md); use live `--help` for the current `cliente` / `fattura` surface |
214
+ | Understand document generation | [XSD validation](docs/XSD_VALIDATION.md), [PDF generation](docs/PDF_GENERATION.md) |
215
+ | Configure AI workflows | [AI architecture](docs/AI_ARCHITECTURE.md), [feature extras](docs/CORE_VS_EXTENSIONS.md) |
216
+ | Extend or contribute | [Architecture](docs/ARCHITECTURE.md), [hook examples](examples/hooks/), [contributing](CONTRIBUTING.md) |
217
+ | Review changes and limitations | [2.4.0 release notes](docs/releases/v2.4.0.md), [changelog](CHANGELOG.md), [technical debt](docs/TECHNICAL_DEBT.md) |
218
+
219
+ Some deeper guides retain earlier CLI or release descriptions. Prefer the current
220
+ command help and package metadata when they differ; material under `docs/history/`
221
+ is historical context.
222
+
223
+ ## Development & Contributing
224
+
225
+ The full development stack includes optional features and test/quality tools:
226
+
227
+ ```bash
228
+ uv sync --frozen --all-extras
229
+ uv run python -m pytest -q
230
+ uv run ruff check .
231
+ uv run ruff format --check .
232
+ uv run mypy openfatture/
233
+ ```
234
+
235
+ The default pytest selection excludes performance, benchmark, slow, end-to-end,
236
+ and Ollama tests. Those need explicit selection and, where applicable, external
237
+ services. See [contributing](CONTRIBUTING.md) for the development workflow.
238
+
239
+ Report bugs or propose improvements through
240
+ [GitHub issues](https://github.com/gianlucamazza/openfatture/issues).
241
+ OpenFatture is released under the [MIT License](LICENSE).
@@ -5,6 +5,6 @@ A modern, CLI-first invoicing system with AI-powered workflows and full
5
5
  compliance with FatturaPA and SDI requirements.
6
6
  """
7
7
 
8
- __version__ = "2.4.0"
8
+ __version__ = "2.4.2"
9
9
  __author__ = "Gianluca Mazza"
10
10
  __license__ = "MIT"
@@ -229,14 +229,18 @@ class OpenAIProvider(BaseLLMProvider):
229
229
  elif isinstance(tool_call, dict):
230
230
  # Handle dict format tool calls
231
231
  function = tool_call.get("function", {})
232
+ arguments = function.get("arguments")
233
+ if arguments is None:
234
+ arguments = tool_call.get("arguments", {})
235
+ if not isinstance(arguments, str):
236
+ arguments = json.dumps(arguments, ensure_ascii=False)
232
237
  tool_calls.append(
233
238
  {
234
239
  "id": tool_call.get("id") or tool_call.get("call_id"),
235
240
  "type": "function",
236
241
  "function": {
237
242
  "name": function.get("name") or tool_call.get("name"),
238
- "arguments": function.get("arguments")
239
- or tool_call.get("arguments", "{}"),
243
+ "arguments": arguments,
240
244
  },
241
245
  }
242
246
  )
@@ -29,6 +29,7 @@ def build_chat_system_prompt(context: ChatContext, *, enable_tools: bool = True)
29
29
  "- Risposte proporzionate alla richiesta: a un saluto rispondi con un saluto breve e una domanda, senza cataloghi di funzionalità.",
30
30
  "- Fornisci dettagli quando servono; evita emoji decorative e introduzioni ripetitive.",
31
31
  "- Distingui capacità disponibili da configurazione pronta. Conferma il completamento solo dopo un risultato positivo degli strumenti.",
32
+ "- Le fatture issued_elsewhere sono documenti storici emessi altrove, non vere bozze. Nei riepiloghi usa per_documento e distingui stato tecnico, stato SDI e incassi. Non dedurre mai da bozza che una fattura storica non sia stata emessa o trasmessa: senza evidenza SDI dichiara stato non verificato. Nessun pagamento registrato non prova il mancato incasso.",
32
33
  "- Usa un tono professionale ma friendly",
33
34
  "- Rispondi in italiano (salvo richiesta diversa)",
34
35
  "- Se non hai informazioni sufficienti, chiedi chiarimenti",