void dspAPOpenItemsByVendor::sViewVoucher() { int voheadid; int poheadid; XSqlQuery open; open.prepare("SELECT vohead_id, COALESCE(pohead_id, -1) AS pohead_id " "FROM vohead LEFT OUTER JOIN pohead ON (pohead_id=vohead_pohead_id) " "WHERE vohead_number=:vohead_number;"); open.bindValue(":vohead_number", list()->currentItem()->text("apopen_docnumber")); open.exec(); if (open.first()) { voheadid = open.value("vohead_id").toInt(); poheadid = open.value("pohead_id").toInt(); } else return; if (!checkSitePrivs(voheadid)) return; ParameterList params; params.append("mode", "view"); params.append("vohead_id", voheadid); if (poheadid == -1) { miscVoucher *newdlg = new miscVoucher(); newdlg->set(params); omfgThis->handleNewWindow(newdlg); } else { voucher *newdlg = new voucher(); newdlg->set(params); omfgThis->handleNewWindow(newdlg); } }
void closePurchaseOrder::sClosePo() { XSqlQuery closeClosePo; closeClosePo.prepare("SELECT closePo(:pohead_id) AS result;"); QList<XTreeWidgetItem*>selected = _po->selectedItems(); for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { closeClosePo.bindValue(":pohead_id", ((XTreeWidgetItem*)selected[i])->id()); closeClosePo.exec(); } } if (_captive) accept(); else { _close->setText(tr("&Close")); sFillList(); } }
void openSalesOrders::sAddToPackingListBatch() { if (!checkSitePrivs()) return; q.prepare("SELECT addToPackingListBatch(:sohead_id) AS result;"); q.bindValue(":sohead_id", _so->id()); q.exec(); if (q.first()) { int result = q.value("result").toInt(); if (result < 0) { systemError(this, storedProcErrorLookup("addToPackingListBatch", result), __FILE__, __LINE__); return; } } else if (q.lastError().type() != QSqlError::NoError) { systemError(this, q.lastError().databaseText(), __FILE__, __LINE__); return; } }
void openVouchers::sDelete() { if (QMessageBox::question(this, tr("Delete Selected Vouchers"), tr("<p>Are you sure that you want to delete the " "selected Vouchers?"), QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::Yes) { q.prepare("SELECT deleteVoucher(:vohead_id) AS result;"); QList<XTreeWidgetItem*>selected = _vohead->selectedItems(); for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { int id = ((XTreeWidgetItem*)(selected[i]))->id(); q.bindValue(":vohead_id", id); q.exec(); if (q.first()) { int result = q.value("result").toInt(); if (result < 0) { systemError(this, storedProcErrorLookup("deleteVoucher", result), __FILE__, __LINE__); } } else if (q.lastError().type() != QSqlError::NoError) { systemError(this, q.lastError().databaseText(), __FILE__, __LINE__); } } } omfgThis->sVouchersUpdated(); } }
void unpostedInvoices::sDelete() { if ( QMessageBox::warning( this, tr("Delete Selected Invoices"), tr("<p>Are you sure that you want to delete the " "selected Invoices?"), tr("Delete"), tr("Cancel"), QString::null, 1, 1 ) == 0) { q.prepare("SELECT deleteInvoice(:invchead_id) AS result;"); QList<XTreeWidgetItem*> selected = _invchead->selectedItems(); for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { q.bindValue(":invchead_id", ((XTreeWidgetItem*)(selected[i]))->id()); q.exec(); if (q.first()) { int result = q.value("result").toInt(); if (result < 0) { systemError(this, storedProcErrorLookup("deleteInvoice", result), __FILE__, __LINE__); } } else if (q.lastError().type() != QSqlError::NoError) systemError(this, tr("Error deleting Invoice %1\n").arg(selected[i]->text(0)) + q.lastError().databaseText(), __FILE__, __LINE__); } } omfgThis->sInvoicesUpdated(-1, TRUE); omfgThis->sBillingSelectionUpdated(-1, -1); } }
void returnAuthorizationWorkbench::sProcess() { if (!checkSitePrivs(_radue->id())) return; bool _post = ((_radue->altId() > 1) || (_radue->altId() == 1 && _postmemos->isChecked())) ; q.prepare("SELECT createRaCreditMemo(:rahead_id,:post) AS result;"); q.bindValue(":rahead_id",_radue->id()); q.bindValue(":post",QVariant(_post)); q.exec(); if (q.first()) { int cmheadid = q.value("result").toInt(); if (cmheadid < 0) { systemError(this, storedProcErrorLookup("createRaCreditMemo", cmheadid), __FILE__, __LINE__); return; } q.prepare( "SELECT cmhead_number " "FROM cmhead " "WHERE (cmhead_id=:cmhead_id);" ); q.bindValue(":cmhead_id", cmheadid); q.exec(); if (q.first()) { QMessageBox::information( this, tr("New Credit Memo Created"), tr("<p>A new CreditMemo has been created and " "assigned #%1") .arg(q.value("cmhead_number").toString())); if (_printmemo->isChecked()) { ParameterList params; params.append("cmhead_id", cmheadid); if (_post) params.append("posted"); printCreditMemo newdlg(this, "", TRUE); newdlg.set(params); newdlg.exec(); } if (_radue->altId() == 2) { ParameterList params; params.append("cmhead_id", cmheadid); returnAuthCheck newdlg(this, "", TRUE); newdlg.set(params); if (newdlg.exec() != XDialog::Rejected) sFillListDue(); } else if (_radue->altId() == 3) { ParameterList ccp; ccp.append("cmhead_id", cmheadid); MetaSQLQuery ccm = mqlLoad("creditMemoCreditCards", "detail"); XSqlQuery ccq = ccm.toQuery(ccp); if (ccq.first()) { int ccpayid = ccq.value("ccpay_id").toInt(); CreditCardProcessor *cardproc = CreditCardProcessor::getProcessor(); if (! cardproc) QMessageBox::critical(this, tr("Credit Card Processing Error"), CreditCardProcessor::errorMsg()); else if (! cardproc->errorMsg().isEmpty()) QMessageBox::critical(this, tr("Credit Card Processing Warning"), cardproc->errorMsg()); else { QString docnum = q.value("cmhead_number").toString(); QString refnum = ccq.value("cohead_number").toString(); int refid = -1; int returnValue = cardproc->credit(ccq.value("ccard_id").toInt(), -2, ccq.value("total").toDouble(), ccq.value("tax_in_cmcurr").toDouble(), ccq.value("cmhead_tax_id").isNull(), ccq.value("cmhead_freight").toDouble(), 0, ccq.value("cmhead_curr_id").toInt(), docnum, refnum, ccpayid, QString(), refid); if (returnValue < 0) QMessageBox::critical(this, tr("Credit Card Processing Error"), cardproc->errorMsg()); else if (returnValue > 0) QMessageBox::warning(this, tr("Credit Card Processing Warning"), cardproc->errorMsg()); else if (! cardproc->errorMsg().isEmpty()) QMessageBox::information(this, tr("Credit Card Processing Note"), cardproc->errorMsg()); } // requery regardless 'cause the new credit memo means nothing's "due" sFillListDue(); } else if (ccq.lastError().type() != QSqlError::NoError) { systemError(this, ccq.lastError().databaseText(), __FILE__, __LINE__); return; } else { QMessageBox::critical(this, tr("Credit Card Processing Error"), tr("Could not find a Credit Card to use for " "this Credit transaction.")); sFillListDue(); return; } } else sFillListDue(); } else if (q.lastError().type() != QSqlError::NoError) { systemError(this, q.lastError().databaseText(), __FILE__, __LINE__); return; } } else if (q.lastError().type() != QSqlError::NoError) { systemError(this, q.lastError().databaseText(), __FILE__, __LINE__); return; } }
void quotes::sConvert() { if (QMessageBox::question(this, tr("Convert Selected Quote(s)"), tr("<p>Are you sure that you want to convert " "the selected Quote(s) to Sales Order(s)?"), QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::Yes) { XSqlQuery convert; convert.prepare("SELECT convertQuote(:quhead_id) AS sohead_id;"); XSqlQuery prospectq; prospectq.prepare("SELECT convertProspectToCustomer(quhead_cust_id) AS result " "FROM quhead " "WHERE (quhead_id=:quhead_id);"); bool tryagain = false; QList<int> converted; do { int soheadid = -1; QList<XTreeWidgetItem*> selected = _quote->selectedItems(); QList<XTreeWidgetItem*> notConverted; for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { int quheadid = ((XTreeWidgetItem*)(selected[i]))->id(); convert.bindValue(":quhead_id", quheadid); convert.exec(); if (convert.first()) { soheadid = convert.value("sohead_id").toInt(); if (soheadid == -3) { if ((_metrics->value("DefaultSalesRep").toInt() > 0) && (_metrics->value("DefaultTerms").toInt() > 0) && (_metrics->value("DefaultCustType").toInt() > 0) && (_metrics->value("DefaultShipFormId").toInt() > 0) && (_privileges->check("MaintainCustomerMasters"))) { if (QMessageBox::question(this, tr("Quote for Prospect"), tr("<p>This Quote is for a Prospect, not " "a Customer. Do you want to convert " "the Prospect to a Customer using global " "default values?"), QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::Yes) { prospectq.bindValue(":quhead_id", quheadid); prospectq.exec(); if (prospectq.first()) { int result = prospectq.value("result").toInt(); if (result < 0) { systemError(this, storedProcErrorLookup("convertProspectToCustomer", result), __FILE__, __LINE__); notConverted.append(selected[i]); continue; } convert.exec(); if (convert.first()) { soheadid = convert.value("sohead_id").toInt(); if (soheadid < 0) { QMessageBox::warning(this, tr("Cannot Convert Quote"), storedProcErrorLookup("convertQuote", soheadid) .arg(selected[i] ? selected[i]->text(0) : "")); notConverted.append(selected[i]); continue; } } } else if (prospectq.lastError().type() != QSqlError::NoError) { systemError(this, prospectq.lastError().databaseText(), __FILE__, __LINE__); notConverted.append(selected[i]); continue; } } else { QMessageBox::information(this, tr("Quote for Prospect"), tr("<p>The prospect must be manually " "converted to customer from either the " "CRM Account or Customer windows before " "coverting this quote.")); notConverted.append(selected[i]); continue; } } else { QMessageBox::information(this, tr("Quote for Prospect"), tr("<p>The prospect must be manually " "converted to customer from either the " "CRM Account or Customer windows before " "coverting this quote.")); notConverted.append(selected[i]); continue; } } else if (soheadid < 0) { QMessageBox::warning(this, tr("Cannot Convert Quote"), storedProcErrorLookup("convertQuote", soheadid) .arg(selected[i] ? selected[i]->text(0) : "")); notConverted.append(selected[i]); continue; } converted << quheadid; omfgThis->sSalesOrdersUpdated(soheadid); salesOrder::editSalesOrder(soheadid, true); } else if (convert.lastError().type() != QSqlError::NoError) { notConverted.append(selected[i]); systemError(this, convert.lastError().databaseText(), __FILE__, __LINE__); continue; } } } if (notConverted.size() > 0) { failedPostList newdlg(this, "", true); newdlg.setLabel(tr("<p>The following Quotes could not be converted.")); newdlg.sSetList(notConverted, _quote->headerItem(), _quote->header()); tryagain = (newdlg.exec() == XDialog::Accepted); selected = notConverted; notConverted.clear(); } } while (tryagain); for (int i = 0; i < converted.size(); i++) { omfgThis->sQuotesUpdated(converted[i]); } } // if user wants to convert }
void unpostedCreditMemos::sPost() { bool changeDate = false; QDate newDate = QDate::currentDate(); if (_privileges->check("ChangeSOMemoPostDate")) { getGLDistDate newdlg(this, "", TRUE); newdlg.sSetDefaultLit(tr("Credit Memo Date")); if (newdlg.exec() == XDialog::Accepted) { newDate = newdlg.date(); changeDate = (newDate.isValid()); } else return; } XSqlQuery setDate; setDate.prepare("UPDATE cmhead SET cmhead_gldistdate=:distdate " "WHERE cmhead_id=:cmhead_id;"); QList<QTreeWidgetItem *> selected = _cmhead->selectedItems(); QList<QTreeWidgetItem *> triedToClosed; for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { int id = ((XTreeWidgetItem*)(selected[i]))->id(); if (changeDate) { setDate.bindValue(":distdate", newDate); setDate.bindValue(":cmhead_id", id); setDate.exec(); if (setDate.lastError().type() != QSqlError::NoError) { systemError(this, setDate.lastError().databaseText(), __FILE__, __LINE__); } } } } XSqlQuery rollback; rollback.prepare("ROLLBACK;"); XSqlQuery postq; postq.prepare("SELECT postCreditMemo(:cmhead_id, 0) AS result;"); bool tryagain = false; do { for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { int id = ((XTreeWidgetItem*)(selected[i]))->id(); XSqlQuery tx; tx.exec("BEGIN;"); // because of possible lot, serial, or location distribution cancelations postq.bindValue(":cmhead_id", id); postq.exec(); if (postq.first()) { int result = postq.value("result").toInt(); if (result < 0) { rollback.exec(); systemError( this, storedProcErrorLookup("postCreditMemo", result), __FILE__, __LINE__); return; } else { if (distributeInventory::SeriesAdjust(result, this) == XDialog::Rejected) { rollback.exec(); QMessageBox::information( this, tr("Post Credit Memo"), tr("Transaction Canceled") ); return; } q.exec("COMMIT;"); } } // contains() string is hard-coded in stored procedure else if (postq.lastError().databaseText().contains("post to closed period")) { rollback.exec(); if (changeDate) { triedToClosed = selected; break; } else triedToClosed.append(selected[i]); } else if (postq.lastError().type() != QSqlError::NoError) { rollback.exec(); systemError(this, tr("A System Error occurred posting Credit Memo#%1.\n%2") .arg(selected[i]->text(0)) .arg(postq.lastError().databaseText()), __FILE__, __LINE__); } } if (triedToClosed.size() > 0) { failedPostList newdlg(this, "", true); newdlg.sSetList(triedToClosed, _cmhead->headerItem(), _cmhead->header()); tryagain = (newdlg.exec() == XDialog::Accepted); selected = triedToClosed; triedToClosed.clear(); } } } while (tryagain); omfgThis->sCreditMemosUpdated(); }
void openVouchers::sPost() { bool changeDate = false; QDate newDate = QDate::currentDate(); if (_privileges->check("ChangeVOPostDate")) { getGLDistDate newdlg(this, "", TRUE); newdlg.sSetDefaultLit(tr("Distribution Date")); if (newdlg.exec() == XDialog::Accepted) { newDate = newdlg.date(); changeDate = (newDate.isValid()); } else return; } XSqlQuery setDate; setDate.prepare("UPDATE vohead SET vohead_gldistdate=:distdate " "WHERE vohead_id=:vohead_id;"); QList<XTreeWidgetItem*>selected = _vohead->selectedItems(); QList<XTreeWidgetItem*>triedToClosed; for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { int id = ((XTreeWidgetItem*)(selected[i]))->id(); if (changeDate) { setDate.bindValue(":distdate", newDate); setDate.bindValue(":vohead_id", id); setDate.exec(); if (setDate.lastError().type() != QSqlError::NoError) { systemError(this, setDate.lastError().databaseText(), __FILE__, __LINE__); } } } } XSqlQuery post; post.prepare("SELECT fetchJournalNumber('AP-VO') AS result;"); post.exec(); int journalNumber = 0; if(post.first()) journalNumber = post.value("result").toInt(); else { systemError(this, post.lastError().databaseText(), __FILE__, __LINE__); return; } post.prepare("SELECT postVoucher(:vohead_id, :journalNumber, FALSE) AS result;"); bool tryagain = false; do { for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { int id = ((XTreeWidgetItem*)(selected[i]))->id(); post.bindValue(":vohead_id", id); post.bindValue(":journalNumber", journalNumber); post.exec(); if (post.first()) { int result = post.value("result").toInt(); if (result < 0) systemError(this, storedProcErrorLookup("postVoucher", result), __FILE__, __LINE__); } // contains() string is hard-coded in stored procedure else if (post.lastError().databaseText().contains("post to closed period")) { if (changeDate) { triedToClosed = selected; break; } else triedToClosed.append(selected[i]); } else if (post.lastError().type() != QSqlError::NoError) { systemError(this, post.lastError().databaseText(), __FILE__, __LINE__); } } } if (triedToClosed.size() > 0) { failedPostList newdlg(this, "", true); newdlg.sSetList(triedToClosed, _vohead->headerItem(), _vohead->header()); tryagain = (newdlg.exec() == XDialog::Accepted); selected = triedToClosed; triedToClosed.clear(); } } while (tryagain); if (_printJournal->isChecked()) { ParameterList params; params.append("journalNumber", journalNumber); orReport report("PayablesJournal", params); if (report.isValid()) report.print(); else report.reportError(this); } omfgThis->sVouchersUpdated(); }
void openSalesOrders::sDelete() { if (!checkSitePrivs()) return; if ( QMessageBox::warning(this, tr("Delete Sales Order?"), tr("<p>Are you sure that you want to completely " "delete the selected Sales Order?"), QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::Yes) { q.prepare("SELECT deleteSo(:sohead_id) AS result;"); q.bindValue(":sohead_id", _so->id()); q.exec(); if (q.first()) { bool closeInstead = false; int result = q.value("result").toInt(); if (result == -4 && _privileges->check("ProcessCreditCards")) { if ( QMessageBox::question(this, tr("Cannot Delete Sales Order"), storedProcErrorLookup("deleteSo", result) + "<br>Would you like to refund the amount " "charged and close the Sales Order instead?", QMessageBox::Yes | QMessageBox::Default, QMessageBox::No) == QMessageBox::Yes) { CreditCardProcessor *cardproc = CreditCardProcessor::getProcessor(); if (! cardproc) QMessageBox::critical(this, tr("Credit Card Processing Error"), CreditCardProcessor::errorMsg()); else { XSqlQuery ccq; ccq.prepare("SELECT ccpay_ccard_id, ccpay_curr_id," " SUM(ccpay_amount * sense) AS amount," " SUM(ccpay_r_tax * sense) AS tax," " SUM(ccpay_r_shipping * sense) AS freight " "FROM (SELECT ccpay_ccard_id, ccpay_curr_id, " " CASE WHEN ccpay_status = 'C' THEN 1" " WHEN ccpay_status = 'R' THEN -1" " END AS sense," " ccpay_amount," " COALESCE(ccpay_r_tax::NUMERIC, 0) AS ccpay_r_tax," " COALESCE(ccpay_r_shipping::NUMERIC, 0) AS ccpay_r_shipping " " FROM ccpay, payco " " WHERE ((ccpay_id=payco_ccpay_id)" " AND (ccpay_status IN ('C', 'R'))" " AND (payco_cohead_id=:coheadid)) " " ) AS dummy " "GROUP BY ccpay_ccard_id, ccpay_curr_id;"); ccq.bindValue(":coheadid", _so->id()); ccq.exec(); if (ccq.first()) do { QString docnum = _so->currentItem()->text(0); QString refnum = docnum; int ccpayid = -1; int coheadid = _so->id(); int returnVal = cardproc->credit(ccq.value("ccpay_ccard_id").toInt(), -2, ccq.value("amount").toDouble(), ccq.value("tax").toDouble(), true, ccq.value("freight").toDouble(), 0, ccq.value("ccpay_curr_id").toInt(), docnum, refnum, ccpayid, "cohead", coheadid); if (returnVal < 0) { QMessageBox::critical(this, tr("Credit Card Processing Error"), cardproc->errorMsg()); return; } else if (returnVal > 0) { QMessageBox::warning(this, tr("Credit Card Processing Warning"), cardproc->errorMsg()); closeInstead = true; } else if (! cardproc->errorMsg().isEmpty()) { QMessageBox::information(this, tr("Credit Card Processing Note"), cardproc->errorMsg()); closeInstead = true; } } while (ccq.next()); else if (ccq.lastError().type() != QSqlError::NoError) { systemError(this, ccq.lastError().databaseText(), __FILE__, __LINE__); return; } else { systemError(this, tr("Could not find the ccpay records!"), __FILE__, __LINE__); return; } } } } else if (result == -1 || result == -5) { if ( QMessageBox::question(this, tr("Cannot Delete Sales Order"), storedProcErrorLookup("deleteSo", result) + "<br>Would you like to Close the selected " "Sales Order instead?", QMessageBox::Yes | QMessageBox::Default, QMessageBox::No) == QMessageBox::Yes) closeInstead = true; } else if (result < 0) { systemError(this, storedProcErrorLookup("deleteSo", result), __FILE__, __LINE__); return; } if (closeInstead) { q.prepare( "UPDATE coitem " "SET coitem_status='C' " "WHERE ((coitem_status <> 'X')" " AND (coitem_cohead_id=:sohead_id));" ); q.bindValue(":sohead_id", _so->id()); q.exec(); if (q.lastError().type() != QSqlError::NoError) { systemError(this, q.lastError().databaseText(), __FILE__, __LINE__); return; } } omfgThis->sSalesOrdersUpdated(-1); omfgThis->sProjectsUpdated(-1); } else if (q.lastError().type() != QSqlError::NoError) { systemError(this, q.lastError().databaseText(), __FILE__, __LINE__); return; } } }
void openSalesOrders::sView() { if (checkSitePrivs()) salesOrder::viewSalesOrder(_so->id()); }
void openSalesOrders::sEdit() { if (checkSitePrivs()) salesOrder::editSalesOrder(_so->id(), false); }
void unpostedInvoices::sPost() { bool changeDate = false; QDate newDate = QDate::currentDate(); if (_privileges->check("ChangeARInvcDistDate")) { getGLDistDate newdlg(this, "", TRUE); newdlg.sSetDefaultLit(tr("Invoice Date")); if (newdlg.exec() == XDialog::Accepted) { newDate = newdlg.date(); changeDate = (newDate.isValid()); } else return; } int journal = -1; q.exec("SELECT fetchJournalNumber('AR-IN') AS result;"); if (q.first()) { journal = q.value("result").toInt(); if (journal < 0) { systemError(this, storedProcErrorLookup("fetchJournalNumber", journal), __FILE__, __LINE__); return; } } else if (q.lastError().type() != QSqlError::NoError) { systemError(this, q.lastError().databaseText(), __FILE__, __LINE__); return; } XSqlQuery xrate; xrate.prepare("SELECT curr_rate " "FROM curr_rate, invchead " "WHERE ((curr_id=invchead_curr_id)" " AND (invchead_id=:invchead_id)" " AND (invchead_invcdate BETWEEN curr_effective AND curr_expires));"); // if SUM becomes dependent on curr_id then move XRATE before it in the loop XSqlQuery sum; sum.prepare("SELECT invoicetotal(:invchead_id) AS subtotal;"); XSqlQuery rollback; rollback.prepare("ROLLBACK;"); XSqlQuery post; post.prepare("SELECT postInvoice(:invchead_id, :journal) AS result;"); XSqlQuery setDate; setDate.prepare("UPDATE invchead SET invchead_gldistdate=:distdate " "WHERE invchead_id=:invchead_id;"); QList<XTreeWidgetItem*> selected = _invchead->selectedItems(); QList<XTreeWidgetItem*> triedToClosed; for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { int id = ((XTreeWidgetItem*)(selected[i]))->id(); // always change gldistdate. if using invoice date then will set to null //if (changeDate) //{ setDate.bindValue(":distdate", newDate); setDate.bindValue(":invchead_id", id); setDate.exec(); if (setDate.lastError().type() != QSqlError::NoError) { systemError(this, setDate.lastError().databaseText(), __FILE__, __LINE__); } //} } } bool tryagain = false; do { for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { int id = ((XTreeWidgetItem*)(selected[i]))->id(); sum.bindValue(":invchead_id", id); if (sum.exec() && sum.first() && sum.value("subtotal").toDouble() == 0) { if (QMessageBox::question(this, tr("Invoice Has Value 0"), tr("Invoice #%1 has a total value of 0.\n" "Would you like to post it anyway?") .arg(selected[i]->text(0)), QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::No) continue; } else if (sum.lastError().type() != QSqlError::NoError) { systemError(this, sum.lastError().databaseText(), __FILE__, __LINE__); continue; } else if (sum.value("subtotal").toDouble() != 0) { xrate.bindValue(":invchead_id", id); xrate.exec(); if (xrate.lastError().type() != QSqlError::NoError) { systemError(this, tr("System Error posting Invoice #%1\n%2") .arg(selected[i]->text(0)) .arg(xrate.lastError().databaseText()), __FILE__, __LINE__); continue; } else if (!xrate.first() || xrate.value("curr_rate").isNull()) { systemError(this, tr("Could not post Invoice #%1 because of a missing exchange rate.") .arg(selected[i]->text(0))); continue; } } q.exec("BEGIN;"); // because of possible lot, serial, or location distribution cancelations post.bindValue(":invchead_id", id); post.bindValue(":journal", journal); post.exec(); if (post.first()) { int result = post.value("result").toInt(); if (result < 0) { rollback.exec(); systemError(this, storedProcErrorLookup("postInvoice", result), __FILE__, __LINE__); } else if (distributeInventory::SeriesAdjust(result, this) == XDialog::Rejected) { rollback.exec(); QMessageBox::information( this, tr("Post Invoices"), tr("Transaction Canceled") ); return; } q.exec("COMMIT;"); } // contains() string is hard-coded in stored procedure else if (post.lastError().databaseText().contains("post to closed period")) { rollback.exec(); if (changeDate) triedToClosed = selected; else triedToClosed.append(selected[i]); } else if (post.lastError().type() != QSqlError::NoError) { rollback.exec(); systemError(this, tr("A System Error occurred posting Invoice #%1.\n%2") .arg(selected[i]->text(0)) .arg(post.lastError().databaseText()), __FILE__, __LINE__); } } if (triedToClosed.size() > 0) { failedPostList newdlg(this, "", true); newdlg.sSetList(triedToClosed, _invchead->headerItem(), _invchead->header()); tryagain = (newdlg.exec() == XDialog::Accepted); selected = triedToClosed; triedToClosed.clear(); } } } while (tryagain); if (_printJournal->isChecked()) { ParameterList params; params.append("source", tr("A/R")); params.append("startJrnlnum", journal); params.append("endJrnlnum", journal); if (_metrics->boolean("UseJournals")) { params.append("title",tr("Journal Series")); params.append("table", "sltrans"); } else { params.append("title",tr("General Ledger Series")); params.append("gltrans", true); params.append("table", "gltrans"); } orReport report("GLSeries", params); if (report.isValid()) report.print(); else report.reportError(this); } omfgThis->sInvoicesUpdated(-1, TRUE); }
void unpostedInvoices::sPost() { bool changeDate = false; QDate newDate = QDate::currentDate(); if (_privileges->check("ChangeARInvcDistDate")) { getGLDistDate newdlg(this, "", TRUE); newdlg.sSetDefaultLit(tr("Invoice Date")); if (newdlg.exec() == XDialog::Accepted) { newDate = newdlg.date(); changeDate = (newDate.isValid()); } else return; } int journal = -1; q.exec("SELECT fetchJournalNumber('AR-IN') AS result;"); if (q.first()) { journal = q.value("result").toInt(); if (journal < 0) { systemError(this, storedProcErrorLookup("fetchJournalNumber", journal), __FILE__, __LINE__); return; } } else if (q.lastError().type() != QSqlError::NoError) { systemError(this, q.lastError().databaseText(), __FILE__, __LINE__); return; } XSqlQuery xrate; xrate.prepare("SELECT curr_rate " "FROM curr_rate, invchead " "WHERE ((curr_id=invchead_curr_id)" " AND (invchead_id=:invchead_id)" " AND (invchead_invcdate BETWEEN curr_effective AND curr_expires));"); // if SUM becomes dependent on curr_id then move XRATE before it in the loop XSqlQuery sum; sum.prepare("SELECT COALESCE(SUM(round((invcitem_billed * invcitem_qty_invuomratio) *" " (invcitem_price / " " CASE WHEN (item_id IS NULL) THEN 1" " ELSE invcitem_price_invuomratio" " END), 2)),0) + " " invchead_freight + invchead_tax + " " invchead_misc_amount AS subtotal " " FROM invchead LEFT OUTER JOIN invcitem ON (invcitem_invchead_id=invchead_id) LEFT OUTER JOIN" " item ON (invcitem_item_id=item_id) " " WHERE(invchead_id=:invchead_id) " " GROUP BY invchead_freight, invchead_tax, invchead_misc_amount;"); XSqlQuery post; post.prepare("SELECT postInvoice(:invchead_id, :journal) AS result;"); XSqlQuery setDate; setDate.prepare("UPDATE invchead SET invchead_gldistdate=:distdate " "WHERE invchead_id=:invchead_id;"); QList<QTreeWidgetItem *> selected = _invchead->selectedItems(); QList<QTreeWidgetItem *> triedToClosed; for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { int id = ((XTreeWidgetItem*)(selected[i]))->id(); if (changeDate) { setDate.bindValue(":distdate", newDate); setDate.bindValue(":invchead_id", id); setDate.exec(); if (setDate.lastError().type() != QSqlError::NoError) { systemError(this, setDate.lastError().databaseText(), __FILE__, __LINE__); } } } } bool tryagain = false; do { for (int i = 0; i < selected.size(); i++) { if (checkSitePrivs(((XTreeWidgetItem*)(selected[i]))->id())) { int id = ((XTreeWidgetItem*)(selected[i]))->id(); sum.bindValue(":invchead_id", id); if (sum.exec() && sum.first() && sum.value("subtotal").toDouble() == 0) { if (QMessageBox::question(this, tr("Invoice Has Value 0"), tr("Invoice #%1 has a total value of 0.\n" "Would you like to post it anyway?") .arg(selected[i]->text(0)), QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::No) continue; } else if (sum.lastError().type() != QSqlError::NoError) { systemError(this, sum.lastError().databaseText(), __FILE__, __LINE__); continue; } else if (sum.value("subtotal").toDouble() != 0) { xrate.bindValue(":invchead_id", id); xrate.exec(); if (xrate.lastError().type() != QSqlError::NoError) { systemError(this, tr("System Error posting Invoice #%1\n%2") .arg(selected[i]->text(0)) .arg(xrate.lastError().databaseText()), __FILE__, __LINE__); continue; } else if (!xrate.first() || xrate.value("curr_rate").isNull()) { systemError(this, tr("Could not post Invoice #%1 because of a missing exchange rate.") .arg(selected[i]->text(0))); continue; } } post.bindValue(":invchead_id", id); post.bindValue(":journal", journal); post.exec(); if (post.first()) { int result = post.value("result").toInt(); if (result < 0) systemError(this, storedProcErrorLookup("postInvoice", result), __FILE__, __LINE__); } // contains() string is hard-coded in stored procedure else if (post.lastError().databaseText().contains("post to closed period")) { if (changeDate) { triedToClosed = selected; break; } else triedToClosed.append(selected[i]); } else if (post.lastError().type() != QSqlError::NoError) systemError(this, tr("A System Error occurred posting Invoice #%1.\n%2") .arg(selected[i]->text(0)) .arg(post.lastError().databaseText()), __FILE__, __LINE__); } if (triedToClosed.size() > 0) { failedPostList newdlg(this, "", true); newdlg.sSetList(triedToClosed, _invchead->headerItem(), _invchead->header()); tryagain = (newdlg.exec() == XDialog::Accepted); selected = triedToClosed; triedToClosed.clear(); } } } while (tryagain); if (_printJournal->isChecked()) { ParameterList params; params.append("journalNumber", journal); orReport report("SalesJournal", params); if (report.isValid()) report.print(); else report.reportError(this); } omfgThis->sInvoicesUpdated(-1, TRUE); }
void dspQuotesByCustomer::sConvert() { if (QMessageBox::question(this, tr("Convert Selected Quote(s)"), tr("<p>Are you sure that you want to convert the " "selected Quote(s) to Sales Order(s)?"), QMessageBox::Yes, QMessageBox::No | QMessageBox::Default) == QMessageBox::Yes) { XSqlQuery check; check.prepare("SELECT quhead_number, quhead_status, cust_creditstatus " " FROM quhead" " JOIN custinfo ON (quhead_cust_id=cust_id)" " WHERE (quhead_id=:quhead_id);" ); XSqlQuery convert; convert.prepare("SELECT convertQuote(:quhead_id) AS sohead_id;"); int counter = 0; int soheadid = -1; foreach (XTreeWidgetItem *cursor, list()->selectedItems()) { if (checkSitePrivs(cursor->id())) { check.bindValue(":quhead_id", cursor->id()); check.exec(); if (check.first()) { // TODO: add this check to convertquote if (check.value("quhead_status").toString() == "C") { QMessageBox::warning(this, tr("Cannot Convert Quote"), tr("<p>Quote #%1 has already been converted " "to a Sales Order." ) .arg(cursor->text("quhead_number"))); return; } } else if (ErrorReporter::error(QtCriticalMsg, this, tr("Error Getting Quote"), check, __FILE__, __LINE__)) continue; convert.bindValue(":quhead_id", cursor->id()); convert.exec(); if (convert.first()) { soheadid = convert.value("sohead_id").toInt(); if(soheadid < 0) { QMessageBox::warning(this, tr("Cannot Convert Quote"), storedProcErrorLookup("convertQuote", soheadid) .arg(check.value("quhead_number").toString())); continue; } counter++; omfgThis->sSalesOrdersUpdated(soheadid); } else if (ErrorReporter::error(QtCriticalMsg, this, tr("Converting Error"), convert, __FILE__, __LINE__)) continue; } } if (counter) omfgThis->sQuotesUpdated(-1); if (counter == 1) salesOrder::editSalesOrder(soheadid, true); }