diff --git a/src/Lib/receipts_handler.cpp b/src/Lib/receipts_handler.cpp old mode 100755 new mode 100644 index c7f0f1b..69120fa --- a/src/Lib/receipts_handler.cpp +++ b/src/Lib/receipts_handler.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2014-2016 Markus Prasser + * Copyright 2014-2018 Markus Prasser, Tobias Weiss * * This file is part of Labcontrol. * @@ -24,57 +24,58 @@ #include "receipts_handler.h" #include "settings.h" -extern std::unique_ptr< lc::Settings > settings; - -lc::ReceiptsHandler::ReceiptsHandler( const QString &argZTreeDataTargetPath, - bool argPrintReceiptsForLocalClients, - const QString &argAnonymousReceiptsPlaceholder, - const QString &argLatexHeaderName, - QObject *argParent ) : - QObject{ argParent }, - anonymousReceiptsPlaceholder{ argAnonymousReceiptsPlaceholder }, - dateString{ QDateTime::currentDateTime().toString( "yyMMdd_hhmm" ) }, - expectedPaymentFileName{ dateString + ".pay" }, - expectedPaymentFilePath{ argZTreeDataTargetPath + "/" + dateString + ".pay" }, - latexHeaderName{ argLatexHeaderName }, - paymentFile{ expectedPaymentFilePath }, - printReceiptsForLocalClients{ argPrintReceiptsForLocalClients }, - timer{ new QTimer{ this } }, - zTreeDataTargetPath{ argZTreeDataTargetPath } +extern std::unique_ptr settings; + +lc::ReceiptsHandler::ReceiptsHandler(const QString &argZTreeDataTargetPath, + bool argPrintReceiptsForLocalClients, + const QString &argAnonymousReceiptsPlaceholder, + const QString &argLatexHeaderName, + QObject *argParent) : + QObject{argParent}, + anonymousReceiptsPlaceholder{argAnonymousReceiptsPlaceholder}, + dateString{QDateTime::currentDateTime().toString("yyMMdd_hhmm")}, + expectedPaymentFileName{dateString + ".pay"}, + expectedPaymentFilePath{argZTreeDataTargetPath + "/" + dateString + ".pay"}, + latexHeaderName{argLatexHeaderName}, + paymentFile{expectedPaymentFilePath}, + printReceiptsForLocalClients{argPrintReceiptsForLocalClients}, + timer{new QTimer{this}}, +zTreeDataTargetPath{argZTreeDataTargetPath} { qDebug() << "Expected payment file name is:" << expectedPaymentFilePath; // Create a QTimer regularly checking if the payment file was created and print it if so - connect( timer, &QTimer::timeout, - this, &ReceiptsHandler::PrintReceipts ); - timer->start( 2000 ); + connect(timer, &QTimer::timeout, + this, &ReceiptsHandler::PrintReceipts); + timer->start(2000); } -lc::ReceiptsHandler::ReceiptsHandler( const QString &argZTreeDataTargetPath, - bool argPrintReceiptsForLocalClients, - const QString &argAnonymousReceiptsPlaceholder, - const QString &argLatexHeaderName, - const QString &argDateString, QObject *argParent ) : - QObject{ argParent }, - anonymousReceiptsPlaceholder{ argAnonymousReceiptsPlaceholder }, - dateString{ argDateString }, - expectedPaymentFileName{ argDateString + ".pay" }, - expectedPaymentFilePath{ argZTreeDataTargetPath + "/" + argDateString + ".pay" }, - latexHeaderName{ argLatexHeaderName }, - paymentFile{ expectedPaymentFilePath }, - printReceiptsForLocalClients{ argPrintReceiptsForLocalClients }, - zTreeDataTargetPath{ argZTreeDataTargetPath } +lc::ReceiptsHandler::ReceiptsHandler(const QString &argZTreeDataTargetPath, + bool argPrintReceiptsForLocalClients, + const QString &argAnonymousReceiptsPlaceholder, + const QString &argLatexHeaderName, + const QString &argDateString, QObject *argParent) : + QObject{argParent}, + anonymousReceiptsPlaceholder{argAnonymousReceiptsPlaceholder}, + dateString{argDateString}, + expectedPaymentFileName{argDateString + ".pay"}, + expectedPaymentFilePath{argZTreeDataTargetPath + "/" + argDateString + ".pay"}, + latexHeaderName{argLatexHeaderName}, + paymentFile{expectedPaymentFilePath}, + printReceiptsForLocalClients{argPrintReceiptsForLocalClients}, + zTreeDataTargetPath{argZTreeDataTargetPath} { qDebug() << "Expected payment file name is:" << expectedPaymentFilePath; PrintReceipts(); } -void lc::ReceiptsHandler::PrintReceipts() { +void lc::ReceiptsHandler::PrintReceipts() +{ // If the payment file exists, print it - if ( paymentFile.exists() ) { + if (paymentFile.exists()) { qDebug() << "The payment file has been created and will be printed"; - if ( timer ) { + if (timer) { timer->stop(); } @@ -82,28 +83,30 @@ void lc::ReceiptsHandler::PrintReceipts() { } } -void lc::ReceiptsHandler::CreateReceiptsFromPaymentFile() { +void lc::ReceiptsHandler::CreateReceiptsFromPaymentFile() +{ // Get the data needed for receipts creation from the payment file QVector *rawParticipantsData = nullptr; rawParticipantsData = GetParticipantsDataFromPaymentFile(); - for ( int i = 0; i < rawParticipantsData->size(); i++ ) { - qDebug() << "Payment file line" << QString::number( i ) << ":\t" << rawParticipantsData->at( i ); + for (int i = 0; i < rawParticipantsData->size(); i++) { + qDebug() << "Payment file line" << QString::number(i) + << ":\t" << rawParticipantsData->at(i); } // Extract the data of the participant's whose receipts shall be printed /* The tab separated fields in the payment file are: * SUBJECT COMPUTER INTERESTED NAME PROFIT SIGNATURE */ - QVector *participants = new QVector; + QVector *participants = new QVector; double overall_payoff = 0.0; - for ( QVector::iterator it = rawParticipantsData->begin(); it != rawParticipantsData->end() - 1; ++it ) { + for (QVector::iterator it = rawParticipantsData->begin(); + it != rawParticipantsData->end() - 1; ++it) { // Split the lines containing the participants' data into their inidivual parts QStringList temp_participant_data = it->split('\t', QString::KeepEmptyParts); - qDebug() << temp_participant_data.join( " - " ); - if ( !printReceiptsForLocalClients && temp_participant_data.at( 3 ).contains( "local" ) ) { - qDebug() << "Receipt for local client" << temp_participant_data.at( 1 ) << "will not be printed."; - } - else { + qDebug() << temp_participant_data.join(" - "); + if (!printReceiptsForLocalClients && temp_participant_data.at(3).contains("local")) { + qDebug() << "Receipt for local client" << temp_participant_data.at(1) << "will not be printed."; + } else { // Create a new struct instance for participant data and fill it paymentEntry_t *participant = new paymentEntry_t; participant->computer = temp_participant_data.at(1); @@ -117,14 +120,14 @@ void lc::ReceiptsHandler::CreateReceiptsFromPaymentFile() { rawParticipantsData = nullptr; // Make receipts overview anonymous if requested (at this stage just names are removed, so that the overview still containts the client names - if ( !anonymousReceiptsPlaceholder.isEmpty() ) { - MakeReceiptsAnonymous( participants, false ); + if (!anonymousReceiptsPlaceholder.isEmpty()) { + MakeReceiptsAnonymous(participants, false); } // Load the LaTeX header QString *latexText = LoadLatexHeader(); - if ( latexText == nullptr ) { - for ( auto s : *participants ) { + if (latexText == nullptr) { + for (auto s : *participants) { delete s; } delete participants; @@ -133,12 +136,13 @@ void lc::ReceiptsHandler::CreateReceiptsFromPaymentFile() { } // Write the comprehension table - latexText->append( "\n\\COMPREHENSION{\n" ); + latexText->append("\n\\COMPREHENSION{\n"); unsigned short int zeile = 0; - for ( auto s : *participants ) { - latexText->append( expectedPaymentFileName + " & " + s->computer + " & " + s->name + " & " + QString::number( s->payoff, 'f', 2 ) + " \\EUR\\\\\n" ); - if ( zeile % 2 == 0 ) { - latexText->append( "\\rowcolor[gray]{0.9}\n" ); + for (auto s : *participants) { + latexText->append(expectedPaymentFileName + " & " + s->computer + " & " + s->name + " & " + + QString::number(s->payoff, 'f', 2) + " \\EUR\\\\\n"); + if (zeile % 2 == 0) { + latexText->append("\\rowcolor[gray]{0.9}\n"); } ++zeile; } @@ -146,20 +150,21 @@ void lc::ReceiptsHandler::CreateReceiptsFromPaymentFile() { // MISSING: Appending show up entries to the overview // Make also the clients on the receipts anonymous. This is done as second step, so that the beforehand created overview still contains the clients - if ( !anonymousReceiptsPlaceholder.isEmpty() ) { - MakeReceiptsAnonymous( participants, true ); + if (!anonymousReceiptsPlaceholder.isEmpty()) { + MakeReceiptsAnonymous(participants, true); } // Add the LaTeX middle sequence - latexText->append( "}{" + QString::number( overall_payoff, 'f', 2 ) + "}\n\n%%Einzelquittungen\n" ); + latexText->append("}{" + QString::number(overall_payoff, 'f', 2) + "}\n\n%%Einzelquittungen\n"); // Write the single receipts - for ( auto s : *participants ) { - if ( s->payoff >= 0 ) { - latexText->append( "\\GAINRECEIPT{" + expectedPaymentFileName + "}{" + s->computer + "}{" + s->name + "}{" + QString::number( s->payoff, 'f', 2 ) + "}\n" ); - } - else { - latexText->append( "\\LOSSRECEIPT{" + expectedPaymentFileName + "}{" + s->computer + "}{" + s->name + "}{" + QString::number( s->payoff, 'f', 2 ) + "}\n" ); + for (auto s : *participants) { + if (s->payoff >= 0) { + latexText->append("\\GAINRECEIPT{" + expectedPaymentFileName + "}{" + s->computer + "}{" + s->name + + "}{" + QString::number(s->payoff, 'f', 2) + "}\n"); + } else { + latexText->append("\\LOSSRECEIPT{" + expectedPaymentFileName + "}{" + s->computer + "}{" + s->name + + "}{" + QString::number(s->payoff, 'f', 2) + "}\n"); } delete s; } @@ -172,44 +177,47 @@ void lc::ReceiptsHandler::CreateReceiptsFromPaymentFile() { qDebug() << *latexText; // Create the tex file - QFile *texFile = new QFile{ zTreeDataTargetPath + "/" + dateString + ".tex" }; + QFile *texFile = new QFile{zTreeDataTargetPath + "/" + dateString + ".tex"}; qDebug() << "Tex file" << texFile->fileName() << "will be created for receipts printing."; // Clean up any already existing files - if ( texFile->exists() ) { - if ( !texFile->remove() ) { - QMessageBox messageBox( QMessageBox::Critical, "Tex file removing failed", "There already exists a tex file at '" + texFile->fileName() - + "' which cannot be removed. The creation of the receipts printout may fail.", QMessageBox::Ok ); + if (texFile->exists()) { + if (!texFile->remove()) { + QMessageBox messageBox(QMessageBox::Critical, "Tex file removing failed", + "There already exists a tex file at '" + texFile->fileName() + + "' which cannot be removed. The creation of the receipts printout may fail.", QMessageBox::Ok); messageBox.exec(); } } // Create a new file - if ( !texFile->open( QIODevice::Text | QIODevice::WriteOnly ) ) { - QMessageBox messageBox( QMessageBox::Critical, "Tex file creation failed", "The creation of the tex file for receipts printing at '" + texFile->fileName() - + "' failed. Receipts printing will not work.", QMessageBox::Ok ); + if (!texFile->open(QIODevice::Text | QIODevice::WriteOnly)) { + QMessageBox messageBox( QMessageBox::Critical, "Tex file creation failed", + "The creation of the tex file for receipts printing at '" + texFile->fileName() + + "' failed. Receipts printing will not work.", QMessageBox::Ok); messageBox.exec(); return; } // Open a QTextStream to write to the file - QTextStream out( texFile ); + QTextStream out(texFile); out << *latexText; delete latexText; latexText = nullptr; - receiptsPrinter = new ReceiptsPrinter{ dateString, zTreeDataTargetPath, this }; + receiptsPrinter = new ReceiptsPrinter{dateString, zTreeDataTargetPath, this}; receiptsPrinter->start(); - connect( receiptsPrinter, &ReceiptsPrinter::PrintingFinished, - this, &ReceiptsHandler::DeleteReceiptsPrinterInstance ); - connect( receiptsPrinter, &ReceiptsPrinter::ErrorOccurred, - this, &ReceiptsHandler::DisplayMessageBox ); + connect(receiptsPrinter, &ReceiptsPrinter::PrintingFinished, + this, &ReceiptsHandler::DeleteReceiptsPrinterInstance); + connect(receiptsPrinter, &ReceiptsPrinter::ErrorOccurred, + this, &ReceiptsHandler::DisplayMessageBox); // Clean up texFile->close(); delete texFile; } -void lc::ReceiptsHandler::DeleteReceiptsPrinterInstance() { +void lc::ReceiptsHandler::DeleteReceiptsPrinterInstance() +{ receiptsPrinter->quit(); receiptsPrinter->wait(); receiptsPrinter->deleteLater(); @@ -219,33 +227,37 @@ void lc::ReceiptsHandler::DeleteReceiptsPrinterInstance() { emit PrintingFinished(); } -void lc::ReceiptsHandler::DisplayMessageBox( QString *argErrorMessage, QString *argHeading ) { - QMessageBox messageBox( QMessageBox::Warning, *argHeading, *argErrorMessage, QMessageBox::Ok ); +void lc::ReceiptsHandler::DisplayMessageBox(QString *argErrorMessage, + QString *argHeading) +{ + QMessageBox messageBox(QMessageBox::Warning, *argHeading, + *argErrorMessage, QMessageBox::Ok); delete argHeading; delete argErrorMessage; messageBox.exec(); } -QVector *lc::ReceiptsHandler::GetParticipantsDataFromPaymentFile() { +QVector *lc::ReceiptsHandler::GetParticipantsDataFromPaymentFile() +{ // Create the vector to store the single lines of the file QVector *participantsData = new QVector; // Open the payment file for reading and create a QTextStream - paymentFile.open( QIODevice::ReadOnly | QIODevice::Text ); - QTextStream in( &paymentFile ); - in.setCodec( "ISO 8859-1" ); + paymentFile.open(QIODevice::ReadOnly | QIODevice::Text); + QTextStream in(&paymentFile); + in.setCodec("ISO 8859-1"); // Read the file line by line and store them in the vector - while ( true ) { + while (true) { QString line = in.readLine(); - if ( line.isNull() ) { + if (line.isNull()) { break; } - participantsData->append( line ); + participantsData->append(line); } // Remove the first line, since it is not needed - participantsData->erase( participantsData->begin() ); + participantsData->erase(participantsData->begin()); // Close the file afterwards paymentFile.close(); @@ -253,38 +265,44 @@ QVector *lc::ReceiptsHandler::GetParticipantsDataFromPaymentFile() { return participantsData; } -QString *lc::ReceiptsHandler::LoadLatexHeader() { +QString *lc::ReceiptsHandler::LoadLatexHeader() +{ // Prepare all facilities to read the latex header file - QFile latexHeaderFile( settings->lcDataDir + "/" + latexHeaderName + "_header.tex" ); - if ( !latexHeaderFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) { - QMessageBox messageBox{ QMessageBox::Critical, tr( "LaTeX header could not be loaded" ), - tr( "The LaTeX header at '%1/%2_header.tex' could not be loaded. Receipts printing will not work." ) - .arg( settings->lcDataDir ).arg( latexHeaderName ), QMessageBox::Ok }; + QFile latexHeaderFile(settings->lcDataDir + "/" + latexHeaderName + "_header.tex"); + if (!latexHeaderFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + QMessageBox messageBox{QMessageBox::Critical, + tr("LaTeX header could not be loaded"), + tr("The LaTeX header at '%1/%2_header.tex' could" + " not be loaded. Receipts printing will not work.") + .arg(settings->lcDataDir).arg(latexHeaderName), QMessageBox::Ok}; messageBox.exec(); return nullptr; } - QTextStream in( &latexHeaderFile ); + QTextStream in(&latexHeaderFile); QString *header = nullptr; - header = new QString( in.readAll() ); + header = new QString(in.readAll()); latexHeaderFile.close(); return header; } -void lc::ReceiptsHandler::MakeReceiptsAnonymous( QVector *argDataVector, bool argAlsoAnonymizeClients ) { - if ( !argAlsoAnonymizeClients ) { +void lc::ReceiptsHandler::MakeReceiptsAnonymous(QVector *argDataVector, + bool argAlsoAnonymizeClients) +{ + if (!argAlsoAnonymizeClients) { qDebug() << "Names are made anonymous"; - for ( QVector< paymentEntry_t* >::iterator it = argDataVector->begin(); it != argDataVector->end(); ++it ) { - ( *it )->name = anonymousReceiptsPlaceholder; + for (QVector::iterator it = argDataVector->begin(); it != argDataVector->end(); + ++it) { + (*it)->name = anonymousReceiptsPlaceholder; + } + } else { + qDebug() << "Clients and names are made anonymous"; + for (QVector::iterator it = argDataVector->begin(); it != argDataVector->end(); + ++it) { + (*it)->name = anonymousReceiptsPlaceholder; + (*it)->computer = "\\hspace{1cm}"; } - } - else { - qDebug() << "Clients and names are made anonymous"; - for ( QVector< paymentEntry_t* >::iterator it = argDataVector->begin(); it != argDataVector->end(); ++it ) { - ( *it )->name = anonymousReceiptsPlaceholder; - ( *it )->computer = "\\hspace{1cm}"; - } } } diff --git a/src/Lib/receipts_handler.h b/src/Lib/receipts_handler.h old mode 100755 new mode 100644 index 68b0841..8260103 --- a/src/Lib/receipts_handler.h +++ b/src/Lib/receipts_handler.h @@ -1,5 +1,5 @@ /* - * Copyright 2014-2016 Markus Prasser + * Copyright 2014-2018 Markus Prasser, Tobias Weiss * * This file is part of Labcontrol. * @@ -36,25 +36,30 @@ namespace lc { /*! This class represents a single payoff entry which will be used in the receipts creation process. Multiple instances of this will be used to represent the individual participants' outcomes. */ -struct paymentEntry_t {QString computer; QString name; double payoff;}; +struct paymentEntry_t { + QString computer; + QString name; + double payoff; +}; //! A class to handle receipts printing. /*! This class is element of every session and is used to handle the receipts printing. */ -class ReceiptsHandler : public QObject { +class ReceiptsHandler : public QObject +{ Q_OBJECT public: - explicit ReceiptsHandler( const QString &argZTreeDataTargetPath, - bool argPrintReceiptsForLocalClients, - const QString &argAnonymousReceiptsPlaceholder, - const QString &argLatexHeaderName, QObject *argParent = nullptr ); - explicit ReceiptsHandler( const QString &argZTreeDataTargetPath, - bool argPrintReceiptsForLocalClients, - const QString &argAnonymousReceiptsPlaceholder, - const QString &argLatexHeaderName, - const QString &argDateString, QObject *argParent = nullptr ); + explicit ReceiptsHandler(const QString &argZTreeDataTargetPath, + bool argPrintReceiptsForLocalClients, + const QString &argAnonymousReceiptsPlaceholder, + const QString &argLatexHeaderName, QObject *argParent = nullptr); + explicit ReceiptsHandler(const QString &argZTreeDataTargetPath, + bool argPrintReceiptsForLocalClients, + const QString &argAnonymousReceiptsPlaceholder, + const QString &argLatexHeaderName, + const QString &argDateString, QObject *argParent = nullptr); signals: void PrintingFinished(); @@ -74,20 +79,31 @@ private: void CreateReceiptsFromPaymentFile(); QVector *GetParticipantsDataFromPaymentFile(); QString *LoadLatexHeader(); - void MakeReceiptsAnonymous( QVector *argDataVector, bool argAlsoAnonymizeClients ); + void MakeReceiptsAnonymous(QVector *argDataVector, + bool argAlsoAnonymizeClients); - const QString anonymousReceiptsPlaceholder; //!< Placeholder which shall be inserted for participant names if anonymous printing is desired (QString != "") - const QString dateString; //!< The expected date string of the payment file in form 'yyMMdd_hhmm' - const QString expectedPaymentFileName; //!< The name of the expected payment file - const QString expectedPaymentFilePath; //!< The path of the expected payment file - const QString latexHeaderName; //!< The name of the chosen LaTeX header template - QFile paymentFile; //!< A pointer to the '*.pay' file being watched for existance and starting the printing process - const bool printReceiptsForLocalClients; //!< Stores if receipts shall be printed for local clients - ReceiptsPrinter *receiptsPrinter = nullptr; //!< Creates new thread for receipts printing - QTimer *timer = nullptr; //!< Used for regular checking if the payment file was created - const QString zTreeDataTargetPath; //!< A reference to the data target path stored in the session class instance + //! Placeholder which shall be inserted for participant names if anonymous printing is desired (QString != "") + const QString anonymousReceiptsPlaceholder; + //! The expected date string of the payment file in form 'yyMMdd_hhmm' + const QString dateString; + //! The name of the expected payment file + const QString expectedPaymentFileName; + //! The path of the expected payment file + const QString expectedPaymentFilePath; + //! The name of the chosen LaTeX header template + const QString latexHeaderName; + //! A pointer to the '*.pay' file being watched for existance and starting the printing process + QFile paymentFile; + //! Stores if receipts shall be printed for local clients + const bool printReceiptsForLocalClients; + //! Creates new thread for receipts printing + ReceiptsPrinter *receiptsPrinter = nullptr; + //! Used for regular checking if the payment file was created + QTimer *timer = nullptr; + //! A reference to the data target path stored in the session class instance + const QString zTreeDataTargetPath; }; -} +} // namespace lc #endif // RECEIPTS_HANDLER_H