PageRenderTime 53ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/class.xmodatos.inc

https://github.com/jcplat/console-seolan
PHP | 1036 lines | 691 code | 46 blank | 299 comment | 108 complexity | 9af7f29b8b91aed55a24488454faf44e MD5 | raw file
Possible License(s): LGPL-2.0, LGPL-2.1, GPL-3.0, Apache-2.0, BSD-3-Clause
  1. <?php
  2. /**
  3. * \file class.xmodatos.inc
  4. * \name XModPaybox
  5. * \author Vladimir Monari
  6. * \version 1.0
  7. * \date 1 Septembre 2013
  8. */
  9. /**
  10. * \brief Classe XModAtos.
  11. * Classe de paiement ATOS/SIPS
  12. * \version 1.0
  13. */
  14. class XModAtos extends XModMonetique{
  15. // Options spécifiques au module
  16. public $path = null; ///< Chemin où se trouvent les CGI Atos.
  17. public $singleDeadLine = "IMMEDIATE"; ///< IMMEDIATE par defaut, PAYEMENT_N pour un paiement en plusieurs fois
  18. public $logoReturnOk = NULL; ///< Logo à afficer quand la transaction est réussie.
  19. public $logoReturnKo = NULL; ///< Logo à afficer quand la transaction échoue.
  20. public $defaultTemplate = "xmodmonetique/xmodmonetique-atos-basic-form.html"; ///< Template par défaut
  21. const SERVER = '81.200.32.61'; ///< adresse du serveur
  22. const SERVICE_PORT = 7180; ///< port de service
  23. const COMMAND_PORT = 7181; ///< port de commande
  24. private $cardsTypePaybox = array(
  25. 'CB' => 'CB',
  26. 'VISA' => 'VISA',
  27. 'MASTERCARD' => 'MASTERCARD',
  28. 'AMEX' => 'AMEX',
  29. 'FINAREF' => 'FINAREF',
  30. 'FNAC' => 'FNAC',
  31. 'CYRILLUS' => 'CYRILLUS',
  32. 'PRINTEMPS' => 'PRINTEMPS',
  33. 'KANGOUROU' => 'KANGOUROU',
  34. 'SURCOUF' => 'SURCOUF',
  35. 'POCKETCARD' => 'POCKETCARD',
  36. 'CONFORAMA' => 'CONFORAMA',
  37. 'NUITEA' => 'NUITEA',
  38. 'AURORE' => 'AURORE',
  39. 'PASS' => 'PASS',
  40. 'PASS2' => 'PASS2',
  41. 'PASS3FOIS' => 'PASS3FOIS',
  42. 'CBPASS' => 'CBPASS',
  43. 'PEUGEOT' => 'PEUGEOT',
  44. 'COFINOGA' => 'COFINOGA',
  45. 'ACCORD' => 'ACCORD',
  46. 'PLURIEL' => 'BUYSTER',
  47. '1EUROCOM' => '1EUROCOM',
  48. '4ETOILES' => '4ETOILES',
  49. 'COFIDIS_3X' => 'COFIDIS_3X',
  50. 'PROFILPLUS' => 'PROFILPLUS',
  51. 'LIBRAVOU' => 'LIBRAVOU',
  52. 'JCB' => 'JCB',
  53. 'DINERS' => 'DINERS',
  54. 'SOLO' => 'SOLO',
  55. 'SWITCH' => 'SWITCH',
  56. 'DELTA' => 'DELTA',
  57. 'BANCONTACTMISTERCASH' => 'BANCONTACTMISTERCASH'
  58. );
  59. /// Constructeur standard d'un module console.
  60. function __construct($ar=null){
  61. parent::__construct($ar);
  62. }
  63. /* Fonctions de paiement version WEB */
  64. /**
  65. * \brief Méthode de génération des données de paiement.
  66. * Cette fonction permet de générer les données d'un paiement ATOS.
  67. * \param MOrderInfos $order : Objet des données issues de la commande.
  68. * \param MCustomerInfos $customer : Objet des données issues du client.
  69. * \param MShopInfos $shop : Objet comportant les paramètres de la boutique.
  70. * \param MTransaction $transaction : La transaction en cours de paramètrage.
  71. * \return Array :
  72. * - MTransaction $transaction : La transaction contenant tous les paramètres d'appel.
  73. * - Array $webPaymentAtosForm : Contient le formulaire envoyé en banque.
  74. * - String $template : Le template correspondant correspondant un module de traitement (TZR_SHARE_DIR.$this->defaultTemplate).
  75. * - String $tplentry : L'entrée smarty du template : 'webPaymentAtosForm'.
  76. * \note
  77. * - Crée le formulaire à envoyer en banque.
  78. * - Retourne la transaction en cours, le formulaire envoyé en banque ainsi que le template et son entrée.
  79. */
  80. protected function webPaymentHandling(MTransaction $transaction){
  81. $transaction->callParms = $this->webPaymentAtosForm($transaction);
  82. $webPaymentAtosForm['fields'] = $this->callExec( $transaction->callParms);
  83. return array($transaction, $webPaymentAtosForm, TZR_SHARE_DIR.$this->defaultTemplate, 'atosForm');
  84. }
  85. /**
  86. * \brief Méthode de génération du formulaire de paiement.
  87. * Cette fonction permet de générer le formulaire de paiement ATOS.
  88. * \param MOrderInfos $order : Objet des données issues de la commande.
  89. * \param MCustomerInfos $customer : Objet des données issues du client.
  90. * \param MShopInfos $shop : Objet comportant les paramètres de la boutique.
  91. * \param String $transactionOid : L'oid de la transaction est cours de paramètrage.
  92. * \return Array :
  93. * - Array $parms : Contient le formulaire envoyé en banque.
  94. * \note
  95. * - Mise en forme du montant (centimes). \link XModMonetique::formatOrderAmount($amount); \endlink
  96. * - Paiement en euros par défaut.
  97. * - Si $order->options['noCapture'] est valorisé à true alors on ne fait qu'une demande d'autorisation, sinon capture par défaut.
  98. * - Gestion du paiement multiple si la commande indique plusieurs échéances. \link MOrderInfos::$options \endlink
  99. * - Gestion du mode TEST ou PRODUCTION.
  100. * - Gestion des abonnement.
  101. * - Gestion des délais de capture.
  102. * - Génération de la signature.
  103. */
  104. private function webPaymentAtosForm(MTransaction $transaction){
  105. $params = array();
  106. $params['merchant_id'] = $this->siteId;
  107. $params['capture_mode'] = $this->singleDeadLine;
  108. $params['merchant_country'] = $this->lang;
  109. $params['amount'] = $this->formatOrderAmount($transaction->amount);
  110. $params['currency_code'] = $this->defaultCurrencyCode;
  111. $params['pathfile'] = $this->path.'param/pathfile';
  112. $params['normal_return_url'] = $this->urlPayed;
  113. $params['cancel_return_url'] = $this->urlCancelled;
  114. $params['automatic_response_url'] = $this->urlAutoResponse;
  115. $params['language'] = $this->lang;
  116. $params['target'] = '_top';
  117. $params['order_id'] = $transaction->orderReference;
  118. $params['customer_email'] = $transaction->customerEmail;
  119. $params['customer_id']=str_replace('WTSCUSTOMER:', '', $transaction->customerOid);
  120. $params['customer_ip_address'] = $_SERVER['REMOTE_ADDR'];
  121. $params['return_context'] = urlencode($transaction->oid);
  122. // Préparation des paiement à multiples échéances
  123. if ($transaction->nbDeadLine > 1) {
  124. // Préparation des paramètres de multi paiements
  125. $reste = $this->formatOrderAmount($transaction->amount) % $transaction->nbDeadLine;
  126. $montantDivise = $this->formatOrderAmount($order->amount) / $transaction->nbDeadLine;
  127. $montantDivise = explode('.', $montantDivise);
  128. $montant = $montantDivise[0];
  129. $montant1 = $montant+$reste ;
  130. $params['data'] = 'NB_PAYMENT='.$transaction->nbDeadLine.';PERIOD=';
  131. $params['data'] .= $transaction->frequencyDuplicate.'INITIAL_AMOUNT='.$montant1;
  132. }
  133. // Si la commande indique que la capture doit être différé
  134. $params['capture_day'] = $transaction->captureDay;///< Nombre de jours pour la capture différée
  135. // Gestion du mode de capture (Capture par défaut, sinon autorisation seulement)
  136. if( $transaction->captureMode == self::AUTHORIZATION_ONLY){
  137. $params['capture_mode'] = 'VALIDATION';
  138. }
  139. else{
  140. $params['capture_mode'] = 'AUTHOR_CAPTURE';
  141. }
  142. return $params;
  143. }
  144. private function callExec($params) {
  145. // Création de la chaine de paramètres
  146. $form='';
  147. foreach($params as $key => $value){
  148. $form .= $key.'='.$value.' ';
  149. }
  150. // Appel de l'executable
  151. $result = exec($this->path."bin/static/request $form");
  152. $tableau = explode ("!", $result);
  153. $code = $tableau[1];
  154. $error = $tableau[2];
  155. $message = $tableau[3];
  156. // Analyse du retour de l'éxécution
  157. if (( $code == "" ) && ( $error == "" )) {
  158. throw new Exception('::callExec : Error appel API ATOS request : '.$message);
  159. }
  160. else if ($code != 0) {
  161. throw new Exception('::callExec : Error appel API de paiement : '.$code." : ".$error.", ". $message);
  162. }
  163. return $message;
  164. }
  165. /**
  166. * \brief Méthode de traitement du retour banque ATOS.
  167. * Méthode de traitement du retour banque ATOS, afin de transamettre des paramètres standards à \link XModMonetique::autoresponse() \endlink
  168. * \return MTransaction $transaction : La transaction concernée par le retour automatique.
  169. * \note
  170. * - Récupère de toutes les valeurs attendu par ATOS, présentes dans $_REQUEST.
  171. * - Mémorise les paramètres de retour de la transaction sous une forme normalisée pour faciliter le traitement en aval et dans Xmodmonetique.
  172. * - Vérifie la signature de la reponse. \link XModPaybox::verificationSignature($retour, $signature); \endlink
  173. * - Affecte le status de la transaction.
  174. * - Récupère l'oid de la transaction grâce à urldecode($params['return_context']);
  175. */
  176. protected function webPaymentUnFoldReponse() {
  177. // Appel de l'executable
  178. $message="message=".$_REQUEST[DATA];
  179. $pathfile= 'pathfile='.$this->path.'param/pathfile';
  180. $path_bin = $this->path.'bin/static/response';
  181. $message = escapeshellcmd($message);
  182. $result=exec("$path_bin $pathfile $message");
  183. $response = explode ("!", $result);
  184. // Extraction des paramètres
  185. $params = $this->extractExecAutoresponse($response);
  186. $transaction->responseParms = $params;
  187. // Mise en forme des paramètre en vue du traitement par XModMonetique
  188. $formatedReturn = $this->formatParams($params);
  189. foreach($formatedReturn as $k => $v){
  190. $transaction->{$k} = $v;
  191. }
  192. // Si l'éxécutable n'est pas présent (ou introuvable)
  193. if (( $params['code'] == "" ) && ( $params['error'] == "" ) ){
  194. throw new Exception(get_class($this).' ::webPaymentUnFoldReponse : Error call API ATOS : response : '.$message."\n executable response non trouve $path_bin");
  195. }
  196. // Error, sauvegarde le message d'erreur
  197. else if ( $params['code'] != 0 ){
  198. $transaction->status = self::INVALID; ///< Définition de status invalide
  199. $transaction->statusComplement = 'Error message : '.$code." : ".$error.", ". $message;
  200. $transaction->autoResponseMode = self::RESPONSE_NONE;
  201. $this->xset->procEdit(array('_options'=>array('local'=>1),
  202. 'oid'=>$transaction->oid,
  203. 'responseParms'=>$transaction->responseParms,
  204. 'status'=>$transaction->status,
  205. 'dateTimeIn'=>date('Y-m-d H:i:s'),
  206. 'statusComplement'=>$transaction->statusComplement,
  207. 'nbReturn'=>$transaction->nbReturn,
  208. 'responseStatus'=>'NA'
  209. ));
  210. XLogs::critical(get_class($this)."::webPaymentUnFoldReponse $transaction->statusComplement. ", print_r($transaction, true));
  211. throw new Exception(get_class($this).' ::webPaymentUnFoldReponse : '.$transaction->statusComplement);
  212. }
  213. return $transaction;
  214. }
  215. private function extractExecAutoresponse($tableau){
  216. if (!empty($tableau)) {
  217. $params = array();
  218. $params['code'] = $tableau[1];
  219. $params['error'] = $tableau[2];
  220. $params['merchant_id'] = $tableau[3];
  221. $params['merchant_country'] = $tableau[4];
  222. $params['amount'] = $tableau[5];
  223. $params['transaction_id'] = $tableau[6];
  224. $params['payment_means'] = $tableau[7];
  225. $params['transmission_date']= $tableau[8];
  226. $params['payment_time'] = $tableau[9];
  227. $params['payment_date'] = $tableau[10];
  228. $params['response_code'] = $tableau[11];
  229. $params['payment_certificate'] = $tableau[12];
  230. $params['authorisation_id'] = $tableau[13];
  231. $params['currency_code'] = $tableau[14];
  232. $params['card_number'] = $tableau[15];
  233. $params['cvv_flag'] = $tableau[16];
  234. $params['cvv_response_code'] = $tableau[17];
  235. $params['bank_response_code'] = $tableau[18];
  236. $params['complementary_code'] = $tableau[19];
  237. $params['complementary_info'] = $tableau[20];
  238. $params['return_context'] = $tableau[21];
  239. $params['caddie'] = $tableau[22];
  240. $params['receipt_complement'] = $tableau[23];
  241. $params['merchant_language'] = $tableau[24];
  242. $params['language'] = $tableau[25];
  243. $params['customer_id'] = $tableau[26];
  244. $params['order_id'] = $tableau[27];
  245. $params['customer_email'] = $tableau[28];
  246. $params['customer_ip_address'] = $tableau[29];
  247. $params['capture_day'] = $tableau[30];
  248. $params['capture_mode'] = $tableau[31];
  249. $params['data'] = $tableau[32];
  250. $params['order_validity'] = $tableau[33];
  251. $params['transaction_condition'] = $tableau[34];
  252. $params['statement_reference'] = $tableau[35];
  253. $params['card_validity'] = $tableau[36];
  254. return $params;
  255. }
  256. // Si le tableau reçu est vide
  257. else {
  258. throw new Exception('::extractExecAutoresponse : Problème sur la réponse : '.$message);
  259. }
  260. }
  261. /* Fonctions de remboursement d'un abonné */
  262. /**
  263. * \brief Méthode de traitement d'un remboursement ATOS.
  264. * \param MTransaction &$transaction : La nouvelle transaction correspondant au remboursement.
  265. * Doit contenir dans responseParms les paramètre de retour de la transaction à l'origine du remboursement.
  266. * \return MTransaction $transaction : La transaction concernée par le remboursement après l'appel banque.
  267. * \note
  268. * - Récupération des informations nécéssaires au remboursement (renseigne $transaction->numTransOri(avec le numero de transaction et $transaction->fromDate).
  269. * - Diagnostique de l'état de la transaction.
  270. * - Création du formulaire de remboursement.
  271. * - Mémorisation des paramètres d'appel.
  272. * - Choix de l'opération en fonction du status de la transaction (Remboursement ou annulation).
  273. * - Traitement du retour.
  274. * - Si le serveur n'a pas répondu:
  275. * - $transaction->status = \link XModMonetique::WAITTING \endlink, afin qu'elle puisse être rejouée.
  276. * - Sinon traitement habituel avec mise en forme des paramètres.
  277. */
  278. protected function refundHandling($transaction, $replay = false){
  279. if(empty($replay)){
  280. list($transaction->numTransOri, $transaction->fromDate,$amountOri) =$this->getInfoTransOri($transaction);
  281. if($amountOri < $transaction->amount){
  282. throw new Exception(get_class($this).'::refundHandling : Le montant du remboursement ne peut être supérieur au montant d\'origine : '.$transaction->amount.' > '.$amountOri);
  283. }
  284. // Création du formulaire de remboursement
  285. $transaction->callParms = $this->refundAtosForm($transaction);
  286. // Mémorisation des paramètres d'appel
  287. $appel['oid'] = $transaction->oid ;
  288. $appel['callParms'] = $transaction->callParms;
  289. $appel['options'] =array('callParms'=>array('raw'=>true,'toxml'=>true));
  290. $this->xset->procEdit($appel);
  291. }
  292. // Diagnostique de l'état de la transaction
  293. $retourDiag = $this->diagnosticHandling($transaction);
  294. if($retourDiag == '-1'){
  295. $transaction->status = self::WAITTING;
  296. $transaction->statusComplement = 'Serveur indisponible le '.date('d-m-Y').' à : '.date('H:i:s');
  297. return $transaction;
  298. }
  299. else if($retourDiag == '0'){
  300. $transaction->status = self::WAITTING;
  301. $transaction->statusComplement = 'Services du serveur indisponible le '.date('d-m-Y').' à : '.date('H:i:s');
  302. return $transaction;
  303. }
  304. // Le retour du diagnostique est correct
  305. else{
  306. // Si la transaction est capturée on peut éfféctuer le remboursement
  307. if($retourDiag['transaction_status'] == 'CAPTURED'){
  308. $result = $this->sipsOfficeRequest('office', 'credit', $transaction->callParms);
  309. }
  310. // Si la transaction n'est pas capturée on peut l'annullée partiellement
  311. else if ($retourDiag['transaction_status'] == 'TO_CAPTURE') {
  312. $result = $this->sipsOfficeRequest('office', 'cancel', $transaction->callParms);
  313. }
  314. // Si la transaction est déjà annulée, c'est une erreur
  315. else if ($retourDiag['transaction_status'] == 'CANCELLED'){
  316. $transaction->status = self::ERROR;
  317. $transaction->statusComplement = 'Le remboursement ne peut aboutir, la transaction est déjà annulé.';
  318. $transaction->responseParms = $retourDiag;
  319. return $transaction;
  320. }
  321. // Si la transaction est déjà annulée, c'est une erreur
  322. else if ($retourDiag['transaction_status'] == 'REFUSED'){
  323. $transaction->status = self::ERROR;
  324. $transaction->statusComplement = 'Le remboursement ne peut aboutir, la transaction d\'origine à été refusé.';
  325. $transaction->responseParms = $retourDiag;
  326. return $transaction;
  327. }
  328. // Si la transaction est déjà annulée, c'est une erreur
  329. else{
  330. $transaction->status = self::ERROR;
  331. $transaction->statusComplement = 'Le remboursement ne peut aboutir, la transaction d\'origine possède un status à vérifier.';
  332. $transaction->responseParms = $retourDiag;
  333. return $transaction;
  334. }
  335. // Le serveur est indisponible
  336. if($result == '0'){
  337. $transaction->status = self::WAITTING;
  338. $transaction->statusComplement = 'Serveur indisponible le '.date('d-m-Y').' à : '.date('H:i:s');
  339. return $transaction;
  340. }
  341. // Les services du serveur sont indisponibles
  342. else if($result == '-1'){
  343. $transaction->status = self::WAITTING;
  344. $transaction->statusComplement = 'Services du serveur indisponible le '.date('d-m-Y').' à : '.date('H:i:s');
  345. return $transaction;
  346. }
  347. // C'est ici que l'on traite réellement le retour du remboursement
  348. else{
  349. $transaction->responseParms = $result;
  350. if($transaction->responseParms['response_code'] == '00'){
  351. $transaction->status = self::SUCCESS;
  352. }
  353. else{
  354. $transaction->status = self::ERROR;
  355. }
  356. $transaction->statusComplement = $this->getErrorCode($transaction->responseParms['response_code']);
  357. return $transaction;
  358. }
  359. }
  360. }
  361. /**
  362. * \brief Méthode de génération du formulaire de remboursement qui sera envoyé à la banque.
  363. * \param MTransaction $transaction : La transaction correspondant au remboursement.
  364. * \return Array $params : Tableau contenant les paramètres à transamettre en banque pour éfféctuer le remboursement.
  365. */
  366. private function refundAtosForm($transaction){
  367. // Construction du formulaire
  368. $params = array(
  369. 'origin' => 'Console Seolan',
  370. 'merchant_id' => $this->siteId,
  371. 'merchant_country' => $this->lang,
  372. 'transaction_id' => $transaction->numTransOri,
  373. 'currency_code' => $this->defaultCurrencyCode,
  374. 'payment_date' => $transaction->fromDate,
  375. 'amount' => $this->formatOrderAmount($transaction->amount)
  376. );
  377. return $params;
  378. }
  379. /* Fonctions de diagnotique d'une transaction */
  380. /**
  381. * \brief Méthode de diagnotique d'une transaction ATOS.
  382. * \param MTransaction $transaction : La transaction à dignostiquer.
  383. * \return Array:
  384. * - String $result : 'serveurHS', 'reponseEmpty' ou le résultat en XML
  385. * - Array $retourDiag : Un tableau associatif contenant le résultat du diagnotique ou null (si le serveur est HS par exemple).
  386. * \note
  387. * - Création du formulaire de diagnostique.
  388. * - Execution de la requête.
  389. * - Transaformation du retour en tableau associatif.
  390. */
  391. protected function diagnosticHandling($transaction){
  392. $atosParams = array();
  393. // Création du formulaire de diagnostique
  394. $atosParams = $this->diagnosticAtosForm($transaction);
  395. // Execution de la requête
  396. return $this->sipsOfficeRequest('diag', 'diagnostic', $atosParams);
  397. }
  398. /**
  399. * \brief Méthode de génération du formulaire de diagnostique qui sera envoyé à la banque.
  400. * \param MTransaction $transaction : La transaction à diagnostiquer.
  401. * \return Array $params : Tableau contenant les paramètres à transamettre en banque pour éfféctuer le diagnostique.
  402. */
  403. private function diagnosticAtosForm($transaction){
  404. $params = array(
  405. 'merchant_id' => $this->siteId,
  406. 'merchant_country' => 'fr',
  407. 'transaction_id' => $transaction->numTransOri,
  408. 'payment_date' => $transaction->fromDate
  409. );
  410. return $params;
  411. }
  412. /**
  413. * \brief Méthode de ré-émissions des remboursement en attente (Serveur indisponible).
  414. * \param MTransaction &$transaction : La transaction correspondant au remboursement qui sera mise à jour pendant la ré-émission.
  415. * \return MTransaction $transaction : La transaction concernée par le remboursement après sa ré-émission.
  416. */
  417. protected function refundReplay($transaction){
  418. $replay = true;
  419. return $this->refundHandling($transaction, $replay);
  420. }
  421. /* Fonctions de débit forcé d'un abonné */
  422. /**
  423. * \brief Méthode de traitement d'une duplication ATOS.
  424. * \param MTransaction &$transaction : La nouvelle transaction correspondant à la duplication.
  425. * \return MTransaction $transaction : La transaction concernée par la duplication après l'appel banque.
  426. * \note
  427. * - Récupération des informations nécéssaires à la duplication (renseigne $transaction->transOri(avec le numero de transaction à la place du KOID de la transaction et $transaction->fromDate).
  428. * - Création du formulaire envoyer.
  429. * - Mémorise les paramètres d'appel.
  430. * - Appel de duplication.
  431. * - Traitement du retour.
  432. */
  433. protected function duplicateHandling($transaction, $replay = false){
  434. if(empty($replay)){
  435. list($transaction->numTransOri, $transaction->fromDate) = $this->getInfoTransOri($transaction);
  436. // Création du formulaire envoyer
  437. $transaction->callParms = $this->duplicateAtosForm($transaction);
  438. // Mémorisation des paramètres d\'appel
  439. $appel['oid'] = $transaction->oid ;
  440. $appel['callParms'] = $transaction->callParms;
  441. $appel['dateTimeOut'] = date('Y-m-d H:i:s');
  442. $appel['options'] =array('callParms'=>array('raw'=>true,'toxml'=>true));
  443. $this->xset->procEdit($appel);
  444. }
  445. // Appel de duplication
  446. $result = $this->sipsOfficeRequest('office', 'duplicate', $transaction->callParms);
  447. if($result == '-1'){
  448. $transaction->status = self::WAITTING;
  449. $transaction->statusComplement = 'Serveur indisponible le '.date('d-m-Y').' à : '.date('H:i:s');
  450. return $transaction;
  451. }
  452. else if($result == '0'){
  453. $transaction->status = self::WAITTING;
  454. $transaction->statusComplement = 'Services du serveur indisponible le '.date('d-m-Y').' à : '.date('H:i:s');
  455. return $transaction;
  456. }
  457. else{
  458. $transaction->responseParms = $result;
  459. XLogs::critical(get_class($this).'::duplicateHandling', print_r($result, true) );
  460. $transaction->responseCode = $transaction->responseParms['bank_response_code'];
  461. if( $transaction->responseParms['bank_response_code'] == '00'){
  462. $transaction->status = self::SUCCESS;
  463. }
  464. else{
  465. $transaction->status = self::ERROR;
  466. }
  467. $transaction->statusComplement = $this->getErrorCode($transaction->responseParms['response_code']);
  468. // Mise à jour des paramètres de la transaction
  469. return $transaction;
  470. }
  471. }
  472. /**
  473. * \brief Méthode de génération du formulaire de duplication qui sera envoyé à la banque.
  474. * \param MTransaction $transaction : La transaction à dupliquer.
  475. * \return Array $param : Tableau contenant les paramètres à transamettre en banque pour éfféctuer la duplication.
  476. */
  477. private function duplicateAtosForm($transaction){
  478. if($transaction->captureMode == self::CATCH_PAYMENT){
  479. $captureMode = 'AUTHOR_CAPTURE';
  480. }
  481. else{
  482. $captureMode = 'VALIDATION';
  483. }
  484. $param = array(
  485. 'data' =>/* 'FROM_MERCHANT_ID='.$this->siteId.';FROM_MERCHANT_COUNTRY=fr'*/'Ce qu\'on veut..',
  486. 'origin' => 'console seolan',
  487. 'merchant_id' => $this->siteId,
  488. 'merchant_country' => 'fr',
  489. 'transaction_id' => $this->genTransId(),
  490. 'amount' => $this->formatOrderAmount($transaction->amount),
  491. 'currency_code' => $this->defaultCurrencyCode,
  492. 'from_transaction_id' => $transaction->numTransOri,
  493. 'from_payment_date' => $transaction->fromDate,
  494. 'capture_mode' => $captureMode,
  495. 'capture_day' => $transaction->captureDelay,
  496. 'order_validity' => '',
  497. 'order_id' =>$this->genOrderRef('H%i%s')
  498. );
  499. return $param;
  500. }
  501. /**
  502. * \brief Méthode de ré-émissions des remboursement en attente (Serveur indisponible).
  503. * \param MTransaction &$transaction : La transaction correspondant au remboursement qui sera mise à jour pendant la ré-émission.
  504. * \return MTransaction $transaction : La transaction concernée par le remboursement après sa ré-émission.
  505. */
  506. protected function duplicateReplay($transaction){
  507. $replay = true;
  508. return duplicateHandling($transaction, $replay);
  509. }
  510. /* Fonctions utilitaires */
  511. /**
  512. * \brief Mise en forme des paramètres de retour en vue de mémorisation.
  513. * Transforme les paramètres ATOS en paramètres mémorisable par XModMonetique.
  514. * \param MTransaction &$transaction : La transaction en cours.
  515. * \return MTransaction &$transaction: La transaction avec ses paramètres renseignés.
  516. */
  517. private function formatParams($params) {
  518. $formatedReturn = array();
  519. if(isset($params['bank_response_code'])){
  520. $formatedReturn['responseCode'] = $params['bank_response_code'];
  521. }else if(isset($params['response_code'])){
  522. $formatedReturn['responseCode'] = $params['response_code'];
  523. }
  524. $annee = substr($params['card_validity'],2,2);
  525. $mois = substr($params['card_validity'],4,2);
  526. $formatedReturn['dateVal'] = $mois.$annee;
  527. $formatedReturn['amount'] = $params['amount']/100;
  528. $numCarte = explode('.',$params['card_number']);
  529. $formatedReturn['numCarte'] = $numCarte[0].'XXXXXXXXXX'.$numCarte[1];
  530. $formatedReturn['numCarte'] = chunk_split($formatedReturn['numCarte'], 4, ' ');
  531. if(empty($params['data'])){
  532. $formatedReturn['nbDeadLine'] = 1;
  533. }
  534. else{
  535. $infosPaiement = explode(';', $params['data']);
  536. $infosNbPaiement = explode('=', $infosPaiement[0]);
  537. $formatedReturn['nbDeadLine'] = $infosNbPaiement[1];
  538. }
  539. $formatedReturn['transId'] = $params['transaction_id'];
  540. $formatedReturn['captureDelay'] = $params['capture_day'];
  541. if ($params['capture_mode'] == 'AUTHOR_CAPTURE'){
  542. $formatedReturn['captureMode'] = self::CATCH_PAYMENT;
  543. }
  544. else{
  545. $formatedReturn['captureMode'] = self::AUTHORIZATION_ONLY;
  546. }
  547. if(!empty($params['complementary_info'])) {
  548. // Récupération du statusComplement (Si contenu dans complementary_info)
  549. $formatedReturn['statusComplement'] = $params['complementary_info'];
  550. }
  551. else{
  552. $formatedReturn['statusComplement'] = $this->getErrorCode($params['bank_response_code']);
  553. }
  554. if(empty( $formatedReturn['statusComplement'])){
  555. $formatedReturn['statusComplement'] = $this->getErrorCode($params['response_code']);
  556. }
  557. // Récupération de l'oid de la transaction
  558. $formatedReturn['oid'] = urldecode($params['return_context']);
  559. // Mémorisation de la réponse
  560. $formatedReturn['responseParms'] = $params;
  561. $formatedReturn['cvv'] ='N/A';
  562. $formatedReturn['porteur'] ='N/A';
  563. return $formatedReturn;
  564. }
  565. /// appel server sips pour un service donné
  566. /**
  567. * \brief Fonction d'émission d'une requête SIPS Office Server.
  568. * \param String $component : Type de la requête:
  569. * - 'diag' : Pour une requête du type 'diagnostic'.
  570. * - 'office' : Pour une requête du type :
  571. * - 'credit'.
  572. * - 'cancel'.
  573. * - 'duplicate'.
  574. * \param String $service : Le service appelé :
  575. * - 'credit' : Correspond à un remboursement.
  576. * - 'cancel' : Corresspond à une annulation.
  577. * - 'duplicate' : Correspond à une duplication.
  578. * - 'diagnostic' : Correspond à un diagnotique de la transaction.
  579. * \return String $result : 'serveurHS', 'responseEmpty' ou la reponse sous forme de chaine XML.
  580. */
  581. private function sipsOfficeRequest($component, $service, $params){
  582. $errno = $errstr = '';
  583. // Pour connaitre l'état du serveur
  584. if($component == 'status'){
  585. $port = self::COMMAND_PORT;
  586. }else{
  587. $port = self::SERVICE_PORT;
  588. }
  589. $fp = fsockopen(self::SERVER,$port, $errno, $errstr, 10);
  590. if (!$fp) {
  591. XLogs::critical(get_class($this).'::sipsOfficeRequest', ' Errer de connexion '.$errno.' '.$errstr);
  592. XLogs::critical(get_class($this).'::sipsOfficeRequest', 'Serveur : '.self::SERVER.' port :'.$port);
  593. return -1;
  594. }
  595. else {
  596. $request = "<service component=\"$component\" name=\"$service\"><$service ";;
  597. foreach($params as $key=>$value){
  598. $request.= "$key=\"$value\" ";
  599. }
  600. $request .= "></$service></service>\n"; // !!!
  601. XLogs::debug('sips request '.self::SERVER.':'.$port.' socket = '.$fp.' > '.$request);
  602. fputs($fp, $request);
  603. $response = fgets($fp);
  604. XLogs::critical(get_class($this), 'Retour : '.$response);
  605. fclose($fp);
  606. if (!$response){
  607. XLogs::critical(get_class($this), '::sipsOfficeRequest erreur lecture reponse ' .self::SERVER. ':' . self::SERVICE_PORT);
  608. return 0;
  609. }
  610. // Parse la reponse
  611. $xres = simplexml_load_string($response);
  612. if (!$xres){
  613. $t = '';
  614. foreach(libxml_get_errors() as $error) {
  615. $t .= $error->message;
  616. }
  617. XLogs::critical(get_class($this),'::sipsOfficeRequest erreur sips : '.$t);
  618. return false;
  619. }
  620. return $this->serverResponse2array($xres);
  621. }
  622. }
  623. /**
  624. * \brief Fonction de séléction des paramètres de reponse d'une transaction.
  625. * \param MTransaction &$transaction : La transaction pour laquelle on veut renseigné :
  626. * - $transaction->numTransOri : L'identifiant de la transaction renvoyé par ATOS.
  627. * - $transaction->fromDate : La date d'émission du paiement.
  628. * - 'credit'.
  629. * - 'cancel'.
  630. * - 'duplicate'.
  631. * \param String $service : Le service appelé :
  632. * - 'credit' : Correspond à un remboursement.
  633. * - 'cancel' : Corresspond à une annulation.
  634. * - 'duplicate' : Correspond à une duplication.
  635. * - 'diagnostic' : Correspond à un diagnotique de la transaction.
  636. * \return MTransaction $transaction : La transaction avec les paramètres renseignés.
  637. */
  638. private function getInfoTransOri($transaction){
  639. $rs = selectQuery('select responseParms, amount from '.$this->xset->getTable().' where `KOID`="'.$transaction->transOri.'"');
  640. $res = null;
  641. if($rs->rowCount()==1){
  642. $res = $rs->fetch();
  643. $params = XSystem::xml2array($res['responseParms']);
  644. /// Récupération du numéro de transaction
  645. return array($params['transaction_id'], $params['payment_date'], $res['amount']);
  646. }
  647. else{
  648. XLogs::critical(get_class($this).'::getInfoTransOri', 'responseParms, amount de la transaction d\'origine ayant pour KOID '.$transaction->transOri.' non trouvé!');
  649. throw new Exception(get_class($this).'::getInfoTransOri : responseParms, amount de la transaction d\'origine ayant pour KOID '.$transaction->transOri.' non trouvé!');
  650. }
  651. }
  652. /**
  653. * \brief Fonction de transaformation de la réponse du serveur en XML.
  654. * \param String reponse : La reponse renvoyé par \link XModAtos::sipsOfficeRequest($component, $service, $params); \endlink
  655. * \return Array $params : Un tableau associatif de la réponse ou null.
  656. */
  657. private function serverResponse2array($response){
  658. $params = array();
  659. if( ($response != '-1') && ($response != '0') && (!empty($response)) ){
  660. foreach ($response->children() as $element) {
  661. foreach ($element->attributes() as $attribut){
  662. $params[$attribut->getName()]= (string)$attribut;
  663. }
  664. }
  665. return $params;
  666. }
  667. else{
  668. XLogs::critical(get_class($this).'::serverResponse2array : Reponse :', print_r($response));
  669. return null;
  670. }
  671. }
  672. /**
  673. * \brief Fonction d'initialisation des options spécifiques à ATOS.
  674. * \note
  675. * Crée les champs:
  676. * - logoReturnOk \link XModAtos::$logoReturnOk \endlink
  677. * - logoReturnKo \link XModAtos::$logoReturnKo \endlink
  678. * - path \link XModAtos::$path \endlink
  679. */
  680. public function initOptions() {
  681. parent::initOptions();
  682. $this->_options->setOpt('Logo de retour OK','logoReturnOk','text', NULL,NULL,'Monétique');
  683. $this->_options->setOpt('Logo pour abandon de paiement','logoReturnKo','text',NULL,NULL,'Monétique');
  684. $this->_options->setOpt('Chemin de l\'API Atos/Sips','path','text',NULL,NULL,'Monétique');
  685. }
  686. /**
  687. * \brief Méthode de vérification de la présence des fichiers nécéssaire à ATOS/SIPS (Paiement Web uniquement)
  688. * Affiche un message d'erreur dans la configuration du module si des fichiers qui lui sont nécéssaire, sont manquants.
  689. */
  690. public function editProperties($ar) {
  691. parent::editProperties($ar);
  692. if(!file_exists($this->path) ){
  693. setSessionVar('message', 'Dossier SIPS non présent à l\'adresse :'.$this->path);
  694. }
  695. else{
  696. if(!file_exists($this->path.'bin/static/request') ){
  697. setSessionVar('message', 'Fichier binaire request non présent à l\'adresse :'.$this->path.'bin/static/request');
  698. }
  699. if(!file_exists($this->path.'bin/static/response') ){
  700. setSessionVar('message', 'Fichier binaire request non présent à l\'adresse :'.$this->path.'bin/static/request');
  701. }
  702. if(!file_exists($this->path.'param/certif.fr.'.$this->siteId) ){
  703. setSessionVar('message', 'Fichier de certificat commerçant non présent à l\'adresse :'.$this->path.'param/certif.fr.'.$this->siteId);
  704. }
  705. if(!file_exists($this->path.'param/parmcom.'.$this->siteId) ){
  706. setSessionVar('message', 'Fichier de parmcom commerçant non présent à l\'adresse :'.$this->path.'param/parmcom.'.$this->siteId);
  707. }
  708. if(!file_exists($this->path.'param/parmcom.defaut') ){
  709. setSessionVar('message', 'Fichier parmcom.defaut non présent à l\'adresse :'.$this->path.'param/parmcom.defaut');
  710. }
  711. if(!file_exists($this->path.'param/pathfile') ){
  712. setSessionVar('message', 'Fichier pathfile non présent à l\'adresse :'.$this->path.'param/pathfile');
  713. }
  714. }
  715. if(!file_exists(TZR_WWW_DIR.'tzr/templates/xmodmonetique/logo') ){
  716. setSessionVar('message', 'Dossier logo non présent à l\'adresse :'.TZR_WWW_DIR.'tzr/templates/xmodmonetique/logo');
  717. }
  718. }
  719. /**
  720. * \brief Fonction qui permet d'ajouter des méthode dans le menu du module.
  721. * Définit les fonction setCertif() et install() permettant de configurer intégralement le module ATOS.
  722. */
  723. protected function _actionlist(&$my) {
  724. // Utilisation de la fonction du parent
  725. parent::_actionlist($my);
  726. // Mémorisation du moid
  727. $moid=$this->_moid;
  728. if($this->secure('','setCertif')){
  729. $o1=new XModuleAction($this,
  730. 'certif',
  731. 'Mettre à jour le certificat',
  732. '&moid='.$moid.'&_function=preSetCertif&template=xmodmonetique/atos-certificat.html&tplentry=br');
  733. $o1->menuable = 1;
  734. // Affectation au groupe d'affichage
  735. $o1->group='more';
  736. $o1->order=0;
  737. $my['certif']=$o1;
  738. }
  739. if($this->secure('','install')){
  740. $o1=new XModuleAction($this,
  741. 'install',
  742. 'Upload de l\'archive SIPS',
  743. '&moid='.$moid.'&_function=preInstall&template=xmodmonetique/atos-archive.html&tplentry=br');
  744. $o1->menuable = 1;
  745. $o1->group='more';
  746. $o1->order=0;
  747. $my['install']=$o1;
  748. }
  749. }
  750. /**
  751. * \brief Fonction qui prepare la mise à jour du certificat dans le backoffice.
  752. * Crée le champs file permettant l'upload.
  753. */
  754. function preSetCertif($ar){
  755. $certifFile = XFieldDef::objectFactory((object)array('FIELD'=>'certifFile',
  756. 'FTYPE'=>'XFileDef',
  757. 'MULTIVALUED'=>0,
  758. 'COMPULSORY'=>true,
  759. 'TARGET'=>'%',
  760. 'LABEL'=>'...'));
  761. // Suppression du champs 'Titre' au-dessus de l'input FILE
  762. $certifFile->usealt = 0;
  763. $r['certifFile'] = $certifFile->edit();
  764. return XShell::toScreen1('br', $r);
  765. }
  766. /**
  767. * \brief Fonction qui met à jour du certificat à partir du backoffice.
  768. * Récupère les champs renseigné dans le formulaire.
  769. */
  770. function procSetCertif($ar){
  771. $certifFile = XFieldDef::objectFactory((object)array('FIELD'=>'certifFile',
  772. 'FTYPE'=>'XFileDef',
  773. 'MULTIVALUED'=>0,
  774. 'COMPULSORY'=>true,
  775. 'TARGET'=>'%',
  776. 'LABEL'=>'...'));
  777. // Définition du répertoire d'installation
  778. $installDirectoryCertif = '/home/'.$GLOBALS['HOME'].'/sips/';
  779. // Déplacement du certificat vers le repertoire sips/param/
  780. move_uploaded_file($_FILES['certifFile']['tmp_name'],$installDirectoryCertif.'param/'.$_FILES['certifFile']['name']);
  781. }
  782. /**
  783. * \brief Fonction qui prepare l'upload de l'archive ATOS/SIPS à partir du backoffice.
  784. * Définition des champs permettant le téléchargement de l'archive fournis par ATOS/SIPS.
  785. */
  786. function preInstall($ar){
  787. /// Définiton du champs archive
  788. $archive = XFieldDef::objectFactory((object)array('FIELD'=>'archive', // key de la varible pour récupérer le file, ex : $_FILES['archive']
  789. 'FTYPE'=>'XFileDef', // Définition du type de champs (Fichier en l'occurence)
  790. 'MULTIVALUED'=>0, // Ce n'est pas un champs multi-valué
  791. 'COMPULSORY'=>true, // C'est un champs obligatoire
  792. 'TARGET'=>'%'// Qui ne pointe vers rien
  793. ));
  794. $archive->usealt = 0; // Supprime le champs Titre au dessus de l'input du file
  795. $r['archive'] = $archive->edit();
  796. $certifFile = XFieldDef::objectFactory((object)array('FIELD'=>'certifFile',
  797. 'FTYPE'=>'XFileDef',
  798. 'MULTIVALUED'=>0,
  799. 'COMPULSORY'=>true,
  800. 'TARGET'=>'%'
  801. ));
  802. $certifFile->usealt = 0;
  803. $r['certifFile'] = $certifFile->edit();
  804. return XShell::toScreen1('br', $r);
  805. }
  806. /**
  807. * \brief Fonction qui install l'archive ATOS.
  808. * Mise en place des différents file présent dans l'archive.
  809. */
  810. function procInstall($ar){
  811. $archive = XFieldDef::objectFactory((object)array('FIELD'=>'archive',
  812. 'FTYPE'=>'XFileDef',
  813. 'MULTIVALUED'=>0,
  814. 'COMPULSORY'=>true,
  815. 'TARGET'=>'%',
  816. ));
  817. $certifFile = XFieldDef::objectFactory((object)array('FIELD'=>'certifFile',
  818. 'FTYPE'=>'XFileDef',
  819. 'MULTIVALUED'=>0,
  820. 'COMPULSORY'=>true,
  821. 'TARGET'=>'%',
  822. 'LABEL'=>'...'));
  823. // Définition du répertoire d'installation
  824. $installDirectory = '/home/'.$GLOBALS['HOME'].'/sips/';
  825. // Si le repertoire d'installation existe dejà
  826. if(is_dir($installDirectory)){
  827. /// Suppression du folder d'installation pour une réinstallation propre
  828. $this->clearDir($installDirectory);
  829. }
  830. // Création du repertoire d'installation de l'API
  831. mkdir($installDirectory);
  832. // Déplacement de l'archive vers le reperrtoire d'installation
  833. move_uploaded_file ( $_FILES['archive']['tmp_name'],$installDirectory.'archiveSIPS.tar' );
  834. // Décompréssion de l'archive
  835. $this->untar($installDirectory.'archiveSIPS.tar',$installDirectory.'dossierSIPS');
  836. // Suppression de l'archive
  837. unlink($installDirectory.'archiveSIPS.tar');
  838. // Déplacement du folder param contenu dans le folder de l'archive
  839. rename($installDirectory.'dossierSIPS/param',$installDirectory.'param');
  840. // Déplacement du folder bin contenu dans le folder de l'archive
  841. rename($installDirectory.'dossierSIPS/bin',$installDirectory.'bin');
  842. // Suppresion du file Readme.txt
  843. unlink($installDirectory.'bin/README.txt');
  844. // Suppression du folder décompresser
  845. $this->clearDir($installDirectory.'dossierSIPS/');
  846. /* Edition du file pathfile */
  847. // Ouverture du file
  848. $ptr = fopen($installDirectory.'param/pathfile', "r");
  849. // Récupération du contenu
  850. $contenu = fread($ptr, filesize($installDirectory.'param/pathfile'));
  851. /* On a plus besoin du pointeur */
  852. fclose($ptr);
  853. // Transformation du contenu en tableau de lignes
  854. // PHP_EOL contient le saut à la ligne utilisé sur le serveur (\n linux, \r\n windows ou \r Macintosh
  855. $contenu = explode(PHP_EOL, $contenu);
  856. /* Edition des lignes personalisées */
  857. // Affectation de l'emplacement des logos
  858. $contenu[21]='D_LOGO!/tzr/templates/xmodmonetique/logo/!';
  859. // Affectation de l'emplacement du file parmcom.defaut
  860. $contenu[29]='F_DEFAULT!/home/'.$GLOBALS['HOME'].'/sips/param/parmcom.defaut!';
  861. // Affectation de l'emplacement du file parmcom.numCommerçant
  862. $contenu[33]='F_PARAM!/home/'.$GLOBALS['HOME'].'/sips/param/parmcom!';
  863. // Affectation de l'emplacement du file certif.fr.numCommerçant
  864. $contenu[37]='F_CERTIFICATE!/home/'.$GLOBALS['HOME'].'/sips/param/certif!';
  865. // On ré-index le tableau
  866. $contenu = array_values($contenu);
  867. // On reconstruit le tout
  868. $contenu = implode(PHP_EOL, $contenu);
  869. // On réouvre le file
  870. $ptr = fopen($installDirectory.'param/pathfile', "w");
  871. // On écris le nouveau contenu
  872. fwrite($ptr, $contenu);
  873. // Déplacement du certificat vers le repertoire sips/param/
  874. move_uploaded_file ( $_FILES['certifFile']['tmp_name'],$installDirectory.'param/'.$_FILES['certifFile']['name'] );
  875. }
  876. /**
  877. * \brief Fonction qui qui extrait une archive .tar dans le folder spécifié.
  878. * \param String $file : Le chemin de l'archive à extraire.
  879. * \param String $dest : Le chemin du folder dans lequel sera extraite l'archive.
  880. * \return Bool $result : True ou False;
  881. */
  882. function untar($file, $dest = "./") {
  883. if (!is_readable($file)){
  884. return false;
  885. }
  886. $filesize = filesize($file);
  887. // Minimum 4 blocks
  888. if ($filesize <= 512*4){
  889. return false;
  890. }
  891. if (!preg_match("/\/$/", $dest)) {
  892. // Force trailing slash
  893. $dest .= "/";
  894. }
  895. //Ensure write to destination
  896. if (!file_exists($dest)) {
  897. if (!mkdir($dest, 0777, true)) {
  898. return false;
  899. }
  900. }
  901. $fh = fopen($file, 'rb');
  902. $total = 0;
  903. while (false !== ($block = fread($fh, 512))) {
  904. $total += 512;
  905. $meta = array();
  906. // Extract meta data
  907. // http://www.mkssoftware.com/docs/man4/tar.4.asp
  908. $meta['filename'] = trim(substr($block, 0, 99));
  909. $meta['mode'] = octdec((int)trim(substr($block, 100, 8)));
  910. $meta['userid'] = octdec(substr($block, 108, 8));
  911. $meta['groupid'] = octdec(substr($block, 116, 8));
  912. $meta['filesize'] = octdec(substr($block, 124, 12));
  913. $meta['mtime'] = octdec(substr($block, 136, 12));
  914. $meta['header_checksum'] = octdec(substr($block, 148, 8));
  915. $meta['link_flag'] = octdec(substr($block, 156, 1));
  916. $meta['linkname'] = trim(substr($block, 157, 99));
  917. $meta['databytes'] = ($meta['filesize'] + 511) & ~511;
  918. if ($meta['link_flag'] == 5) {
  919. // Create folder
  920. mkdir($dest . $meta['filename'], 0777, true);
  921. chmod($dest . $meta['filename'], $meta['mode']);
  922. }
  923. if ($meta['databytes'] > 0) {
  924. $block = fread($fh, $meta['databytes']);
  925. // Extract data
  926. $data = substr($block, 0, $meta['filesize']);
  927. // Write data and set permissions
  928. if (false !== ($ftmp = fopen($dest . $meta['filename'], 'wb'))) {
  929. fwrite($ftmp, $data);
  930. fclose($ftmp);
  931. touch($dest . $meta['filename'], $meta['mtime'], $meta['mtime']);
  932. if ($meta['mode'] == 0744) $meta['mode'] = 0644;
  933. chmod($dest . $meta['filename'], $meta['mode']);
  934. }
  935. $total += $meta['databytes'];
  936. }
  937. if ($total >= $filesize-1024) {
  938. return true;
  939. }
  940. }
  941. }
  942. /**
  943. * \brief Fonction recursive de suppression d'un repertoire contenant des fichiers.
  944. * \param String $folder : Le chemin du folder à supprimer.
  945. * \return Bool $result : True ou False.
  946. */
  947. function clearDir ($folder) {
  948. $open=opendir($folder);
  949. if (!$open) {
  950. return;
  951. }
  952. while($file=readdir($open)) {
  953. if ($file == '.' || $file == '..'){
  954. continue;
  955. }
  956. if (is_dir($folder."/".$file)) {
  957. $r=$this->clearDir($folder."/".$file);
  958. if (!$r) return false;
  959. }
  960. else {
  961. $r=unlink($folder."/".$file);
  962. if (!$r) return false;
  963. }
  964. }
  965. closedir($open);
  966. $r=rmdir($folder);
  967. rename($folder,"trash");
  968. return true;
  969. }
  970. /**
  971. * \brief Fonction de définition des droits sur les fonctions.
  972. * \param ? $function : ?.
  973. * \param ? $group : ?.
  974. * \return ? $result : ?.
  975. */
  976. function secGroups($function, $group=NULL) {
  977. $g=array();
  978. $g['preInstall']=array('admin');
  979. $g['procInstall']=array('admin');
  980. $g['preSetCertif']=array('admin');
  981. $g['procSetCertif']=array('admin');
  982. self::getGetAdminSecGroups($g);
  983. if(isset($g[$function])) {
  984. if(!empty($group)) return in_array($group, $g[$function]);
  985. return $g[$function];
  986. }
  987. return parent::secGroups($function,$group);
  988. }
  989. }
  990. ?>