/** * This function is run by admin/cron.php every time if admin has enabled this plugin. * * Everyday at settlement time (default is 00:05), it cleans up some tables * and sends email to admin/teachers about pending orders expiring if manual-capture has enabled. * * If admin set up 'Order review' and 'Capture day', it captures credits cards and enrols students. * * @access public */ public function cron() { global $CFG, $DB; $oneday = 86400; $timenow = time(); $settlementtime = AuthorizeNet::getsettletime($timenow); $timediff30 = $settlementtime - 30 * $oneday; $mconfig = get_config('enrol/authorize'); mtrace("Processing authorize cron..."); if (intval($mconfig->an_dailysettlement) < $settlementtime) { set_config('an_dailysettlement', $settlementtime, 'enrol/authorize'); mtrace(" Daily cron:"); $this->cron_daily(); mtrace(" Done"); } mtrace(" Scheduled capture", ": "); if (empty($CFG->an_review) or !empty($CFG->an_test) or intval($CFG->an_capture_day) < 1 or !check_curl_available()) { mtrace("disabled"); return; // order review disabled or test mode or manual capture or openssl wasn't loaded. } $timediffcnf = $settlementtime - intval($CFG->an_capture_day) * $oneday; $select = "(status = ?) AND (timecreated < ?) AND (timecreated > ?)"; $params = array(AN_STATUS_AUTH, $timediffcnf, $timediff30); if (!($ordercount = $DB->count_records_select('enrol_authorize', $select, $params))) { mtrace("no pending orders"); return; } $eachconn = intval($mconfig->an_eachconnsecs); $eachconn = $eachconn > 60 ? 60 : ($eachconn <= 0 ? 3 : $eachconn); if ($ordercount * $eachconn + intval($mconfig->an_lastcron) > $timenow) { mtrace("blocked"); return; } set_config('an_lastcron', $timenow, 'enrol/authorize'); mtrace(" {$ordercount} orders are being processed now", ": "); $faults = ''; $sendem = array(); $elapsed = time(); @set_time_limit(0); $this->log = "AUTHORIZE.NET AUTOCAPTURE CRON: " . userdate($timenow) . "\n"; $lastcourseid = 0; $rs = $DB->get_recordset_select('enrol_authorize', $select, $params, 'courseid'); foreach ($rs as $order) { $message = ''; $extra = NULL; if (AN_APPROVED == AuthorizeNet::process($order, $message, $extra, AN_ACTION_PRIOR_AUTH_CAPTURE)) { if ($lastcourseid != $order->courseid) { $lastcourseid = $order->courseid; $course = $DB->get_record('course', array('id' => $lastcourseid)); $role = get_default_course_role($course); $context = get_context_instance(CONTEXT_COURSE, $lastcourseid); } $timestart = $timeend = 0; if ($course->enrolperiod) { $timestart = $timenow; $timeend = $order->settletime + $course->enrolperiod; } $user = $DB->get_record('user', array('id' => $order->userid)); if (role_assign($role->id, $user->id, 0, $context->id, $timestart, $timeend, 0, 'authorize')) { $this->log .= "User({$user->id}) has been enrolled to course({$course->id}).\n"; if (!empty($CFG->enrol_mailstudents)) { $sendem[] = $order->id; } } else { $faults .= "Error while trying to enrol " . fullname($user) . " in '{$course->fullname}' \n"; foreach ($order as $okey => $ovalue) { $faults .= " {$okey} = {$ovalue}\n"; } } } else { $this->log .= "Error, Order# {$order->id}: " . $message . "\n"; } } $rs->close(); mtrace("processed"); $timenow = time(); $elapsed = $timenow - $elapsed; $eachconn = ceil($elapsed / $ordercount); set_config('an_eachconnsecs', $eachconn, 'enrol/authorize'); $this->log .= "AUTHORIZE.NET CRON FINISHED: " . userdate($timenow); $adminuser = get_admin(); if (!empty($faults)) { $eventdata = new object(); $eventdata->modulename = 'moodle'; $eventdata->userfrom = $adminuser; $eventdata->userto = $adminuser; $eventdata->subject = "AUTHORIZE.NET CRON FAULTS"; $eventdata->fullmessage = $faults; $eventdata->fullmessageformat = FORMAT_PLAIN; $eventdata->fullmessagehtml = ''; $eventdata->smallmessage = ''; events_trigger('message_send', $eventdata); } if (!empty($CFG->enrol_mailadmins)) { $eventdata = new object(); $eventdata->modulename = 'moodle'; $eventdata->userfrom = $adminuser; $eventdata->userto = $adminuser; $eventdata->subject = "AUTHORIZE.NET CRON LOG"; $eventdata->fullmessage = $this->log; $eventdata->fullmessageformat = FORMAT_PLAIN; $eventdata->fullmessagehtml = ''; $eventdata->smallmessage = ''; events_trigger('message_send', $eventdata); } // Send emails to students about which courses have enrolled. if (!empty($sendem)) { mtrace(" sending welcome messages to students", ": "); send_welcome_messages($sendem); mtrace("sent"); } }
function authorize_verify_account() { global $USER, $SITE; $plugin = enrol_get_plugin('authorize'); require_once 'authorizenet.class.php'; $original_antest = $plugin->get_config('an_test'); $plugin->set_config('an_test', 1); // Test mode $shortname = format_string($SITE->shortname, true, array('context' => context_course::instance(SITEID))); $order = new stdClass(); $order->id = -1; $order->paymentmethod = AN_METHOD_CC; $order->refundinfo = '1111'; $order->ccname = 'Test User'; $order->courseid = $SITE->id; $order->userid = $USER->id; $order->status = AN_STATUS_NONE; $order->settletime = 0; $order->transid = 0; $order->timecreated = time(); $order->amount = '0.01'; $order->currency = 'USD'; $extra = new stdClass(); $extra->x_card_num = '4111111111111111'; $extra->x_card_code = '123'; $extra->x_exp_date = "12" . intval(date("Y")) + 5; $extra->x_currency_code = $order->currency; $extra->x_amount = $order->amount; $extra->x_first_name = 'Test'; $extra->x_last_name = 'User'; $extra->x_country = $USER->country; $extra->x_invoice_num = $order->id; $extra->x_description = $shortname . ' - Authorize.net Merchant Account Verification Test'; $ret = ''; $message = ''; if (AN_APPROVED == AuthorizeNet::process($order, $message, $extra, AN_ACTION_AUTH_CAPTURE)) { $ret = get_string('verifyaccountresult', 'enrol_authorize', get_string('success')); } else { $ret = get_string('verifyaccountresult', 'enrol_authorize', $message); } $plugin->set_config('an_test', $original_antest); return $ret; }
/** * authorize_print_order * * @param object $order */ function authorize_print_order($orderid) { global $CFG, $USER, $DB, $OUTPUT, $PAGE; global $strs, $authstrs; $plugin = enrol_get_plugin('authorize'); $an_test = $plugin->get_config('an_test'); $do = optional_param('do', '', PARAM_ALPHA); $unenrol = optional_param('unenrol', 0, PARAM_BOOL); $confirm = optional_param('confirm', 0, PARAM_BOOL); if (!($order = $DB->get_record('enrol_authorize', array('id' => $orderid)))) { print_error('orderidnotfound', '', "{$CFG->wwwroot}/enrol/authorize/index.php", $orderid); } if (!($course = $DB->get_record('course', array('id' => $order->courseid)))) { print_error('invalidcourseid', '', "{$CFG->wwwroot}/enrol/authorize/index.php"); } if (!($user = $DB->get_record('user', array('id' => $order->userid)))) { print_error('nousers', '', "{$CFG->wwwroot}/enrol/authorize/index.php"); } $coursecontext = context_course::instance($course->id); if ($USER->id != $order->userid) { // Current user viewing someone else's order require_capability('enrol/authorize:managepayments', $coursecontext); } $settled = AuthorizeNet::settled($order); $statusandactions = authorize_get_status_action($order); $color = authorize_get_status_color($statusandactions->status); $buttons = ''; if (empty($do)) { if (empty($statusandactions->actions)) { if (AN_METHOD_ECHECK == $order->paymentmethod && has_capability('enrol/authorize:uploadcsv', context_user::instance($USER->id))) { $buttons .= "<form method='get' action='uploadcsv.php'><div><input type='submit' value='" . get_string('uploadcsv', 'enrol_authorize') . "' /></div></form>"; } } else { foreach ($statusandactions->actions as $val) { $buttons .= authorize_print_action_button($orderid, $val); } } } if (SITEID != $course->id) { $shortname = format_string($course->shortname, true, array('context' => $coursecontext)); $PAGE->navbar->add($shortname, new moodle_url('/course/view.php', array('id' => $course->id))); } $PAGE->navbar->add($authstrs->paymentmanagement, 'index.php?course=' . $course->id); $PAGE->navbar->add($authstrs->orderid . ': ' . $orderid, 'index.php'); $PAGE->set_course($course); $PAGE->set_title("{$course->shortname}: {$authstrs->paymentmanagement}"); $PAGE->set_heading($authstrs->orderdetails); $PAGE->set_cacheable(false); $PAGE->set_button($buttons); echo $OUTPUT->header(); $table = new html_table(); $table->width = '100%'; $table->size = array('30%', '70%'); $table->align = array('right', 'left'); if (AN_METHOD_CC == $order->paymentmethod) { $table->data[] = array("<b>{$authstrs->paymentmethod}:</b>", $authstrs->methodcc); $table->data[] = array("<b>{$authstrs->nameoncard}:</b>", $order->ccname . ' (<b><a href="' . $CFG->wwwroot . '/user/view.php?id=' . $user->id . '">' . fullname($user) . '</a></b>)'); $table->data[] = array("<b>{$authstrs->cclastfour}:</b>", $order->refundinfo); } else { $table->data[] = array("<b>{$authstrs->paymentmethod}:</b>", $authstrs->methodecheck); $table->data[] = array("<b>{$authstrs->echeckfirslasttname}:</b>", $order->ccname . ' (<b><a href="' . $CFG->wwwroot . '/user/view.php?id=' . $user->id . '">' . fullname($user) . '</a></b>)'); $table->data[] = array("<b>{$authstrs->isbusinesschecking}:</b>", $order->refundinfo == 1 ? $strs->yes : $strs->no); } $table->data[] = array("<b>{$authstrs->amount}:</b>", "{$order->currency} {$order->amount}"); $table->data[] = array("<b>{$authstrs->transid}:</b>", $order->transid); $table->data[] = array("<b>{$strs->time}:</b>", userdate($order->timecreated)); $table->data[] = array("<b>{$authstrs->settlementdate}:</b>", $settled ? userdate($order->settletime) : $authstrs->notsettled); $table->data[] = array("<b>{$strs->status}:</b>", "<b><font style='color:{$color}'>" . $authstrs->{$statusandactions->status} . "</font></b>"); if (ORDER_CAPTURE == $do && in_array(ORDER_CAPTURE, $statusandactions->actions)) { if ($confirm && confirm_sesskey()) { $message = ''; $extra = NULL; if (AN_APPROVED == AuthorizeNet::process($order, $message, $extra, AN_ACTION_PRIOR_AUTH_CAPTURE)) { if (empty($an_test)) { if (enrol_into_course($course, $user, 'authorize')) { if ($plugin->get_config('enrol_mailstudents')) { send_welcome_messages($orderid); } redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}"); } else { $shortname = format_string($course->shortname, true, array('context' => $coursecontext)); redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", "Error while trying to enrol " . fullname($user) . " in '" . $shortname . "'", 20); } } else { redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", get_string('testwarning', 'enrol_authorize'), 10); } } else { redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", $message, 20); } } $table->data[] = array("<b>{$strs->confirm}:</b>", get_string('captureyes', 'enrol_authorize') . '<br />' . authorize_print_action_button($orderid, ORDER_CAPTURE, 0, true, false, $strs->no)); echo html_writer::table($table); } elseif (ORDER_REFUND == $do && in_array(ORDER_REFUND, $statusandactions->actions)) { $refunded = 0.0; $sql = "SELECT SUM(amount) AS refunded\n FROM {enrol_authorize_refunds}\n WHERE (orderid = ?)\n AND (status = ?)"; if ($refundval = $DB->get_field_sql($sql, array($orderid, AN_STATUS_CREDIT))) { $refunded = floatval($refundval); } $upto = round($order->amount - $refunded, 2); if ($upto <= 0) { print_error('refoundtoorigi', '', "{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", $order->amount); } $amount = round(optional_param('amount', $upto, PARAM_RAW), 2); if ($amount > $upto) { print_error('refoundto', '', "{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", $upto); } if ($confirm && confirm_sesskey()) { $extra = new stdClass(); $extra->orderid = $orderid; $extra->amount = $amount; $message = ''; $success = AuthorizeNet::process($order, $message, $extra, AN_ACTION_CREDIT); if (AN_APPROVED == $success || AN_REVIEW == $success) { if (empty($an_test)) { if (empty($extra->id)) { redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", "insert record error", 20); } else { if (!empty($unenrol)) { $pinstance = $DB->get_record('enrol', array('id' => $order->instanceid)); $plugin->unenrol_user($pinstance, $order->userid); //role_unassign_all(array('userid'=>$order->userid, 'contextid'=>$coursecontext->id, 'component'=>'enrol_authorize'), true, true); } redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}"); } } else { redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", get_string('testwarning', 'enrol_authorize'), 10); } } else { redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", $message, 20); } } $a = new stdClass(); $a->upto = $upto; $extrahtml = get_string('howmuch', 'enrol_authorize') . ' <input type="text" size="5" name="amount" value="' . $amount . '" /> ' . get_string('canbecredit', 'enrol_authorize', $a) . '<br />'; $table->data[] = array("<b>{$strs->confirm}:</b>", authorize_print_action_button($orderid, ORDER_REFUND, 0, true, $authstrs->unenrolstudent, $strs->no, $extrahtml)); echo html_writer::table($table); } elseif (ORDER_DELETE == $do && in_array(ORDER_DELETE, $statusandactions->actions)) { if ($confirm && confirm_sesskey()) { if (!empty($unenrol)) { $pinstance = $DB->get_record('enrol', array('id' => $order->instanceid)); $plugin->unenrol_user($pinstance, $order->userid); //role_unassign_all(array('userid'=>$order->userid, 'contextid'=>$coursecontext->id, 'component'=>'enrol_authorize'), true, true); } $DB->delete_records('enrol_authorize', array('id' => $orderid)); redirect("{$CFG->wwwroot}/enrol/authorize/index.php"); } $table->data[] = array("<b>{$strs->confirm}:</b>", authorize_print_action_button($orderid, ORDER_DELETE, 0, true, $authstrs->unenrolstudent, $strs->no)); echo html_writer::table($table); } elseif (ORDER_VOID == $do) { // special case: cancel original or refunded transaction? $suborderid = optional_param('suborder', 0, PARAM_INT); if (empty($suborderid) && in_array(ORDER_VOID, $statusandactions->actions)) { // cancel original if ($confirm && confirm_sesskey()) { $extra = NULL; $message = ''; if (AN_APPROVED == AuthorizeNet::process($order, $message, $extra, AN_ACTION_VOID)) { if (empty($an_test)) { redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}"); } else { redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", get_string('testwarning', 'enrol_authorize'), 10); } } else { redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", $message, 20); } } $table->data[] = array("<b>{$strs->confirm}:</b>", get_string('voidyes', 'enrol_authorize') . '<br />' . authorize_print_action_button($orderid, ORDER_VOID, 0, true, false, $strs->no)); echo html_writer::table($table); } elseif (!empty($suborderid)) { // cancel refunded $sql = "SELECT r.*, e.courseid, e.paymentmethod\n FROM {enrol_authorize_refunds} r\n INNER JOIN {enrol_authorize} e\n ON r.orderid = e.id\n WHERE r.id = ?\n AND r.orderid = ?\n AND r.status = ?"; $suborder = $DB->get_record_sql($sql, array($suborderid, $orderid, AN_STATUS_CREDIT)); if (!$suborder) { // not found print_error('transactionvoid', '', "{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}"); } $refundedstatus = authorize_get_status_action($suborder); unset($suborder->courseid); if (in_array(ORDER_VOID, $refundedstatus->actions)) { if ($confirm && confirm_sesskey()) { $message = ''; $extra = NULL; if (AN_APPROVED == AuthorizeNet::process($suborder, $message, $extra, AN_ACTION_VOID)) { if (empty($an_test)) { if (!empty($unenrol)) { $pinstance = $DB->get_record('enrol', array('id' => $order->instanceid)); $plugin->unenrol_user($pinstance, $order->userid); //role_unassign_all(array('userid'=>$order->userid, 'contextid'=>$coursecontext->id, 'component'=>'enrol_authorize'), true, true); } redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}"); } else { redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", get_string('testwarning', 'enrol_authorize'), 10); } } else { redirect("{$CFG->wwwroot}/enrol/authorize/index.php?order={$orderid}", $message, 20); } } $a = new stdClass(); $a->transid = $suborder->transid; $a->amount = $suborder->amount; $table->data[] = array("<b>{$strs->confirm}:</b>", get_string('subvoidyes', 'enrol_authorize', $a) . '<br />' . authorize_print_action_button($orderid, ORDER_VOID, $suborderid, true, $authstrs->unenrolstudent, $strs->no)); echo html_writer::table($table); } } } else { echo html_writer::table($table); if ($settled) { // show refunds. $t2 = new html_table(); $t2->size = array('45%', '15%', '20%', '10%', '10%'); $t2->align = array('right', 'right', 'right', 'right', 'right'); $t2->head = array($authstrs->settlementdate, $authstrs->transid, $strs->status, $strs->action, $authstrs->amount); $sql = "SELECT r.*, e.courseid, e.paymentmethod\n FROM {enrol_authorize_refunds} r\n INNER JOIN {enrol_authorize} e\n ON r.orderid = e.id\n WHERE r.orderid = ?"; if ($refunds = $DB->get_records_sql($sql, array($orderid))) { $sumrefund = floatval(0.0); foreach ($refunds as $rf) { $subactions = ''; $substatus = authorize_get_status_action($rf); if (empty($substatus->actions)) { $subactions .= $strs->none; } else { foreach ($substatus->actions as $vl) { $subactions .= authorize_print_action_button($orderid, $vl, $rf->id); } } $sign = ''; $color = authorize_get_status_color($substatus->status); if ($substatus->status == 'refunded' or $substatus->status == 'settled') { $sign = '-'; $sumrefund += floatval($rf->amount); } $t2->data[] = array(userdate($rf->settletime), $rf->transid, "<b><font style='color:{$color}'>" . $authstrs->{$substatus->status} . "</font></b>", $subactions, format_float($sign . $rf->amount, 2)); } $t2->data[] = array('', '', get_string('total'), $order->currency, format_float('-' . $sumrefund, 2)); } else { $t2->data[] = array('', '', get_string('noreturns', 'enrol_authorize'), '', ''); } echo "<h4>" . get_string('returns', 'enrol_authorize') . "</h4>\n"; echo html_writer::table($t2); } } echo $OUTPUT->footer(); }