int CreditCardProcessor::voidPrevious(int &pccpayid) { if (DEBUG) qDebug("CCP:voidPrevious(%d)", pccpayid); // don't reset(); because we're probably voiding because of a previous error int ccv = -2; XSqlQuery ccq; ccq.prepare("SELECT * FROM ccpay WHERE (ccpay_id=:ccpayid);"); ccq.bindValue(":ccpayid", pccpayid); ccq.exec(); int ccardid; if (ccq.first()) ccardid = ccq.value("ccpay_ccard_id").toInt(); else if (ccq.lastError().type() != QSqlError::None) { _errorMsg = ccq.lastError().databaseText(); return -1; } else { _errorMsg = errorMsg(-60); return -60; } // don't checkCreditCard because we want to void the transaction regardless QString neworder = ccq.value("ccpay_order_number").toString(); QString reforder = ccq.value("ccpay_r_ordernum").toString(); ParameterList dbupdateinfo; int returnVal = doVoidPrevious(ccardid, ccv, ccq.value("ccpay_amount").toDouble(), ccq.value("ccpay_curr_id").toInt(), neworder, reforder, pccpayid, dbupdateinfo); if (returnVal < 0) return returnVal; else if (returnVal > 0) _errorMsg = errorMsg(4).arg(_errorMsg); returnVal = updateCCPay(pccpayid, dbupdateinfo); if (returnVal < 0) return returnVal; ccq.prepare("SELECT postCCVoid(:ccpayid) AS result;"); ccq.bindValue(":ccpayid", pccpayid); ccq.exec(); if (ccq.first()) { int result = ccq.value("result").toInt(); if (result < 0) { _errorMsg = "<p>" + errorMsg(4).arg(storedProcErrorLookup("postCCVoid", result)); returnVal = 1; } } else if (ccq.lastError().type() != QSqlError::NoError) { _errorMsg = errorMsg(4).arg(ccq.lastError().databaseText()); returnVal = 1; } return returnVal; }
int AuthorizeDotNetProcessor::doCredit(const int pccardid, const QString &pcvv, const double pamount, const double ptax, const bool ptaxexempt, const double pfreight, const double pduty, const int pcurrid, QString &pneworder, QString &preforder, int &pccpayid, ParameterList &pparams) { Q_UNUSED(pcvv); if (DEBUG) qDebug("AN:doCredit(%d, pcvv, %f, %f, %d, %f, %f, %d, %s, %s, %d)", pccardid, pamount, ptax, ptaxexempt, pfreight, pduty, pcurrid, pneworder.toLatin1().data(), preforder.toLatin1().data(), pccpayid); int returnValue = 0; double amount = pamount; int currid = pcurrid; bool tryVoid = false; QString approvalCode; QString request; returnValue = buildFollowup(pccpayid, preforder, amount, currid, request, "CREDIT"); if (returnValue != 0) return returnValue; XSqlQuery anq; anq.prepare("SELECT ccpay_card_pan_trunc," " (ccpay_transaction_datetime > CURRENT_DATE" " AND ccpay_amount = :amount) AS tryVoid," " ccpay_r_code," " formatbytea(decrypt(setbytea(ccard_number)," " setbytea(:key),'bf')) AS ccard_number" " FROM ccpay LEFT OUTER JOIN ccard ON (ccpay_ccard_id=ccard_id)" " WHERE (ccpay_id=:ccpayid);"); anq.bindValue(":ccpayid", pccpayid); anq.bindValue(":key", omfgThis->_key); anq.bindValue(":now", QDateTime::currentDateTime()); anq.bindValue(":amount", amount); anq.exec(); if (anq.first()) { QString cardnum = anq.value("ccpay_card_pan_trunc").toString(); if (cardnum.isEmpty()) cardnum = anq.value("ccard_number").toString(); APPENDFIELD(request, "x_card_num", cardnum.right(4)); tryVoid = anq.value("tryVoid").toBool(); approvalCode = anq.value("ccpay_r_code").toString(); } else if (anq.lastError().type() != QSqlError::NoError) { _errorMsg = anq.lastError().databaseText(); return -1; } QString response; returnValue = sendViaHTTP(request, response); if (returnValue < 0) return returnValue; returnValue = handleResponse(response, pccardid, "R", amount, currid, pneworder, preforder, pccpayid, pparams); // TODO: make more precise - look for return code 54 if (returnValue < 0 && tryVoid) { int voidResult = 0; QString tmpErrorMsg = _errorMsg; ParameterList voidParams; _errorMsg.clear(); voidResult = doVoidPrevious(pccardid, pcvv, amount, currid, pneworder, preforder, approvalCode, pccpayid, voidParams); if (voidResult >= 0) { returnValue = voidResult; pparams.clear(); while (! voidParams.isEmpty()) pparams.append(voidParams.takeFirst()); } else _errorMsg = tmpErrorMsg; } return returnValue; }