2026-05-24 23:21:33 +02:00
# include "formproduct.h"
# include "ui_formproduct.h"
# include "mapplication.h"
# include "treemodelcomposeelement.h"
# include "itemnumberdelegate.h"
# include "itemtextdelegate.h"
# include "itemtextpopupdelegate.h"
# include "itemcomboboxdelegate.h"
# include "QtSql"
formProduct : : formProduct ( QString aID , int aEditMode , QWidget * parent ) :
formBase ( aID , aEditMode , parent ) ,
ui ( new Ui : : formProduct ) ,
editMode ( false )
{
ui - > setupUi ( this ) ;
ui - > editDischargeDate - > setDate ( QDate : : currentDate ( ) ) ;
ui - > editUpdateDate - > setDate ( QDate : : currentDate ( ) ) ;
QStringList headers ;
headers < < tr ( " Código " ) //Código del elemento (editable)
< < tr ( " Título " ) //Título del elemento (NO editable)
< < tr ( " Cantidad " ) //Cantidad del elemento (editable)
< < tr ( " Cantidad total " ) //Cantidad total del elemento (NO editable)
< < tr ( " Unidad " ) //Unidad del elemento (editable)
< < tr ( " N. Precio Unitario " ) //Precio unitario del elemento (editable)
< < tr ( " N. Precio Total " ) //Precio total del elemento (NO editable)
< < tr ( " Tipo " )
< < ( " " ) ;
TreeModelComposeElement * model = new TreeModelComposeElement ( headers , QByteArray ( ) ) ;
ui - > treeView - > setModel ( model ) ;
// Texto con Popup
ItemTextPopupDelegate * LineTextPopup = new ItemTextPopupDelegate ( this ) ;
ui - > treeView - > setItemDelegateForColumn ( 0 , 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 ( 2 , doubleNumberEditor ) ;
// Combobox:
//ItemComboboxDelegate *ComboboxEditor = new ItemComboboxDelegate(this);
//ui->treeView->setItemDelegateForColumn(6, ComboboxEditor);
connect ( model , & TreeModelComposeElement : : dataChanged , this , & formProduct : : on_ModelSetData ) ;
ui - > treeView - > setColumnWidth ( 0 , 150 ) ;
ui - > treeView - > setColumnWidth ( 1 , 250 ) ;
ui - > treeView - > setColumnWidth ( 2 , 80 ) ;
ui - > treeView - > setColumnWidth ( 3 , 80 ) ;
ui - > treeView - > setColumnWidth ( 4 , 50 ) ;
ui - > treeView - > setColumnWidth ( 5 , 80 ) ;
ui - > treeView - > setColumnWidth ( 6 , 80 ) ;
//Arg1: the number
//Arg2: how many 0 you want?
//Arg3: The base (10 - decimal, 16 hexadecimal - if you don't understand, choose 10)
// It seems like only decimal can support negative numbers.
ui - > editCode - > setText ( QString ( " EL%1 " ) . arg ( 2 , 10 , 10 , QChar ( ' 0 ' ) ) ) ;
// Unidades:
dApp - > Enterprise ( ) . open ( ) ;
QSqlQueryModel * unitModel = new QSqlQueryModel ( this ) ;
unitModel - > setQuery ( " SELECT * FROM UNIT " , dApp - > Enterprise ( ) ) ;
//ui->comboUnit->setModel(unitModel);
QTableView * tableView = new QTableView ( this ) ;
QHeaderView * header = tableView - > verticalHeader ( ) ;
header - > setDefaultSectionSize ( 20 ) ; // 20 px height
header - > sectionResizeMode ( QHeaderView : : Fixed ) ;
tableView - > setModel ( unitModel ) ;
tableView - > verticalHeader ( ) - > setVisible ( false ) ;
tableView - > horizontalHeader ( ) - > setVisible ( false ) ;
tableView - > setColumnWidth ( 0 , 60 ) ;
tableView - > setColumnWidth ( 1 , 160 ) ;
tableView - > setHorizontalScrollBarPolicy ( Qt : : ScrollBarAsNeeded ) ;
tableView - > setSelectionBehavior ( QAbstractItemView : : SelectRows ) ;
tableView - > setAutoScroll ( false ) ;
ui - > comboUnit - > setModel ( unitModel ) ;
ui - > comboUnit - > setView ( tableView ) ;
ui - > comboUnit - > view ( ) - > setMinimumWidth ( 220 ) ;
dApp - > Enterprise ( ) . close ( ) ;
}
formProduct : : ~ formProduct ( )
{
delete ui ;
}
void formProduct : : openDocument ( QString id )
{
setEditMode ( ) ;
ui - > editCode - > setText ( id ) ;
ui - > editCode - > setReadOnly ( true ) ;
ui - > treeView - > model ( ) - > removeRows ( 0 , ui - > treeView - > model ( ) - > rowCount ( ) ) ;
dApp - > Enterprise ( ) . open ( ) ;
QSqlQuery qry = QSqlQuery ( dApp - > Enterprise ( ) ) ;
if ( qry . exec ( QString ( " SELECT * FROM ELEMENT WHERE CODE = '%1'; " ) . arg ( id ) ) )
{
qry . first ( ) ;
ui - > comboType1 - > setCurrentIndex ( qry . value ( qry . record ( ) . indexOf ( " TYPE1 " ) ) . toInt ( ) ) ;
ui - > comboType2 - > setCurrentIndex ( qry . value ( qry . record ( ) . indexOf ( " TYPE2 " ) ) . toInt ( ) ) ;
ui - > editTitle - > setText ( qry . value ( qry . record ( ) . indexOf ( " TITLE " ) ) . toString ( ) ) ;
ui - > editDescription - > setHtml ( qry . value ( qry . record ( ) . indexOf ( " DESCRIPTION " ) ) . toString ( ) ) ;
//ui->editTitle->setText(qry.value(4).toString()); // FAMILY_ID
ui - > comboUnit - > setCurrentText ( qry . value ( qry . record ( ) . indexOf ( " UNIT_ID " ) ) . toString ( ) ) ; // UNIT_ID
ui - > editUpdateDate - > setDate ( qry . value ( qry . record ( ) . indexOf ( " DATE_UPDATE " ) ) . toDate ( ) ) ;
//ui->editDischargeDate->setDate(qry.value().toDate());
ui - > editPVP - > setValue ( qry . value ( qry . record ( ) . indexOf ( " REAL_PRICE " ) ) . toDouble ( ) ) ;
ui - > editDiscount - > setValue ( qry . value ( qry . record ( ) . indexOf ( " DISCOUNT " ) ) . toDouble ( ) ) ;
ui - > editPC - > setValue ( qry . value ( qry . record ( ) . indexOf ( " PURCHASE_PRICE " ) ) . toDouble ( ) ) ;
ui - > editMargin - > setValue ( qry . value ( qry . record ( ) . indexOf ( " BENEFIT " ) ) . toDouble ( ) ) ;
ui - > editPV - > setValue ( qry . value ( qry . record ( ) . indexOf ( " SALE_PRICE " ) ) . toDouble ( ) ) ;
ui - > comboIVA - > setCurrentText ( qry . value ( qry . record ( ) . indexOf ( " TAX " ) ) . toString ( ) ) ;
ui - > checkState - > setChecked ( qry . value ( qry . record ( ) . indexOf ( " STATE " ) ) . toBool ( ) ) ;
ui - > editWeight - > setValue ( qry . value ( qry . record ( ) . indexOf ( " WEIGHT " ) ) . toDouble ( ) ) ;
ui - > editHeight - > setValue ( qry . value ( qry . record ( ) . indexOf ( " HEIGHT " ) ) . toDouble ( ) ) ;
ui - > editWidth - > setValue ( qry . value ( qry . record ( ) . indexOf ( " WIDTH " ) ) . toDouble ( ) ) ;
ui - > editLength - > setValue ( qry . value ( qry . record ( ) . indexOf ( " LENGHT " ) ) . toDouble ( ) ) ;
if ( qry . value ( qry . record ( ) . indexOf ( " TYPE1 " ) ) . toInt ( ) = = 0 )
{
setComposeElement ( true ) ;
QList < QPair < QString , QString > > list ;
if ( qry . exec ( QString ( " SELECT * FROM ELEMENTCOMPOSITION WHERE CODE = '%1'; " ) . arg ( id ) ) )
{
while ( qry . next ( ) )
{
list . append ( qMakePair ( qry . value ( qry . record ( ) . indexOf ( " ELEMENT_CODE " ) ) . toString ( ) ,
qry . value ( qry . record ( ) . indexOf ( " ELEMENT_AMOUNT " ) ) . toString ( ) ) ) ;
}
int row = 0 ;
while ( row < list . size ( ) )
{
ui - > treeView - > addRow ( ) ;
QModelIndex index = ui - > treeView - > model ( ) - > index ( row , 0 ) ;
setCellText ( list . at ( row ) . first , index , 0 ) ; // CODE
setCellText ( list . at ( row ) . second , index , 2 ) ; // AMOUNT
row + + ;
}
ui - > treeView - > addRow ( ) ;
}
else
{
qDebug ( ) < < " Error ejecutando el query: " < < qry . lastError ( ) . text ( ) < < " \n " ;
}
}
else
{
setComposeElement ( false ) ;
}
}
else
{
qDebug ( ) < < " Error ejecutando el query: " < < qry . lastError ( ) . text ( ) < < " \n " ;
}
dApp - > Enterprise ( ) . close ( ) ;
}
void formProduct : : closeDocument ( )
{
close ( ) ;
}
void formProduct : : setEditMode ( )
{
editMode = true ;
ui - > editCode - > setReadOnly ( true ) ; // ->setEnabled(false);
}
void formProduct : : on_editPC_valueChanged ( double arg1 )
{
CalculatePrice ( ) ;
}
void formProduct : : on_editMargin_valueChanged ( double arg1 )
{
CalculatePrice ( ) ;
}
void formProduct : : on_editPV_valueChanged ( double arg1 )
{
}
void formProduct : : on_editPV_editingFinished ( )
{
double pc = ui - > editPC - > value ( ) ;
if ( pc = = 0 )
return ;
double ma ;
double pv = ui - > editPV - > value ( ) ;
ma = ( pv / pc - 1 ) * 100 ;
if ( ma ! = ui - > editMargin - > value ( ) )
ui - > editMargin - > setValue ( ma ) ;
}
void formProduct : : on_comboIVA_currentIndexChanged ( const QString & arg1 )
{
CalculatePrice ( ) ;
}
void formProduct : : CalculatePrice ( )
{
double pc = ui - > editPC - > value ( ) ;
double ma = ui - > editMargin - > value ( ) ;
QString ivatext = ui - > comboIVA - > currentText ( ) . replace ( " % " , " " ) ;
double iva = ivatext . toDouble ( ) ;
double pv = pc * ( 1 + ma / 100 ) ;
ui - > editPV - > setValue ( pv ) ;
ui - > editPVIVA - > setValue ( pv * ( 1 + iva / 100 ) ) ;
}
void formProduct : : save ( )
{
// INSERT
QString Element ;
QString ElementComp ;
if ( editMode = = false )
{
Element = " INSERT INTO ELEMENT ( "
" CODE, TYPE1, TYPE2, TITLE, DESCRIPTION, FAMILY_ID, UNIT_ID, "
" DATE_UPDATE, REAL_PRICE, DISCOUNT, PURCHASE_PRICE, BENEFIT, TAX, SALE_PRICE, "
" BARCODE, IMAGE, STATE, MANUFACTURER, GAMMA, "
" WEIGHT, HEIGHT, WIDTH, LENGHT "
" ) VALUES ( "
" :CODE, :TYPE1, :TYPE2, :TITLE, :DESCRIPTION, :FAMILY_ID, :UNIT_ID, "
" :DATE_UPDATE, :REAL_PRICE, :DISCOUNT, :PURCHASE_PRICE, :BENEFIT, :TAX, :SALE_PRICE, "
" :BARCODE, :IMAGE, :STATE, :MANUFACTURER, :GAMMA, "
" :WEIGHT, :HEIGHT, :WIDTH, :LENGHT "
" ); " ;
ElementComp = " INSERT INTO ELEMENTCOMPOSITION ( "
" CODE, ELEMENT_CODE, ELEMENT_AMOUNT "
" ) VALUES ( "
" :CODE, :ELEMENT_CODE, :ELEMENT_AMOUNT "
" ); " ;
}
// UPDATE
else
{
Element = " UPDATE ELEMENT SET "
" TYPE1 = :TYPE1, TYPE2 = :TYPE2, TITLE = :TITLE, DESCRIPTION = :DESCRIPTION, FAMILY_ID = :FAMILY_ID, "
" UNIT_ID = :UNIT_ID, DATE_UPDATE = :DATE_UPDATE, REAL_PRICE = :REAL_PRICE, DISCOUNT = :DISCOUNT, "
" PURCHASE_PRICE = :PURCHASE_PRICE, BENEFIT = :BENEFIT, TAX = :TAX, SALE_PRICE = :SALE_PRICE, BARCODE = :BARCODE, IMAGE = :IMAGE, "
" STATE = :STATE, MANUFACTURER = :MANUFACTURER, GAMMA = :GAMMA, WEIGHT = :WEIGHT, HEIGHT = :HEIGHT, "
" WIDTH = :WIDTH, LENGHT = :LENGHT "
" WHERE CODE = :CODE "
" ; " ;
ElementComp = " UPDATE ELEMENTCOMPOSITION SET "
2026-05-27 12:22:25 +02:00
" ELEMENT_AMOUNT = :ELEMENT_AMOUNT "
" WHERE CODE = :CODE AND ELEMENT_CODE = :ELEMENT_CODE " ;
2026-05-24 23:21:33 +02:00
}
dApp - > Enterprise ( ) . open ( ) ;
QSqlQuery qry = QSqlQuery ( dApp - > Enterprise ( ) ) ;
// 1. Si es compuesto crear la lista de elementos que lo componen:
if ( ui - > comboType1 - > currentIndex ( ) = = 0 )
{
QAbstractItemModel * model = ui - > treeView - > model ( ) ;
for ( int i = 0 ; i < model - > rowCount ( ) ; i + + )
{
// Obtiene los datos de la primera columna
QString elementCode = model - > index ( i , 0 ) . data ( ) . toString ( ) ;
// Verifica si los datos son válidos
if ( elementCode . isEmpty ( ) )
continue ;
qry . prepare ( ElementComp ) ;
qry . bindValue ( " :CODE " , ui - > editCode - > text ( ) ) ;
qry . bindValue ( " :ELEMENT_CODE " , elementCode ) ;
qry . bindValue ( " :ELEMENT_AMOUNT " , model - > index ( i , 2 ) . data ( ) . toDouble ( ) ) ;
if ( ! qry . exec ( ) )
{
2026-05-27 13:12:07 +02:00
// barrar lo creado: eliminar las composiciones ya insertadas para este producto
if ( ! insertedElementCodes . isEmpty ( ) )
{
QSqlQuery qryDel = QSqlQuery ( dApp - > Enterprise ( ) ) ;
qryDel . prepare ( QString ( " DELETE FROM ELEMENTCOMPOSITION WHERE CODE = :CODE AND ELEMENT_CODE IN (%1) " ) . arg ( QString ( insertedElementCodes . size ( ) , ' ? ' ) . replace ( ' ? ' , " :ELEMENT_CODE " ) ) ) ;
qryDel . bindValue ( " :CODE " , ui - > editCode - > text ( ) ) ;
for ( int j = 0 ; j < insertedElementCodes . size ( ) ; + + j )
{
qryDel . bindValue ( QString ( " :ELEMENT_CODE%1 " ) . arg ( j ) , insertedElementCodes . at ( j ) ) ;
}
qryDel . exec ( ) ;
}
2026-05-24 23:21:33 +02:00
qDebug ( ) < < " Error ejecutando el query: " < < qry . lastError ( ) . text ( ) < < " \n " ;
dApp - > Enterprise ( ) . close ( ) ;
return ;
2026-05-27 13:12:07 +02:00
} }
2026-05-24 23:21:33 +02:00
}
}
// 2. Crear el elemento principal
qry . prepare ( Element ) ;
qry . bindValue ( " :CODE " , ui - > editCode - > text ( ) ) ;
qry . bindValue ( " :TYPE1 " , ui - > comboType1 - > currentIndex ( ) ) ;
qry . bindValue ( " :TYPE2 " , ui - > comboType2 - > currentIndex ( ) ) ;
qry . bindValue ( " :TITLE " , ui - > editTitle - > text ( ) ) ;
qry . bindValue ( " :DESCRIPTION " , ui - > editDescription - > toHtml ( ) ) ;
//qry.bindValue(":FAMILY_ID", ui->editCode->text());
qry . bindValue ( " :UNIT_ID " , ui - > comboUnit - > currentText ( ) ) ;
qry . bindValue ( " :DATE_UPDATE " , ui - > editUpdateDate - > date ( ) ) ;
qry . bindValue ( " :REAL_PRICE " , ui - > editPVP - > value ( ) ) ;
qry . bindValue ( " :DISCOUNT " , ui - > editDiscount - > value ( ) ) ;
qry . bindValue ( " :PURCHASE_PRICE " , ui - > editPC - > value ( ) ) ;
qry . bindValue ( " :BENEFIT " , ui - > editMargin - > value ( ) ) ;
qry . bindValue ( " :TAX " , ui - > comboIVA - > currentText ( ) . replace ( " % " , " " ) ) ;
qry . bindValue ( " :SALE_PRICE " , ui - > editPV - > text ( ) ) ;
//qry.bindValue(":BARCODE", ui->edit->text());
//qry.bindValue(":IMAGE", ui->editCode->text());
qry . bindValue ( " :STATE " , ui - > checkState - > isChecked ( ) ) ;
//qry.bindValue(":MANUFACTURER", ui->editCode->text());
//qry.bindValue(":GAMMA", ui->editCode->text());
qry . bindValue ( " :WEIGHT " , ui - > editWeight - > text ( ) ) ;
qry . bindValue ( " :HEIGHT " , ui - > editHeight - > text ( ) ) ;
qry . bindValue ( " :WIDTH " , ui - > editWidth - > text ( ) ) ;
qry . bindValue ( " :LENGHT " , ui - > editLength - > text ( ) ) ;
if ( ! qry . exec ( ) )
{
//goto error;
}
setWindowTitle ( mDocumentID ) ;
QTabWidget * prt = static_cast < QTabWidget * > ( parent ( ) - > parent ( ) ) ;
prt - > setTabText ( prt - > currentIndex ( ) , ui - > editCode - > text ( ) + " - " + ui - > editTitle - > text ( ) ) ;
dApp - > Enterprise ( ) . close ( ) ;
setEditMode ( ) ;
return ;
error :
dApp - > Enterprise ( ) . close ( ) ;
qDebug ( ) < < " Error ejecutando el query: " < < qry . lastError ( ) . text ( ) < < " \n " ;
}
void formProduct : : on_buttonSave_released ( )
{
// Salvar
save ( ) ;
}
void formProduct : : on_editPVIVA_valueChanged ( const QString & arg1 )
{
ui - > editUpdateDate - > setDate ( QDate : : currentDate ( ) ) ;
}
void formProduct : : on_ModelSetData ( const QModelIndex & topLeft , const QModelIndex & bottomRight , const QVector < int > & roles )
{
Q_UNUSED ( bottomRight ) ;
if ( topLeft . column ( ) = = 0 )
{
InsertElement ( topLeft . data ( roles . first ( ) ) . toString ( ) , topLeft ) ;
}
else if ( topLeft . column ( ) = = 2 )
{
QAbstractItemModel /*TreeModelComposeElement*/ * aModel = ui - > treeView - > model ( ) ;
double pt = 0 ;
for ( int i = 0 ; i < aModel - > rowCount ( ) ; i + + )
{
QModelIndex idx = aModel - > index ( i , 6 ) ;
pt + = idx . data ( ) . toDouble ( ) ;
}
ui - > editPC - > setValue ( pt ) ;
}
}
void formProduct : : setLineType ( QString type , QModelIndex index )
{
setCellText ( type , index , 7 ) ;
}
void formProduct : : setCellText ( QString val , QModelIndex index , int col )
{
//QModelIndex selindex = ui->treeView->selectionModel()->currentIndex();
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 ) ;
}
bool formProduct : : InsertElement ( QString ID , QModelIndex index )
{
if ( ID . isEmpty ( ) )
return false ;
dApp - > Enterprise ( ) . open ( ) ;
QSqlQuery qry = QSqlQuery ( dApp - > Enterprise ( ) ) ;
if ( qry . exec ( QString ( " SELECT * FROM ELEMENT WHERE CODE = '%1'; " ) . arg ( ID ) ) )
{
qry . first ( ) ;
setCellText ( qry . value ( qry . record ( ) . indexOf ( " TITLE " ) ) . toString ( ) , index , 1 ) ; // TITLE
setCellText ( qry . value ( qry . record ( ) . indexOf ( " UNIT_ID " ) ) . toString ( ) , index , 4 ) ; // UNIT ----QSqlQuery::value: not positioned on a valid record
/*
if (qry.value(qry.record().indexOf("TYPE")).toInt() == 0)
{
on_buttonInsertChild_released();
QSqlQuery comp = QSqlQuery(dApp->Enterprise());
if (comp.exec(QString("SELECT * FROM ELEMENTCOMPOSITION WHERE CODE = '%1';").arg(ID)))
{
while (comp.next())
{
on_buttonInsertRow_released();
InsertElement(comp.value(1).toString());
setCellText(4, comp.value(comp.record().indexOf("ELEMENT_AMOUNT")).toString()); //AMOUNT
}
}
}
else*/
{
setCellText ( qry . value ( qry . record ( ) . indexOf ( " PURCHASE_PRICE " ) ) . toString ( ) , index , 5 ) ; //PRICE ----QSqlQuery::value: not positioned on a valid record
}
// TODO: mirar de hacer esto con una enumeración o algo que automice el porceso:
2026-05-27 12:22:25 +02:00
// Use enumeration for element types
2026-05-24 23:21:33 +02:00
switch ( qry . value ( qry . record ( ) . indexOf ( " TYPE1 " ) ) . toInt ( ) )
{
2026-05-27 12:22:25 +02:00
case ElementType : : Composed :
2026-05-24 23:21:33 +02:00
setLineType ( " CO " , index ) ; // type
break ;
2026-05-27 12:22:25 +02:00
case ElementType : : Material :
2026-05-24 23:21:33 +02:00
setLineType ( " MT " , index ) ; // type
break ;
2026-05-27 12:22:25 +02:00
case ElementType : : ManPower :
2026-05-24 23:21:33 +02:00
setLineType ( " MO " , index ) ; // type
break ;
2026-05-27 12:22:25 +02:00
case ElementType : : Machinery :
2026-05-24 23:21:33 +02:00
setLineType ( " MQ " , index ) ; // type
break ;
2026-05-27 12:22:25 +02:00
case ElementType : : Subcontracted :
setLineType ( " SC " , index ) ; // type
break ;
case ElementType : : Other :
setLineType ( " OT " , index ) ; // type
break ;
default :
setLineType ( " UNKNOWN " , index ) ; // type
break ;
2026-05-24 23:21:33 +02:00
}
}
else
{
qDebug ( ) < < qry . lastError ( ) . text ( ) ;
}
dApp - > Enterprise ( ) . close ( ) ;
return false ;
}
void formProduct : : on_comboType2_currentIndexChanged ( int index )
{
if ( index = = 0 )
setComposeElement ( true ) ;
else
setComposeElement ( false ) ;
}
void formProduct : : setComposeElement ( bool val )
{
ui - > editPVP - > setEnabled ( ! val ) ;
ui - > editDiscount - > setEnabled ( ! val ) ;
ui - > editPC - > setReadOnly ( val ) ;
ui - > groupBox_6 - > setVisible ( ! val ) ;
//ui->tabCompose->setVisible(val);
ui - > comboType1 - > setEnabled ( ! val ) ;
//ui->comboType2->setEnabled(!val);
}