PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/MoodleWebRole/enrol/authorize/enrol_form.php

#
PHP | 347 lines | 287 code | 50 blank | 10 comment | 43 complexity | b9418cd0e7990059e32ea65393c6e9a1 MD5 | raw file
Possible License(s): LGPL-2.1, BSD-3-Clause, LGPL-2.0, GPL-2.0
  1. <?php // $Id: enrol_form.php,v 1.16.2.7 2009/11/19 10:15:21 skodak Exp $
  2. require_once($CFG->libdir.'/formslib.php');
  3. class enrol_authorize_form extends moodleform
  4. {
  5. function definition()
  6. {
  7. global $CFG, $USER;
  8. $paymentmethodsenabled = get_list_of_payment_methods();
  9. $paymentmethod = optional_param('paymentmethod', $paymentmethodsenabled[0], PARAM_ALPHA);
  10. if (!in_array($paymentmethod, $paymentmethodsenabled)) {
  11. error("Invalid payment method: $paymentmethod");
  12. }
  13. $mform =& $this->_form;
  14. $course = $this->_customdata['course'];
  15. $mform->addElement('header', 'general', get_string('paymentrequired'));
  16. $othermethodstr = $this->other_method_available($paymentmethod);
  17. if ($othermethodstr) {
  18. $mform->addElement('static', '', '<div class="mdl-right">' . $othermethodstr . '</div>', '');
  19. }
  20. $mform->addElement('hidden', 'id', $course->id);
  21. $mform->setType('id', PARAM_INT);
  22. $mform->addElement('hidden', 'paymentmethod', $paymentmethod);
  23. $mform->setType('paymentmethod', PARAM_ALPHA);
  24. $firstlastnamestr = (AN_METHOD_CC == $paymentmethod) ? get_string('nameoncard', 'enrol_authorize') : get_string('echeckfirslasttname', 'enrol_authorize');
  25. $firstlastnamegrp = array();
  26. $firstlastnamegrp[] = &$mform->createElement('text', 'firstname', '', 'size="16"');
  27. $firstlastnamegrp[] = &$mform->createElement('text', 'lastname', '', 'size="16"');
  28. $mform->addGroup($firstlastnamegrp, 'firstlastgrp', $firstlastnamestr, '&nbsp;', false);
  29. $firstlastnamegrprules = array();
  30. $firstlastnamegrprules['firstname'][] = array(get_string('missingfirstname'), 'required', null, 'client');
  31. $firstlastnamegrprules['lastname'][] = array(get_string('missinglastname'), 'required', null, 'client');
  32. $mform->addGroupRule('firstlastgrp', $firstlastnamegrprules);
  33. $mform->setType('firstname', PARAM_ALPHANUM);
  34. $mform->setType('lastname', PARAM_ALPHANUM);
  35. $mform->setDefault('firstname', $USER->firstname);
  36. $mform->setDefault('lastname', $USER->lastname);
  37. if (AN_METHOD_CC == $paymentmethod)
  38. {
  39. $mform->addElement('passwordunmask', 'cc', get_string('ccno', 'enrol_authorize'), 'size="20"');
  40. $mform->setType('cc', PARAM_ALPHANUM);
  41. $mform->setDefault('cc', '');
  42. $mform->addRule('cc', get_string('missingcc', 'enrol_authorize'), 'required', null, 'client');
  43. $mform->addRule('cc', get_string('ccinvalid', 'enrol_authorize'), 'numeric', null, 'client');
  44. $monthsmenu = array('' => get_string('choose'));
  45. for ($i = 1; $i <= 12; $i++) {
  46. $monthsmenu[$i] = userdate(gmmktime(12, 0, 0, $i, 15, 2000), "%B");
  47. }
  48. $nowdate = getdate();
  49. $startyear = $nowdate["year"] - 1;
  50. $endyear = $startyear + 20;
  51. $yearsmenu = array('' => get_string('choose'));
  52. for ($i = $startyear; $i < $endyear; $i++) {
  53. $yearsmenu[$i] = $i;
  54. }
  55. $ccexpiregrp = array();
  56. $ccexpiregrp[] = &$mform->createElement('select', 'ccexpiremm', '', $monthsmenu);
  57. $ccexpiregrp[] = &$mform->createElement('select', 'ccexpireyyyy', '', $yearsmenu);
  58. $mform->addGroup($ccexpiregrp, 'ccexpiregrp', get_string('ccexpire', 'enrol_authorize'), '&nbsp;', false);
  59. $ccexpiregrprules = array();
  60. $ccexpiregrprules['ccexpiremm'][] = array(get_string('missingccexpire', 'enrol_authorize'), 'required', null, 'client');
  61. $ccexpiregrprules['ccexpireyyyy'][] = array(get_string('missingccexpire', 'enrol_authorize'), 'required', null, 'client');
  62. $mform->addGroupRule('ccexpiregrp', $ccexpiregrprules);
  63. $mform->setType('ccexpiremm', PARAM_INT);
  64. $mform->setType('ccexpireyyyy', PARAM_INT);
  65. $mform->setDefault('ccexpiremm', '');
  66. $mform->setDefault('ccexpireyyyy', '');
  67. $creditcardsmenu = array('' => get_string('choose')) + get_list_of_creditcards();
  68. $mform->addElement('select', 'cctype', get_string('cctype', 'enrol_authorize'), $creditcardsmenu);
  69. $mform->setType('cctype', PARAM_ALPHA);
  70. $mform->addRule('cctype', get_string('missingcctype', 'enrol_authorize'), 'required', null, 'client');
  71. $mform->setDefault('cctype', '');
  72. $mform->addElement('text', 'cvv', get_string('ccvv', 'enrol_authorize'), 'size="4"');
  73. $mform->setHelpButton('cvv', array('cvv',get_string('ccvv', 'enrol_authorize'),'enrol/authorize'), true);
  74. $mform->setType('cvv', PARAM_ALPHANUM);
  75. $mform->setDefault('cvv', '');
  76. $mform->addRule('cvv', get_string('missingcvv', 'enrol_authorize'), 'required', null, 'client');
  77. $mform->addRule('cvv', get_string('missingcvv', 'enrol_authorize'), 'numeric', null, 'client');
  78. if (!empty($CFG->an_authcode)) {
  79. $ccauthgrp = array();
  80. $ccauthgrp[] = &$mform->createElement('checkbox', 'haveauth', null, get_string('haveauthcode', 'enrol_authorize'));
  81. $ccauthgrp[] = &$mform->createElement('static', 'nextline', null, '<br />');
  82. $ccauthgrp[] = &$mform->createElement('text', 'ccauthcode', '', 'size="8"');
  83. $mform->addGroup($ccauthgrp, 'ccauthgrp', get_string('authcode', 'enrol_authorize'), '&nbsp;', false);
  84. $mform->setHelpButton('ccauthgrp', array('authcode',get_string('authcode', 'enrol_authorize'),'enrol/authorize'), true);
  85. $ccauthgrprules = array();
  86. $ccauthgrprules['ccauthcode'][] = array(get_string('missingccauthcode', 'enrol_authorize'), 'numeric', null, 'client');
  87. $mform->addGroupRule('ccauthgrp', $ccauthgrprules);
  88. $mform->setDefault('haveauth', '');
  89. $mform->setDefault('ccauthcode', '');
  90. }
  91. if (!empty($CFG->an_avs)) {
  92. $mform->addElement('header', '', '&nbsp;&nbsp;' . get_string('address'), '');
  93. $mform->addElement('text', 'ccaddress', get_string('address'), 'size="30"');
  94. $mform->setType('ccaddress', PARAM_ALPHANUM);
  95. $mform->setDefault('ccaddress', $USER->address);
  96. $mform->addRule('ccaddress', get_string('missingaddress', 'enrol_authorize'), 'required', null, 'client');
  97. $citystategrp = array();
  98. $citystategrp[] = &$mform->createElement('text', 'cccity', '', 'size="14"');
  99. $citystategrp[] = &$mform->createElement('static', 'sep', null, ' - ');
  100. $citystategrp[] = &$mform->createElement('text', 'ccstate', '', 'size="8"');
  101. $mform->addGroup($citystategrp, 'citystategrp', get_string('city') . ' - ' . get_string('state'), '&nbsp;', false);
  102. $citystategrprules = array();
  103. $citystategrprules['cccity'][] = array(get_string('missingcity'), 'required', null, 'client');
  104. $mform->addGroupRule('citystategrp', $citystategrprules);
  105. $mform->setType('cccity', PARAM_ALPHANUM);
  106. $mform->setType('ccstate', PARAM_ALPHANUM);
  107. $mform->setDefault('cccity', $USER->city);
  108. $mform->setDefault('ccstate', '');
  109. $mform->addElement('select', 'cccountry', get_string('country'), get_list_of_countries());
  110. $mform->addRule('cccountry', get_string('missingcountry'), 'required', null, 'client');
  111. $mform->setType('cccountry', PARAM_ALPHA);
  112. $mform->setDefault('cccountry', $USER->country);
  113. }
  114. else {
  115. $mform->addElement('hidden', 'ccstate', '');
  116. $mform->setType('ccstate', PARAM_ALPHANUM);
  117. $mform->addElement('hidden', 'ccaddress', $USER->address);
  118. $mform->setType('ccaddress', PARAM_ALPHANUM);
  119. $mform->addElement('hidden', 'cccity', $USER->city);
  120. $mform->setType('cccity', PARAM_ALPHANUM);
  121. $mform->addElement('hidden', 'cccountry', $USER->country);
  122. $mform->setDefault('cccountry', $USER->country);
  123. }
  124. }
  125. elseif (AN_METHOD_ECHECK == $paymentmethod)
  126. {
  127. $mform->addElement('text', 'abacode', get_string('echeckabacode', 'enrol_authorize'), 'size="9" maxlength="9"');
  128. $mform->setHelpButton('abacode', array('aba',get_string('echeckabacode', 'enrol_authorize'),'enrol/authorize'), true);
  129. $mform->setType('abacode', PARAM_ALPHANUM);
  130. $mform->setDefault('abacode', '');
  131. $mform->addRule('abacode', get_string('missingaba', 'enrol_authorize'), 'required', null, 'client');
  132. $mform->addRule('abacode', get_string('missingaba', 'enrol_authorize'), 'numeric', null, 'client');
  133. $mform->addElement('text', 'accnum', get_string('echeckaccnum', 'enrol_authorize'), 'size="20" maxlength="20"');
  134. $mform->setType('accnum', PARAM_ALPHANUM);
  135. $mform->setDefault('accnum', '');
  136. $mform->addRule('accnum', get_string('invalidaccnum', 'enrol_authorize'), 'required', null, 'client');
  137. $mform->addRule('accnum', get_string('invalidaccnum', 'enrol_authorize'), 'numeric', null, 'client');
  138. $acctypes = array();
  139. $acctypesenabled = get_list_of_bank_account_types();
  140. foreach ($acctypesenabled as $key) {
  141. $acctypes[$key] = get_string("echeck".strtolower($key), "enrol_authorize");
  142. }
  143. $acctypes = array('' => get_string('choose')) + $acctypes;
  144. $mform->addElement('select', 'acctype', get_string('echeckacctype', 'enrol_authorize'), $acctypes);
  145. $mform->setType('acctype', PARAM_ALPHA);
  146. $mform->addRule('acctype', get_string('invalidacctype', 'enrol_authorize'), 'required', null, 'client');
  147. $mform->setDefault('acctype', '');
  148. $mform->addElement('text', 'bankname', get_string('echeckbankname', 'enrol_authorize'), 'size="20" maxlength="50"');
  149. $mform->setType('bankname', PARAM_ALPHANUM);
  150. $mform->setDefault('bankname', '');
  151. $mform->addRule('bankname', get_string('missingbankname', 'enrol_authorize'), 'required', null, 'client');
  152. }
  153. $mform->addElement('text', 'cczip', get_string('zipcode', 'enrol_authorize'), 'size="5"');
  154. $mform->setType('cczip', PARAM_ALPHANUM);
  155. $mform->setDefault('cczip', '');
  156. $mform->addRule('cczip', get_string('missingzip', 'enrol_authorize'), 'required', null, 'client');
  157. $this->add_action_buttons(false, get_string('sendpaymentbutton', 'enrol_authorize'));
  158. }
  159. function validation($data, $files)
  160. {
  161. global $CFG;
  162. $errors = parent::validation($data, $files);
  163. if (AN_METHOD_CC == $data['paymentmethod'])
  164. {
  165. if (!in_array($data['cctype'], array_keys(get_list_of_creditcards()))) {
  166. $errors['cctype'] = get_string('missingcctype', 'enrol_authorize');
  167. }
  168. $expdate = sprintf("%02d", intval($data['ccexpiremm'])) . $data['ccexpireyyyy'];
  169. $validcc = $this->validate_cc($data['cc'], $data['cctype'], $expdate);
  170. if (!$validcc) {
  171. if ($validcc === 0) {
  172. $errors['ccexpiregrp'] = get_string('ccexpired', 'enrol_authorize');
  173. }
  174. else {
  175. $errors['cc'] = get_string('ccinvalid', 'enrol_authorize');
  176. }
  177. }
  178. if (!empty($CFG->an_authcode) && !empty($data['haveauth']) && empty($data['ccauthcode'])) {
  179. $errors['ccauthgrp'] = get_string('missingccauthcode', 'enrol_authorize');
  180. }
  181. }
  182. elseif (AN_METHOD_ECHECK == $data['paymentmethod'])
  183. {
  184. if (!$this->validate_aba($data['abacode'])) {
  185. $errors['abacode'] = get_string('invalidaba', 'enrol_authorize');
  186. }
  187. if (!in_array($data['acctype'], get_list_of_bank_account_types())) {
  188. $errors['acctype'] = get_string('invalidacctype', 'enrol_authorize');
  189. }
  190. }
  191. return $errors;
  192. }
  193. function other_method_available($currentmethod)
  194. {
  195. $course = $this->_customdata['course'];
  196. if ($currentmethod == AN_METHOD_CC) {
  197. $otheravailable = in_array(AN_METHOD_ECHECK, get_list_of_payment_methods());
  198. $url = 'enrol.php?id='.$course->id.'&amp;paymentmethod='.AN_METHOD_ECHECK;
  199. $stringtofetch = 'usingecheckmethod';
  200. }
  201. else {
  202. $otheravailable = in_array(AN_METHOD_CC, get_list_of_payment_methods());
  203. $url = 'enrol.php?id='.$course->id.'&amp;paymentmethod='.AN_METHOD_CC;
  204. $stringtofetch = 'usingccmethod';
  205. }
  206. if ($otheravailable) {
  207. $a = new stdClass;
  208. $a->url = $url;
  209. return get_string($stringtofetch, "enrol_authorize", $a);
  210. }
  211. else {
  212. return '';
  213. }
  214. }
  215. function validate_aba($aba)
  216. {
  217. if (ereg("^[0-9]{9}$", $aba)) {
  218. $n = 0;
  219. for($i = 0; $i < 9; $i += 3) {
  220. $n += (substr($aba, $i, 1) * 3) + (substr($aba, $i + 1, 1) * 7) + (substr($aba, $i + 2, 1));
  221. }
  222. if ($n != 0 and $n % 10 == 0) {
  223. return true;
  224. }
  225. }
  226. return false;
  227. }
  228. function validate_cc($Num, $Name = "n/a", $Exp = "")
  229. {
  230. // Check the expiration date first
  231. if (strlen($Exp))
  232. {
  233. $Month = substr($Exp, 0, 2);
  234. $Year = substr($Exp, -2);
  235. $WorkDate = "$Month/01/$Year";
  236. $WorkDate = strtotime($WorkDate);
  237. $LastDay = date("t", $WorkDate);
  238. $Expires = strtotime("$Month/$LastDay/$Year 11:59:59");
  239. if ($Expires < time()) return 0;
  240. }
  241. // Innocent until proven guilty
  242. $GoodCard = true;
  243. // Get rid of any non-digits
  244. $Num = ereg_replace("[^0-9]", "", $Num);
  245. // Perform card-specific checks, if applicable
  246. switch ($Name)
  247. {
  248. case "mcd" :
  249. $GoodCard = ereg("^5[1-5].{14}$", $Num);
  250. break;
  251. case "vis" :
  252. $GoodCard = ereg("^4.{15}$|^4.{12}$", $Num);
  253. break;
  254. case "amx" :
  255. $GoodCard = ereg("^3[47].{13}$", $Num);
  256. break;
  257. case "dsc" :
  258. $GoodCard = ereg("^6011.{12}$", $Num);
  259. break;
  260. case "dnc" :
  261. $GoodCard = ereg("^30[0-5].{11}$|^3[68].{12}$", $Num);
  262. break;
  263. case "jcb" :
  264. $GoodCard = ereg("^3.{15}$|^2131|1800.{11}$", $Num);
  265. break;
  266. case "dlt" :
  267. $GoodCard = ereg("^4.{15}$", $Num);
  268. break;
  269. case "swi" :
  270. $GoodCard = ereg("^[456].{15}$|^[456].{17,18}$", $Num);
  271. break;
  272. case "enr" :
  273. $GoodCard = ereg("^2014.{11}$|^2149.{11}$", $Num);
  274. break;
  275. }
  276. // The Luhn formula works right to left, so reverse the number.
  277. $Num = strrev($Num);
  278. $Total = 0;
  279. for ($x=0; $x < strlen($Num); $x++)
  280. {
  281. $digit = substr($Num, $x, 1);
  282. // If it's an odd digit, double it
  283. if ($x/2 != floor($x/2)) {
  284. $digit *= 2;
  285. // If the result is two digits, add them
  286. if (strlen($digit) == 2)
  287. $digit = substr($digit, 0, 1) + substr($digit, 1, 1);
  288. }
  289. // Add the current digit, doubled and added if applicable, to the Total
  290. $Total += $digit;
  291. }
  292. // If it passed (or bypassed) the card-specific check and the Total is
  293. // evenly divisible by 10, it's cool!
  294. return ($GoodCard && $Total % 10 == 0);
  295. }
  296. }
  297. ?>