2
// This file is part of Moodle - http://moodle.org/
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
// GNU General Public License for more details.
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
18
* Authorize.Net enrolment plugin - support for user self unenrolment.
20
* @package enrol_authorize
21
* @copyright 2010 Eugene Venter
22
* @author Eugene Venter
23
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27
require_once('../../config.php');
28
require_once($CFG->dirroot.'/enrol/authorize/const.php');
29
require_once($CFG->dirroot.'/enrol/authorize/localfuncs.php');
30
require_once($CFG->libdir.'/eventslib.php');
31
require_once('import_form.php');
33
/// Require capabilities
35
require_capability('enrol/authorize:uploadcsv', context_system::instance());
38
$struploadcsv = get_string('uploadcsv', 'enrol_authorize');
39
$managebutton = "<form method='get' action='index.php'><input type='submit' value='".get_string('paymentmanagement', 'enrol_authorize')."' /></form>";
41
$form = new enrol_authorize_import_form();
43
$PAGE->set_url('/enrol/authorize/uploadcsv.php');
44
$PAGE->navbar->add(get_string('paymentmanagement', 'enrol_authorize'), 'index.php');
45
$PAGE->navbar->add($struploadcsv, 'uploadcsv.php');
46
$PAGE->set_title($struploadcsv);
47
$PAGE->set_cacheable(false);
48
$PAGE->set_button($managebutton);
49
echo $OUTPUT->header();
50
echo $OUTPUT->heading($struploadcsv);
53
if (!$form->get_data()) {
56
$filename = $CFG->tempdir . '/enrolauthorize/importedfile_'.time().'.csv';
57
make_temp_directory('enrolauthorize');
58
// Fix mac/dos newlines
59
$text = $form->get_file_content('csvfile');
60
$text = preg_replace('!\r\n?!', "\n", $text);
61
$fp = fopen($filename, "w");
64
authorize_process_csv($filename);
68
echo $OUTPUT->footer();
70
function authorize_process_csv($filename) {
71
global $CFG, $SITE, $DB;
73
$plugin = enrol_get_plugin('authorize');
75
/// We need these fields
77
'Transaction ID', // enrol_authorize.transid or enrol_authorize_refunds.transid; See: Reference Transaction ID
78
'Transaction Status', // Under Review,Approved Review,Review Failed,Settled Successfully
79
'Transaction Type', // Authorization w/ Auto Capture, Authorization Only, Capture Only, Credit, Void, Prior Authorization Capture
80
'Settlement Amount', //
81
'Settlement Currency', //
82
'Settlement Date/Time', //
83
'Authorization Amount', //
84
'Authorization Currency', //
85
'Submit Date/Time', // timecreated
86
'Reference Transaction ID', // enrol_authorize.transid if Transaction Type = Credit
87
'Total Amount', // enrol_authorize.cost
88
'Currency', // enrol_authorize.currency
89
'Invoice Number', // enrol_authorize.id: Don't trust this! Backup/Restore changes this
90
'Customer ID' // enrol_authorize.userid
93
/// Open the file and get first line
94
$handle = fopen($filename, "r");
96
print_error('cannotopencsv');
98
$firstline = fgetcsv($handle, 8192, ",");
99
$numfields = count($firstline);
100
if ($numfields != 49 && $numfields != 70) {
102
print_error('csvinvalidcolsnum');
106
$csvfields = array();
107
foreach ($myfields as $myfield) {
108
$csvindex = array_search($myfield, $firstline);
109
if ($csvindex === false) {
110
$csvfields = array();
113
$csvfields[$myfield] = $csvindex;
115
if (empty($csvfields)) {
117
print_error('csvinvalidcols');
127
while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
128
if (count($data) != $numfields) {
129
$ignored++; // ignore empty lines
133
$transid = $data[$csvfields['Transaction ID']];
134
$transtype = $data[$csvfields['Transaction Type']];
135
$transstatus = $data[$csvfields['Transaction Status']];
136
$reftransid = $data[$csvfields['Reference Transaction ID']];
137
$settlementdate = strtotime($data[$csvfields['Settlement Date/Time']]);
139
if ($transstatus == 'Approved Review' || $transstatus == 'Review Failed') {
140
if (($order = $DB->get_record('enrol_authorize', array('transid'=>$transid)))) {
141
$order->status = ($transstatus == 'Approved Review') ? AN_STATUS_APPROVEDREVIEW : AN_STATUS_REVIEWFAILED;
142
$DB->update_record('enrol_authorize', $order);
143
$updated++; // Updated order status
148
if (!empty($reftransid) && is_numeric($reftransid) && 'Settled Successfully' == $transstatus && 'Credit' == $transtype) {
149
if (($order = $DB->get_record('enrol_authorize', array('transid'=>$reftransid)))) {
150
if (AN_METHOD_ECHECK == $order->paymentmethod) {
151
$refund = $DB->get_record('enrol_authorize_refunds', array('transid'=>$transid));
153
$refund->status = AN_STATUS_CREDIT;
154
$refund->settletime = $settlementdate;
155
$DB->update_record('enrol_authorize_refunds', $refund);
160
$ignoredlines .= $reftransid . ": Not our business(Reference Transaction ID)\n";
166
$ignoredlines .= $reftransid . ": Not our business(Transaction ID)\n";
171
if (! ($transstatus == 'Settled Successfully' && $transtype == 'Authorization w/ Auto Capture')) {
173
$ignoredlines .= $transid . ": Not settled\n";
177
// TransactionId must match
178
$order = $DB->get_record('enrol_authorize', array('transid'=>$transid));
181
$ignoredlines .= $transid . ": Not our business\n";
185
// Authorized/Captured and Settled
186
$order->status = AN_STATUS_AUTHCAPTURE;
187
$order->settletime = $settlementdate;
188
$DB->update_record('enrol_authorize', $order);
189
$updated++; // Updated order status and settlement date
191
if ($order->paymentmethod != AN_METHOD_ECHECK) {
193
$ignoredlines .= $transid . ": The method must be echeck\n";
197
// Get course and context
198
$course = $DB->get_record('course', array('id'=>$order->courseid));
201
$ignoredlines .= $transid . ": Could not find this course: " . $order->courseid . "\n";
204
$coursecontext = context_course::instance($course->id, IGNORE_MISSING);
205
if (!$coursecontext) {
207
$ignoredlines .= $transid . ": Could not find course context: " . $order->courseid . "\n";
212
$user = $DB->get_record('user', array('id'=>$order->userid));
215
$ignoredlines .= $transid . ": Could not find this user: " . $order->userid . "\n";
219
// If user wasn't enrolled, enrol now. Ignore otherwise. Because admin user might submit this file again.
220
if (($role = get_default_course_role($course))) {
221
if (! user_has_role_assignment($user->id, $role->id, $coursecontext->id)) {
222
$timestart = $timeend = 0;
223
if ($course->enrolperiod) {
225
$timeend = $timestart + $course->enrolperiod;
228
$pinstance = $DB->get_record('enrol', array('id'=>$order->instanceid));
229
$plugin->enrol_user($pinstance, $user->id, $pinstance->roleid, $timestart, $timeend);
232
if ($plugin->get_config('enrol_mailstudents')) {
233
$sendem[] = $order->id;
240
/// Send email to admin
241
if (!empty($ignoredlines)) {
242
$admin = get_admin();
244
$eventdata = new stdClass();
245
$eventdata->modulename = 'moodle';
246
$eventdata->component = 'enrol_authorize';
247
$eventdata->name = 'authorize_enrolment';
248
$eventdata->userfrom = $admin;
249
$eventdata->userto = $admin;
250
$eventdata->subject = format_string($SITE->fullname, true, array('context' => context_course::instance(SITEID))).': Authorize.net CSV ERROR LOG';
251
$eventdata->fullmessage = $ignoredlines;
252
$eventdata->fullmessageformat = FORMAT_PLAIN;
253
$eventdata->fullmessagehtml = '';
254
$eventdata->smallmessage = '';
255
message_send($eventdata);
258
/// Send welcome messages to users
259
if (!empty($sendem)) {
260
send_welcome_messages($sendem);
264
notice("<b>Done...</b><br />Imported: $imported<br />Updated: $updated<br />Ignored: $ignored");