/** * Pay Retail Commission * * Used by Commission Sqs Queue to pay commissions * * @param $commission * @param null $queue_message * @see PayCommissionTask * @see CommissionSqsShell * @see QueueCommissionsTask * @return bool|mixed|stdClass */ public function payRetailCommission($commission, &$queue_message = null) { $config = array(); $config_file = parse_ini_file("/etc/younique/payquicker.ini", true); $address = $this->Presenter->loadAddressDetails($commission['presenter_id']); $state_code = $address['User']['Address']['State']['abbrev']; $country_code = $address['User']['Address']['Country']['country_code']; $us_domestic = FALSE; switch ($commission['currency']) { case 'USD': if (in_array($state_code, $this->us_territories)) { $config['payquicker'] = $config_file['USD_INT']; } else { $config['payquicker'] = $config_file['USD_DOM']; } $us_domestic = TRUE; break; case 'CAD': $config['payquicker'] = $config_file['CAD']; break; case 'AUD': $config['payquicker'] = $config_file['AUD']; break; case 'NZD': //NZD Gets paid from the USD international account $config['payquicker'] = $config_file['NZD']; break; case 'GBP': $config['payquicker'] = $config_file['GBP']; break; case 'EUR': $config['payquicker'] = $config_file['EUR']; break; case 'MXN': $config['payquicker'] = $config_file['MXN']; break; default: // this should never happen $this->apiLog("royalties_earned.id", $commission['id'], "RoyaltiesEarned->payRetailCommission", "PayQuicker API", var_export($commission, true), "", "Could not load config for this currency", 1); error_log("Could not load config for this currency"); return FALSE; break; } $this->Presenter->RoyaltiesEarned->id = $commission['id']; //Withhold appropriate taxes: switch ($commission['market_id']) { case 6: //Mexico $commission = $this->withholdMexicoTaxes($commission); break; case 8: //France $payFr = $this->payFranceCommissions($commission['presenter_id']); if (strtoupper($payFr) == 'VDI') { $commission = $this->withholdFranceTaxes($commission); } break; default: break; } App::uses("PayquickerAPI", "Lib"); $royalties_withheld = $this->Presenter->getDynamicData($commission['presenter_id'], 'royalties_withheld'); if (isset($royalties_withheld[0]) && $royalties_withheld[0]['value'] == 1) { $this->Presenter->RoyaltiesEarned->saveField("reference_id", 'Royalties_Withheld'); return 'Royalties_Withheld'; } $dateEarned = $commission['date_earned']; $dateExpires = date("m/d/Y", strtotime("next year", strtotime($dateEarned))); $orderId = $commission['order_id']; $payeeName = $commission['first_name']; $recipientEmail = $commission['payquickeremail']; $paymentObject = array("authorizedKey" => $config['payquicker']['authorizedKey'], "senderEmail" => $config['payquicker']["senderEmail"], "recipientEmail" => $recipientEmail, "amount" => $commission['amount'], "comment" => "Hi {$payeeName}, This is your retail royalty for order #{$orderId}. Congratulations! We are proud of your online success.", "expirationDate" => $dateExpires, "forceDebitCard" => $commission['forceCard'], "accountingId" => $orderId, "currency" => $commission['currency'], "countryCode" => $country_code); if ($us_domestic === TRUE) { $paymentObject['stateCode'] = $state_code; } $this->Presenter->RoyaltiesEarned->saveField("date_attempted", date("Y-m-d H:i:s")); /** * Empty amounts should not be tried against payquicker * and are set to paid status */ if (empty($paymentObject['amount'])) { $this->Presenter->RoyaltiesEarned->saveField("date_paid", date("Y-m-d H:i:s")); $this->Presenter->RoyaltiesEarned->saveField("royalty_status_id", RoyaltiesEarned::STATUS_IS_PAID); return true; } if (YOUNIQUE_TESTSERVER === true) { $response = new stdClass(); $response->success = true; $response->reference = 'QATesting:' . $commission['order_id']; } else { $response = PayquickerAPI::call("instantPayment", $paymentObject); } if ($response->success == true) { $this->Presenter->RoyaltiesEarned->saveField("date_paid", date("Y-m-d H:i:s")); $this->Presenter->RoyaltiesEarned->saveField("reference_id", $response->reference); $this->Presenter->RoyaltiesEarned->saveField("royalty_status_id", RoyaltiesEarned::STATUS_IS_PAID); } else { /** * If error is duplicate update royalties earned data * if it is not already set. */ if (!empty($response) && isset($response->status)) { if ($response->status == 'Duplicate') { $duplicate = $this->find('first', ['conditions' => ['RoyaltiesEarned.id' => $commission['id']]]); if (empty($duplicate['RoyaltiesEarned']['date_paid'])) { $this->Presenter->RoyaltiesEarned->saveField("date_paid", date("Y-m-d H:i:s")); } if (empty($duplicate['RoyaltiesEarned']['reference_id'])) { $this->Presenter->RoyaltiesEarned->saveField("reference_id", $response->reference); } if (empty($duplicate['RoyaltiesEarned']['royalty_status_id'])) { $this->Presenter->RoyaltiesEarned->saveField("royalty_status_id", RoyaltiesEarned::STATUS_IS_PAID); } return true; } } /** * Send pay quicker error only once */ if (!empty($queue_message) && empty($queue_message['failure'])) { $queue_message['failure'] = $response; // Remove the key since this is going into an email unset($paymentObject['authorizedKey']); $message_body = "There was an error posting a retail commission, here are the details:\n\n" . var_export($paymentObject, true) . "\n\nHere is the response we got:\n\n" . var_export($response, true); SNS::sendSNS('PayQuicker_Issues', "Failure to Pay Retail Commission [{$recipientEmail}]", $message_body); } /** * Return true status on state code failure * so queue will not retry it. */ if (!empty($response) && isset($response->errorMessage)) { if ($response->errorMessage == 'stateCode is Required.') { return true; } } return false; } return $response; }
/** * @deprecated * */ public function admin_payCommission($commissionId) { App::uses("PayquickerAPI", "Lib"); $commission = $this->Presenter->RoyaltiesEarned->find("first", array("contain" => array("Presenter" => array("User" => array("RoyaltiesEmail"))), "conditions" => array("RoyaltiesEarned.id" => $commissionId, "RoyaltiesEarned.date_paid is null", "RoyaltiesEarned.date_attempted is null"))); if ($commissionId != $commission['RoyaltiesEarned']['id']) { $this->sendError("404", "Invalid Commission"); } else { $this->Presenter->RoyaltiesEarned->id = $commissionId; $this->Presenter->RoyaltiesEarned->saveField("date_attempted", date('Y-m-d h:i:s')); //Now I need to check if the payquicker email works $payquickerEmail = $commission['Presenter']['User']['RoyaltiesEmail']['email']; $dateEarned = $commission['RoyaltiesEarned']['date_earned']; $dateExpires = date("m/d/Y", strtotime("next year", strtotime($dateEarned))); $orderId = $commission['RoyaltiesEarned']['order_id']; $payeeName = $commission['Presenter']['User']['first_name']; //Withhold appropriate taxes: switch ($commission['RoyaltiesEarned']['market_id']) { case 6: //Mexico $commission = $this->withholdMexicoTaxes($commission); break; default: break; } //Gotta go see what we actually need to pay $amountToPay = $commission['RoyaltiesEarned']['amount']; $config = parse_ini_file("/etc/younique/configuration.ini", true); $paymentObject = array("authorizedKey" => $config['payquicker']['authorizedKey'], "senderEmail" => $config['payquicker']["senderEmail"], "recipientEmail" => $payquickerEmail, "amount" => $amountToPay, "comment" => "Hi {$payeeName}, This is your retail royalty for order #{$orderId}. Congratulations! We are proud of your online success.", "expirationDate" => $dateExpires, "accountingId" => $orderId); $response = PayquickerAPI::call("instantPayment", $paymentObject); if (YOUNIQUE_TESTSERVER === true) { $response->success = true; } if ($response->success === true) { $this->Presenter->RoyaltiesEarned->saveField("date_paid", date('Y-m-d h:i:s')); $this->Presenter->RoyaltiesEarned->saveField("reference_id", $response->reference); $this->sendSuccess(DruniqueAPIUtil::content('Processed', $this->DruniqueAPI->page_data)); } else { $this->sendError(500, DruniqueAPIUtil::content('We were not able to process this payment', $this->DruniqueAPI->page_data)); } } }