From ed1ac4266c2a179d270c4552c442532f3d0d8042 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 9 Jun 2026 23:26:35 +0200 Subject: [PATCH] Fase 2: Template engine, DAO, editor visual, plantillas y motor de exportacion PDF/XLSX/DOCX --- README.md | 15 ++ data/sqltable.h | 23 ++- src/dao/templatedao.cpp | 152 +++++++++++++++ src/dao/templatedao.h | 44 +++++ src/dao/templateengine.cpp | 265 +++++++++++++++++++++++++++ src/dao/templateengine.h | 35 ++++ src/gui/forms/formtemplateeditor.cpp | 93 ++++++++++ src/gui/forms/formtemplateeditor.h | 34 ++++ src/gui/forms/formtemplatelist.cpp | 92 ++++++++++ src/gui/forms/formtemplatelist.h | 30 +++ templates/budget_standard.json | 75 ++++++++ templates/invoice_standard.json | 52 ++++++ 12 files changed, 908 insertions(+), 2 deletions(-) create mode 100644 src/dao/templatedao.cpp create mode 100644 src/dao/templatedao.h create mode 100644 src/dao/templateengine.cpp create mode 100644 src/dao/templateengine.h create mode 100644 src/gui/forms/formtemplateeditor.cpp create mode 100644 src/gui/forms/formtemplateeditor.h create mode 100644 src/gui/forms/formtemplatelist.cpp create mode 100644 src/gui/forms/formtemplatelist.h create mode 100644 templates/budget_standard.json create mode 100644 templates/invoice_standard.json diff --git a/README.md b/README.md index ab7f0c7..bf819c5 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ BudgetPro is a desktop application designed for managing company finances, budge - **Invoice Tracking**: Manage incoming and outgoing invoices - **Data Visualization**: Tree views for hierarchical financial data - **Custom Editors**: Specialized delegates for different data types (combobox, rich text, etc.) +- **Template Editor**: Visual template designer for document export +- **Document Export**: Export documents as PDF, XLSX, and DOCX with configurable templates ## Technical Stack @@ -36,6 +38,15 @@ BudgetPro/ ├── widget/ # Custom widgets and delegates ├── utils/ # Utility classes and helpers ├── data/ # Data access layer (sqltable.h) +├── templates/ # Document export templates (JSON) +├── src/ +│ ├── dao/ # Data Access Objects +│ │ ├── templatedao.h/cpp # Template CRUD operations +│ │ └── templateengine.h/cpp # Export engine (PDF/XLSX/DOCX) +│ └── gui/ +│ └── forms/ +│ ├── formtemplateeditor.h/cpp # Visual template editor +│ └── formtemplatelist.h/cpp # Template list manager └── resources/ # Qt resource file (icons, stylesheets, etc.) ``` @@ -80,6 +91,10 @@ BudgetPro includes several custom Qt components: - Item numbering in hierarchical views - Popup tables for complex selection - `TreeModel`: Custom model for tree-structured data +- `TemplateEngine`: Document export engine supporting PDF, XLSX, DOCX +- `TemplateDAO`: Data access for document templates +- `formTemplateEditor`: Visual template designer +- `formTemplateList`: Template list management - `AvatarWidget`: For displaying user/entity avatars ## Extending the Application diff --git a/data/sqltable.h b/data/sqltable.h index 8f1bc92..60885dc 100644 --- a/data/sqltable.h +++ b/data/sqltable.h @@ -539,10 +539,29 @@ const QString tContact = "CREATE TABLE CONTACT (" +//----------------------- TEMPLATE ----------------------------------------- +const QString tTemplate = "CREATE TABLE TEMPLATE (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " + "NAME VARCHAR(100) NOT NULL, " + "DESCRIPTION VARCHAR(500), " + "DOCUMENT_TYPE VARCHAR(20) NOT NULL, " + "WIDTH_MM FLOAT DEFAULT 210, " + "HEIGHT_MM FLOAT DEFAULT 297, " + "MARGIN_TOP FLOAT DEFAULT 20, " + "MARGIN_BOTTOM FLOAT DEFAULT 20, " + "MARGIN_LEFT FLOAT DEFAULT 20, " + "MARGIN_RIGHT FLOAT DEFAULT 20, " + "CONTENT TEXT, " + "IS_DEFAULT BOOLEAN DEFAULT 0, " + "CREATEDBY VARCHAR(100), " + "CREATEDAT DATETIME DEFAULT CURRENT_TIMESTAMP, " + "UPDATEDAT DATETIME DEFAULT CURRENT_TIMESTAMP" + ");"; + const QStringList dbTables = {tDBInfo, tEmpresaInfo, tThird, tElemento, tElemComp, tUnidad, tPropuestaVenta, tDataPropuestaVenta, - tDocVenta, tDataDocVenta, tDocCompra, tDataDocCompra, tContact}; + tDocVenta, tDataDocVenta, tDocCompra, tDataDocCompra, tContact, tTemplate}; const QStringList dbTableNames = {"DBINFO", "ENTERPRISESINFO", "THIRD", "ELEMENT", "ELEMENTCOMPOSITION", "UNIT", "SALEPROPOSAL", "SALEPROPOSALDATA", - "SALEDOCUMENT", "SALEDOCUMENTDATA", "BUYDOCUMENT", "BUYDOCUMENTDATA", "CONTACT"}; + "SALEDOCUMENT", "SALEDOCUMENTDATA", "BUYDOCUMENT", "BUYDOCUMENTDATA", "CONTACT", "TEMPLATE"}; #endif // SQLTABLE_H diff --git a/src/dao/templatedao.cpp b/src/dao/templatedao.cpp new file mode 100644 index 0000000..cded23a --- /dev/null +++ b/src/dao/templatedao.cpp @@ -0,0 +1,152 @@ +#include "templatedao.h" +#include "../../data/sqltable.h" + +bool TemplateDAO::create(Template &tpl) +{ + QSqlQuery query; + query.prepare( + "INSERT INTO TEMPLATE (" + "NAME, DESCRIPTION, DOCUMENT_TYPE, WIDTH_MM, HEIGHT_MM, " + "MARGIN_TOP, MARGIN_BOTTOM, MARGIN_LEFT, MARGIN_RIGHT, CONTENT, IS_DEFAULT, CREATEDBY" + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" + ); + query.addBindValue(tpl.name); + query.addBindValue(tpl.description); + query.addBindValue(tpl.documentType); + query.addBindValue(tpl.widthMM); + query.addBindValue(tpl.heightMM); + query.addBindValue(tpl.marginTop); + query.addBindValue(tpl.marginBottom); + query.addBindValue(tpl.marginLeft); + query.addBindValue(tpl.marginRight); + query.addBindValue(tpl.content); + query.addBindValue(tpl.isDefault ? 1 : 0); + query.addBindValue(tpl.createdBy); + + if (!query.exec()) { + qWarning() << "TemplateDAO::create - Error:" << query.lastError().text(); + return false; + } + tpl.id = query.lastInsertId().toInt(); + return true; +} + +QVector