src/PrinterDialog.cpp

changeset 53
d36879f13d32
parent 52
ff7b3a41c9b5
child 54
bba7be9034be
--- 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. */
 }
 
 

mercurial