[ Index ]

PHP Cross Reference of Moodle 1.9.3 [Build 15-Oct-2008]

title

Body

[close]

/enrol/authorize/ -> uploadcsv.php (source)

   1  <?php // $Id: uploadcsv.php,v 1.12.2.2 2008/02/07 16:27:53 ethem Exp $
   2  
   3  /// Load libraries
   4      require_once('../../config.php');
   5      require_once($CFG->libdir.'/uploadlib.php');
   6      require_once($CFG->dirroot.'/enrol/authorize/const.php');
   7      require_once($CFG->dirroot.'/enrol/authorize/localfuncs.php');
   8  
   9  /// Require capabilites
  10      require_login();
  11      require_capability('enrol/authorize:uploadcsv', get_context_instance(CONTEXT_USER, $USER->id));
  12  
  13  /// Print header
  14      $struploadcsv = get_string('uploadcsv', 'enrol_authorize');
  15      $navlinks = array();
  16      $navlinks[] = array('name' => $struploadcsv, 'link' => "uploadcsv.php", 'type' => 'misc');
  17      $navigation = build_navigation($navlinks);
  18  
  19      print_header_simple($struploadcsv, "", $navigation);
  20      print_heading_with_help($struploadcsv, 'uploadcsv', 'enrol/authorize');
  21  
  22  /// Handle CSV file
  23      if (($form = data_submitted()) && confirm_sesskey()) {
  24          $um = new upload_manager('csvfile', false, false, null, false, 0);
  25          if ($um->preprocess_files()) {
  26              $filename = $um->files['csvfile']['tmp_name'];
  27              // Fix mac/dos newlines
  28              $text = file_get_contents($filename);
  29              $text = preg_replace('!\r\n?!', "\n", $text);
  30              $fp = fopen($filename, "w");
  31              fwrite($fp, $text);
  32              fclose($fp);
  33              authorize_process_csv($filename);
  34          }
  35      }
  36  
  37  /// Print submit form
  38      $maxuploadsize = get_max_upload_file_size();
  39      echo '<center><form method="post" enctype="multipart/form-data" action="uploadcsv.php">
  40            <input type="hidden" name="MAX_FILE_SIZE" value="'.$maxuploadsize.'" />
  41            <input type="hidden" name="sesskey" value="'.$USER->sesskey.'">';
  42            upload_print_form_fragment(1, array('csvfile'), array(get_string('file')));
  43      echo '<input type="submit" value="'.get_string('upload').'" />';
  44      echo '</form></center><br />';
  45  
  46  /// Print footer
  47      print_footer();
  48  
  49  ?><?php
  50  
  51  function authorize_process_csv($filename)
  52  {
  53      global $CFG, $SITE;
  54  
  55  /// We need these fields
  56      $myfields = array(
  57          'Transaction ID',           // enrol_authorize.transid or enrol_authorize_refunds.transid; See: Reference Transaction ID
  58          'Transaction Status',       // Under Review,Approved Review,Review Failed,Settled Successfully
  59          'Transaction Type',         // Authorization w/ Auto Capture, Authorization Only, Capture Only, Credit, Void, Prior Authorization Capture
  60          'Settlement Amount',        //
  61          'Settlement Currency',      //
  62          'Settlement Date/Time',     //
  63          'Authorization Amount',     //
  64          'Authorization Currency',   //
  65          'Submit Date/Time',         // timecreated
  66          'Reference Transaction ID', // enrol_authorize.transid if Transaction Type = Credit
  67          'Total Amount',             // enrol_authorize.cost
  68          'Currency',                 // enrol_authorize.currency
  69          'Invoice Number',           // enrol_authorize.id: Don't trust this! Backup/Restore changes this
  70          'Customer ID'               // enrol_authorize.userid
  71      );
  72  
  73  /// Open the file and get first line
  74      $handle = fopen($filename, "r");
  75      if (!$handle) {
  76          error('CANNOT OPEN CSV FILE');
  77      }
  78      $firstline = fgetcsv($handle, 8192, ",");
  79      $numfields = count($firstline);
  80      if ($numfields != 49 && $numfields != 70) {
  81          @fclose($handle);
  82          error('INVALID CSV FILE; Each line must include 49 or 70 fields');
  83      }
  84  
  85  /// Re-sort fields
  86      $csvfields = array();
  87      foreach ($myfields as $myfield) {
  88          $csvindex = array_search($myfield, $firstline);
  89          if ($csvindex === false) {
  90              $csvfields = array();
  91              break;
  92          }
  93          $csvfields[$myfield] = $csvindex;
  94      }
  95      if (empty($csvfields)) {
  96          @fclose($handle);
  97          error("<b>INVALID CSV FILE:</b> First line must include 'Header Fields' and
  98                 the file must be type of <br />'Expanded Fields/Comma Separated'<br />or<br />
  99                'Expanded Fields with CAVV Result Code/Comma Separated'");
 100      }
 101  
 102  /// Read lines
 103      $sendem = array();
 104      $ignoredlines = '';
 105  
 106      $imported = 0;
 107      $updated = 0;
 108      $ignored = 0;
 109      while (($data = fgetcsv($handle, 8192, ",")) !== FALSE) {
 110          if (count($data) != $numfields) {
 111              $ignored++; // ignore empty lines
 112              continue;
 113          }
 114  
 115          $transid = $data[$csvfields['Transaction ID']];
 116          $transtype = $data[$csvfields['Transaction Type']];
 117          $transstatus = $data[$csvfields['Transaction Status']];
 118          $reftransid = $data[$csvfields['Reference Transaction ID']];
 119          $settlementdate = strtotime($data[$csvfields['Settlement Date/Time']]);
 120  
 121          if ($transstatus == 'Approved Review' || $transstatus == 'Review Failed') {
 122              if (($order = get_record('enrol_authorize', 'transid', $transid))) {
 123                  $order->status = ($transstatus == 'Approved Review') ? AN_STATUS_APPROVEDREVIEW : AN_STATUS_REVIEWFAILED;
 124                  update_record('enrol_authorize', $order);
 125                  $updated++; // Updated order status
 126              }
 127              continue;
 128          }
 129  
 130          if (!empty($reftransid) && is_numeric($reftransid) && 'Settled Successfully' == $transstatus && 'Credit' == $transtype) {
 131              if (($order = get_record('enrol_authorize', 'transid', $reftransid))) {
 132                  if (AN_METHOD_ECHECK == $order->paymentmethod) {
 133                      $refund = get_record('enrol_authorize_refunds', 'transid', $transid);
 134                      if ($refund) {
 135                          $refund->status = AN_STATUS_CREDIT;
 136                          $refund->settletime = $settlementdate;
 137                          update_record('enrol_authorize_refunds', $refund);
 138                          $updated++;
 139                      }
 140                      else {
 141                          $ignored++;
 142                          $ignoredlines .= $reftransid . ": Not our business(Reference Transaction ID)\n";
 143                      }
 144                  }
 145              }
 146              else {
 147                  $ignored++;
 148                  $ignoredlines .= $reftransid . ": Not our business(Transaction ID)\n";
 149              }
 150              continue;
 151          }
 152  
 153          if (! ($transstatus == 'Settled Successfully' && $transtype == 'Authorization w/ Auto Capture')) {
 154              $ignored++;
 155              $ignoredlines .= $transid . ": Not settled\n";
 156              continue;
 157          }
 158  
 159          // TransactionId must match
 160          $order = get_record('enrol_authorize', 'transid', $transid);
 161          if (!$order) {
 162              $ignored++;
 163              $ignoredlines .= $transid . ": Not our business\n";
 164              continue;
 165          }
 166  
 167          // Authorized/Captured and Settled
 168          $order->status = AN_STATUS_AUTHCAPTURE;
 169          $order->settletime = $settlementdate;
 170          update_record('enrol_authorize', $order);
 171          $updated++; // Updated order status and settlement date
 172  
 173          if ($order->paymentmethod != AN_METHOD_ECHECK) {
 174              $ignored++;
 175              $ignoredlines .= $transid . ": The method must be echeck\n";
 176              continue;
 177          }
 178  
 179          // Get course and context
 180          $course = get_record('course', 'id', $order->courseid);
 181          if (!$course) {
 182              $ignored++;
 183              $ignoredlines .= $transid . ": Could not find this course: " . $order->courseid . "\n";
 184              continue;
 185          }
 186          $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
 187          if (!$coursecontext) {
 188              $ignored++;
 189              $ignoredlines .= $transid . ": Could not find course context: " . $order->courseid . "\n";
 190              continue;
 191          }
 192  
 193          // Get user
 194          $user = get_record('user', 'id', $order->userid);
 195          if (!$user) {
 196              $ignored++;
 197              $ignoredlines .= $transid . ": Could not find this user: " . $order->userid . "\n";
 198              continue;
 199          }
 200  
 201          // If user wasn't enrolled, enrol now. Ignore otherwise. Because admin user might submit this file again.
 202          if (($role = get_default_course_role($course))) {
 203              if (! user_has_role_assignment($user->id, $role->id, $coursecontext->id)) {
 204                  $timestart = $timeend = 0;
 205                  if ($course->enrolperiod) {
 206                      $timestart = time();
 207                      $timeend = $timestart + $course->enrolperiod;
 208                  }
 209                  if (role_assign($role->id, $user->id, 0, $coursecontext->id, $timestart, $timeend, 0, 'authorize')) {
 210                      $imported++;
 211                      if (!empty($CFG->enrol_mailstudents)) {
 212                          $sendem[] = $order->id;
 213                      }
 214                  }
 215                  else {
 216                      $ignoredlines .= $transid . ": Error while trying to enrol " . fullname($user) . " in '$course->fullname' \n";
 217                  }
 218              }
 219          }
 220      }
 221      fclose($handle);
 222  
 223  /// Send email to admin
 224      if (!empty($ignoredlines)) {
 225          $admin = get_admin();
 226          email_to_user($admin, $admin, "$SITE->fullname: Authorize.net CSV ERROR LOG", $ignoredlines);
 227      }
 228  
 229  /// Send welcome messages to users
 230      if (!empty($sendem)) {
 231          send_welcome_messages($sendem);
 232      }
 233  
 234  /// Show result
 235      notice("<b>Done...</b><br />Imported: $imported<br />Updated: $updated<br />Ignored: $ignored");
 236  }
 237  
 238  ?>


Generated: Wed Jan 14 11:33:29 2009 Cross-referenced by PHPXref 0.7