# HG changeset patch # User Michiel Broek # Date 1647262828 -3600 # Node ID d36879f13d328b2c882405f80ee1aa82184e924b # Parent ff7b3a41c9b588063ec482843b5930b7f350f4c0 Completed printing inventory supplies. diff -r ff7b3a41c9b5 -r d36879f13d32 src/PrinterDialog.cpp --- a/src/PrinterDialog.cpp Sun Mar 13 22:56:22 2022 +0100 +++ b/src/PrinterDialog.cpp Mon Mar 14 14:00:28 2022 +0100 @@ -53,9 +53,13 @@ QPainter painter; QString w; + const QColor c_header(255, 150, 100, 255); + const QColor c_line1(210, 245, 255, 255); + const QColor c_line2(255, 255, 210, 255); const QStringList f_types({tr("Grain"), tr("Sugar"), tr("Extract"), tr("Dry extract"), tr("Adjunct")}); const QStringList h_form({tr("Pellet"), tr("Plug"), tr("Leaf"), tr("Leaf Wet"), tr("Cryo")}); const QStringList m_types({tr("Spice"), tr("Herb"), tr("Flavor"), tr("Fining"), tr("Water agent"), tr("Yeast nutrient"), tr("Other")}); + const QStringList y_form({tr("pkg"), tr("gr"), tr("ml"), tr("ml"), tr("ml"), tr("ml"), tr("gr")}); painter.begin(printer); bool firstPage = true; @@ -65,13 +69,12 @@ double tot_fermentables = 0, tot_hops = 0, tot_yeasts = 0, tot_miscs = 0; - printHeader(&painter, tr("Inventaris")); - y = 140; - + printHeader(&painter); + y = 120; /* Fermentables supplies header */ painter.setFont(QFont("Helvetica", 9, QFont::Bold)); painter.setPen(Qt::black); - painter.fillRect( 0, y, 735, 20, QColor(255, 150, 100, 255)); + painter.fillRect( 0, y, 735, 20, c_header); painter.drawText( 0, y+4, 90, 20, Qt::AlignLeft, tr("Type")); painter.drawText( 90, y+4, 100, 20, Qt::AlignLeft, tr("Supplier")); painter.drawText(190, y+4, 270, 20, Qt::AlignLeft, tr("Fermentable")); @@ -80,15 +83,15 @@ painter.drawText(655, y+4, 80, 20, Qt::AlignRight, tr("Value")); y += 20; painter.setFont(QFont("Helvetica", 9, QFont::Normal)); - QSqlQuery query("SELECT type,name,supplier,inventory,cost FROM inventory_fermentables WHERE inventory > 0 ORDER BY type,supplier,name"); query.first(); for (int i = 0 ; i < query.size() ; i++ ) { - if (i % 2) { - painter.fillRect( 0, y, 735, 20, QColor(210, 245, 255, 255)); - } else { - painter.fillRect( 0, y, 735, 20, QColor(255, 255, 210, 255)); - } + if ((y + 20) > painter.device()->height()) { + printer->newPage(); + printHeader(&painter); + y = 120; + } + painter.fillRect( 0, y, 735, 20, (i % 2) ? c_line1:c_line2); painter.drawText( 0, y+4, 90, 20, Qt::AlignLeft, f_types[query.value(0).toInt()]); painter.drawText( 90, y+4, 100, 20, Qt::AlignLeft, query.value(2).toString()); painter.drawText(190, y+4, 270, 20, Qt::AlignLeft, query.value(1).toString()); @@ -102,21 +105,25 @@ query.next(); y += 20; } - painter.fillRect( 0, y, 735, 20, QColor(255, 150, 100, 255)); + painter.fillRect( 0, y, 735, 20, c_header); painter.drawText( 0, y+4, 100, 20, Qt::AlignLeft, tr("Total")); w = QString("%1 €").arg(tot_fermentables, 8, 'f', 2); painter.drawText(655, y+4, 80, 20, Qt::AlignRight, w); y += 20; - qDebug() << " * " << y; + /* Hops supplies */ query.exec("SELECT name,form,origin,inventory,cost FROM inventory_hops WHERE inventory > 0 ORDER BY origin,name"); query.first(); - qDebug() << "hops" << query.size(); - y += 60; // TODO: proper pagebreak check - /* Hops supplies header */ + if ((y + 80 + (query.size() * 20)) > painter.device()->height()) { /* Rows + header + footer + blank */ + printer->newPage(); + printHeader(&painter); + y = 120; + } else { + y += 40; + } painter.setFont(QFont("Helvetica", 9, QFont::Bold)); painter.setPen(Qt::black); - painter.fillRect( 0, y, 735, 20, QColor(255, 150, 100, 255)); + painter.fillRect( 0, y, 735, 20, c_header); painter.drawText( 0, y+4, 120, 20, Qt::AlignLeft, tr("Country")); painter.drawText(120, y+4, 260, 20, Qt::AlignLeft, tr("Hop name")); painter.drawText(380, y+4, 80, 20, Qt::AlignLeft, tr("Form")); @@ -126,11 +133,12 @@ y += 20; painter.setFont(QFont("Helvetica", 9, QFont::Normal)); for (int i = 0; i < query.size(); i++) { - if (i % 2) { - painter.fillRect( 0, y, 735, 20, QColor(210, 245, 255, 255)); - } else { - painter.fillRect( 0, y, 735, 20, QColor(255, 255, 210, 255)); - } + if ((y + 20) > painter.device()->height()) { + printer->newPage(); + printHeader(&painter); + y = 120; + } + painter.fillRect( 0, y, 735, 20, (i % 2) ? c_line1:c_line2); painter.drawText( 0, y+4, 120, 20, Qt::AlignLeft, query.value(2).toString()); painter.drawText(120, y+4, 260, 20, Qt::AlignLeft, query.value(0).toString()); painter.drawText(380, y+4, 80, 20, Qt::AlignLeft, h_form[query.value(1).toInt()]); @@ -147,20 +155,109 @@ query.next(); y += 20; } - painter.fillRect( 0, y, 735, 20, QColor(255, 150, 100, 255)); + painter.fillRect( 0, y, 735, 20, c_header); painter.drawText( 0, y+4, 100, 20, Qt::AlignLeft, tr("Total")); w = QString("%1 €").arg(tot_hops, 8, 'f', 2); painter.drawText(655, y+4, 80, 20, Qt::AlignRight, w); y += 20; - qDebug() << " * " << y; + /* Yeasts supplies */ query.exec("SELECT name,laboratory,product_id,form,inventory,cost FROM inventory_yeasts WHERE inventory > 0 ORDER BY laboratory,product_id"); query.first(); - qDebug() << "yeasts" << query.size(); + if ((y + 80 + (query.size() * 20)) > painter.device()->height()) { /* Rows + header + footer + blank */ + printer->newPage(); + printHeader(&painter); + y = 120; + } else { + y += 40; + } + painter.setFont(QFont("Helvetica", 9, QFont::Bold)); + painter.setPen(Qt::black); + painter.fillRect( 0, y, 735, 20, c_header); + painter.drawText( 0, y+4, 120, 20, Qt::AlignLeft, tr("Laboratory")); + painter.drawText(120, y+4, 120, 20, Qt::AlignLeft, tr("Product")); + painter.drawText(240, y+4, 220, 20, Qt::AlignLeft, tr("Yeast")); + painter.drawText(460, y+4, 115, 20, Qt::AlignRight, tr("Stock")); + painter.drawText(575, y+4, 80, 20, Qt::AlignRight, tr("Price/Kg")); + painter.drawText(655, y+4, 80, 20, Qt::AlignRight, tr("Value")); + y += 20; + painter.setFont(QFont("Helvetica", 9, QFont::Normal)); + for (int i = 0; i < query.size(); i++) { + if ((y + 20) > painter.device()->height()) { + printer->newPage(); + printHeader(&painter); + y = 120; + } + painter.fillRect( 0, y, 735, 20, (i % 2) ? c_line1:c_line2); + painter.drawText( 0, y+4, 120, 20, Qt::AlignLeft, query.value(1).toString()); + painter.drawText(120, y+4, 120, 20, Qt::AlignLeft, query.value(2).toString()); + painter.drawText(240, y+4, 220, 20, Qt::AlignLeft, query.value(0).toString()); + if (query.value(3).toInt() == 0) + w = QString("%1 %2").arg(query.value(4).toDouble(), 10, 'f', 1).arg(y_form[query.value(3).toInt()]); + else + w = QString("%1 %2").arg(query.value(4).toDouble() * 1000.0, 10, 'f', 1).arg(y_form[query.value(3).toInt()]); + painter.drawText(460, y+4, 115, 20, Qt::AlignRight, w); + w = QString("%1 €").arg(query.value(5).toDouble(), 8, 'f', 2); + painter.drawText(575, y+4, 80, 20, Qt::AlignRight, w); + w = QString("%1 €").arg(query.value(4).toDouble() * query.value(5).toDouble(), 8, 'f', 2); + tot_yeasts += (query.value(4).toDouble() * query.value(5).toDouble()); + painter.drawText(655, y+4, 80, 20, Qt::AlignRight, w); + query.next(); + y += 20; + } + painter.fillRect( 0, y, 735, 20, c_header); + painter.drawText( 0, y+4, 100, 20, Qt::AlignLeft, tr("Total")); + w = QString("%1 €").arg(tot_yeasts, 8, 'f', 2); + painter.drawText(655, y+4, 80, 20, Qt::AlignRight, w); + y += 20; + /* Miscs supplies */ query.exec("SELECT name,type,amount_is_weight,inventory,cost FROM inventory_miscs WHERE inventory > 0 ORDER BY type,name"); query.first(); - qDebug() << "miscs" << query.size(); + if ((y + 80 + (query.size() * 20)) > painter.device()->height()) { /* Rows + header + footer + blank */ + printer->newPage(); + printHeader(&painter); + y = 120; + } else { + y += 40; + } + painter.setFont(QFont("Helvetica", 9, QFont::Bold)); + painter.setPen(Qt::black); + painter.fillRect( 0, y, 735, 20, c_header); + painter.drawText( 0, y+4, 120, 20, Qt::AlignLeft, tr("Type")); + painter.drawText(120, y+4, 340, 20, Qt::AlignLeft, tr("Ingredient")); + painter.drawText(460, y+4, 115, 20, Qt::AlignRight, tr("Stock")); + painter.drawText(575, y+4, 80, 20, Qt::AlignRight, tr("Price/Kg")); + painter.drawText(655, y+4, 80, 20, Qt::AlignRight, tr("Value")); + y += 20; + painter.setFont(QFont("Helvetica", 9, QFont::Normal)); + for (int i = 0; i < query.size(); i++) { + if ((y + 20) > painter.device()->height()) { + printer->newPage(); + printHeader(&painter); + y = 120; + } + painter.fillRect( 0, y, 735, 20, (i % 2) ? c_line1:c_line2); + painter.drawText( 0, y+4, 120, 20, Qt::AlignLeft, m_types[query.value(1).toInt()]); + painter.drawText(120, y+4, 340, 20, Qt::AlignLeft, query.value(0).toString()); + if (query.value(2).toInt()) + w = QString("%1 gr").arg(query.value(3).toDouble() * 1000.0, 10, 'f', 1); + else + w = QString("%1 ml").arg(query.value(3).toDouble() * 1000.0, 10, 'f', 1); + painter.drawText(460, y+4, 115, 20, Qt::AlignRight, w); + w = QString("%1 €").arg(query.value(4).toDouble(), 8, 'f', 2); + painter.drawText(575, y+4, 80, 20, Qt::AlignRight, w); + w = QString("%1 €").arg(query.value(3).toDouble() * query.value(4).toDouble(), 8, 'f', 2); + tot_miscs += (query.value(3).toDouble() * query.value(4).toDouble()); + painter.drawText(655, y+4, 80, 20, Qt::AlignRight, w); + query.next(); + y += 20; + } + painter.fillRect( 0, y, 735, 20, c_header); + painter.drawText( 0, y+4, 100, 20, Qt::AlignLeft, tr("Total")); + w = QString("%1 €").arg(tot_miscs, 8, 'f', 2); + painter.drawText(655, y+4, 80, 20, Qt::AlignRight, w); + y += 20; } @@ -169,17 +266,36 @@ -void PrinterDialog::printHeader(QPainter *painter, QString title) +void PrinterDialog::printHeader(QPainter *painter) { - QSqlQuery query("SELECT brewery_logo, brewery_name FROM profile_setup"); + QSqlQuery query("SELECT brewery_logo,brewery_name FROM profile_setup"); query.first(); QByteArray logoByteArray = query.value(0).toByteArray(); QPixmap outPixmap = QPixmap(); outPixmap.loadFromData(logoByteArray); - painter->drawPixmap(0, 0, 120, 120, outPixmap); + int w = outPixmap.width(); + int h = outPixmap.height(); + /* Make sure to keep the logo aspect ratio */ + if (w == h) { + painter->drawPixmap(0, 0, 100, 100, outPixmap); + } else if (w > h) { + painter->drawPixmap(0, 0, 100, (h * 100) / w, outPixmap); + } else { + painter->drawPixmap(0, 0, (w * 100) / h, 100, outPixmap); + } - painter->setFont(QFont("Helvetica", 18, QFont::Bold)); - painter->drawText( 150, 0, 500, 40, Qt::AlignLeft, title + " " + query.value(1).toString()); + /* The fat header line */ + painter->setFont(QFont("Helvetica",18, QFont::Bold)); + if (p_job == PR_SUPPLIES) { + painter->drawText(120, 0, 500, 40, Qt::AlignLeft, tr("Inventory") + " " + query.value(1).toString()); + } else { + painter->drawText(120, 0, 500, 40, Qt::AlignLeft, "?? " + query.value(1).toString()); + } + /* The first normal header line */ + painter->setFont(QFont("Helvetica",10, QFont::Normal)); + painter->drawText(120,35, 80, 20, Qt::AlignLeft, tr("Date and time")); + painter->drawText(200,35, 400, 20, Qt::AlignLeft, ": " + QDateTime::currentDateTime().toString("dd-MM-yyyy hh:mm")); + /* The report itself may print more lines from y = 55. */ } diff -r ff7b3a41c9b5 -r d36879f13d32 src/PrinterDialog.h --- a/src/PrinterDialog.h Sun Mar 13 22:56:22 2022 +0100 +++ b/src/PrinterDialog.h Mon Mar 14 14:00:28 2022 +0100 @@ -36,7 +36,7 @@ int p_job; int p_rec; - void printHeader(QPainter *painter, QString title); + void printHeader(QPainter *painter); }; #endif