void ToitemTableDelegate::setModelData(QWidget *editor, QAbstractItemModel *pModel, const QModelIndex &index) const { bool hitError = false; QVariant oldval = pModel->data(index); ToitemTableModel *model = static_cast<ToitemTableModel*>(pModel); switch (index.column()) { case ITEM_NUMBER_COL: { ItemLineEdit *item = static_cast<ItemLineEdit*>(editor); if (oldval.isNull() || item->itemNumber() != oldval.toString()) { if (! item->itemNumber().isEmpty() && item->isValid()) { XSqlQuery itemq; itemq.prepare("SELECT *, stdCost(item_id) AS stdcost, uom_name " "FROM item JOIN uom ON (item_inv_uom_id=uom_id) " "WHERE (item_id=:item_id);"); itemq.bindValue(":item_id", item->id()); itemq.exec(); if (itemq.first()) { if (itemq.value("stdcost").toDouble() == 0.0) { QMessageBox::critical(0, tr("No Standard Cost"), tr("<p>The selected item has no Standard " "Costing information. Please see your " "controller to correct this situation " "before continuing.")); hitError = true; break; } model->setData(index, item->itemNumber()); model->setData(model->index(index.row(), TOITEM_ITEM_ID_COL), itemq.value("item_id").toInt()); model->setData(model->index(index.row(), TOITEM_UOM_COL), itemq.value("uom_name")); model->setData(model->index(index.row(), TOITEM_STDCOST_COL), formatPurchPrice(itemq.value("stdcost").toDouble())); } else if (itemq.lastError().type() != QSqlError::NoError) { systemError(0, itemq.lastError().databaseText(), __FILE__, __LINE__); hitError = true; break; } } if (hitError) { model->setData(index, QVariant(QVariant::String)); model->setData(model->index(index.row(), TOITEM_ITEM_ID_COL), QVariant(QVariant::Int)); model->setData(model->index(index.row(), TOITEM_STDCOST_COL), QVariant(QVariant::Double)); } } break; } case TOITEM_FREIGHT_COL: { QLineEdit *lineedit = static_cast<QLineEdit*>(editor); if (lineedit->text().toDouble() != oldval.toDouble()) model->setData(index, formatPurchPrice(lineedit->text().toDouble())); break; } case TOITEM_QTY_ORDERED_COL: { QLineEdit *lineedit = static_cast<QLineEdit*>(editor); if (lineedit->text().isEmpty()) model->setData(index, QVariant()); else model->setData(index, lineedit->text().toDouble()); break; } case TOITEM_DUEDATE_COL: { DLineEdit *duedate = static_cast<DLineEdit*>(editor); if (duedate->date() != oldval.toDate()) { model->setData(index, duedate->date()); } break; } #ifdef QE_PROJECT case PRJ_NUMBER_COL: { ProjectLineEdit *prj = static_cast<ProjectLineEdit*>(editor); if (prj->id() != oldval.toInt()) { model->setData(model->index(index.row(), TOITEM_PRJ_ID_COL), prj->id()); model->setData(index, prj->text()); } break; } #endif default: break; } QTableView *view = qobject_cast<QTableView*>(parent()); if (view) { if (hitError) view->setCurrentIndex(index); else if (index.row() >= (model->rowCount() - 1)) { QHeaderView* header = view->horizontalHeader(); if (header->visualIndex(index.column()) >= (header->count() - header->hiddenSectionCount() - 1)) { model->insertRow(model->rowCount()); } } } return; }
void PoitemTableDelegate::setModelData(QWidget *editor, QAbstractItemModel *pModel, const QModelIndex &index) const { bool hitError = false; QVariant oldval = pModel->data(index); PoitemTableModel *model = static_cast<PoitemTableModel*>(pModel); switch (index.column()) { case ITEM_NUMBER_COL: { ItemLineEdit *item = static_cast<ItemLineEdit*>(editor); if (item->itemNumber() != oldval.toString()) { if (item->itemNumber().isEmpty()) { model->setData(index, new QVariant()); model->setData(model->index(index.row(), ITEM_ID_COL), new QVariant()); model->setData(model->index(index.row(), POITEM_ITEMSITE_ID_COL), new QVariant()); model->setData(model->index(index.row(), WAREHOUS_ID_COL), new QVariant()); model->setData(model->index(index.row(), WAREHOUS_CODE_COL), new QVariant()); model->setData(model->index(index.row(), POITEM_ITEMSRC_ID_COL), new QVariant()); model->setData(model->index(index.row(), POITEM_VEND_ITEM_NUMBER_COL), new QVariant()); model->setData(model->index(index.row(), POITEM_VEND_ITEM_DESCRIP_COL), new QVariant()); model->setData(model->index(index.row(), POITEM_VEND_UOM_COL), new QVariant()); model->setData(model->index(index.row(), ITEMSRC_MINORDQTY_COL), new QVariant()); model->setData(model->index(index.row(), ITEMSRC_MULTORDQTY_COL), new QVariant()); model->setData(model->index(index.row(), ITEMSRC_INVVENDORUOMRATIO_COL), new QVariant()); model->setData(model->index(index.row(), POITEM_INVVENDUOMRATIO_COL), new QVariant()); model->setData(model->index(index.row(), EARLIESTDATE_COL), new QVariant()); } else { model->setData(index, item->itemNumber()); model->setData(model->index(index.row(), ITEM_ID_COL), item->id()); if (item->isValid()) { XSqlQuery itemq; itemq.prepare("SELECT (warehous_id=:preferred) AS preferred, " " itemsite_id, warehous_id, warehous_code " "FROM itemsite, whsinfo " "WHERE ((itemsite_item_id=:item_id)" " AND (itemsite_warehous_id=warehous_id)) " "ORDER BY preferred DESC, warehous_code " "LIMIT 1;"); itemq.bindValue(":item_id", item->id()); itemq.bindValue(":preferred", _x_preferences->value("PreferredWarehouse").toInt()); itemq.exec(); if (itemq.first()) { model->setData(model->index(index.row(), POITEM_ITEMSITE_ID_COL), itemq.value("itemsite_id").toInt()); model->setData(model->index(index.row(), WAREHOUS_ID_COL), itemq.value("warehous_id").toInt()); model->setData(model->index(index.row(), WAREHOUS_CODE_COL), itemq.value("warehous_code").toString()); } else if (itemq.lastError().type() != QSqlError::None) { systemError(0, itemq.lastError().databaseText(), __FILE__, __LINE__); hitError = true; break; } else { systemError(0, QString("Could not find Item Site for %1 (%2).") .arg(item->itemNumber()).arg(item->id())); hitError = true; break; } if (_metrics->boolean("RequireStdCostForPOItem")) { XSqlQuery stdcostq; stdcostq.prepare("SELECT stdCost(:item_id) AS result"); stdcostq.bindValue(":item_id", item->id()); stdcostq.exec(); if(stdcostq.first() && stdcostq.value("result").toDouble() == 0.0) { QMessageBox::critical(0, tr("Selected Item Missing Cost"), tr("<p>The selected item has no Std. Costing information. " "Please see your controller to correct this situation " "before continuing.")); model->setData(index, new QString()); model->setData(model->index(index.row(), POITEM_ITEMSITE_ID_COL), new QVariant()); model->setData(model->index(index.row(), WAREHOUS_ID_COL), new QVariant()); model->setData(model->index(index.row(), WAREHOUS_CODE_COL), new QString()); model->setData(index, new QString()); hitError = true; break; } else if (stdcostq.lastError().type() != QSqlError::None) { systemError(0, stdcostq.lastError().databaseText(), __FILE__, __LINE__); hitError = true; break; } } XSqlQuery itemsrcq; itemsrcq.prepare( "SELECT itemsrc_id, itemsrc_vend_item_number," " itemsrc_vend_item_descrip, itemsrc_vend_uom," " itemsrc_minordqty," " itemsrc_multordqty," " itemsrc_invvendoruomratio," " (CURRENT_DATE + itemsrc_leadtime) AS earliestdate " "FROM pohead, itemsrc " "WHERE ( (itemsrc_vend_id=pohead_vend_id)" " AND (itemsrc_item_id=:item_id)" " AND (pohead_id=:pohead_id) );" ); itemsrcq.bindValue(":item_id", item->id()); itemsrcq.bindValue(":pohead_id", model->headId()); itemsrcq.exec(); if (itemsrcq.first()) { model->setData(model->index(index.row(), POITEM_ITEMSRC_ID_COL), itemsrcq.value("itemsrc_id").toInt()); model->setData(model->index(index.row(), POITEM_VEND_ITEM_NUMBER_COL), itemsrcq.value("itemsrc_vend_item_number").toString()); model->setData(model->index(index.row(), POITEM_VEND_ITEM_DESCRIP_COL), itemsrcq.value("itemsrc_vend_item_descrip").toString()); model->setData(model->index(index.row(), POITEM_VEND_UOM_COL), itemsrcq.value("itemsrc_vend_uom").toString()); model->setData(model->index(index.row(), ITEMSRC_MINORDQTY_COL), itemsrcq.value("itemsrc_minordqty").toDouble()); model->setData(model->index(index.row(), ITEMSRC_MULTORDQTY_COL), itemsrcq.value("itemsrc_multordqty").toDouble()); model->setData(model->index(index.row(), ITEMSRC_INVVENDORUOMRATIO_COL), itemsrcq.value("itemsrc_invvendoruomratio").toDouble()); model->setData(model->index(index.row(), POITEM_INVVENDUOMRATIO_COL), itemsrcq.value("itemsrc_invvendoruomratio").toDouble()); model->setData(model->index(index.row(), EARLIESTDATE_COL), itemsrcq.value("earliestdate").toDate()); if (_metrics->boolean("UseEarliestAvailDateOnPOItem")) model->setData(model->index(index.row(), POITEM_DUEDATE_COL), itemsrcq.value("earliestdate").toDate()); } else if (itemsrcq.lastError().type() != QSqlError::None) { systemError(0, itemsrcq.lastError().databaseText(), __FILE__, __LINE__); hitError = true; break; } } } } break; } case WAREHOUS_CODE_COL: { WComboBox *whs = static_cast<WComboBox*>(editor); if (whs->id() < 0) { model->setData(model->index(index.row(), WAREHOUS_ID_COL), QVariant()); model->setData(index, QVariant()); } else if (whs->id() != oldval.toInt()) { model->setData(model->index(index.row(), WAREHOUS_ID_COL), whs->id()); model->setData(index, whs->currentText()); if (whs->isValid()) { XSqlQuery itemq; itemq.prepare("SELECT itemsite_id " "FROM itemsite " "WHERE ((itemsite_item_id=:item_id)" " AND (itemsite_warehous_id=:whs_id)) " "LIMIT 1;"); itemq.bindValue(":item_id", model->index(index.row(), ITEM_ID_COL).data()); itemq.bindValue(":whs_id", whs->id()); itemq.exec(); if (itemq.first()) { model->setData(model->index(index.row(), POITEM_ITEMSITE_ID_COL), itemq.value("itemsite_id").toInt()); } else if (itemq.lastError().type() != QSqlError::None) { systemError(0, itemq.lastError().databaseText(), __FILE__, __LINE__); hitError = true; break; } else { systemError(0, QString("Could not find Item Site for %1 in %2.") .arg(model->index(index.row(), ITEM_NUMBER_COL).data().toString()) .arg(whs->currentText())); hitError = true; break; } } } break; } case POITEM_VEND_ITEM_NUMBER_COL: { QLineEdit *lineedit = static_cast<QLineEdit*>(editor); if (lineedit->text() != oldval.toString()) model->setData(index, lineedit->text()); break; } case POITEM_FREIGHT_COL: { QLineEdit *lineedit = static_cast<QLineEdit*>(editor); if (lineedit->text().toDouble() != oldval.toDouble()) model->setData(index, formatPurchPrice(lineedit->text().toDouble())); break; } case POITEM_QTY_ORDERED_COL: { QLineEdit *lineedit = static_cast<QLineEdit*>(editor); if (lineedit->text().isEmpty()) { model->setData(index, QVariant()); model->setData(model->index(index.row(), EXTPRICE_COL), QVariant()); break; } double qty = lineedit->text().toDouble(); if (qty != oldval.toDouble()) { model->setData(index, formatQty(qty)); if (model->data(model->index(index.row(), POITEM_QTY_ORDERED_COL)).toDouble() > 0 && model->data(model->index(index.row(), POITEM_ITEMSRC_ID_COL)).toInt() > 0) { q.prepare( "SELECT ROUND(currToCurr(itemsrcp_curr_id, :curr_id, itemsrcp_price, :effective), :prec) " "AS new_itemsrcp_price " "FROM itemsrcp " "WHERE ( (itemsrcp_itemsrc_id=:itemsrc_id)" " AND (itemsrcp_qtybreak <= :qty) ) " "ORDER BY itemsrcp_qtybreak DESC " "LIMIT 1;" ); q.bindValue(":itemsrc_id", model->data(model->index(index.row(), POITEM_ITEMSRC_ID_COL)).toInt()); q.bindValue(":qty", model->data(model->index(index.row(), POITEM_QTY_ORDERED_COL)).toDouble()); q.bindValue(":curr_id", model->currId()); q.bindValue(":effective", model->transDate().toString()); q.bindValue(":prec", omfgThis->priceVal()->decimals()); q.exec(); if (q.first()) { model->setData(model->index(index.row(), POITEM_UNITPRICE_COL), q.value("new_itemsrcp_price").toDouble()); } else if (q.lastError().type() != QSqlError::None) { systemError(0, q.lastError().databaseText(), __FILE__, __LINE__); hitError = true; break; } else model->setData(model->index(index.row(), POITEM_UNITPRICE_COL), 0); } double prc = model->data(model->index(index.row(), POITEM_UNITPRICE_COL)).toDouble(); model->setData(model->index(index.row(), EXTPRICE_COL), formatPurchPrice(qty * prc)); } break; } case POITEM_UNITPRICE_COL: { QLineEdit *lineedit = static_cast<QLineEdit*>(editor); if (lineedit->text().isEmpty()) { model->setData(index, QVariant()); model->setData(model->index(index.row(), EXTPRICE_COL), QVariant()); break; } double prc = lineedit->text().toDouble(); if (prc != oldval.toDouble()) { model->setData(index, prc); double qty = model->data(model->index(index.row(),POITEM_QTY_ORDERED_COL)).toDouble(); model->setData(model->index(index.row(), EXTPRICE_COL), formatPurchPrice(qty * prc)); } break; } case POITEM_DUEDATE_COL: { DLineEdit *duedate = static_cast<DLineEdit*>(editor); if (duedate->date() != oldval.toDate()) { model->setData(index, duedate->date()); } break; } #ifdef QE_PROJECT case PRJ_NUMBER_COL: { ProjectLineEdit *prj = static_cast<ProjectLineEdit*>(editor); if (prj->id() != oldval.toInt()) { model->setData(model->index(index.row(), POITEM_PRJ_ID_COL), prj->id()); model->setData(index, prj->text()); } break; } #endif #ifdef QE_NONINVENTORY case EXPCAT_CODE_COL: { ExpenseLineEdit *exp = static_cast<ExpenseLineEdit*>(editor); if (exp->id() != oldval.toInt()) { model->setData(model->index(index.row(), POITEM_EXPCAT_ID_COL), exp->id()); model->setData(index, exp->text()); } break; } #endif default: break; } QTableView *view = qobject_cast<QTableView*>(parent()); if (view) { if (hitError) view->setCurrentIndex(index); else if (index.row() >= (model->rowCount() - 1)) { QHeaderView* header = view->horizontalHeader(); if (header->visualIndex(index.column()) >= (header->count() - header->hiddenSectionCount() - 1)) { model->insertRow(model->rowCount()); } } } return; }