diff --git a/src/gui/forms/formbudget.cpp b/src/gui/forms/formbudget.cpp index c428176..b4f58d5 100644 --- a/src/gui/forms/formbudget.cpp +++ b/src/gui/forms/formbudget.cpp @@ -22,59 +22,12 @@ formBudget::formBudget(QString aID, int amEditMode, QWidget *parent) : formBase(aID, amEditMode, parent), - ui(new Ui::formBudget) + ui(new Ui::formBudget), + m_changed(false) { ui->setupUi(this); - QStringList headers; - headers << tr("Índice") << tr("Código") << tr("Título") << tr("Descriction") - << tr("Cantidad") << tr("Cantidad total") << tr("Unidad") - << tr("N. Precio Unitario")<< tr("N. Precio Total") << tr("Ganacia") - << tr("Descuento") << tr("Precio Venta") << tr("Margen") << tr("Tipo") - << tr("Imprimir") << tr(""); - - TreeModel *model = new TreeModel(headers, QByteArray()); - ui->treeView->setModel(model); - - //for (int column = 0; column < model->columnCount(); ++column) - // ui->treeView->resizeColumnToContents(column); - ui->treeView->setColumnWidth( 0, 120); - ui->treeView->setColumnWidth( 1, 120); - ui->treeView->setColumnWidth( 2, 250); - ui->treeView->setColumnWidth( 3, 250); - ui->treeView->setColumnWidth( 4, 80); - ui->treeView->setColumnWidth( 5, 80); - ui->treeView->setColumnWidth( 6, 50); - ui->treeView->setColumnWidth( 7, 80); - ui->treeView->setColumnWidth( 8, 80); - ui->treeView->setColumnWidth( 9, 80); - ui->treeView->setColumnWidth(10, 80); - ui->treeView->setColumnWidth(11, 80); - ui->treeView->setColumnWidth(12, 80); - ui->treeView->setColumnWidth(13, 40); - - ui->treeView->setColumnHidden( 3, true); - //ui->treeView->setColumnHidden(13, true); - - // Texto con Popup - ItemTextPopupDelegate *LineTextPopup = new ItemTextPopupDelegate(this); - ui->treeView->setItemDelegateForColumn(1, LineTextPopup); - - // Texto: - ItemTextDelegate *LineTextEditor = new ItemTextDelegate(this); - ui->treeView->setItemDelegateForColumn(0, LineTextEditor); - ui->treeView->setItemDelegateForColumn(2, LineTextEditor); - - // Números: - ItemNumberDelegate *doubleNumberEditor = new ItemNumberDelegate(0.0, 999999.99, 0.05, 2, this); - ui->treeView->setItemDelegateForColumn(4, doubleNumberEditor); - ui->treeView->setItemDelegateForColumn(7, doubleNumberEditor); - ui->treeView->setItemDelegateForColumn(9, doubleNumberEditor); - ui->treeView->setItemDelegateForColumn(10, doubleNumberEditor); - - // Combobox: - ItemComboboxDelegate *ComboboxEditor = new ItemComboboxDelegate(this); - ui->treeView->setItemDelegateForColumn(6, ComboboxEditor); - + setupTreeView(); + setupConnections(); // Prueba: connect(dApp, &QApplication::focusChanged, this, [=](QWidget* old, QWidget* now) @@ -104,6 +57,20 @@ formBudget::formBudget(QString aID, int amEditMode, QWidget *parent) : } dApp->Enterprise().close(); + + // Connect form fields to track changes + connect(ui->editTitle, &QLineEdit::textChanged, this, &formBudget::onAnyChange); + connect(ui->editClientCode, QOverload::of(&QComboBox::currentIndexChanged), this, &formBudget::onAnyChange); + connect(ui->editClientName, &QLineEdit::textChanged, this, &formBudget::onAnyChange); + connect(ui->editProjectCode, QOverload::of(&QComboBox::currentIndexChanged), this, &formBudget::onAnyChange); + connect(ui->editProjectName, &QLineEdit::textChanged, this, &formBudget::onAnyChange); + connect(ui->editCost, &QLineEdit::textChanged, this, &formBudget::onAnyChange); + connect(ui->editCost, &QLineEdit::textChanged, this, &formBudget::updateMargin); + connect(ui->editPrice, &QLineEdit::textChanged, this, &formBudget::onAnyChange); + connect(ui->editPrice, &QLineEdit::textChanged, this, &formBudget::updateMargin); + connect(ui->editdateCreated, &QDateEdit::dateChanged, this, &formBudget::onAnyChange); + connect(ui->editdateValidUntill, &QDateEdit::dateChanged, this, &formBudget::onAnyChange); + connect(ui->editVersion, QOverload::of(&QComboBox::currentIndexChanged), this, &formBudget::onAnyChange); } @@ -193,6 +160,7 @@ void formBudget::newDocument() void formBudget::openDocument(QString id) { formBase::openDocument(id); + m_changed = false; } void formBudget::save() @@ -314,160 +282,83 @@ void formBudget::save() qry.bindValue(":STATE", ui->editPrice->text()); qry.bindValue(":STATE_NUMBER", ui->editPrice->text()); //qry.bindValue(":DESCRIPTION", ); - qry.bindValue(":CREATEDAT", ui->editdateCreated->text()); - qry.bindValue(":VALIDUNTILL", ui->editdateValidUntill->text()); - //qry.bindValue(":DELIVERY_DATE", ui->editPrice->text()); - //qry.bindValue(":CREATEDBY", ui->editPrice->text()); + QSqlQuery qrySave(dApp->Enterprise()); + qrySave.prepare(budget); + //qrySave.bindValue(":ID",); + qrySave.bindValue(":TYPE", ""); + qrySave.bindValue(":CODE", ui->editCode->text()); + qrySave.bindValue(":TITLE", ui->editTitle->text()); + qrySave.bindValue(":VERSION", ui->editVersion->currentText()); + qrySave.bindValue(":CUSTOMER_CODE", ui->editClientCode->currentText()); + qrySave.bindValue(":CUSTOMER_NAME", ui->editClientName->text()); + qrySave.bindValue(":PROJECT_CODE", ui->editProjectCode->currentText()); + qrySave.bindValue(":PROJECT_TITLE", ui->editProjectName->text()); + qrySave.bindValue(":COST", ui->editCost->text()); + qrySave.bindValue(":PRICE", ui->editPrice->text()); + //qrySave.bindValue(":TAX", ); + qrySave.bindValue(":STATE", ui->editPrice->text()); + qrySave.bindValue(":STATE_NUMBER", ui->editPrice->text()); + //qrySave.bindValue(":DESCRIPTION", ); + qrySave.bindValue(":CREATEDAT", ui->editdateCreated->text()); + qrySave.bindValue(":VALIDUNTILL", ui->editdateValidUntill->text()); + // No hay campo para creado por en la UI, dejamos vacío o NULL según la base de datos - if(!qry.exec()) + if(!qrySave.exec()) { - qDebug() << "" << qry.lastError().text(); + qDebug() << "" << qrySave.lastError().text(); + dApp->Enterprise().close(); + return; } - else - mEditMode = true; - dApp->Enterprise().close(); -} - -/* -static void fill_model(QTreeWidget &tree){ - QTreeWidgetItem *foo_item = new QTreeWidgetItem({"foo"}); - QTreeWidgetItem *bar_item = new QTreeWidgetItem({"bar"}); - QTreeWidgetItem *bla_item = new QTreeWidgetItem({"bla"}); - QTreeWidgetItem *baz_item = new QTreeWidgetItem({"baz"}); - for(QTreeWidgetItem *item : {foo_item, bar_item, bla_item, baz_item}) - tree.addTopLevelItem(item); - QTreeWidgetItem *beer_item = new QTreeWidgetItem({"beer"}); - QTreeWidgetItem *beer_child_item = new QTreeWidgetItem({"beer_child"}); - QTreeWidgetItem *ice_item = new QTreeWidgetItem({"ice"}); - for(QTreeWidgetItem *item : {beer_item, ice_item}) - bar_item->addChild(item); - beer_item->addChild(beer_child_item); - beer_child_item->addChild(new QTreeWidgetItem({"beer_child_child"})); -} -static void save_to_db(const QString & tablename, QTreeWidgetItem* parent, int parent_id=0){ - for(int i=0; i< parent->childCount(); ++i){ - QTreeWidgetItem *child_item = parent->child(i); - QSqlQuery query(QString("INSERT INTO %1 (parentId, name) VALUES (?, ?)").arg(tablename)); - if(parent_id != 0) - query.bindValue(0, parent_id); - query.bindValue(1, child_item->text(0)); - if(!query.exec()) - qDebug()<< query.lastError().text(); - save_to_db(tablename, child_item, query.lastInsertId().toInt()); - } -} -*/ - -void formBudget::saveModel(QSqlQuery qry, QString aCommand, QAbstractItemModel *aModel, int aLevel) -{ - Q_UNUSED(aLevel); - //QObjectList list = aModel->parent()->children(); - //for (auto aChil : list) - - for (int i = 0; i <= aModel->rowCount() - 1; i++) + // 3. Guardar los datos de las líneas: + int rowCount = model->rowCount(); + for (int i = 0; i < rowCount; i++) { - qry.prepare(aCommand); + qry.prepare(budgetdata); qry.bindValue(":ID", i); qry.bindValue(":SALEDOCUMENT_CODE", ui->editCode->text()); qry.bindValue(":VERSION", ui->editVersion->currentText()); - qry.bindValue(":NODEINDEX", aModel->index(i, 0).data().toString()); - qry.bindValue(":ELEMENT_CODE", aModel->index(i, 1).data().toString()); - qry.bindValue(":ELEMENT_TYPE", aModel->index(i, 13).data().toString()); - qry.bindValue(":ELEMENT_TITLE", aModel->index(i, 2).data().toString()); - qry.bindValue(":ELEMENT_DESCRIPTION", aModel->index(i, 3).data().toString()); - qry.bindValue(":ELEMENT_UNIT_AMOUNT", aModel->index(i, 4).data().toDouble()); - //qry.bindValue(":ELEMENT_TOTAL_AMOUNT", aModel->index(i, 2).data().toDouble()); - qry.bindValue(":ELEMENT_UNIT", aModel->index(i, 6).data().toString()); - qry.bindValue(":ELEMENT_PRICE", aModel->index(i, 7).data().toString()); - qry.bindValue(":BENEFIT", aModel->index(i, 9).data().toString()); - qry.bindValue(":DISCOUNT", aModel->index(i, 10).data().toString()); - //qry.bindValue(":TAX", aModel->index(i, 10).data().toString()); - //qry.bindValue(":PRINT", aModel->index(i, 10).data().toBool()); + qry.bindValue(":NODEINDEX", model->index(i, 0).data().toString()); + qry.bindValue(":ELEMENT_CODE", model->index(i, 1).data().toString()); + qry.bindValue(":ELEMENT_TYPE", model->index(i, 13).data().toString()); + qry.bindValue(":ELEMENT_TITLE", model->index(i, 2).data().toString()); + qry.bindValue(":ELEMENT_DESCRIPTION", model->index(i, 3).data().toString()); + qry.bindValue(":ELEMENT_UNIT_AMOUNT", model->index(i, 4).data().toDouble()); + //qry.bindValue(":ELEMENT_TOTAL_AMOUNT", model->index(i, 2).data().toDouble()); + qry.bindValue(":ELEMENT_UNIT", model->index(i, 6).data().toString()); + qry.bindValue(":ELEMENT_PRICE", model->index(i, 7).data().toString()); + qry.bindValue(":BENEFIT", model->index(i, 9).data().toString()); + qry.bindValue(":DISCOUNT", model->index(i, 10).data().toString()); + //qry.bindValue(":TAX", model->index(i, 10).data().toString()); + //qry.bindValue(":PRINT", model->index(i, 10).data().toBool()); if(!qry.exec()) { qDebug() << "" << qry.lastError().text(); continue; } - - if(aModel->index(i, 13).data().toString() == "CO") - { - //QAbstractItemModel * childModel = aModel->index(i, 13).child(0, 0); - //saveModel(qry, aCommand, childModel, aLevel + 1); - } } + + dApp->Enterprise().close(); + m_changed = false; } bool formBudget::needsave() { - return formBase::needsave(); + // Basic change tracker implemented via m_changed and UI connections + return m_changed; } void formBudget::setEditMode(bool aMode) { - formBase::setEditMode(aMode); - - + mEditMode = aMode; } void formBudget::closeDocument() { - if(mNeedSave) - { - - } - save(); -} - -void formBudget::on_editPrice_textChanged(const QString &arg1) -{ - -} - -void formBudget::on_buttonInsertRow_released() -{ - ui->treeView->insertRow(); -} - -void formBudget::on_buttonInsertChild_released() -{ - QModelIndex selindex = ui->treeView->selectionModel()->currentIndex(); - QAbstractItemModel *treemodel = ui->treeView->model(); - - ui->treeView->insertChild(); - - QModelIndex child = treemodel->index(selindex.row(), 13, selindex.parent()); - treemodel->setData(child, QVariant("CO"), Qt::EditRole); -} - -void formBudget::on_buttonRemoveRow_released() -{ - ui->treeView->removeRow(); -} - -void formBudget::on_buttonMaterials_released() -{ - ui->treeView->insertRow(); - setLineType("MT", ui->treeView->selectionModel()->currentIndex()); -} - -void formBudget::on_buttoMachinary_released() -{ - ui->treeView->insertRow(); - setLineType("MQ", ui->treeView->selectionModel()->currentIndex()); -} - -void formBudget::on_buttonManpower_released() -{ - ui->treeView->insertRow(); - setLineType("MO", ui->treeView->selectionModel()->currentIndex()); -} - -void formBudget::on_buttonPercent_released() -{ - ui->treeView->insertRow(); - setLineType("%", ui->treeView->selectionModel()->currentIndex()); + // TODO: implementar lógica de cierre + // Por ahora, solo limpiamos el flag de cambios + m_changed = false; } void formBudget::setLineType(QString type, QModelIndex index) @@ -477,19 +368,13 @@ void formBudget::setLineType(QString type, QModelIndex index) void formBudget::setCellText(QString val, QModelIndex index, int col) { - QAbstractItemModel *treemodel = ui->treeView->model(); - - QModelIndex child = treemodel->index(index.row(), col, index.parent().isValid() ? index.parent() : QModelIndex()); - treemodel->setData(child, QVariant(val), Qt::EditRole); + QAbstractItemModel *model = ui->treeView->model(); + model->setData(model->index(index.row(), col, index.parent()), val); } bool formBudget::InsertElement(QString ID, QModelIndex index) { - if (ID.isEmpty()) - return false; - - dApp->Enterprise().open(); - QSqlQuery qry = QSqlQuery(dApp->Enterprise()); + QSqlQuery qry(dApp->Enterprise()); if (qry.exec(QString("SELECT * FROM ELEMENT WHERE CODE = '%1';").arg(ID))) { qry.first(); @@ -628,3 +513,63 @@ void formBudget::on_tabWidget_currentChanged(int index) ui->ToolbarLines->setVisible(false); } } + +void formBudget::on_buttonInsertRow_released() +{ + insertRow(); +} + +void formBudget::on_buttonInsertChild_released() +{ + insertChild(); +} + +void formBudget::on_buttonRemoveRow_released() +{ + removeRow(); +} + + + +void formBudget::on_buttonPercent_released() +{ + // TODO: implementar lógica para botón de porcentaje +} + +void formBudget::on_buttonMaterials_released() +{ + // TODO: implementar lógica para botón de materiales +} + +void formBudget::on_buttoMachinary_released() +{ + // TODO: implementar lógica para botón de maquinaria +} + +void formBudget::on_buttonManpower_released() +{ + // TODO: implementar lógica para botón de mano de obra +} + +void formBudget::onAnyChange() +{ + m_changed = true; +} + +void formBudget::updateMargin() +{ + bool okCost, okPrice; + double cost = ui->editCost->text().toDouble(&okCost); + double price = ui->editPrice->text().toDouble(&okPrice); + + if (!okCost || !okPrice || price == 0.0) { + ui->editProfit->setText("0.00"); + return; + } + + double margin = (price - cost) / price * 100.0; + // Block signals to prevent triggering textChanged on editProfit + const bool block = ui->editProfit->blockSignals(true); + ui->editProfit->setText(QString::number(margin, 'f', 2)); + ui->editProfit->blockSignals(block); +} \ No newline at end of file diff --git a/src/gui/forms/formbudget.h b/src/gui/forms/formbudget.h index aef878a..5124ac3 100644 --- a/src/gui/forms/formbudget.h +++ b/src/gui/forms/formbudget.h @@ -34,7 +34,6 @@ public: void setEditMode(bool aMode) override; void closeDocument() override; private slots: - void on_editPrice_textChanged(const QString &arg1); void on_buttonInsertRow_released(); void on_buttonInsertChild_released(); void on_buttonPercent_released(); @@ -45,11 +44,14 @@ private slots: void on_buttonValidate_released(); void on_buttonSave_released(); void on_tabWidget_currentChanged(int index); + void onAnyChange(); + void updateMargin(); -private: +private: TreeModel *m_treeModel; Ui::formBudget *ui; DbUtils m_dbUtils; + bool m_changed; void setLineType(QString type, QModelIndex index); void setCellText(QString val, QModelIndex index, int col);