# HG changeset patch # User Michiel Broek # Date 1675178651 -3600 # Node ID e13763ec829fef364ae18ea446cb807dafcce316 # Parent 8a25dbe682eb4eac475bb2d504c51056dff6d7ce Expanded Yeast edit popup with a Yeast Pack dropdown list. Prepared database product read and write with values for yeast package. They will be stored as json object in the yeast records. diff -r 8a25dbe682eb -r e13763ec829f src/EditProduct.h --- a/src/EditProduct.h Tue Jan 31 11:10:14 2023 +0100 +++ b/src/EditProduct.h Tue Jan 31 16:24:11 2023 +0100 @@ -288,7 +288,7 @@ /* * Variables for popup ingredients editing. */ - QComboBox *fselectEdit, *faddedEdit, *hselectEdit,*haddedEdit, *useatEdit, *mselectEdit, *yselectEdit, *splitatEdit; + QComboBox *fselectEdit, *faddedEdit, *hselectEdit,*haddedEdit, *useatEdit, *mselectEdit, *yselectEdit, *ypackageEdit, *splitatEdit; QLineEdit *fnameEdit, *fsupplierEdit, *hnameEdit, *horiginEdit, *mnameEdit, *ynameEdit, *ylaboratoryEdit, *yproduct_idEdit, *stepnameEdit; QDoubleSpinBox *famountEdit, *pctEdit, *fmaxEdit, *hamountEdit, *ibuEdit, *mamountEdit, *yamountEdit, *stepphEdit, *stepsgEdit; QDoubleSpinBox *steptempEdit, *endtempEdit, *steptimeEdit, *ramptimeEdit, *stepivolEdit, *stepitmpEdit, *brixEdit; diff -r 8a25dbe682eb -r e13763ec829f src/EditProductTab6.cpp --- a/src/EditProductTab6.cpp Tue Jan 31 11:10:14 2023 +0100 +++ b/src/EditProductTab6.cpp Tue Jan 31 16:24:11 2023 +0100 @@ -956,7 +956,7 @@ void EditProduct::yeast_select_changed(int val) { - QSqlQuery query; + QSqlQuery query, query1; bool instock = yinstockEdit->isChecked(); QString w; QTableWidgetItem *item; @@ -1015,6 +1015,7 @@ product->yeasts[product->yeasts_row].sg_hi = query.value("sg_hi").toDouble(); product->yeasts[product->yeasts_row].cost = query.value("cost").toDouble(); product->yeasts[product->yeasts_row].inventory = query.value("inventory").toDouble(); + product->yeasts[product->yeasts_row].yp_uuid = QString(); /* * Update the visible fields @@ -1048,6 +1049,22 @@ product->yeast_pitchrate = 0; } + /* + * Clear package and rebuild package select table. + */ + this->ypackageEdit->setCurrentIndex(-1); + this->ypackageEdit->clear(); + this->ypackageEdit->addItem(""); // Start with empty value + query1.prepare("SELECT * FROM inventory_yeastpack WHERE laboratory=:laboratory AND form=:form AND valid='1' ORDER BY laboratory,package"); + query1.bindValue(":laboratory", query.value("laboratory").toString()); + query1.bindValue(":form", query.value("form").toInt()); + qDebug() << " search" << query.value("laboratory").toString() << query.value("form").toInt(); + query1.exec(); + while (query1.next()) { + this->ypackageEdit->addItem(query1.value("laboratory").toString()+" - "+query1.value("package").toString()); + qDebug() << " add package" << query1.value("laboratory").toString() << query1.value("package").toString(); + } + ui->yeastsTable->setItem(product->yeasts_row, 0, new QTableWidgetItem(product->yeasts.at(product->yeasts_row).name)); ui->yeastsTable->setItem(product->yeasts_row, 1, new QTableWidgetItem(product->yeasts.at(product->yeasts_row).laboratory)); ui->yeastsTable->setItem(product->yeasts_row, 2, new QTableWidgetItem(product->yeasts.at(product->yeasts_row).product_id)); @@ -1171,10 +1188,10 @@ Yeasts backup = product->yeasts.at(product->yeasts_row); QDialog* dialog = new QDialog(this); - dialog->resize(738, 260); + dialog->resize(738, 290); QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog); buttonBox->setObjectName(QString::fromUtf8("buttonBox")); - buttonBox->setGeometry(QRect(30, 210, 671, 32)); + buttonBox->setGeometry(QRect(30, 240, 671, 32)); buttonBox->setLayoutDirection(Qt::LeftToRight); buttonBox->setOrientation(Qt::Horizontal); buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); @@ -1205,6 +1222,11 @@ instockLabel->setText(tr("In stock:")); instockLabel->setGeometry(QRect(525,100, 121, 20)); instockLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); + QLabel *packageLabel = new QLabel(dialog); + packageLabel->setObjectName(QString::fromUtf8("packageLabel")); + packageLabel->setText(tr("Select package:")); + packageLabel->setGeometry(QRect(10,130, 141, 20)); + packageLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); yamountLabel = new QLabel(dialog); yamountLabel->setObjectName(QString::fromUtf8("amountLabel")); if (product->yeasts.at(product->yeasts_row).form == YEAST_FORMS_LIQUID) @@ -1213,12 +1235,12 @@ yamountLabel->setText(tr("Amount in gr:")); else yamountLabel->setText(tr("Amount in ml:")); - yamountLabel->setGeometry(QRect(10, 130, 141, 20)); + yamountLabel->setGeometry(QRect(10, 160, 141, 20)); yamountLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); QLabel *useatLabel = new QLabel(dialog); useatLabel->setObjectName(QString::fromUtf8("useatLabel")); useatLabel->setText(tr("Use at:")); - useatLabel->setGeometry(QRect(10, 160, 141, 20)); + useatLabel->setGeometry(QRect(10, 190, 141, 20)); useatLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); ynameEdit = new QLineEdit(dialog); @@ -1243,9 +1265,12 @@ yinstockEdit->setObjectName(QString::fromUtf8("yinstockEdit")); yinstockEdit->setGeometry(QRect(655,100, 85, 21)); yinstockEdit->setChecked(true); + ypackageEdit = new QComboBox(dialog); + ypackageEdit->setObjectName(QString::fromUtf8("packageEdit")); + ypackageEdit->setGeometry(QRect(160,130, 371, 23)); yamountEdit = new QDoubleSpinBox(dialog); yamountEdit->setObjectName(QString::fromUtf8("yamountEdit")); - yamountEdit->setGeometry(QRect(160, 130, 121, 24)); + yamountEdit->setGeometry(QRect(160, 160, 121, 24)); yamountEdit->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); yamountEdit->setAccelerated(true); yamountEdit->setMaximum(10000.0); @@ -1265,7 +1290,7 @@ yamountEdit->setMaximum(1000000000.0); useatEdit = new QComboBox(dialog); useatEdit->setObjectName(QString::fromUtf8("useatEdit")); - useatEdit->setGeometry(QRect(160, 160, 161, 23)); + useatEdit->setGeometry(QRect(160, 190, 161, 23)); useatEdit->addItem(tr("Primary")); useatEdit->addItem(tr("Secondary")); useatEdit->addItem(tr("Tertiary")); diff -r 8a25dbe682eb -r e13763ec829f src/database/db_product.cpp --- a/src/database/db_product.cpp Tue Jan 31 11:10:14 2023 +0100 +++ b/src/database/db_product.cpp Tue Jan 31 16:24:11 2023 +0100 @@ -64,11 +64,7 @@ prod->eq_trub_loss = query.value("eq_trub_loss").toDouble(); prod->eq_evap_rate = query.value("eq_evap_rate").toDouble(); prod->eq_boil_time = query.value("eq_boil_time").toDouble(); -// prod->eq_calc_boil_volume = query.value("eq_calc_boil_volume").toInt() ? true:false; prod->eq_top_up_kettle = query.value("eq_top_up_kettle").toDouble(); -// prod->eq_hop_utilization = query.value("eq_hop_utilization").toDouble(); -// prod->eq_lauter_volume = query.value("eq_lauter_volume").toDouble(); -// prod->eq_lauter_height = query.value("eq_lauter_height").toDouble(); prod->eq_lauter_deadspace = query.value("eq_lauter_deadspace").toDouble(); prod->eq_kettle_volume = query.value("eq_kettle_volume").toDouble(); prod->eq_kettle_height = query.value("eq_kettle_height").toDouble(); @@ -438,6 +434,7 @@ } else if (yeasts.isArray()) { for (int i = 0; i < yeasts.array().size(); i++) { QJsonObject obj = yeasts.array().at(i).toObject(); + qDebug() << "yeasts_Json" << i << obj; Yeasts y; /* First some defaults for newer fields. */ y.tolerance = y.harvest_time = y.pitch_temperature = y.zymocide = 0; @@ -446,6 +443,13 @@ y.sg_lo = 1.04; y.gr_hl_hi = 80; y.sg_hi = 1.08; + /* Clear Yeast Package data */ + y.yp_uuid = QString(); + y.yp_package = QString(); + y.yp_cells = obj["y_cells"].toDouble(); + y.yp_viability = 0.99; + y.yp_max = 100; + y.yp_size = 0.01; /* Now get what we have got */ y.name = obj["y_name"].toString(); y.laboratory = obj["y_laboratory"].toString(); @@ -485,25 +489,42 @@ yquery.exec(); if (yquery.first()) { if (y.tolerance == 0 || y.cells == 0) { - y.tolerance = yquery.value(0).toDouble(); - y.cells = yquery.value(1).toDouble(); + y.tolerance = yquery.value("tolerance").toDouble(); + y.cells = yquery.value("cells").toDouble(); } - y.sta1 = yquery.value(2).toInt() ? true:false; - y.bacteria = yquery.value(3).toInt() ? true:false; - y.harvest_top = yquery.value(4).toInt() ? true:false; - y.harvest_time = yquery.value(5).toInt(); - y.pitch_temperature = yquery.value(6).toDouble(); - y.pofpos = yquery.value(7).toInt() ? true:false; - y.zymocide = yquery.value(8).toInt(); - y.gr_hl_lo = yquery.value(9).toInt(); - y.sg_lo = yquery.value(10).toDouble(); - y.gr_hl_hi = yquery.value(11).toInt(); - y.sg_hi = yquery.value(12).toDouble(); - y.inventory = yquery.value(13).toDouble(); + y.sta1 = yquery.value("sta1").toInt() ? true:false; + y.bacteria = yquery.value("bacteria").toInt() ? true:false; + y.harvest_top = yquery.value("harvest_top").toInt() ? true:false; + y.harvest_time = yquery.value("harvest_time").toInt(); + y.pitch_temperature = yquery.value("pitch_temperature").toDouble(); + y.pofpos = yquery.value("pofpos").toInt() ? true:false; + y.zymocide = yquery.value("zymocide").toInt(); + y.gr_hl_lo = yquery.value("gr_hl_lo").toInt(); + y.sg_lo = yquery.value("sg_lo").toDouble(); + y.gr_hl_hi = yquery.value("gr_hl_hi").toInt(); + y.sg_hi = yquery.value("sg_hi").toDouble(); + y.inventory = yquery.value("inventory").toDouble(); y.avail = true; } else { qDebug() << y.name << y.product_id << "not found for upgrade"; } + /* + * Yeast Pack. + */ + if (obj.contains("y_package") && obj["y_package"].isObject()) { + qDebug() << "y_package object present"; + QJsonObject package = obj.value("y_package").toObject(); + qDebug() << "yeasts_Json package" << i << package; + y.yp_uuid = package["uuid"].toString(); + y.yp_package = package["package"].toString(); + y.yp_cells = package["cells"].toDouble(); + y.yp_viability = package["viability"].toDouble(); + y.yp_max = package["max"].toInt(); + y.yp_size = package["size"].toDouble(); + } else { + qDebug() << "y_package not present"; + } + prod->yeasts.append(y); } // qDebug() << "yeasts" << prod->yeasts.size(); @@ -973,7 +994,18 @@ obj.insert("y_gr_hl_hi", prod->yeasts.at(i).gr_hl_hi); obj.insert("y_sg_hi", round(prod->yeasts.at(i).sg_hi * 1000) / 1000); obj.insert("y_cost", round(prod->yeasts.at(i).cost * 1000) / 1000); - // qDebug() << "yeasts_Json" << i << obj; + if (! product->yeasts.at(i).yp_uuid.isNull() && (product->yeasts.at(i).yp_uuid.length() == 36)) { + qDebug() << "yeasts_Json append package"; + QJsonObject package; + package.insert("uuid", prod->yeasts.at(i).yp_uuid); + package.insert("package", prod->yeasts.at(i).yp_package); + package.insert("cells", prod->yeasts.at(i).yp_cells); + package.insert("viability", round(prod->yeasts.at(i).yp_viability * 10000) / 10000); + package.insert("max", prod->yeasts.at(i).yp_max); + package.insert("size", round(prod->yeasts.at(i).yp_size * 100000) / 100000); + obj.insert("y_package", package); + } + qDebug() << "yeasts_Json" << i << obj; array.append(obj); /* Append this object */ } QJsonDocument doc; diff -r 8a25dbe682eb -r e13763ec829f src/global.h --- a/src/global.h Tue Jan 31 11:10:14 2023 +0100 +++ b/src/global.h Tue Jan 31 16:24:11 2023 +0100 @@ -181,18 +181,12 @@ double cost; double inventory; ///< In product, current inventory. bool avail; ///< Product available in database. -}; - - -struct YeastPacks -{ - QString laboratory; - QString package; - QString notes; - int form; - double cells; - double viability; - double size; + QString yp_uuid; ///< Yeast Package uuid or NULL. + QString yp_package; ///< Package name. + double yp_cells; ///< Cells per package. + double yp_viability; ///< Viability degradation per month. + int yp_max; ///< Maximum viability percent. + double yp_size; ///< Yeast Package size in kg or liter. }; diff -r 8a25dbe682eb -r e13763ec829f translations/bmsapp_en.ts --- a/translations/bmsapp_en.ts Tue Jan 31 11:10:14 2023 +0100 +++ b/translations/bmsapp_en.ts Tue Jan 31 16:24:11 2023 +0100 @@ -4366,7 +4366,7 @@ - + Use at: @@ -4523,7 +4523,7 @@ - + Amount in gr: @@ -4563,7 +4563,7 @@ - + Amount in ml: @@ -4574,13 +4574,13 @@ - + Primary - + Secondary @@ -4742,7 +4742,7 @@ - + Total packs: @@ -4763,12 +4763,17 @@ - + + Select package: + + + + Tertiary - + Bottle @@ -12309,8 +12314,8 @@ - - + + Database error @@ -12323,8 +12328,8 @@ - - + + MySQL error: %1 %2 %3 diff -r 8a25dbe682eb -r e13763ec829f translations/bmsapp_nl.ts --- a/translations/bmsapp_nl.ts Tue Jan 31 11:10:14 2023 +0100 +++ b/translations/bmsapp_nl.ts Tue Jan 31 16:24:11 2023 +0100 @@ -4882,7 +4882,7 @@ - + Use at: Toevoegen bij: @@ -5039,7 +5039,7 @@ - + Amount in gr: Gewicht in gr: @@ -5098,7 +5098,7 @@ - + Amount in ml: Hoeveelheid in ml: @@ -5109,13 +5109,13 @@ - + Primary Hoofdgisting - + Secondary Nagisting/lagering @@ -5277,7 +5277,7 @@ - + Total packs: Aantal pakken: @@ -5298,12 +5298,17 @@ Kies gist: - + + Select package: + + + + Tertiary Lageren - + Bottle Bottelen @@ -13962,8 +13967,8 @@ - - + + Database error Database fout @@ -13976,8 +13981,8 @@ - - + + MySQL error: %1 %2 %3 diff -r 8a25dbe682eb -r e13763ec829f ui/EditProduct.ui --- a/ui/EditProduct.ui Tue Jan 31 11:10:14 2023 +0100 +++ b/ui/EditProduct.ui Tue Jan 31 16:24:11 2023 +0100 @@ -3484,7 +3484,7 @@ 3 - 0.005000000000000 + 0.000000000000000 5.000000000000000 @@ -3493,7 +3493,7 @@ 0.010000000000000 - 0.005000000000000 + 0.000000000000000