/** * 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 */ function cron() { global $CFG; require_once $CFG->dirroot . '/enrol/authorize/authorizenetlib.php'; $oneday = 86400; $timenow = time(); $settlementtime = authorize_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; some cleanups and sending email to admins the count of pending orders expiring", ": "); $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_openssl_loaded()) { 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 = '" . AN_STATUS_AUTH . "') AND (timecreated < '{$timediffcnf}') AND (timecreated > '{$timediff30}')"; if (!($ordercount = count_records_select('enrol_authorize', $select))) { 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; for ($rs = get_recordset_select('enrol_authorize', $select, 'courseid'); $order = rs_fetch_next_record($rs);) { $message = ''; $extra = NULL; if (AN_APPROVED == authorize_action($order, $message, $extra, AN_ACTION_PRIOR_AUTH_CAPTURE)) { if ($lastcourseid != $order->courseid) { $lastcourseid = $order->courseid; $course = get_record('course', '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 = get_record('user', '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($rs); 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)) { email_to_user($adminuser, $adminuser, "AUTHORIZE.NET CRON FAULTS", $faults); } if (!empty($CFG->enrol_mailadmins)) { email_to_user($adminuser, $adminuser, "AUTHORIZE.NET CRON LOG", $this->log); } // Send emails to students about which courses have enrolled. if (!empty($sendem)) { mtrace(" sending welcome messages to students", ": "); send_welcome_messages($sendem); mtrace("sent"); } }
/** * authorize_print_order_details * * @param int $orderno */ function authorize_print_order_details($orderno) { global $CFG, $USER; global $strs, $authstrs; $cmdcapture = optional_param(ORDER_CAPTURE, '', PARAM_ALPHA); $cmddelete = optional_param(ORDER_DELETE, '', PARAM_ALPHA); $cmdrefund = optional_param(ORDER_REFUND, '', PARAM_ALPHA); $cmdvoid = optional_param(ORDER_VOID, '', PARAM_ALPHA); $unenrol = optional_param('unenrol', 0, PARAM_BOOL); $confirm = optional_param('confirm', 0, PARAM_BOOL); $table = new stdClass(); $table->width = '100%'; $table->size = array('30%', '70%'); $table->align = array('right', 'left'); $order = get_record('enrol_authorize', 'id', $orderno); if (!$order) { notice("Order {$orderno} not found.", "index.php"); return; } $course = get_record('course', 'id', $order->courseid); $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id); if ($USER->id != $order->userid) { // Current user viewing someone else's order require_capability('enrol/authorize:managepayments', $coursecontext); } echo "<form action=\"index.php\" method=\"post\">\n"; echo "<div>"; echo "<input type=\"hidden\" name=\"order\" value=\"{$orderno}\" />\n"; echo "<input type=\"hidden\" name=\"sesskey\" value=\"" . sesskey() . "\" />"; $settled = authorize_settled($order); $status = authorize_get_status_action($order); $table->data[] = array("<b>{$authstrs->paymentmethod}:</b>", $order->paymentmethod == AN_METHOD_CC ? $authstrs->methodcc : $authstrs->methodecheck); $table->data[] = array("<b>{$authstrs->orderid}:</b>", $orderno); $table->data[] = array("<b>{$authstrs->transid}:</b>", $order->transid); $table->data[] = array("<b>{$authstrs->amount}:</b>", "{$order->currency} {$order->amount}"); if (empty($cmdcapture) and empty($cmdrefund) and empty($cmdvoid) and empty($cmddelete)) { $color = authorize_get_status_color($status->status); $table->data[] = array("<b>{$strs->course}:</b>", format_string($course->shortname)); $table->data[] = array("<b>{$strs->status}:</b>", "<font style='color:{$color}'>" . $authstrs->{$status->status} . "</font>"); if ($order->paymentmethod == AN_METHOD_CC) { $table->data[] = array("<b>{$authstrs->nameoncard}:</b>", $order->ccname); } else { $table->data[] = array("<b>{$authstrs->echeckfirslasttname}:</b>", $order->ccname); } $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(" ", "<hr size='1' />\n"); if (!empty($cmdcapture) and confirm_sesskey()) { // CAPTURE if (!in_array(ORDER_CAPTURE, $status->actions)) { $a = new stdClass(); $a->action = $authstrs->capture; print_error('youcantdo', 'enrol_authorize', '', $a); } if (empty($confirm)) { $strcaptureyes = get_string('captureyes', 'enrol_authorize'); $table->data[] = array("<b>{$strs->confirm}:</b>", "{$strcaptureyes} <br />\n <input type='hidden' name='confirm' value='1' /><input type='submit' name='" . ORDER_CAPTURE . "' value='{$authstrs->capture}' />\n <a href='index.php?order={$orderno}'>{$strs->no}</a>"); } else { $message = ''; $extra = NULL; if (AN_APPROVED != authorize_action($order, $message, $extra, AN_ACTION_PRIOR_AUTH_CAPTURE)) { $table->data[] = array("<b><font color='red'>{$strs->error}:</font></b>", $message); } else { if (empty($CFG->an_test)) { $user = get_record('user', 'id', $order->userid); if (enrol_into_course($course, $user, 'authorize')) { if (!empty($CFG->enrol_mailstudents)) { send_welcome_messages($order->id); } redirect("index.php?order={$orderno}"); } else { $table->data[] = array("<b><font color='red'>{$strs->error}:</font></b>", "Error while trying to enrol " . fullname($user) . " in '" . format_string($course->shortname) . "'"); } } else { $table->data[] = array(get_string('testmode', 'enrol_authorize'), get_string('testwarning', 'enrol_authorize')); } } } print_table($table); } elseif (!empty($cmdrefund) and confirm_sesskey()) { // REFUND if (!in_array(ORDER_REFUND, $status->actions)) { $a = new stdClass(); $a->action = $authstrs->refund; print_error('youcantdo', 'enrol_authorize', '', $a); } $refunded = 0.0; $sql = "SELECT SUM(amount) AS refunded FROM {$CFG->prefix}enrol_authorize_refunds " . "WHERE (orderid = '" . $orderno . "') AND (status = '" . AN_STATUS_CREDIT . "')"; if ($refundval = get_field_sql($sql)) { $refunded = floatval($refundval); } $upto = round($order->amount - $refunded, 2); if ($upto <= 0) { error("Refunded to original amount."); } else { $amount = round(optional_param('amount', $upto), 2); if ($amount > $upto or empty($confirm)) { $a = new stdClass(); $a->upto = $upto; $strcanbecredit = get_string('canbecredit', 'enrol_authorize', $a); $strhowmuch = get_string('howmuch', 'enrol_authorize'); $cbunenrol = print_checkbox('unenrol', '1', !empty($unenrol), '', '', '', true); $table->data[] = array("<b>{$authstrs->unenrolstudent}</b>", $cbunenrol); $table->data[] = array("<b>{$strhowmuch}</b>", "<input type='hidden' name='confirm' value='1' />\n <input type='text' size='5' name='amount' value='{$amount}' />\n {$strcanbecredit}<br /><input type='submit' name='" . ORDER_REFUND . "' value='{$authstrs->refund}' />"); } else { $extra = new stdClass(); $extra->orderid = $orderno; $extra->amount = $amount; $message = ''; $success = authorize_action($order, $message, $extra, AN_ACTION_CREDIT); if (AN_APPROVED == $success || AN_REVIEW == $success) { if (empty($CFG->an_test)) { if (empty($extra->id)) { $table->data[] = array("<b><font color='red'>{$strs->error}:</font></b>", 'insert record error'); } else { if (!empty($unenrol)) { role_unassign(0, $order->userid, 0, $coursecontext->id); } redirect("index.php?order={$orderno}"); } } else { $table->data[] = array(get_string('testmode', 'enrol_authorize'), get_string('testwarning', 'enrol_authorize')); } } else { $table->data[] = array("<b><font color='red'>{$strs->error}:</font></b>", $message); } } } print_table($table); } elseif (!empty($cmdvoid) and confirm_sesskey()) { // VOID $suborderno = optional_param('suborder', 0, PARAM_INT); if (empty($suborderno)) { // cancel original transaction. if (!in_array(ORDER_VOID, $status->actions)) { $a = new stdClass(); $a->action = $authstrs->void; print_error('youcantdo', 'enrol_authorize', '', $a); } if (empty($confirm)) { $strvoidyes = get_string('voidyes', 'enrol_authorize'); $table->data[] = array("<b>{$strs->confirm}:</b>", "{$strvoidyes}<br /><input type='hidden' name='" . ORDER_VOID . "' value='y' />\n <input type='hidden' name='confirm' value='1' />\n <input type='submit' value='{$authstrs->void}' />\n <a href='index.php?order={$orderno}'>{$strs->no}</a>"); } else { $extra = NULL; $message = ''; if (AN_APPROVED == authorize_action($order, $message, $extra, AN_ACTION_VOID)) { if (empty($CFG->an_test)) { redirect("index.php?order={$orderno}"); } else { $table->data[] = array(get_string('testmode', 'enrol_authorize'), get_string('testwarning', 'enrol_authorize')); } } else { $table->data[] = array("<b><font color='red'>{$strs->error}:</font></b>", $message); } } } else { // cancel refunded transaction $sql = "SELECT r.*, e.courseid, e.paymentmethod FROM {$CFG->prefix}enrol_authorize_refunds r " . "INNER JOIN {$CFG->prefix}enrol_authorize e ON r.orderid = e.id " . "WHERE r.id = '{$suborderno}' AND r.orderid = '{$orderno}' AND r.status = '" . AN_STATUS_CREDIT . "'"; $suborder = get_record_sql($sql); if (!$suborder) { // not found error("Transaction can not be voided because of already been voided."); } else { $refundedstatus = authorize_get_status_action($suborder); if (!in_array(ORDER_VOID, $refundedstatus->actions)) { $a = new stdClass(); $a->action = $authstrs->void; print_error('youcantdo', 'enrol_authorize', '', $a); } unset($suborder->courseid); if (empty($confirm)) { $a = new stdClass(); $a->transid = $suborder->transid; $a->amount = $suborder->amount; $strsubvoidyes = get_string('subvoidyes', 'enrol_authorize', $a); $cbunenrol = print_checkbox('unenrol', '1', !empty($unenrol), '', '', '', true); $table->data[] = array("<b>{$authstrs->unenrolstudent}</b>", $cbunenrol); $table->data[] = array("<b>{$strs->confirm}:</b>", "{$strsubvoidyes}<br /><input type='hidden' name='" . ORDER_VOID . "' value='y' />\n <input type='hidden' name='confirm' value='1' />\n <input type='hidden' name='suborder' value='{$suborderno}' />\n <input type='submit' value='{$authstrs->void}' />\n <a href='index.php?order={$orderno}'>{$strs->no}</a>"); } else { $message = ''; $extra = NULL; if (AN_APPROVED == authorize_action($suborder, $message, $extra, AN_ACTION_VOID)) { if (empty($CFG->an_test)) { if (!empty($unenrol)) { role_unassign(0, $order->userid, 0, $coursecontext->id); } redirect("index.php?order={$orderno}"); } else { $table->data[] = array(get_string('testmode', 'enrol_authorize'), get_string('testwarning', 'enrol_authorize')); } } else { $table->data[] = array("<b><font color='red'>{$strs->error}:</font></b>", $message); } } } } print_table($table); } elseif (!empty($cmddelete) and confirm_sesskey()) { // DELETE if (!in_array(ORDER_DELETE, $status->actions)) { $a = new stdClass(); $a->action = $authstrs->delete; print_error('youcantdo', 'enrol_authorize', '', $a); } if (empty($confirm)) { $cbunenrol = print_checkbox('unenrol', '1', !empty($unenrol), '', '', '', true); $table->data[] = array("<b>{$authstrs->unenrolstudent}</b>", $cbunenrol); $table->data[] = array("<b>{$strs->confirm}:</b>", "<input type='hidden' name='" . ORDER_DELETE . "' value='y' />\n <input type='hidden' name='confirm' value='1' />\n <input type='submit' value='{$authstrs->delete}' />\n <a href='index.php?order={$orderno}'>{$strs->no}</a>"); } else { if (!empty($unenrol)) { role_unassign(0, $order->userid, 0, $coursecontext->id); } delete_records('enrol_authorize', 'id', $orderno); redirect("index.php"); } print_table($table); } else { // SHOW $actions = ''; if (empty($status->actions)) { if ($order->paymentmethod == AN_METHOD_ECHECK && has_capability('enrol/authorize:uploadcsv', get_context_instance(CONTEXT_USER, $USER->id))) { $actions .= '<a href="uploadcsv.php">' . get_string('uploadcsv', 'enrol_authorize') . '</a>'; } else { $actions .= $strs->none; } } else { foreach ($status->actions as $value) { $actions .= "<input type='submit' name='{$value}' value='{$authstrs->{$value}}' /> "; } } $table->data[] = array("<b>{$strs->action}</b>", $actions); print_table($table); if ($settled) { // show refunds. $t2 = new stdClass(); $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 FROM {$CFG->prefix}enrol_authorize_refunds r " . "INNER JOIN {$CFG->prefix}enrol_authorize e ON r.orderid = e.id " . "WHERE r.orderid = '{$orderno}'"; $refunds = get_records_sql($sql); if ($refunds) { $sumrefund = floatval(0.0); foreach ($refunds as $rf) { $substatus = authorize_get_status_action($rf); $subactions = ' '; if (empty($substatus->actions)) { $subactions .= $strs->none; } else { foreach ($substatus->actions as $vl) { $subactions .= "<a href='index.php?{$vl}=y&sesskey={$USER->sesskey}&order={$orderno}&suborder={$rf->id}'>{$authstrs->{$vl}}</a> "; } } $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, "<font style='color:{$color}'>" . $authstrs->{$substatus->status} . "</font>", $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"; print_table($t2); } } echo '</div>'; echo '</form>'; }