PageRenderTime 55ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/htdocs/public/paypal/newpayment.php

https://bitbucket.org/speedealing/speedealing
PHP | 963 lines | 742 code | 113 blank | 108 comment | 154 complexity | 878808c5c15b630d647af065feb27b5f MD5 | raw file
Possible License(s): LGPL-3.0, LGPL-2.1, GPL-3.0, MIT
  1. <?php
  2. /* Copyright (C) 2001-2002 Rodolphe Quiedeville <rodolphe@quiedeville.org>
  3. * Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
  4. * Copyright (C) 2009-2012 Regis Houssin <regis.houssin@capnetworks.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. /**
  20. * \file htdocs/public/paypal/newpayment.php
  21. * \ingroup paypal
  22. * \brief File to offer a way to make a payment for a particular Dolibarr entity
  23. * \author Laurent Destailleur
  24. */
  25. define("NOLOGIN",1); // This means this output page does not require to be logged.
  26. define("NOCSRFCHECK",1); // We accept to go on this page from external web site.
  27. // For MultiCompany module
  28. $entity=(! empty($_GET['entity']) ? (int) $_GET['entity'] : (! empty($_POST['entity']) ? (int) $_POST['entity'] : 1));
  29. if (is_int($entity))
  30. {
  31. define("DOLENTITY", $entity);
  32. }
  33. require '../../main.inc.php';
  34. require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php';
  35. require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypalfunctions.lib.php';
  36. require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
  37. require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
  38. require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
  39. // Security check
  40. if (empty($conf->paypal->enabled)) accessforbidden('',1,1,1);
  41. $langs->load("main");
  42. $langs->load("other");
  43. $langs->load("dict");
  44. $langs->load("bills");
  45. $langs->load("companies");
  46. $langs->load("errors");
  47. $langs->load("paybox");
  48. $langs->load("paypal");
  49. // Input are:
  50. // type ('invoice','order','contractline'),
  51. // id (object id),
  52. // amount (required if id is empty),
  53. // tag (a free text, required if type is empty)
  54. // currency (iso code)
  55. $suffix=GETPOST("suffix",'alpha');
  56. $amount=price2num(GETPOST("amount"));
  57. if (! GETPOST("currency",'alpha')) $currency=$conf->currency;
  58. else $currency=GETPOST("currency",'alpha');
  59. if (! GETPOST("action"))
  60. {
  61. if (! GETPOST("amount") && ! GETPOST("source"))
  62. {
  63. dol_print_error('',$langs->trans('ErrorBadParameters')." - amount or source");
  64. exit;
  65. }
  66. if (is_numeric($amount) && ! GETPOST("tag") && ! GETPOST("source"))
  67. {
  68. dol_print_error('',$langs->trans('ErrorBadParameters')." - tag or source");
  69. exit;
  70. }
  71. if (GETPOST("source") && ! GETPOST("ref"))
  72. {
  73. dol_print_error('',$langs->trans('ErrorBadParameters')." - ref");
  74. exit;
  75. }
  76. }
  77. $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
  78. $urlok=$urlwithouturlroot.DOL_URL_ROOT.'/public/paypal/paymentok.php?';
  79. $urlko=$urlwithouturlroot.DOL_URL_ROOT.'/public/paypal/paymentko.php?';
  80. // Complete urls for post treatment
  81. $SOURCE=GETPOST("source",'alpha');
  82. $ref=$REF=GETPOST('ref','alpha');
  83. $TAG=GETPOST("tag",'alpha');
  84. $FULLTAG=GETPOST("fulltag",'alpha'); // fulltag is tag with more informations
  85. $SECUREKEY=GETPOST("securekey"); // Secure key
  86. if (! empty($SOURCE))
  87. {
  88. $urlok.='source='.urlencode($SOURCE).'&';
  89. $urlko.='source='.urlencode($SOURCE).'&';
  90. }
  91. if (! empty($REF))
  92. {
  93. $urlok.='ref='.urlencode($REF).'&';
  94. $urlko.='ref='.urlencode($REF).'&';
  95. }
  96. if (! empty($TAG))
  97. {
  98. $urlok.='tag='.urlencode($TAG).'&';
  99. $urlko.='tag='.urlencode($TAG).'&';
  100. }
  101. if (! empty($FULLTAG))
  102. {
  103. $urlok.='fulltag='.urlencode($FULLTAG).'&';
  104. $urlko.='fulltag='.urlencode($FULLTAG).'&';
  105. }
  106. if (! empty($SECUREKEY))
  107. {
  108. $urlok.='securekey='.urlencode($SECUREKEY).'&';
  109. $urlko.='securekey='.urlencode($SECUREKEY).'&';
  110. }
  111. if (! empty($entity))
  112. {
  113. $urlok.='entity='.urlencode($entity).'&';
  114. $urlko.='entity='.urlencode($entity).'&';
  115. }
  116. $urlok=preg_replace('/&$/','',$urlok); // Remove last &
  117. $urlko=preg_replace('/&$/','',$urlko); // Remove last &
  118. // Check parameters
  119. $PAYPAL_API_OK="";
  120. if ($urlok) $PAYPAL_API_OK=$urlok;
  121. $PAYPAL_API_KO="";
  122. if ($urlko) $PAYPAL_API_KO=$urlko;
  123. if (empty($PAYPAL_API_USER))
  124. {
  125. dol_print_error('',"Paypal setup param PAYPAL_API_USER not defined");
  126. return -1;
  127. }
  128. if (empty($PAYPAL_API_PASSWORD))
  129. {
  130. dol_print_error('',"Paypal setup param PAYPAL_API_PASSWORD not defined");
  131. return -1;
  132. }
  133. if (empty($PAYPAL_API_SIGNATURE))
  134. {
  135. dol_print_error('',"Paypal setup param PAYPAL_API_SIGNATURE not defined");
  136. return -1;
  137. }
  138. // Check security token
  139. $valid=true;
  140. if (! empty($conf->global->PAYPAL_SECURITY_TOKEN))
  141. {
  142. if (! empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE))
  143. {
  144. if ($SOURCE && $REF) $token = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . $SOURCE . $REF, 2); // Use the source in the hash to avoid duplicates if the references are identical
  145. else $token = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
  146. }
  147. else
  148. {
  149. $token = $conf->global->PAYPAL_SECURITY_TOKEN;
  150. }
  151. if ($SECUREKEY != $token) $valid=false;
  152. if (! $valid)
  153. {
  154. print '<div class="error">Bad value for key.</div>';
  155. //print 'SECUREKEY='.$SECUREKEY.' token='.$token.' valid='.$valid;
  156. exit;
  157. }
  158. }
  159. /*
  160. * Actions
  161. */
  162. if (GETPOST("action") == 'dopayment')
  163. {
  164. $PAYPAL_API_PRICE=price2num(GETPOST("newamount"),'MT');
  165. $PAYPAL_PAYMENT_TYPE='Sale';
  166. $shipToName=GETPOST("shipToName");
  167. $shipToStreet=GETPOST("shipToStreet");
  168. $shipToCity=GETPOST("shipToCity");
  169. $shipToState=GETPOST("shipToState");
  170. $shipToCountryCode=GETPOST("shipToCountryCode");
  171. $shipToZip=GETPOST("shipToZip");
  172. $shipToStreet2=GETPOST("shipToStreet2");
  173. $phoneNum=GETPOST("phoneNum");
  174. $email=GETPOST("email");
  175. $desc=GETPOST("desc");
  176. $mesg='';
  177. if (empty($PAYPAL_API_PRICE) || ! is_numeric($PAYPAL_API_PRICE)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Amount"));
  178. //elseif (empty($EMAIL)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("YourEMail"));
  179. //elseif (! isValidEMail($EMAIL)) $mesg=$langs->trans("ErrorBadEMail",$EMAIL);
  180. elseif (empty($FULLTAG)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("PaymentCode"));
  181. //var_dump($_POST);
  182. if (empty($mesg))
  183. {
  184. dol_syslog("newpayment.php call paypal api and do redirect", LOG_DEBUG);
  185. // Other
  186. $PAYPAL_API_DEVISE="USD";
  187. //if ($currency == 'EUR') $PAYPAL_API_DEVISE="EUR";
  188. //if ($currency == 'USD') $PAYPAL_API_DEVISE="USD";
  189. if (! empty($currency)) $PAYPAL_API_DEVISE=$currency;
  190. dol_syslog("Submit Paypal form", LOG_DEBUG);
  191. dol_syslog("PAYPAL_API_USER: $PAYPAL_API_USER", LOG_DEBUG);
  192. //dol_syslog("PAYPAL_API_PASSWORD: $PAYPAL_API_PASSWORD", LOG_DEBUG); // No password into log files
  193. dol_syslog("PAYPAL_API_SIGNATURE: $PAYPAL_API_SIGNATURE", LOG_DEBUG);
  194. dol_syslog("PAYPAL_API_SANDBOX: $PAYPAL_API_SANDBOX", LOG_DEBUG);
  195. dol_syslog("PAYPAL_API_OK: $PAYPAL_API_OK", LOG_DEBUG);
  196. dol_syslog("PAYPAL_API_KO: $PAYPAL_API_KO", LOG_DEBUG);
  197. dol_syslog("PAYPAL_API_PRICE: $PAYPAL_API_PRICE", LOG_DEBUG);
  198. dol_syslog("PAYPAL_API_DEVISE: $PAYPAL_API_DEVISE", LOG_DEBUG);
  199. dol_syslog("shipToName: $shipToName", LOG_DEBUG);
  200. dol_syslog("shipToStreet: $shipToStreet", LOG_DEBUG);
  201. dol_syslog("shipToCity: $shipToCity", LOG_DEBUG);
  202. dol_syslog("shipToState: $shipToState", LOG_DEBUG);
  203. dol_syslog("shipToCountryCode: $shipToCountryCode", LOG_DEBUG);
  204. dol_syslog("shipToZip: $shipToZip", LOG_DEBUG);
  205. dol_syslog("shipToStreet2: $shipToStreet2", LOG_DEBUG);
  206. dol_syslog("phoneNum: $phoneNum", LOG_DEBUG);
  207. dol_syslog("email: $email", LOG_DEBUG);
  208. dol_syslog("desc: $desc", LOG_DEBUG);
  209. $_SESSION["Payment_Amount"]=$PAYPAL_API_PRICE;
  210. // A redirect is added if API call successfull
  211. print_paypal_redirect($PAYPAL_API_PRICE,$PAYPAL_API_DEVISE,$PAYPAL_PAYMENT_TYPE,$PAYPAL_API_OK,$PAYPAL_API_KO, $FULLTAG);
  212. exit;
  213. }
  214. }
  215. /*
  216. * View
  217. */
  218. llxHeaderPaypal($langs->trans("PaymentForm"));
  219. if (! empty($PAYPAL_API_SANDBOX))
  220. {
  221. dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode'),'','warning');
  222. }
  223. // Common variables
  224. $creditor=$mysoc->name;
  225. $paramcreditor='PAYPAL_CREDITOR_'.$suffix;
  226. if (! empty($conf->global->$paramcreditor)) $creditor=$conf->global->$paramcreditor;
  227. else if (! empty($conf->global->PAYPAL_CREDITOR)) $creditor=$conf->global->PAYPAL_CREDITOR;
  228. print '<span id="dolpaymentspan"></span>'."\n";
  229. print '<center>'."\n";
  230. print '<form id="dolpaymentform" name="paymentform" action="'.$_SERVER["PHP_SELF"].'" method="POST">'."\n";
  231. print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'."\n";
  232. print '<input type="hidden" name="action" value="dopayment">'."\n";
  233. print '<input type="hidden" name="tag" value="'.GETPOST("tag",'alpha').'">'."\n";
  234. print '<input type="hidden" name="suffix" value="'.GETPOST("suffix",'alpha').'">'."\n";
  235. print '<input type="hidden" name="securekey" value="'.$SECUREKEY.'">'."\n";
  236. print '<input type="hidden" name="entity" value="'.$entity.'" />';
  237. print "\n";
  238. print '<!-- Form to send a Paypal payment -->'."\n";
  239. print '<!-- PAYPAL_API_SANDBOX = '.$conf->global->PAYPAL_API_SANDBOX.' -->'."\n";
  240. print '<!-- PAYPAL_API_INTEGRAL_OR_PAYPALONLY = '.$conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY.' -->'."\n";
  241. print '<!-- creditor = '.$creditor.' -->'."\n";
  242. print '<!-- urlok = '.$urlok.' -->'."\n";
  243. print '<!-- urlko = '.$urlko.' -->'."\n";
  244. print "\n";
  245. print '<table id="dolpaymenttable" summary="Payment form">'."\n";
  246. // Show logo (search order: logo defined by PAYBOX_LOGO_suffix, then PAYBOX_LOGO, then small company logo, large company logo, theme logo, common logo)
  247. $width=0;
  248. // Define logo and logosmall
  249. $logosmall=$mysoc->logo_small;
  250. $logo=$mysoc->logo;
  251. $paramlogo='PAYBOX_LOGO_'.$suffix;
  252. if (! empty($conf->global->$paramlogo)) $logosmall=$conf->global->$paramlogo;
  253. else if (! empty($conf->global->PAYBOX_LOGO)) $logosmall=$conf->global->PAYBOX_LOGO;
  254. //print '<!-- Show logo (logosmall='.$logosmall.' logo='.$logo.') -->'."\n";
  255. // Define urllogo
  256. $urllogo='';
  257. if (! empty($logosmall) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$logosmall))
  258. {
  259. $urllogo=DOL_URL_ROOT.'/viewimage.php?modulepart=companylogo&amp;file='.urlencode('thumbs/'.$logosmall);
  260. }
  261. elseif (! empty($logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$logo))
  262. {
  263. $urllogo=DOL_URL_ROOT.'/viewimage.php?modulepart=companylogo&amp;file='.urlencode($logo);
  264. $width=96;
  265. }
  266. // Output html code for logo
  267. if ($urllogo)
  268. {
  269. print '<tr>';
  270. print '<td align="center"><img id="dolpaymentlogo" title="'.$title.'" src="'.$urllogo.'"';
  271. if ($width) print ' width="'.$width.'"';
  272. print '></td>';
  273. print '</tr>'."\n";
  274. }
  275. // Output introduction text
  276. $text='';
  277. if (! empty($conf->global->PAYPAL_NEWFORM_TEXT))
  278. {
  279. $langs->load("members");
  280. if (preg_match('/^\((.*)\)$/',$conf->global->PAYPAL_NEWFORM_TEXT,$reg)) $text.=$langs->trans($reg[1])."<br>\n";
  281. else $text.=$conf->global->PAYPAL_NEWFORM_TEXT."<br>\n";
  282. $text='<tr><td align="center"><br>'.$text.'<br></td></tr>'."\n";
  283. }
  284. if (empty($text))
  285. {
  286. $text.='<tr><td class="textpublicpayment"><br><strong>'.$langs->trans("WelcomeOnPaymentPage").'</strong><br></td></tr>'."\n";
  287. $text.='<tr><td class="textpublicpayment"><br>'.$langs->trans("ThisScreenAllowsYouToPay",$creditor).'<br><br></td></tr>'."\n";
  288. }
  289. print $text;
  290. // Output payment summary form
  291. print '<tr><td align="center">';
  292. print '<table with="100%" id="tablepublicpayment">';
  293. print '<tr class="liste_total"><td align="left" colspan="2">'.$langs->trans("ThisIsInformationOnPayment").' :</td></tr>'."\n";
  294. $found=false;
  295. $error=0;
  296. $var=false;
  297. // Free payment
  298. if (! GETPOST("source") && $valid)
  299. {
  300. $found=true;
  301. $tag=GETPOST("tag");
  302. $fulltag=$tag;
  303. // Creditor
  304. $var=!$var;
  305. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Creditor");
  306. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$creditor.'</b>';
  307. print '<input type="hidden" name="creditor" value="'.$creditor.'">';
  308. print '</td></tr>'."\n";
  309. // Amount
  310. $var=!$var;
  311. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Amount");
  312. if (empty($amount)) print ' ('.$langs->trans("ToComplete").')';
  313. print '</td><td class="CTableRow'.($var?'1':'2').'">';
  314. if (empty($amount) || ! is_numeric($amount))
  315. {
  316. print '<input type="hidden" name="amount" value="'.GETPOST("amount",'int').'">';
  317. print '<input class="flat" size=8 type="text" name="newamount" value="'.GETPOST("newamount","int").'">';
  318. }
  319. else {
  320. print '<b>'.price($amount).'</b>';
  321. print '<input type="hidden" name="amount" value="'.$amount.'">';
  322. print '<input type="hidden" name="newamount" value="'.$amount.'">';
  323. }
  324. // Currency
  325. print ' <b>'.$langs->trans("Currency".$currency).'</b>';
  326. print '<input type="hidden" name="currency" value="'.$currency.'">';
  327. print '</td></tr>'."\n";
  328. // Tag
  329. $var=!$var;
  330. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("PaymentCode");
  331. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$fulltag.'</b>';
  332. print '<input type="hidden" name="tag" value="'.$tag.'">';
  333. print '<input type="hidden" name="fulltag" value="'.$fulltag.'">';
  334. print '</td></tr>'."\n";
  335. // We do not add fields shipToName, shipToStreet, shipToCity, shipToState, shipToCountryCode, shipToZip, shipToStreet2, phoneNum
  336. // as they don't exists (buyer is unknown, tag is free).
  337. }
  338. // Payment on customer order
  339. if (GETPOST("source") == 'order' && $valid)
  340. {
  341. $found=true;
  342. $langs->load("orders");
  343. require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
  344. $order=new Commande($db);
  345. $result=$order->fetch('',$ref);
  346. if ($result < 0)
  347. {
  348. $mesg=$order->error;
  349. $error++;
  350. }
  351. else
  352. {
  353. $result=$order->fetch_thirdparty($order->socid);
  354. }
  355. $amount=$order->total_ttc;
  356. if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int');
  357. $amount=price2num($amount);
  358. $fulltag='ORD='.$order->ref.'.CUS='.$order->thirdparty->id;
  359. //$fulltag.='.NAM='.strtr($order->thirdparty->name,"-"," ");
  360. if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; }
  361. $fulltag=dol_string_unaccent($fulltag);
  362. // Creditor
  363. $var=!$var;
  364. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Creditor");
  365. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$creditor.'</b>';
  366. print '<input type="hidden" name="creditor" value="'.$creditor.'">';
  367. print '</td></tr>'."\n";
  368. // Debitor
  369. $var=!$var;
  370. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("ThirdParty");
  371. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$order->thirdparty->name.'</b>';
  372. // Object
  373. $var=!$var;
  374. $text='<b>'.$langs->trans("PaymentOrderRef",$order->ref).'</b>';
  375. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Designation");
  376. print '</td><td class="CTableRow'.($var?'1':'2').'">'.$text;
  377. print '<input type="hidden" name="source" value="'.GETPOST("source",'alpha').'">';
  378. print '<input type="hidden" name="ref" value="'.$order->ref.'">';
  379. print '</td></tr>'."\n";
  380. // Amount
  381. $var=!$var;
  382. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Amount");
  383. if (empty($amount)) print ' ('.$langs->trans("ToComplete").')';
  384. print '</td><td class="CTableRow'.($var?'1':'2').'">';
  385. if (empty($amount) || ! is_numeric($amount))
  386. {
  387. print '<input type="hidden" name="amount" value="'.GETPOST("amount",'int').'">';
  388. print '<input class="flat" size=8 type="text" name="newamount" value="'.GETPOST("newamount","int").'">';
  389. }
  390. else {
  391. print '<b>'.price($amount).'</b>';
  392. print '<input type="hidden" name="amount" value="'.$amount.'">';
  393. print '<input type="hidden" name="newamount" value="'.$amount.'">';
  394. }
  395. // Currency
  396. print ' <b>'.$langs->trans("Currency".$currency).'</b>';
  397. print '<input type="hidden" name="currency" value="'.$currency.'">';
  398. print '</td></tr>'."\n";
  399. // Tag
  400. $var=!$var;
  401. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("PaymentCode");
  402. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$fulltag.'</b>';
  403. print '<input type="hidden" name="tag" value="'.$tag.'">';
  404. print '<input type="hidden" name="fulltag" value="'.$fulltag.'">';
  405. print '</td></tr>'."\n";
  406. // Shipping address
  407. $shipToName=$order->thirdparty->name;
  408. $shipToStreet=$order->thirdparty->address;
  409. $shipToCity=$order->thirdparty->town;
  410. $shipToState=$order->thirdparty->state_code;
  411. $shipToCountryCode=$order->thirdparty->country_code;
  412. $shipToZip=$order->thirdparty->zip;
  413. $shipToStreet2='';
  414. $phoneNum=$order->thirdparty->tel;
  415. if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip)
  416. {
  417. print '<input type="hidden" name="shipToName" value="'.$shipToName.'">'."\n";
  418. print '<input type="hidden" name="shipToStreet" value="'.$shipToStreet.'">'."\n";
  419. print '<input type="hidden" name="shipToCity" value="'.$shipToCity.'">'."\n";
  420. print '<input type="hidden" name="shipToState" value="'.$shipToState.'">'."\n";
  421. print '<input type="hidden" name="shipToCountryCode" value="'.$shipToCountryCode.'">'."\n";
  422. print '<input type="hidden" name="shipToZip" value="'.$shipToZip.'">'."\n";
  423. print '<input type="hidden" name="shipToStreet2" value="'.$shipToStreet2.'">'."\n";
  424. print '<input type="hidden" name="phoneNum" value="'.$phoneNum.'">'."\n";
  425. }
  426. else
  427. {
  428. print '<!-- Shipping address not complete, so we don t use it -->'."\n";
  429. }
  430. print '<input type="hidden" name="email" value="'.$order->thirdparty->email.'">'."\n";
  431. print '<input type="hidden" name="desc" value="'.$langs->trans("Order").' '.$order->ref.'">'."\n";
  432. }
  433. // Payment on customer invoice
  434. if (GETPOST("source") == 'invoice' && $valid)
  435. {
  436. $found=true;
  437. $langs->load("bills");
  438. require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
  439. $invoice=new Facture($db);
  440. $result=$invoice->fetch('',$ref);
  441. if ($result < 0)
  442. {
  443. $mesg=$invoice->error;
  444. $error++;
  445. }
  446. else
  447. {
  448. $result=$invoice->fetch_thirdparty($invoice->socid);
  449. }
  450. $amount=price2num($invoice->total_ttc - $invoice->getSommePaiement());
  451. if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int');
  452. $amount=price2num($amount);
  453. $fulltag='INV='.$invoice->ref.'.CUS='.$invoice->thirdparty->id;
  454. //$fulltag.='.NAM='.strtr($invoice->thirdparty->name,"-"," ");
  455. if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; }
  456. $fulltag=dol_string_unaccent($fulltag);
  457. // Creditor
  458. $var=!$var;
  459. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Creditor");
  460. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$creditor.'</b>';
  461. print '<input type="hidden" name="creditor" value="'.$creditor.'">';
  462. print '</td></tr>'."\n";
  463. // Debitor
  464. $var=!$var;
  465. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("ThirdParty");
  466. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$invoice->thirdparty->name.'</b>';
  467. // Object
  468. $var=!$var;
  469. $text='<b>'.$langs->trans("PaymentInvoiceRef",$invoice->ref).'</b>';
  470. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Designation");
  471. print '</td><td class="CTableRow'.($var?'1':'2').'">'.$text;
  472. print '<input type="hidden" name="source" value="'.GETPOST("source",'alpha').'">';
  473. print '<input type="hidden" name="ref" value="'.$invoice->ref.'">';
  474. print '</td></tr>'."\n";
  475. // Amount
  476. $var=!$var;
  477. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Amount");
  478. if (empty($amount)) print ' ('.$langs->trans("ToComplete").')';
  479. print '</td><td class="CTableRow'.($var?'1':'2').'">';
  480. if (empty($amount) || ! is_numeric($amount))
  481. {
  482. print '<input type="hidden" name="amount" value="'.GETPOST("amount",'int').'">';
  483. print '<input class="flat" size=8 type="text" name="newamount" value="'.GETPOST("newamount","int").'">';
  484. }
  485. else {
  486. print '<b>'.price($amount).'</b>';
  487. print '<input type="hidden" name="amount" value="'.$amount.'">';
  488. print '<input type="hidden" name="newamount" value="'.$amount.'">';
  489. }
  490. // Currency
  491. print ' <b>'.$langs->trans("Currency".$currency).'</b>';
  492. print '<input type="hidden" name="currency" value="'.$currency.'">';
  493. print '</td></tr>'."\n";
  494. // Tag
  495. $var=!$var;
  496. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("PaymentCode");
  497. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$fulltag.'</b>';
  498. print '<input type="hidden" name="tag" value="'.$tag.'">';
  499. print '<input type="hidden" name="fulltag" value="'.$fulltag.'">';
  500. print '</td></tr>'."\n";
  501. // Shipping address
  502. $shipToName=$invoice->thirdparty->name;
  503. $shipToStreet=$invoice->thirdparty->address;
  504. $shipToCity=$invoice->thirdparty->town;
  505. $shipToState=$invoice->thirdparty->state_code;
  506. $shipToCountryCode=$invoice->thirdparty->country_code;
  507. $shipToZip=$invoice->thirdparty->zip;
  508. $shipToStreet2='';
  509. $phoneNum=$invoice->thirdparty->tel;
  510. if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip)
  511. {
  512. print '<input type="hidden" name="shipToName" value="'.$shipToName.'">'."\n";
  513. print '<input type="hidden" name="shipToStreet" value="'.$shipToStreet.'">'."\n";
  514. print '<input type="hidden" name="shipToCity" value="'.$shipToCity.'">'."\n";
  515. print '<input type="hidden" name="shipToState" value="'.$shipToState.'">'."\n";
  516. print '<input type="hidden" name="shipToCountryCode" value="'.$shipToCountryCode.'">'."\n";
  517. print '<input type="hidden" name="shipToZip" value="'.$shipToZip.'">'."\n";
  518. print '<input type="hidden" name="shipToStreet2" value="'.$shipToStreet2.'">'."\n";
  519. print '<input type="hidden" name="phoneNum" value="'.$phoneNum.'">'."\n";
  520. }
  521. else
  522. {
  523. print '<!-- Shipping address not complete, so we don t use it -->'."\n";
  524. }
  525. print '<input type="hidden" name="email" value="'.$invoice->thirdparty->email.'">'."\n";
  526. print '<input type="hidden" name="desc" value="'.$langs->trans("Invoice").' '.$invoice->ref.'">'."\n";
  527. }
  528. // Payment on contract line
  529. if (GETPOST("source") == 'contractline' && $valid)
  530. {
  531. $found=true;
  532. $langs->load("contracts");
  533. require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
  534. $contractline=new ContratLigne($db);
  535. $result=$contractline->fetch('',$ref);
  536. if ($result < 0)
  537. {
  538. $mesg=$contractline->error;
  539. $error++;
  540. }
  541. else
  542. {
  543. if ($contractline->fk_contrat > 0)
  544. {
  545. $contract=new Contrat($db);
  546. $result=$contract->fetch($contractline->fk_contrat);
  547. if ($result > 0)
  548. {
  549. $result=$contract->fetch_thirdparty($contract->socid);
  550. }
  551. else
  552. {
  553. $mesg=$contract->error;
  554. $error++;
  555. }
  556. }
  557. else
  558. {
  559. $mesg='ErrorRecordNotFound';
  560. $error++;
  561. }
  562. }
  563. $amount=$contractline->total_ttc;
  564. if ($contractline->fk_product)
  565. {
  566. $product=new Product($db);
  567. $result=$product->fetch($contractline->fk_product);
  568. // We define price for product (TODO Put this in a method in product class)
  569. if (! empty($conf->global->PRODUIT_MULTIPRICES))
  570. {
  571. $pu_ht = $product->multiprices[$contract->thirdparty->price_level];
  572. $pu_ttc = $product->multiprices_ttc[$contract->thirdparty->price_level];
  573. $price_base_type = $product->multiprices_base_type[$contract->thirdparty->price_level];
  574. }
  575. else
  576. {
  577. $pu_ht = $product->price;
  578. $pu_ttc = $product->price_ttc;
  579. $price_base_type = $product->price_base_type;
  580. }
  581. $amount=$pu_ttc;
  582. if (empty($amount))
  583. {
  584. dol_print_error('','ErrorNoPriceDefinedForThisProduct');
  585. exit;
  586. }
  587. }
  588. if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int');
  589. $amount=price2num($amount);
  590. $fulltag='COL='.$contractline->ref.'.CON='.$contract->ref.'.CUS='.$contract->thirdparty->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M');
  591. //$fulltag.='.NAM='.strtr($contract->thirdparty->name,"-"," ");
  592. if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; }
  593. $fulltag=dol_string_unaccent($fulltag);
  594. $qty=1;
  595. if (GETPOST('qty')) $qty=GETPOST('qty');
  596. // Creditor
  597. $var=!$var;
  598. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Creditor");
  599. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$creditor.'</b>';
  600. print '<input type="hidden" name="creditor" value="'.$creditor.'">';
  601. print '</td></tr>'."\n";
  602. // Debitor
  603. $var=!$var;
  604. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("ThirdParty");
  605. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$contract->thirdparty->name.'</b>';
  606. // Object
  607. $var=!$var;
  608. $text='<b>'.$langs->trans("PaymentRenewContractId",$contract->ref,$contractline->ref).'</b>';
  609. if ($contractline->fk_product)
  610. {
  611. $text.='<br>'.$product->ref.($product->libelle?' - '.$product->libelle:'');
  612. }
  613. if ($contractline->description) $text.='<br>'.dol_htmlentitiesbr($contractline->description);
  614. //if ($contractline->date_fin_validite) {
  615. // $text.='<br>'.$langs->trans("DateEndPlanned").': ';
  616. // $text.=dol_print_date($contractline->date_fin_validite);
  617. //}
  618. if ($contractline->date_fin_validite)
  619. {
  620. $text.='<br>'.$langs->trans("ExpiredSince").': '.dol_print_date($contractline->date_fin_validite);
  621. }
  622. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Designation");
  623. print '</td><td class="CTableRow'.($var?'1':'2').'">'.$text;
  624. print '<input type="hidden" name="source" value="'.GETPOST("source",'alpha').'">';
  625. print '<input type="hidden" name="ref" value="'.$contractline->ref.'">';
  626. print '</td></tr>'."\n";
  627. // Quantity
  628. $var=!$var;
  629. $label=$langs->trans("Quantity");
  630. $qty=1;
  631. $duration='';
  632. if ($contractline->fk_product)
  633. {
  634. if ($product->isservice() && $product->duration_value > 0)
  635. {
  636. $label=$langs->trans("Duration");
  637. // TODO Put this in a global method
  638. if ($product->duration_value > 1)
  639. {
  640. $dur=array("h"=>$langs->trans("Hours"),"d"=>$langs->trans("DurationDays"),"w"=>$langs->trans("DurationWeeks"),"m"=>$langs->trans("DurationMonths"),"y"=>$langs->trans("DurationYears"));
  641. }
  642. else
  643. {
  644. $dur=array("h"=>$langs->trans("Hour"),"d"=>$langs->trans("DurationDay"),"w"=>$langs->trans("DurationWeek"),"m"=>$langs->trans("DurationMonth"),"y"=>$langs->trans("DurationYear"));
  645. }
  646. $duration=$product->duration_value.' '.$dur[$product->duration_unit];
  647. }
  648. }
  649. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$label.'</td>';
  650. print '<td class="CTableRow'.($var?'1':'2').'"><b>'.($duration?$duration:$qty).'</b>';
  651. print '<input type="hidden" name="newqty" value="'.dol_escape_htmltag($qty).'">';
  652. print '</b></td></tr>'."\n";
  653. // Amount
  654. $var=!$var;
  655. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Amount");
  656. if (empty($amount)) print ' ('.$langs->trans("ToComplete").')';
  657. print '</td><td class="CTableRow'.($var?'1':'2').'">';
  658. if (empty($amount) || ! is_numeric($amount))
  659. {
  660. print '<input type="hidden" name="amount" value="'.GETPOST("amount",'int').'">';
  661. print '<input class="flat" size=8 type="text" name="newamount" value="'.GETPOST("newamount","int").'">';
  662. }
  663. else {
  664. print '<b>'.price($amount).'</b>';
  665. print '<input type="hidden" name="amount" value="'.$amount.'">';
  666. print '<input type="hidden" name="newamount" value="'.$amount.'">';
  667. }
  668. // Currency
  669. print ' <b>'.$langs->trans("Currency".$currency).'</b>';
  670. print '<input type="hidden" name="currency" value="'.$currency.'">';
  671. print '</td></tr>'."\n";
  672. // Tag
  673. $var=!$var;
  674. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("PaymentCode");
  675. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$fulltag.'</b>';
  676. print '<input type="hidden" name="tag" value="'.$tag.'">';
  677. print '<input type="hidden" name="fulltag" value="'.$fulltag.'">';
  678. print '</td></tr>'."\n";
  679. // Shipping address
  680. $shipToName=$contract->thirdparty->name;
  681. $shipToStreet=$contract->thirdparty->address;
  682. $shipToCity=$contract->thirdparty->town;
  683. $shipToState=$contract->thirdparty->state_code;
  684. $shipToCountryCode=$contract->thirdparty->pays_code;
  685. $shipToZip=$contract->thirdparty->zip;
  686. $shipToStreet2='';
  687. $phoneNum=$contract->thirdparty->tel;
  688. if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip)
  689. {
  690. print '<input type="hidden" name="shipToName" value="'.$shipToName.'">'."\n";
  691. print '<input type="hidden" name="shipToStreet" value="'.$shipToStreet.'">'."\n";
  692. print '<input type="hidden" name="shipToCity" value="'.$shipToCity.'">'."\n";
  693. print '<input type="hidden" name="shipToState" value="'.$shipToState.'">'."\n";
  694. print '<input type="hidden" name="shipToCountryCode" value="'.$shipToCountryCode.'">'."\n";
  695. print '<input type="hidden" name="shipToZip" value="'.$shipToZip.'">'."\n";
  696. print '<input type="hidden" name="shipToStreet2" value="'.$shipToStreet2.'">'."\n";
  697. print '<input type="hidden" name="phoneNum" value="'.$phoneNum.'">'."\n";
  698. }
  699. else
  700. {
  701. print '<!-- Shipping address not complete, so we don t use it -->'."\n";
  702. }
  703. print '<input type="hidden" name="email" value="'.$contract->thirdparty->email.'">'."\n";
  704. print '<input type="hidden" name="desc" value="'.$langs->trans("Contract").' '.$contract->ref.'">'."\n";
  705. }
  706. // Payment on member subscription
  707. if (GETPOST("source") == 'membersubscription' && $valid)
  708. {
  709. $found=true;
  710. $langs->load("members");
  711. require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
  712. require_once DOL_DOCUMENT_ROOT.'/adherents/class/cotisation.class.php';
  713. $member=new Adherent($db);
  714. $result=$member->fetch('',$ref);
  715. if ($result < 0)
  716. {
  717. $mesg=$member->error;
  718. $error++;
  719. }
  720. else
  721. {
  722. $subscription=new Cotisation($db);
  723. }
  724. $amount=$subscription->total_ttc;
  725. if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int');
  726. $amount=price2num($amount);
  727. $fulltag='MEM='.$member->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M');
  728. if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; }
  729. $fulltag=dol_string_unaccent($fulltag);
  730. // Creditor
  731. $var=!$var;
  732. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Creditor");
  733. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$creditor.'</b>';
  734. print '<input type="hidden" name="creditor" value="'.$creditor.'">';
  735. print '</td></tr>'."\n";
  736. // Debitor
  737. $var=!$var;
  738. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Member");
  739. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>';
  740. if ($member->morphy == 'mor' && ! empty($member->societe)) print $member->societe;
  741. else print $member->getFullName($langs);
  742. print '</b>';
  743. // Object
  744. $var=!$var;
  745. $text='<b>'.$langs->trans("PaymentSubscription").'</b>';
  746. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Designation");
  747. print '</td><td class="CTableRow'.($var?'1':'2').'">'.$text;
  748. print '<input type="hidden" name="source" value="'.GETPOST("source",'alpha').'">';
  749. print '<input type="hidden" name="ref" value="'.$member->ref.'">';
  750. print '</td></tr>'."\n";
  751. if ($member->last_subscription_date || $member->last_subscription_amount)
  752. {
  753. // Last subscription date
  754. $var=!$var;
  755. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("LastSubscriptionDate");
  756. print '</td><td class="CTableRow'.($var?'1':'2').'">'.dol_print_date($member->last_subscription_date,'day');
  757. print '</td></tr>'."\n";
  758. // Last subscription amount
  759. $var=!$var;
  760. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("LastSubscriptionAmount");
  761. print '</td><td class="CTableRow'.($var?'1':'2').'">'.price($member->last_subscription_amount);
  762. print '</td></tr>'."\n";
  763. if (empty($amount) && ! GETPOST('newamount')) $_GET['newamount']=$member->last_subscription_amount;
  764. }
  765. // Amount
  766. $var=!$var;
  767. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("Amount");
  768. if (empty($amount)) print ' ('.$langs->trans("ToComplete").')';
  769. print '</td><td class="CTableRow'.($var?'1':'2').'">';
  770. if (empty($amount) || ! is_numeric($amount))
  771. {
  772. $valtoshow=GETPOST("newamount",'int');
  773. if (! empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) $valtoshow=max($conf->global->MEMBER_MIN_AMOUNT,$valtoshow);
  774. print '<input type="hidden" name="amount" value="'.GETPOST("amount",'int').'">';
  775. print '<input class="flat" size="8" type="text" name="newamount" value="'.$valtoshow.'">';
  776. }
  777. else {
  778. $valtoshow=$amount;
  779. if (! empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) $valtoshow=max($conf->global->MEMBER_MIN_AMOUNT,$valtoshow);
  780. print '<b>'.price($valtoshow).'</b>';
  781. print '<input type="hidden" name="amount" value="'.$valtoshow.'">';
  782. print '<input type="hidden" name="newamount" value="'.$valtoshow.'">';
  783. }
  784. // Currency
  785. print ' <b>'.$langs->trans("Currency".$currency).'</b>';
  786. print '<input type="hidden" name="currency" value="'.$currency.'">';
  787. print '</td></tr>'."\n";
  788. // Tag
  789. $var=!$var;
  790. print '<tr class="CTableRow'.($var?'1':'2').'"><td class="CTableRow'.($var?'1':'2').'">'.$langs->trans("PaymentCode");
  791. print '</td><td class="CTableRow'.($var?'1':'2').'"><b>'.$fulltag.'</b>';
  792. print '<input type="hidden" name="tag" value="'.$tag.'">';
  793. print '<input type="hidden" name="fulltag" value="'.$fulltag.'">';
  794. print '</td></tr>'."\n";
  795. // Shipping address
  796. $shipToName=$member->getFullName($langs);
  797. $shipToStreet=$member->address;
  798. $shipToCity=$member->town;
  799. $shipToState=$member->state_code;
  800. $shipToCountryCode=$member->country_code;
  801. $shipToZip=$member->zip;
  802. $shipToStreet2='';
  803. $phoneNum=$member->tel;
  804. if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip)
  805. {
  806. print '<input type="hidden" name="shipToName" value="'.$shipToName.'">'."\n";
  807. print '<input type="hidden" name="shipToStreet" value="'.$shipToStreet.'">'."\n";
  808. print '<input type="hidden" name="shipToCity" value="'.$shipToCity.'">'."\n";
  809. print '<input type="hidden" name="shipToState" value="'.$shipToState.'">'."\n";
  810. print '<input type="hidden" name="shipToCountryCode" value="'.$shipToCountryCode.'">'."\n";
  811. print '<input type="hidden" name="shipToZip" value="'.$shipToZip.'">'."\n";
  812. print '<input type="hidden" name="shipToStreet2" value="'.$shipToStreet2.'">'."\n";
  813. print '<input type="hidden" name="phoneNum" value="'.$phoneNum.'">'."\n";
  814. }
  815. else
  816. {
  817. print '<!-- Shipping address not complete, so we don t use it -->'."\n";
  818. }
  819. print '<input type="hidden" name="email" value="'.$member->email.'">'."\n";
  820. print '<input type="hidden" name="desc" value="'.$langs->trans("PaymentSubscription").'">'."\n";
  821. }
  822. if (! $found && ! $mesg) $mesg=$langs->trans("ErrorBadParameters");
  823. if ($mesg) print '<tr><td align="center" colspan="2"><br><div class="warning">'.$mesg.'</div></td></tr>'."\n";
  824. print '</table>'."\n";
  825. print "\n";
  826. if ($found && ! $error) // We are in a management option and no error
  827. {
  828. if (empty($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY)) $conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY='integral';
  829. if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'integral')
  830. {
  831. print '<br><input class="button" type="submit" name="dopayment" value="'.$langs->trans("PaypalOrCBDoPayment").'">';
  832. }
  833. if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'paypalonly')
  834. {
  835. print '<br><input class="button" type="submit" name="dopayment" value="'.$langs->trans("PaypalDoPayment").'">';
  836. }
  837. }
  838. else
  839. {
  840. dol_print_error_email();
  841. }
  842. print '</td></tr>'."\n";
  843. print '</table>'."\n";
  844. print '</form>'."\n";
  845. print '</center>'."\n";
  846. print '<br>';
  847. html_print_paypal_footer($mysoc,$langs);
  848. llxFooterPaypal();
  849. $db->close();
  850. ?>