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.
- openfatture-2.4.2/PKG-INFO +347 -0
- openfatture-2.4.2/README.md +241 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/__init__.py +1 -1
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/openai.py +6 -2
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/prompt.py +1 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/invoice_queries.py +79 -5
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/fattura.py +64 -3
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/de/cli.ftl +13 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/en/cli.ftl +13 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/es/cli.ftl +13 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/fr/cli.ftl +13 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/it/cli.ftl +13 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/payment_commands.py +30 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/payment_queries.py +12 -14
- openfatture-2.4.2/tests/ai/test_openai_tool_history.py +33 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_invoice.py +15 -4
- openfatture-2.4.2/tests/cli/test_historical_invoice_stats.py +19 -0
- openfatture-2.4.2/tests/payment/test_payment_balance_regressions.py +51 -0
- openfatture-2.4.0/PKG-INFO +0 -202
- openfatture-2.4.0/README.md +0 -96
- {openfatture-2.4.0 → openfatture-2.4.2}/.gitignore +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/LICENSE +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/cash_flow_predictor.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/chat_agent.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/compliance/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/compliance/checker.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/compliance/heuristics.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/compliance/rules.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/compliance/sdi_patterns.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/invoice_assistant.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/payment_insight_agent.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/agents/tax_advisor.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/config.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/memory.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/provider.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/strategy.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/cache/tool_cache.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/config/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/config/settings.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/context/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/context/enrichment.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/agent.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/context.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/message.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/prompt.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/domain/response.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/feedback/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/feedback/analytics.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/feedback/models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/feedback/service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/config.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/data_loader.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/features.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/models/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/models/ensemble.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/models/prophet_model.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/models/xgboost_model.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/config.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/evaluator.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/scheduler.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/triggers.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/ml/retraining/versioning.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/human_loop.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/native_tools.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/parsers.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/react.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/resilience.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/states.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/workflows/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/workflows/cash_flow_analysis.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/workflows/compliance_check.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/orchestration/workflows/invoice_creation.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/prompts/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/prompts/chat_assistant.yaml +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/prompts/invoice_assistant.yaml +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/prompts/tax_advisor.yaml +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/anthropic.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/base.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/factory.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/providers/ollama.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/config.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/listeners.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/queue.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/auto_update/tracker.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/config.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/embeddings.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/indexing.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/knowledge_indexer.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/retrieval.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/sources.json +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/rag/vector_store.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/constants.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/contracts.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/graph.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/graph_backend.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/runtime/service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/factory.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/file_store.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/manager.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/session/store.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/streaming/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/streaming/accumulator.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/streaming/events.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/batch_tools.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/client_tools.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/invoices.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/line_helpers.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/nota_credito.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/queries.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/righe.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/invoice_tools/sdi.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/knowledge_tools.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/metrics.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/payment_tools.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/pdf_tools.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/preventivo_tools.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/prodotto_tools.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/registry/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/registry/core.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/registry/defaults.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/registry/policy.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/report_tools.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/sdi_tools.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/ai/tools/signature_tools.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/batch_ops.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/client_commands.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/client_queries.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/invoice_commands.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/nota_credito_ops.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/preventivo_ops.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/prodotto_ops.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/application/report_queries.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/batch/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/batch/invoice_processor.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/batch/operations.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/batch/processor.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/clienti/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/fatture/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/fatture/service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/fiscale/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/preventivi/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/preventivi/service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/billing/prodotti/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/assistant_ui.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/assistant.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/cliente.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/config.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/init.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/interactive.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/commands/status.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/config_file.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/database.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/base.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/factory.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/html.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/json.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/markdown.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/rich_formatter.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/stream_json.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/formatters/utils.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/lifespan.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/cli/main.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/ai_events.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/analytics.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/base.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/batch_events.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/client_events.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/invoice_events.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/listeners.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/persistence.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/repository.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/events/sdi_events.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/exceptions.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/hooks/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/hooks/executor.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/hooks/listeners.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/hooks/models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/hooks/registry.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/README.md +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/context.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/formatters.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/loader.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/de/common.ftl +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/de/email.ftl +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/en/common.ftl +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/en/email.ftl +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/es/common.ftl +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/es/email.ftl +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/fr/common.ftl +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/fr/email.ftl +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/it/common.ftl +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/locales/it/email.ftl +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/i18n/translator.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/README.md +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/events.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/listeners.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/notifications/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/notifications/notifier.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/insight_service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/matching_service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/payment_overview.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/reconciliation_service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/services/reminder_scheduler.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/application/tool_ops.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/domain/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/domain/enums.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/domain/models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/domain/payment_allocation.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/domain/value_objects.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/base.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/csv_importer.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/factory.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/ofx_importer.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/presets.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/importers/qif_importer.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/infrastructure/repository.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/base.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/composite.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/date_window.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/exact.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/fuzzy.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/iban.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/matchers/iban_formats.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/templates/reminder_email.html +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/payment/templates/reminder_email.txt +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/components/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/components/footer.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/components/header.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/components/qrcode.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/components/table.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/generator.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/preventivo_generator.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/templates/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/templates/base.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/templates/branded.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/templates/minimalist.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/templates/professional.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/pdf/tool_ops.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/assistant_backends.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/async_bridge.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/config.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/datetime.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/i18n/en.json +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/i18n/it.json +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/renderer.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/sender.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/styles.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/base.html +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/base.txt +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/batch/riepilogo_batch.html +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/batch/riepilogo_batch.txt +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/invio_fattura.html +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/invio_fattura.txt +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_attestazione.html +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_attestazione.txt +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_consegna.html +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_consegna.txt +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_esito_accettata.html +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_esito_accettata.txt +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_esito_rifiutata.html +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_esito_rifiutata.txt +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_mancata_consegna.html +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_mancata_consegna.txt +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_scarto.html +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/sdi/notifica_scarto.txt +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/test/test_email.html +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/email/templates/test/test_email.txt +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/extras.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/logging.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/metrics.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/rate_limiter.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/retry.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/security.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/platform/validators.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/py.typed +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/application/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/application/invoice_sdi_ops.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/application/signature_ops.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/application/tool_ops.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/digital_signature/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/digital_signature/certificate_manager.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/digital_signature/signer.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/digital_signature/verifier.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/notifiche/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/notifiche/parser.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/notifiche/processor.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/pec_sender/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/pec_sender/sender.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/schemas/FatturaPA_v1.2.2.xsd +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/schemas/README.md +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/schemas/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/schemas/xmldsig-core-schema.xsd +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/validator/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/validator/xsd_validator.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/xml_builder/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/sdi/xml_builder/fatturapa.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/storage/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/storage/database/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/storage/database/base.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/storage/database/models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/openfatture/storage/session.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/pyproject.toml +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/cache/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/cache/test_cached_provider.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/cache/test_lru_cache.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/conftest.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/domain/test_message.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/domain/test_prompt.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/feedback/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/feedback/test_feedback_service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/conftest.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/test_embeddings_performance.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/test_indexing_performance.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/test_retrieval_performance.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/performance/test_vector_store_performance.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/test_auto_update.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/test_embeddings.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/test_reindex_queue_honesty.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/rag/test_vector_store.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/session/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/session/test_factory.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/session/test_file_store.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/streaming/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/streaming/test_accumulator.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/streaming/test_events.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_anthropic_integration.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_assistant_backend_parity.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_assistant_runtime.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_cache_config.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_cash_flow_predictor_training.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_confirmation_gate.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_invoice_assistant_integration.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_invoice_assistant_unit.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_invoice_creation_workflow.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_invoice_workflows.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_native_tool_calling.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_ollama_integration.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_openai_integration.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_orchestration_states.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_property_based.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_react_e2e_ollama.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_react_orchestration.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_react_orchestration_integration.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_runtime_completion.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_streaming.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tax_advisor_integration.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_token_counter.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tool_confirmation.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tool_loop_graph.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tool_loop_parity.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tool_retry_policy.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_circuit_breaker.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_client.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_knowledge.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_payment_import.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/ai/test_tools_registry_openai_format.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/billing/test_preventivo_service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/billing/test_preventivo_service_extended.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/acceptance/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/e2e/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/formatters/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/formatters/test_formatters.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/formatters/test_formatters_integration.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/formatters/test_formatters_performance.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/performance/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_assistant_presentation.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_assistant_pty.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_cliente_commands.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_config_commands.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_credential_presentation.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_fattura_commands.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_fattura_events.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_fresh_database_commands.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_init_commands.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_public_surface.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_slash_commands.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/test_status_readiness.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/cli/ui/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/conftest.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/events/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/events/test_analytics.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/events/test_event_bus.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/events/test_event_persistence.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/events/test_repository.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/fixtures/minimal_fatturapa.xml +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/hooks/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/hooks/test_executor.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/hooks/test_integration.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/hooks/test_registry.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/i18n/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/i18n/test_basic.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/i18n/test_cli_translations.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/performance/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/performance/conftest.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/performance/test_e2e_performance.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/test_invoice_workflow.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/test_nota_credito_workflow.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/integration/test_preventivo_conversion.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/fake_listeners.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/notifications/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/notifications/test_notifier.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/notifications/test_notifier_autoescape.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/test_matching_service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/test_payment_overview.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/test_reconciliation_service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/test_reminder_scheduler.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/services/test_transaction_insight_service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/application/test_event_listeners.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/conftest.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/domain/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/domain/test_enums.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/domain/test_models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/domain/test_value_objects.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/fixtures/intesa_sanpaolo_sample.csv +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/fixtures/revolut_sample.csv +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/fixtures/sample_statement.ofx +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/fixtures/sample_statement.qif +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/fixtures/unicredit_sample.csv +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_base_importer_unit.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_csv_importer.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_csv_importer_unit.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_importer_factory_unit.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_ofx_importer.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_ofx_importer_unit.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/infrastructure/importers/test_qif_importer.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_composite_matcher.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_composite_matcher_benchmark.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_date_window_matcher.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_exact_matcher.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_fuzzy_matcher.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_fuzzy_matcher_performance.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_iban_matcher.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/matchers/test_iban_matcher_sepa.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/payment/test_integration_workflow.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/pdf/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/pdf/test_pdf_generator.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/pdf/test_pdf_improvements.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/pdf/test_preventivo_pdf_generator.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/pdf/test_single_row_invoice_page_count.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/performance/README.md +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/performance/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/performance/fixtures.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/performance/report_generator.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/performance/utils.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/test_async_bridge.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/test_config.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/test_retry.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/test_ssot.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/platform/test_validators.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/conftest.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/performance/__init__.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/performance/conftest.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/performance/test_database_performance.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/test_models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/storage/test_session.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_ai_agent_models.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_ai_invoice_assistant.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_ai_tax_advisor.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_batch_operations.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_batch_processor.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_billing_application_queries.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_bollo_assolto_virtuale.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_core_boundaries.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_data_emissione_independent.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_digital_signature.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_email_templates.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_extras.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_invoice_service.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_issued_elsewhere_flag.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_line_helpers.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_logging.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_payment_terms_immediate.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_pdf_dati_riepilogo.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_pec_sender.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_rate_limiter.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_sdi_notifiche.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_security.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_validators_hypothesis.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_xml_builder.py +0 -0
- {openfatture-2.4.0 → openfatture-2.4.2}/tests/unit/test_xml_xsd_validation.py +0 -0
- {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
|
+
[](https://github.com/gianlucamazza/openfatture/actions/workflows/test.yml)
|
|
116
|
+
[](pyproject.toml)
|
|
117
|
+
[](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
|
+
[](https://github.com/gianlucamazza/openfatture/actions/workflows/test.yml)
|
|
10
|
+
[](pyproject.toml)
|
|
11
|
+
[](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).
|
|
@@ -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":
|
|
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",
|