39 if (!defined(
'NOLOGIN')) {
42 if (!defined(
'NOCSRFCHECK')) {
43 define(
"NOCSRFCHECK", 1);
45 if (!defined(
'NOIPCHECK')) {
46 define(
'NOIPCHECK',
'1');
48 if (!defined(
'NOBROWSERNOTIF')) {
49 define(
'NOBROWSERNOTIF',
'1');
54 $entity = (!empty($_GET[
'entity']) ? (int) $_GET[
'entity'] : (!empty($_POST[
'entity']) ? (int) $_POST[
'entity'] : (!empty($_GET[
'e']) ? (int) $_GET[
'e'] : (!empty($_POST[
'e']) ? (int) $_POST[
'e'] : 1))));
55 if (is_numeric($entity)) {
56 define(
"DOLENTITY", $entity);
59 require
'../../main.inc.php';
60 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
61 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
62 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
63 require_once DOL_DOCUMENT_ROOT.
'/eventorganization/class/conferenceorboothattendee.class.php';
64 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
65 require_once DOL_DOCUMENT_ROOT.
'/societe/class/societeaccount.class.php';
66 require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
67 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
69 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
71 $hookmanager->initHooks(array(
'newpayment'));
74 $langs->loadLangs(array(
"main",
"other",
"dict",
"bills",
"companies",
"errors",
"paybox",
"paypal",
"stripe"));
79 $action =
GETPOST(
'action',
'aZ09');
88 $suffix =
GETPOST(
"suffix",
'aZ09');
90 if (!
GETPOST(
"currency",
'alpha')) {
91 $currency = $conf->currency;
93 $currency =
GETPOST(
"currency",
'aZ09');
96 $getpostlang =
GETPOST(
'lang',
'aZ09');
99 if (!
GETPOST(
"amount",
'alpha') && !$source) {
100 print $langs->trans(
'ErrorBadParameters').
" - amount or source";
103 if (is_numeric($amount) && !
GETPOST(
"tag",
'alpha') && !$source) {
104 print $langs->trans(
'ErrorBadParameters').
" - tag or source";
107 if ($source && !
GETPOST(
"ref",
'alpha')) {
108 print $langs->trans(
'ErrorBadParameters').
" - ref";
113 if ($source ==
'organizedeventregistration') {
117 $invoiceid =
GETPOST(
'ref',
'int');
120 $resultinvoice = $invoice->fetch($invoiceid);
122 if ($resultinvoice <= 0) {
135 $sql =
"SELECT rowid FROM ".MAIN_DB_PREFIX.
"eventorganization_conferenceorboothattendee";
136 $sql .=
" WHERE fk_invoice = ".((int) $invoiceid);
137 $resql = $db->query($sql);
139 $obj = $db->fetch_object(
$resql);
141 $attendeeid = $obj->rowid;
145 if ($attendeeid > 0) {
146 $resultattendee = $attendee->fetch($attendeeid);
148 if ($resultattendee <= 0) {
151 $attendee->fetch_projet();
153 $amount =
price2num($invoice->total_ttc);
155 $thirdparty =
new Societe($db);
156 $resultthirdparty = $thirdparty->fetch($invoice->socid);
157 if ($resultthirdparty <= 0) {
160 $object = $thirdparty;
164 } elseif ($source ==
'boothlocation') {
168 $resultinvoice = $invoice->fetch($invoiceid);
169 if ($resultinvoice <= 0) {
172 $amount =
price2num($invoice->total_ttc);
174 $thirdparty =
new Societe($db);
175 $resultthirdparty = $thirdparty->fetch($invoice->socid);
176 if ($resultthirdparty <= 0) {
179 $object = $thirdparty;
184 $paymentmethod =
GETPOST(
'paymentmethod',
'alphanohtml') ?
GETPOST(
'paymentmethod',
'alphanohtml') :
'';
185 $validpaymentmethod = array();
188 foreach ($_POST as $key => $val) {
190 if (preg_match(
'/^dopayment_(.*)$/', $key, $reg)) {
191 $paymentmethod = $reg[1];
200 $urlwithroot = DOL_MAIN_URL_ROOT;
202 $urlok = $urlwithroot.
'/public/payment/paymentok.php?';
203 $urlko = $urlwithroot.
'/public/payment/paymentko.php?';
206 $ref = $REF =
GETPOST(
'ref',
'alpha');
207 $TAG =
GETPOST(
"tag",
'alpha');
208 $FULLTAG =
GETPOST(
"fulltag",
'alpha');
209 $SECUREKEY =
GETPOST(
"securekey");
211 if ($paymentmethod && !preg_match(
'/'.preg_quote(
'PM='.$paymentmethod,
'/').
'/', $FULLTAG)) {
212 $FULLTAG .= ($FULLTAG ?
'.' :
'').
'PM='.$paymentmethod;
215 if (!empty($suffix)) {
216 $urlok .=
'suffix='.urlencode($suffix).
'&';
217 $urlko .=
'suffix='.urlencode($suffix).
'&';
220 $urlok .=
's='.urlencode($source).
'&';
221 $urlko .=
's='.urlencode($source).
'&';
224 $urlok .=
'ref='.urlencode($REF).
'&';
225 $urlko .=
'ref='.urlencode($REF).
'&';
228 $urlok .=
'tag='.urlencode($TAG).
'&';
229 $urlko .=
'tag='.urlencode($TAG).
'&';
231 if (!empty($FULLTAG)) {
232 $urlok .=
'fulltag='.urlencode($FULLTAG).
'&';
233 $urlko .=
'fulltag='.urlencode($FULLTAG).
'&';
235 if (!empty($SECUREKEY)) {
236 $urlok .=
'securekey='.urlencode($SECUREKEY).
'&';
237 $urlko .=
'securekey='.urlencode($SECUREKEY).
'&';
239 if (!empty($entity)) {
240 $urlok .=
'e='.urlencode($entity).
'&';
241 $urlko .=
'e='.urlencode($entity).
'&';
243 if (!empty($getpostlang)) {
244 $urlok .=
'lang='.urlencode($getpostlang).
'&';
245 $urlko .=
'lang='.urlencode($getpostlang).
'&';
247 $urlok = preg_replace(
'/&$/',
'', $urlok);
248 $urlko = preg_replace(
'/&$/',
'', $urlko);
253 if ((empty($paymentmethod) || $paymentmethod ==
'paypal') && !empty($conf->paypal->enabled)) {
254 require_once DOL_DOCUMENT_ROOT.
'/paypal/lib/paypal.lib.php';
255 require_once DOL_DOCUMENT_ROOT.
'/paypal/lib/paypalfunctions.lib.php';
260 $PAYPAL_API_OK = $urlok;
264 $PAYPAL_API_KO = $urlko;
266 if (empty($PAYPAL_API_USER)) {
270 if (empty($PAYPAL_API_PASSWORD)) {
271 dol_print_error(
'',
"Paypal setup param PAYPAL_API_PASSWORD not defined");
274 if (empty($PAYPAL_API_SIGNATURE)) {
275 dol_print_error(
'',
"Paypal setup param PAYPAL_API_SIGNATURE not defined");
279 if ((empty($paymentmethod) || $paymentmethod ==
'paybox') && !empty($conf->paybox->enabled)) {
282 if ((empty($paymentmethod) || $paymentmethod ==
'stripe') && !empty($conf->stripe->enabled)) {
283 require_once DOL_DOCUMENT_ROOT.
'/stripe/config.php';
287 $validpaymentmethod = getValidOnlinePaymentMethods($paymentmethod);
291 'paymentmethod' => $paymentmethod,
292 'validpaymentmethod' => &$validpaymentmethod
294 $reshook = $hookmanager->executeHooks(
'doValidatePayment', $parameters, $object, $action);
297 } elseif ($reshook > 0) {
298 print $hookmanager->resPrint;
302 $tmpsource = $source;
303 if ($tmpsource ==
'membersubscription') {
304 $tmpsource =
'member';
307 if (!empty($conf->global->PAYMENT_SECURITY_TOKEN)) {
309 if (!empty($conf->global->PAYMENT_SECURITY_TOKEN_UNIQUE)) {
310 if ($tmpsource && $REF) {
312 $tokenisok =
dol_verifyHash($conf->global->PAYMENT_SECURITY_TOKEN.$tmpsource.$REF, $SECUREKEY,
'2');
314 if ($tmpsource != $source) {
315 $tokenisok =
dol_verifyHash($conf->global->PAYMENT_SECURITY_TOKEN.$source.$REF, $SECUREKEY,
'2');
318 $tokenisok =
dol_verifyHash($conf->global->PAYMENT_SECURITY_TOKEN, $SECUREKEY,
'2');
321 $tokenisok = ($conf->global->PAYMENT_SECURITY_TOKEN == $SECUREKEY);
325 if (empty($conf->global->PAYMENT_SECURITY_ACCEPT_ANY_TOKEN)) {
328 dol_syslog(
"Warning: PAYMENT_SECURITY_ACCEPT_ANY_TOKEN is on", LOG_WARNING);
333 print
'<div class="error">Bad value for key.</div>';
339 if (!empty($paymentmethod) && empty($validpaymentmethod[$paymentmethod])) {
340 print
'Payment module for payment method '.$paymentmethod.
' is not active';
343 if (empty($validpaymentmethod)) {
344 print
'No active payment module (Paypal, Stripe, Paybox, ...)';
349 $creditor = $mysoc->name;
350 $paramcreditor =
'ONLINE_PAYMENT_CREDITOR';
351 $paramcreditorlong =
'ONLINE_PAYMENT_CREDITOR_'.$suffix;
352 if (!empty($conf->global->$paramcreditorlong)) {
353 $creditor = $conf->global->$paramcreditorlong;
354 } elseif (!empty($conf->global->$paramcreditor)) {
355 $creditor = $conf->global->$paramcreditor;
366 if ($action ==
'dopayment') {
367 if ($paymentmethod ==
'paypal') {
369 $PAYPAL_PAYMENT_TYPE =
'Sale';
372 $origfulltag =
GETPOST(
"fulltag",
'alpha');
373 $shipToName =
GETPOST(
"shipToName",
'alpha');
374 $shipToStreet =
GETPOST(
"shipToStreet",
'alpha');
375 $shipToCity =
GETPOST(
"shipToCity",
'alpha');
376 $shipToState =
GETPOST(
"shipToState",
'alpha');
377 $shipToCountryCode =
GETPOST(
"shipToCountryCode",
'alpha');
378 $shipToZip =
GETPOST(
"shipToZip",
'alpha');
379 $shipToStreet2 =
GETPOST(
"shipToStreet2",
'alpha');
380 $phoneNum =
GETPOST(
"phoneNum",
'alpha');
381 $email =
GETPOST(
"email",
'alpha');
382 $desc =
GETPOST(
"desc",
'alpha');
383 $thirdparty_id =
GETPOST(
'thirdparty_id',
'int');
386 if ($shipToCountryCode ==
'ID' && !preg_match(
'/\-/', $shipToState)) {
387 $shipToState =
'ID-'.$shipToState;
390 if (empty($PAYPAL_API_PRICE) || !is_numeric($PAYPAL_API_PRICE)) {
391 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Amount"));
395 } elseif (!$origfulltag) {
396 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"PaymentCode"));
402 dol_syslog(
"newpayment.php call paypal api and do redirect", LOG_DEBUG);
405 $PAYPAL_API_DEVISE =
"USD";
406 if (!empty($currency)) {
407 $PAYPAL_API_DEVISE = $currency;
412 dol_syslog(
"PAYPAL_API_USER: $PAYPAL_API_USER", LOG_DEBUG);
413 dol_syslog(
"PAYPAL_API_PASSWORD: ".preg_replace(
'/./',
'*', $PAYPAL_API_PASSWORD), LOG_DEBUG);
414 dol_syslog(
"PAYPAL_API_SIGNATURE: $PAYPAL_API_SIGNATURE", LOG_DEBUG);
415 dol_syslog(
"PAYPAL_API_SANDBOX: $PAYPAL_API_SANDBOX", LOG_DEBUG);
416 dol_syslog(
"PAYPAL_API_OK: $PAYPAL_API_OK", LOG_DEBUG);
417 dol_syslog(
"PAYPAL_API_KO: $PAYPAL_API_KO", LOG_DEBUG);
418 dol_syslog(
"PAYPAL_API_PRICE: $PAYPAL_API_PRICE", LOG_DEBUG);
419 dol_syslog(
"PAYPAL_API_DEVISE: $PAYPAL_API_DEVISE", LOG_DEBUG);
421 dol_syslog(
"shipToName: $shipToName", LOG_DEBUG);
422 dol_syslog(
"shipToStreet: $shipToStreet", LOG_DEBUG);
423 dol_syslog(
"shipToCity: $shipToCity", LOG_DEBUG);
424 dol_syslog(
"shipToState: $shipToState", LOG_DEBUG);
425 dol_syslog(
"shipToCountryCode: $shipToCountryCode", LOG_DEBUG);
426 dol_syslog(
"shipToZip: $shipToZip", LOG_DEBUG);
427 dol_syslog(
"shipToStreet2: $shipToStreet2", LOG_DEBUG);
432 dol_syslog(
"SCRIPT_URI: ".(empty($_SERVER[
"SCRIPT_URI"]) ?
'' : $_SERVER[
"SCRIPT_URI"]), LOG_DEBUG);
435 $mesg =
print_paypal_redirect($PAYPAL_API_PRICE, $PAYPAL_API_DEVISE, $PAYPAL_PAYMENT_TYPE, $PAYPAL_API_OK, $PAYPAL_API_KO, $FULLTAG);
442 if ($paymentmethod ==
'paybox') {
444 $email = $conf->global->ONLINE_PAYMENT_SENDEMAIL;
445 $thirdparty_id =
GETPOST(
'thirdparty_id',
'int');
447 $origfulltag =
GETPOST(
"fulltag",
'alpha');
450 $urlok = preg_replace(
'/securekey=[^&]+&?/',
'', $urlok);
451 $urlko = preg_replace(
'/securekey=[^&]+&?/',
'', $urlko);
453 if (empty($PRICE) || !is_numeric($PRICE)) {
454 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Amount"));
455 } elseif (empty($email)) {
456 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ONLINE_PAYMENT_SENDEMAIL"));
457 } elseif (!isValidEMail($email)) {
458 $mesg = $langs->trans(
"ErrorBadEMail", $email);
459 } elseif (!$origfulltag) {
460 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"PaymentCode"));
462 $mesg =
'Error urlok too long '.$urlok.
' (Paybox requires 150, found '.strlen($urlok).
')';
464 $mesg =
'Error urlko too long '.$urlko.
' (Paybox requires 150, found '.strlen($urlok).
')';
468 dol_syslog(
"newpayment.php call paybox api and do redirect", LOG_DEBUG);
470 include_once DOL_DOCUMENT_ROOT.
'/paybox/lib/paybox.lib.php';
478 if ($paymentmethod ==
'stripe') {
479 if (
GETPOST(
'newamount',
'alpha')) {
482 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Amount")),
null,
'errors');
492 if ($action ==
'charge' && !empty($conf->stripe->enabled)) {
493 $amountstripe = $amount;
497 $arrayzerounitcurrency = array(
'BIF',
'CLP',
'DJF',
'GNF',
'JPY',
'KMF',
'KRW',
'MGA',
'PYG',
'RWF',
'VND',
'VUV',
'XAF',
'XOF',
'XPF');
498 if (!in_array($currency, $arrayzerounitcurrency)) {
499 $amountstripe = $amountstripe * 100;
502 dol_syslog(
"--- newpayment.php Execute action = ".$action.
" STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION=".
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION'), LOG_DEBUG, 0,
'_stripe');
503 dol_syslog(
"GET=".var_export($_GET,
true), LOG_DEBUG, 0,
'_stripe');
504 dol_syslog(
"POST=".var_export($_POST,
true), LOG_DEBUG, 0,
'_stripe');
506 $stripeToken =
GETPOST(
"stripeToken",
'alpha');
507 $email =
GETPOST(
"email",
'alpha');
508 $thirdparty_id =
GETPOST(
'thirdparty_id',
'int');
510 $dol_id =
GETPOST(
'dol_id',
'int');
511 $vatnumber =
GETPOST(
'vatnumber',
'alpha');
514 dol_syslog(
"POST stripeToken = ".$stripeToken, LOG_DEBUG, 0,
'_stripe');
515 dol_syslog(
"POST email = ".$email, LOG_DEBUG, 0,
'_stripe');
516 dol_syslog(
"POST thirdparty_id = ".$thirdparty_id, LOG_DEBUG, 0,
'_stripe');
517 dol_syslog(
"POST vatnumber = ".$vatnumber, LOG_DEBUG, 0,
'_stripe');
523 if (!
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION')) {
526 'dol_version' => DOL_VERSION,
527 'dol_entity' => $conf->entity,
528 'dol_company' => $mysoc->name,
529 'dol_tax_num' => $vatnumber,
533 if (!empty($thirdparty_id)) {
534 $metadata[
"dol_thirdparty_id"] = $thirdparty_id;
537 if ($thirdparty_id > 0) {
538 dol_syslog(
"Search existing Stripe customer profile for thirdparty_id=".$thirdparty_id, LOG_DEBUG, 0,
'_stripe');
540 $service =
'StripeTest';
542 if (!empty($conf->global->STRIPE_LIVE) && !
GETPOST(
'forcesandbox',
'int')) {
543 $service =
'StripeLive';
547 $thirdparty =
new Societe($db);
548 $thirdparty->fetch($thirdparty_id);
551 include_once DOL_DOCUMENT_ROOT.
'/stripe/class/stripe.class.php';
552 $stripe =
new Stripe($db);
553 $stripeacc = $stripe->getStripeAccount($service);
554 $customer = $stripe->customerStripe($thirdparty, $stripeacc, $servicestatus, 1);
555 if (empty($customer)) {
557 dol_syslog(
'Failed to get/create stripe customer for thirdparty id = '.$thirdparty_id.
' and servicestatus = '.$servicestatus.
': '.$stripe->error, LOG_ERR, 0,
'_stripe');
558 setEventMessages(
'Failed to get/create stripe customer for thirdparty id = '.$thirdparty_id.
' and servicestatus = '.$servicestatus.
': '.$stripe->error,
null,
'errors');
565 $card = $customer->sources->create(array(
"source" => $stripeToken,
"metadata" => $metadata));
567 $card = $stripeToken;
572 dol_syslog(
'Failed to create card record', LOG_WARNING, 0,
'_stripe');
576 if (!empty($FULLTAG)) {
577 $metadata[
"FULLTAG"] = $FULLTAG;
579 if (!empty($dol_id)) {
580 $metadata[
"dol_id"] = $dol_id;
582 if (!empty($dol_type)) {
583 $metadata[
"dol_type"] = $dol_type;
586 dol_syslog(
"Create charge on card ".$card->id, LOG_DEBUG, 0,
'_stripe');
587 $charge = \Stripe\Charge::create(array(
588 'amount' =>
price2num($amountstripe,
'MU'),
589 'currency' => $currency,
591 'description' =>
'Stripe payment: '.$FULLTAG.
' ref='.$ref,
592 'metadata' => $metadata,
593 'customer' => $customer->id,
595 'statement_descriptor_suffix' =>
dol_trunc($FULLTAG, 10,
'right',
'UTF-8', 1),
596 ), array(
"idempotency_key" =>
"$FULLTAG",
"stripe_account" =>
"$stripeacc"));
598 if (empty($charge)) {
600 dol_syslog(
'Failed to charge card', LOG_WARNING, 0,
'_stripe');
607 $vatcleaned = $vatnumber ? $vatnumber :
null;
618 dol_syslog(
"Create anonymous customer card profile", LOG_DEBUG, 0,
'_stripe');
620 $customer = \Stripe\Customer::create(array(
622 'description' => ($email ?
'Anonymous customer for '.$email :
'Anonymous customer'),
623 'metadata' => $metadata,
624 'source' => $stripeToken
643 if (!empty($FULLTAG)) {
644 $metadata[
"FULLTAG"] = $FULLTAG;
646 if (!empty($dol_id)) {
647 $metadata[
"dol_id"] = $dol_id;
649 if (!empty($dol_type)) {
650 $metadata[
"dol_type"] = $dol_type;
655 dol_syslog(
"Create charge", LOG_DEBUG, 0,
'_stripe');
656 $charge = \Stripe\Charge::create(array(
657 'customer' => $customer->id,
658 'amount' =>
price2num($amountstripe,
'MU'),
659 'currency' => $currency,
661 'description' =>
'Stripe payment: '.$FULLTAG.
' ref='.$ref,
662 'metadata' => $metadata,
663 'statement_descriptor' =>
dol_trunc($FULLTAG, 10,
'right',
'UTF-8', 1),
664 ), array(
"idempotency_key" =>
"$FULLTAG",
"stripe_account" =>
"$stripeacc"));
666 if (empty($charge)) {
668 dol_syslog(
'Failed to charge card', LOG_WARNING, 0,
'_stripe');
673 }
catch (\
Stripe\Error\Card $e) {
675 $body = $e->getJsonBody();
676 $err = $body[
'error'];
678 print(
'Status is:'.$e->getHttpStatus().
"\n");
679 print(
'Type is:'.$err[
'type'].
"\n");
680 print(
'Code is:'.$err[
'code'].
"\n");
682 print(
'Param is:'.$err[
'param'].
"\n");
683 print(
'Message is:'.$err[
'message'].
"\n");
686 $errormessage =
"ErrorCard ".$e->getMessage().
" err=".var_export($err,
true);
687 dol_syslog($errormessage, LOG_WARNING, 0,
'_stripe');
690 }
catch (\
Stripe\Error\RateLimit $e) {
693 $errormessage =
"ErrorRateLimit ".$e->getMessage();
694 dol_syslog($errormessage, LOG_WARNING, 0,
'_stripe');
697 }
catch (\
Stripe\Error\InvalidRequest $e) {
700 $errormessage =
"ErrorInvalidRequest ".$e->getMessage();
701 dol_syslog($errormessage, LOG_WARNING, 0,
'_stripe');
704 }
catch (\
Stripe\Error\Authentication $e) {
708 $errormessage =
"ErrorAuthentication ".$e->getMessage();
709 dol_syslog($errormessage, LOG_WARNING, 0,
'_stripe');
712 }
catch (\
Stripe\Error\ApiConnection $e) {
715 $errormessage =
"ErrorApiConnection ".$e->getMessage();
716 dol_syslog($errormessage, LOG_WARNING, 0,
'_stripe');
719 }
catch (\
Stripe\Error\Base $e) {
723 $errormessage =
"ErrorBase ".$e->getMessage();
724 dol_syslog($errormessage, LOG_WARNING, 0,
'_stripe');
730 $errormessage =
"ErrorException ".$e->getMessage();
731 dol_syslog($errormessage, LOG_WARNING, 0,
'_stripe');
738 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION')) {
739 $service =
'StripeTest';
741 if (!empty($conf->global->STRIPE_LIVE) && !
GETPOST(
'forcesandbox',
'int')) {
742 $service =
'StripeLive';
745 include_once DOL_DOCUMENT_ROOT.
'/stripe/class/stripe.class.php';
746 $stripe =
new Stripe($db);
747 $stripeacc = $stripe->getStripeAccount($service);
751 $paymentintent_id =
GETPOST(
"paymentintent_id",
"alpha");
754 global $stripearrayofkeysbyenv;
755 \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$servicestatus][
'secret_key']);
758 if (empty($stripeacc)) {
759 $paymentintent = \Stripe\PaymentIntent::retrieve($paymentintent_id);
761 $paymentintent = \Stripe\PaymentIntent::retrieve($paymentintent_id, array(
"stripe_account" => $stripeacc));
765 $errormessage =
"CantRetrievePaymentIntent ".$e->getMessage();
766 dol_syslog($errormessage, LOG_WARNING, 0,
'_stripe');
771 if ($paymentintent->status !=
'succeeded') {
773 $errormessage =
"StatusOfRetrievedIntent is not succeeded: ".$paymentintent->status;
774 dol_syslog($errormessage, LOG_WARNING, 0,
'_stripe');
784 if (!empty($paymentintent->currency) && !empty($paymentintent->amount)) {
785 $currency = strtoupper($paymentintent->currency);
786 $amount = $paymentintent->amount;
790 $arrayzerounitcurrency = array(
'BIF',
'CLP',
'DJF',
'GNF',
'JPY',
'KMF',
'KRW',
'MGA',
'PYG',
'RWF',
'VND',
'VUV',
'XAF',
'XOF',
'XPF');
791 if (!in_array($currency, $arrayzerounitcurrency)) {
792 $amount = $amount / 100;
801 $_SESSION[
"onlinetoken"] = $stripeToken;
802 $_SESSION[
"FinalPaymentAmt"] = $amount;
803 $_SESSION[
"currencyCodeType"] = $currency;
804 $_SESSION[
"paymentType"] =
'';
805 $_SESSION[
'ipaddress'] = ($remoteip ? $remoteip :
'unknown');
806 $_SESSION[
'payerID'] = is_object($customer) ? $customer->id :
'';
807 $_SESSION[
'TRANSACTIONID'] = (is_object($charge) ? $charge->id : (is_object($paymentintent) ? $paymentintent->id :
''));
808 $_SESSION[
'errormessage'] = $errormessage;
810 dol_syslog(
"Action charge stripe STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION=".
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION').
" ip=".$remoteip, LOG_DEBUG, 0,
'_stripe');
811 dol_syslog(
"onlinetoken=".$_SESSION[
"onlinetoken"].
" FinalPaymentAmt=".$_SESSION[
"FinalPaymentAmt"].
" currencyCodeType=".$_SESSION[
"currencyCodeType"].
" payerID=".$_SESSION[
'payerID'].
" TRANSACTIONID=".$_SESSION[
'TRANSACTIONID'], LOG_DEBUG, 0,
'_stripe');
812 dol_syslog(
"FULLTAG=".$FULLTAG, LOG_DEBUG, 0,
'_stripe');
813 dol_syslog(
"error=".$error.
" errormessage=".$errormessage, LOG_DEBUG, 0,
'_stripe');
814 dol_syslog(
"Now call the redirect to paymentok or paymentko, URL = ".($error ? $urlko : $urlok), LOG_DEBUG, 0,
'_stripe');
817 header(
"Location: ".$urlko);
820 header(
"Location: ".$urlok);
833 if (!empty($conf->global->ONLINE_PAYMENT_CSS_URL)) {
834 $head =
'<link rel="stylesheet" type="text/css" href="'.$conf->global->ONLINE_PAYMENT_CSS_URL.
'?lang='.(!empty($getpostlang) ? $getpostlang: $langs->defaultlang).
'">'.
"\n";
837 $conf->dol_hide_topmenu = 1;
838 $conf->dol_hide_leftmenu = 1;
840 $replacemainarea = (empty($conf->dol_hide_leftmenu) ?
'<div>' :
'').
'<div>';
841 llxHeader($head, $langs->trans(
"PaymentForm"),
'',
'', 0, 0,
'',
'',
'',
'onlinepaymentbody', $replacemainarea);
844 if ($source && in_array($ref, array(
'member_ref',
'contractline_ref',
'invoice_ref',
'order_ref',
'donation_ref',
''))) {
845 $langs->load(
"errors");
846 dol_print_error_email(
'BADREFINPAYMENTFORM', $langs->trans(
"ErrorBadLinkSourceSetButBadValueForRef", $source, $ref));
855 if ((empty($paymentmethod) || $paymentmethod ==
'paypal') && !empty($conf->paypal->enabled) && (!empty($conf->global->PAYPAL_API_SANDBOX) ||
GETPOST(
'forcesandbox',
'int'))) {
856 dol_htmloutput_mesg($langs->trans(
'YouAreCurrentlyInSandboxMode',
'Paypal'),
'',
'warning');
858 if ((empty($paymentmethod) || $paymentmethod ==
'stripe') && !empty($conf->stripe->enabled) && (empty($conf->global->STRIPE_LIVE) ||
GETPOST(
'forcesandbox',
'int'))) {
859 dol_htmloutput_mesg($langs->trans(
'YouAreCurrentlyInSandboxMode',
'Stripe'),
'',
'warning');
863 print
'<span id="dolpaymentspan"></span>'.
"\n";
864 print
'<div class="center">'.
"\n";
865 print
'<form id="dolpaymentform" class="center" name="paymentform" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">'.
"\n";
866 print
'<input type="hidden" name="token" value="'.newToken().
'">'.
"\n";
867 print
'<input type="hidden" name="action" value="dopayment">'.
"\n";
868 print
'<input type="hidden" name="tag" value="'.GETPOST(
"tag",
'alpha').
'">'.
"\n";
869 print
'<input type="hidden" name="suffix" value="'.dol_escape_htmltag($suffix).
'">'.
"\n";
870 print
'<input type="hidden" name="securekey" value="'.dol_escape_htmltag($SECUREKEY).
'">'.
"\n";
871 print
'<input type="hidden" name="e" value="'.$entity.
'" />';
872 print
'<input type="hidden" name="forcesandbox" value="'.GETPOST(
'forcesandbox',
'int').
'" />';
873 print
'<input type="hidden" name="lang" value="'.$getpostlang.
'">';
879 $logosmall = $mysoc->logo_small;
880 $logo = $mysoc->logo;
881 $paramlogo =
'ONLINE_PAYMENT_LOGO_'.$suffix;
882 if (!empty($conf->global->$paramlogo)) {
883 $logosmall = $conf->global->$paramlogo;
884 } elseif (!empty($conf->global->ONLINE_PAYMENT_LOGO)) {
885 $logosmall = $conf->global->ONLINE_PAYMENT_LOGO;
891 if (!empty($logosmall) && is_readable($conf->mycompany->dir_output.
'/logos/thumbs/'.$logosmall)) {
892 $urllogo = DOL_URL_ROOT.
'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.
'&file='.urlencode(
'logos/thumbs/'.$logosmall);
893 $urllogofull = $dolibarr_main_url_root.
'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.
'&file='.urlencode(
'logos/thumbs/'.$logosmall);
894 } elseif (!empty($logo) && is_readable($conf->mycompany->dir_output.
'/logos/'.$logo)) {
895 $urllogo = DOL_URL_ROOT.
'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.
'&file='.urlencode(
'logos/'.$logo);
896 $urllogofull = $dolibarr_main_url_root.
'/viewimage.php?modulepart=mycompany&entity='.$conf->entity.
'&file='.urlencode(
'logos/'.$logo);
901 print
'<div class="backgreypublicpayment">';
902 print
'<div class="logopublicpayment">';
903 print
'<img id="dolpaymentlogo" src="'.$urllogo.
'"';
906 if (empty($conf->global->MAIN_HIDE_POWERED_BY)) {
907 print
'<div class="poweredbypublicpayment opacitymedium right"><a class="poweredbyhref" href="https://www.dolibarr.org?utm_medium=website&utm_source=poweredby" target="dolibarr" rel="noopener">'.$langs->trans(
"PoweredBy").
'<br><img class="poweredbyimg" src="'.DOL_URL_ROOT.
'/theme/dolibarr_logo.svg" width="80px"></a></div>';
911 if (!empty($conf->global->MAIN_IMAGE_PUBLIC_PAYMENT)) {
912 print
'<div class="backimagepublicpayment">';
913 print
'<img id="idMAIN_IMAGE_PUBLIC_PAYMENT" src="'.$conf->global->MAIN_IMAGE_PUBLIC_PAYMENT.
'">';
920 print
'<!-- Form to send a payment -->'.
"\n";
921 print
'<!-- creditor = '.dol_escape_htmltag($creditor).
' -->'.
"\n";
923 if (!empty($conf->paypal->enabled)) {
924 print
'<!-- PAYPAL_API_SANDBOX = '.$conf->global->PAYPAL_API_SANDBOX.
' -->'.
"\n";
925 print
'<!-- PAYPAL_API_INTEGRAL_OR_PAYPALONLY = '.$conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY.
' -->'.
"\n";
927 if (!empty($conf->paybox->enabled)) {
928 print
'<!-- PAYBOX_CGI_URL = '.$conf->global->PAYBOX_CGI_URL_V2.
' -->'.
"\n";
930 if (!empty($conf->stripe->enabled)) {
931 print
'<!-- STRIPE_LIVE = '.$conf->global->STRIPE_LIVE.
' -->'.
"\n";
933 print
'<!-- urlok = '.$urlok.
' -->'.
"\n";
934 print
'<!-- urlko = '.$urlko.
' -->'.
"\n";
938 print
'<table id="dolpublictable" summary="Payment form" class="center">'.
"\n";
942 if (!empty($conf->global->PAYMENT_NEWFORM_TEXT)) {
943 $langs->load(
"members");
944 if (preg_match(
'/^\((.*)\)$/', $conf->global->PAYMENT_NEWFORM_TEXT, $reg)) {
945 $text .= $langs->trans($reg[1]).
"<br>\n";
947 $text .= $conf->global->PAYMENT_NEWFORM_TEXT.
"<br>\n";
949 $text =
'<tr><td align="center"><br>'.$text.
'<br></td></tr>'.
"\n";
952 $text .=
'<tr><td class="textpublicpayment"><br><strong>'.$langs->trans(
"WelcomeOnPaymentPage").
'</strong></td></tr>'.
"\n";
953 $text .=
'<tr><td class="textpublicpayment">'.$langs->trans(
"ThisScreenAllowsYouToPay", $creditor).
'<br><br></td></tr>'.
"\n";
958 print
'<tr><td align="center">';
959 print
'<table with="100%" id="tablepublicpayment">';
960 print
'<tr><td align="left" colspan="2" class="opacitymedium">'.$langs->trans(
"ThisIsInformationOnPayment").
' :</td></tr>'.
"\n";
971 $tag =
GETPOST(
"tag",
'alpha');
972 if (
GETPOST(
'fulltag',
'alpha')) {
973 $fulltag =
GETPOST(
'fulltag',
'alpha');
975 $fulltag =
"TAG=".$tag;
979 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Creditor");
980 print
'</td><td class="CTableRow2">';
981 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
982 print
'<b>'.$creditor.
'</b>';
983 print
'<input type="hidden" name="creditor" value="'.$creditor.
'">';
984 print
'</td></tr>'.
"\n";
987 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Amount");
988 if (empty($amount)) {
989 print
' ('.$langs->trans(
"ToComplete").
')';
991 print
'</td><td class="CTableRow2">';
992 if (empty($amount) || !is_numeric($amount)) {
993 print
'<input type="hidden" name="amount" value="'.price2num(
GETPOST(
"amount",
'alpha'),
'MT').
'">';
994 print
'<input class="flat maxwidth75" type="text" name="newamount" value="'.price2num(
GETPOST(
"newamount",
"alpha"),
'MT').
'">';
996 print
' <b>'.$langs->trans(
"Currency".$currency).
'</b>';
998 print
'<b class="amount">'.price($amount, 1, $langs, 1, -1, -1, $currency).
'</b>';
999 print
'<input type="hidden" name="amount" value="'.$amount.
'">';
1000 print
'<input type="hidden" name="newamount" value="'.$amount.
'">';
1002 print
'<input type="hidden" name="currency" value="'.$currency.
'">';
1003 print
'</td></tr>'.
"\n";
1006 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"PaymentCode");
1007 print
'</td><td class="CTableRow2"><b style="word-break: break-all;">'.$fulltag.
'</b>';
1008 print
'<input type="hidden" name="tag" value="'.$tag.
'">';
1009 print
'<input type="hidden" name="fulltag" value="'.$fulltag.
'">';
1010 print
'</td></tr>'.
"\n";
1018 if ($source ==
'order') {
1020 $langs->load(
"orders");
1022 require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
1025 $result = $order->fetch(
'', $ref);
1027 $mesg = $order->error;
1030 $result = $order->fetch_thirdparty($order->socid);
1034 if ($action !=
'dopayment') {
1035 $amount = $order->total_ttc;
1036 if (
GETPOST(
"amount",
'alpha')) {
1037 $amount =
GETPOST(
"amount",
'alpha');
1042 if (
GETPOST(
'fulltag',
'alpha')) {
1043 $fulltag =
GETPOST(
'fulltag',
'alpha');
1045 $fulltag =
'ORD='.$order->id.
'.CUS='.$order->thirdparty->id;
1047 $tag = $TAG; $fulltag .=
'.TAG='.$TAG;
1053 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Creditor");
1054 print
'</td><td class="CTableRow2">';
1055 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1056 print
'<b>'.$creditor.
'</b>';
1057 print
'<input type="hidden" name="creditor" value="'.$creditor.
'">';
1058 print
'</td></tr>'.
"\n";
1061 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"ThirdParty");
1062 print
'</td><td class="CTableRow2">';
1063 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1064 print
'<b>'.$order->thirdparty->name.
'</b>';
1065 print
'</td></tr>'.
"\n";
1068 $text =
'<b>'.$langs->trans(
"PaymentOrderRef", $order->ref).
'</b>';
1069 if (
GETPOST(
'desc',
'alpha')) {
1070 $text =
'<b>'.$langs->trans(
GETPOST(
'desc',
'alpha')).
'</b>';
1072 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Designation");
1073 print
'</td><td class="CTableRow2">'.$text;
1074 print
'<input type="hidden" name="s" value="'.dol_escape_htmltag($source).
'">';
1075 print
'<input type="hidden" name="ref" value="'.dol_escape_htmltag($order->ref).
'">';
1076 print
'<input type="hidden" name="dol_id" value="'.dol_escape_htmltag($order->id).
'">';
1077 $directdownloadlink = $order->getLastMainDocLink(
'commande');
1078 if ($directdownloadlink) {
1079 print
'<br><a href="'.$directdownloadlink.
'" rel="nofollow noopener">';
1080 print
img_mime($order->last_main_doc,
'');
1081 print $langs->trans(
"DownloadDocument").
'</a>';
1083 print
'</td></tr>'.
"\n";
1086 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Amount");
1087 if (empty($amount)) {
1088 print
' ('.$langs->trans(
"ToComplete").
')';
1090 print
'</td><td class="CTableRow2">';
1091 if (empty($amount) || !is_numeric($amount)) {
1092 print
'<input type="hidden" name="amount" value="'.price2num(
GETPOST(
"amount",
'alpha'),
'MT').
'">';
1093 print
'<input class="flat maxwidth75" type="text" name="newamount" value="'.price2num(
GETPOST(
"newamount",
"alpha"),
'MT').
'">';
1095 print
' <b>'.$langs->trans(
"Currency".$currency).
'</b>';
1097 print
'<b class="amount">'.price($amount, 1, $langs, 1, -1, -1, $currency).
'</b>';
1098 print
'<input type="hidden" name="amount" value="'.$amount.
'">';
1099 print
'<input type="hidden" name="newamount" value="'.$amount.
'">';
1101 print
'<input type="hidden" name="currency" value="'.$currency.
'">';
1102 print
'</td></tr>'.
"\n";
1105 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"PaymentCode");
1106 print
'</td><td class="CTableRow2"><b style="word-break: break-all;">'.$fulltag.
'</b>';
1107 print
'<input type="hidden" name="tag" value="'.dol_escape_htmltag($tag).
'">';
1108 print
'<input type="hidden" name="fulltag" value="'.dol_escape_htmltag($fulltag).
'">';
1109 print
'</td></tr>'.
"\n";
1112 $shipToName = $order->thirdparty->name;
1113 $shipToStreet = $order->thirdparty->address;
1114 $shipToCity = $order->thirdparty->town;
1115 $shipToState = $order->thirdparty->state_code;
1116 $shipToCountryCode = $order->thirdparty->country_code;
1117 $shipToZip = $order->thirdparty->zip;
1118 $shipToStreet2 =
'';
1119 $phoneNum = $order->thirdparty->phone;
1120 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
1121 print
'<input type="hidden" name="shipToName" value="'.dol_escape_htmltag($shipToName).
'">'.
"\n";
1122 print
'<input type="hidden" name="shipToStreet" value="'.dol_escape_htmltag($shipToStreet).
'">'.
"\n";
1123 print
'<input type="hidden" name="shipToCity" value="'.dol_escape_htmltag($shipToCity).
'">'.
"\n";
1124 print
'<input type="hidden" name="shipToState" value="'.dol_escape_htmltag($shipToState).
'">'.
"\n";
1125 print
'<input type="hidden" name="shipToCountryCode" value="'.dol_escape_htmltag($shipToCountryCode).
'">'.
"\n";
1126 print
'<input type="hidden" name="shipToZip" value="'.dol_escape_htmltag($shipToZip).
'">'.
"\n";
1127 print
'<input type="hidden" name="shipToStreet2" value="'.dol_escape_htmltag($shipToStreet2).
'">'.
"\n";
1128 print
'<input type="hidden" name="phoneNum" value="'.dol_escape_htmltag($phoneNum).
'">'.
"\n";
1130 print
'<!-- Shipping address not complete, so we don t use it -->'.
"\n";
1132 if (is_object($order->thirdparty)) {
1133 print
'<input type="hidden" name="thirdparty_id" value="'.$order->thirdparty->id.
'">'.
"\n";
1135 print
'<input type="hidden" name="email" value="'.$order->thirdparty->email.
'">'.
"\n";
1136 print
'<input type="hidden" name="vatnumber" value="'.dol_escape_htmltag($order->thirdparty->tva_intra).
'">'.
"\n";
1137 $labeldesc = $langs->trans(
"Order").
' '.$order->ref;
1138 if (
GETPOST(
'desc',
'alpha')) {
1139 $labeldesc =
GETPOST(
'desc',
'alpha');
1141 print
'<input type="hidden" name="desc" value="'.dol_escape_htmltag($labeldesc).
'">'.
"\n";
1146 if ($source ==
'invoice') {
1148 $langs->load(
"bills");
1150 require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
1153 $result = $invoice->fetch(
'', $ref);
1155 $mesg = $invoice->error;
1158 $result = $invoice->fetch_thirdparty($invoice->socid);
1162 if ($action !=
'dopayment') {
1163 $amount =
price2num($invoice->total_ttc - ($invoice->getSommePaiement() + $invoice->getSumCreditNotesUsed() + $invoice->getSumDepositsUsed()));
1164 if (
GETPOST(
"amount",
'alpha')) {
1165 $amount =
GETPOST(
"amount",
'alpha');
1170 if (
GETPOST(
'fulltag',
'alpha')) {
1171 $fulltag =
GETPOST(
'fulltag',
'alpha');
1173 $fulltag =
'INV='.$invoice->id.
'.CUS='.$invoice->thirdparty->id;
1175 $tag = $TAG; $fulltag .=
'.TAG='.$TAG;
1181 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Creditor");
1182 print
'</td><td class="CTableRow2">';
1183 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1184 print
'<b>'.$creditor.
'</b>';
1185 print
'<input type="hidden" name="creditor" value="'.dol_escape_htmltag($creditor).
'">';
1186 print
'</td></tr>'.
"\n";
1189 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"ThirdParty");
1190 print
'</td><td class="CTableRow2">';
1191 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1192 print
'<b>'.$invoice->thirdparty->name.
'</b>';
1193 print
'</td></tr>'.
"\n";
1196 $text =
'<b>'.$langs->trans(
"PaymentInvoiceRef", $invoice->ref).
'</b>';
1197 if (
GETPOST(
'desc',
'alpha')) {
1198 $text =
'<b>'.$langs->trans(
GETPOST(
'desc',
'alpha')).
'</b>';
1200 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Designation");
1201 print
'</td><td class="CTableRow2">'.$text;
1202 print
'<input type="hidden" name="s" value="'.dol_escape_htmltag($source).
'">';
1203 print
'<input type="hidden" name="ref" value="'.dol_escape_htmltag($invoice->ref).
'">';
1204 print
'<input type="hidden" name="dol_id" value="'.dol_escape_htmltag($invoice->id).
'">';
1205 $directdownloadlink = $invoice->getLastMainDocLink(
'facture');
1206 if ($directdownloadlink) {
1207 print
'<br><a href="'.$directdownloadlink.
'">';
1208 print
img_mime($invoice->last_main_doc,
'');
1209 print $langs->trans(
"DownloadDocument").
'</a>';
1211 print
'</td></tr>'.
"\n";
1214 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"PaymentAmount");
1215 if (empty($amount) && empty($object->paye)) {
1216 print
' ('.$langs->trans(
"ToComplete").
')';
1218 print
'</td><td class="CTableRow2">';
1219 if ($object->type == $object::TYPE_CREDIT_NOTE) {
1220 print
'<b>'.$langs->trans(
"CreditNote").
'</b>';
1221 } elseif (empty($object->paye)) {
1222 if (empty($amount) || !is_numeric($amount)) {
1223 print
'<input type="hidden" name="amount" value="'.price2num(
GETPOST(
"amount",
'alpha'),
'MT').
'">';
1224 print
'<input class="flat maxwidth75" type="text" name="newamount" value="'.price2num(
GETPOST(
"newamount",
"alpha"),
'MT').
'">';
1225 print
' <b>'.$langs->trans(
"Currency".$currency).
'</b>';
1227 print
'<b class="amount">'.price($amount, 1, $langs, 1, -1, -1, $currency).
'</b>';
1228 print
'<input type="hidden" name="amount" value="'.$amount.
'">';
1229 print
'<input type="hidden" name="newamount" value="'.$amount.
'">';
1232 print
'<b class="amount">'.price($object->total_ttc, 1, $langs, 1, -1, -1, $currency).
'</b>';
1234 print
'<input type="hidden" name="currency" value="'.$currency.
'">';
1235 print
'</td></tr>'.
"\n";
1238 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"PaymentCode");
1239 print
'</td><td class="CTableRow2"><b style="word-break: break-all;">'.$fulltag.
'</b>';
1240 print
'<input type="hidden" name="tag" value="'.$tag.
'">';
1241 print
'<input type="hidden" name="fulltag" value="'.$fulltag.
'">';
1242 print
'</td></tr>'.
"\n";
1245 $shipToName = $invoice->thirdparty->name;
1246 $shipToStreet = $invoice->thirdparty->address;
1247 $shipToCity = $invoice->thirdparty->town;
1248 $shipToState = $invoice->thirdparty->state_code;
1249 $shipToCountryCode = $invoice->thirdparty->country_code;
1250 $shipToZip = $invoice->thirdparty->zip;
1251 $shipToStreet2 =
'';
1252 $phoneNum = $invoice->thirdparty->phone;
1253 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
1254 print
'<input type="hidden" name="shipToName" value="'.$shipToName.
'">'.
"\n";
1255 print
'<input type="hidden" name="shipToStreet" value="'.$shipToStreet.
'">'.
"\n";
1256 print
'<input type="hidden" name="shipToCity" value="'.$shipToCity.
'">'.
"\n";
1257 print
'<input type="hidden" name="shipToState" value="'.$shipToState.
'">'.
"\n";
1258 print
'<input type="hidden" name="shipToCountryCode" value="'.$shipToCountryCode.
'">'.
"\n";
1259 print
'<input type="hidden" name="shipToZip" value="'.$shipToZip.
'">'.
"\n";
1260 print
'<input type="hidden" name="shipToStreet2" value="'.$shipToStreet2.
'">'.
"\n";
1261 print
'<input type="hidden" name="phoneNum" value="'.$phoneNum.
'">'.
"\n";
1263 print
'<!-- Shipping address not complete, so we don t use it -->'.
"\n";
1265 if (is_object($invoice->thirdparty)) {
1266 print
'<input type="hidden" name="thirdparty_id" value="'.$invoice->thirdparty->id.
'">'.
"\n";
1268 print
'<input type="hidden" name="email" value="'.$invoice->thirdparty->email.
'">'.
"\n";
1269 print
'<input type="hidden" name="vatnumber" value="'.$invoice->thirdparty->tva_intra.
'">'.
"\n";
1270 $labeldesc = $langs->trans(
"Invoice").
' '.$invoice->ref;
1271 if (
GETPOST(
'desc',
'alpha')) {
1272 $labeldesc =
GETPOST(
'desc',
'alpha');
1274 print
'<input type="hidden" name="desc" value="'.dol_escape_htmltag($labeldesc).
'">'.
"\n";
1278 if ($source ==
'contractline') {
1280 $langs->load(
"contracts");
1282 require_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
1287 $result = $contractline->fetch(
'', $ref);
1289 $mesg = $contractline->error;
1292 if ($contractline->fk_contrat > 0) {
1293 $result = $contract->fetch($contractline->fk_contrat);
1295 $result = $contract->fetch_thirdparty($contract->socid);
1297 $mesg = $contract->error;
1301 $mesg =
'ErrorRecordNotFound';
1305 $object = $contractline;
1307 if ($action !=
'dopayment') {
1308 $amount = $contractline->total_ttc;
1310 if ($contractline->fk_product && !empty($conf->global->PAYMENT_USE_NEW_PRICE_FOR_CONTRACTLINES)) {
1312 $result = $product->fetch($contractline->fk_product);
1315 if (!empty($conf->global->PRODUIT_MULTIPRICES)) {
1316 $pu_ht = $product->multiprices[$contract->thirdparty->price_level];
1317 $pu_ttc = $product->multiprices_ttc[$contract->thirdparty->price_level];
1318 $price_base_type = $product->multiprices_base_type[$contract->thirdparty->price_level];
1320 $pu_ht = $product->price;
1321 $pu_ttc = $product->price_ttc;
1322 $price_base_type = $product->price_base_type;
1326 if (empty($amount)) {
1332 if (
GETPOST(
"amount",
'alpha')) {
1333 $amount =
GETPOST(
"amount",
'alpha');
1338 if (
GETPOST(
'fulltag',
'alpha')) {
1339 $fulltag =
GETPOST(
'fulltag',
'alpha');
1341 $fulltag =
'COL='.$contractline->id.
'.CON='.$contract->id.
'.CUS='.$contract->thirdparty->id.
'.DAT='.
dol_print_date(
dol_now(),
'%Y%m%d%H%M%S');
1343 $tag = $TAG; $fulltag .=
'.TAG='.$TAG;
1354 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Creditor");
1355 print
'</td><td class="CTableRow2"><b>'.$creditor.
'</b>';
1356 print
'<input type="hidden" name="creditor" value="'.$creditor.
'">';
1357 print
'</td></tr>'.
"\n";
1360 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"ThirdParty");
1361 print
'</td><td class="CTableRow2"><b>'.$contract->thirdparty->name.
'</b>';
1362 print
'</td></tr>'.
"\n";
1365 $text =
'<b>'.$langs->trans(
"PaymentRenewContractId", $contract->ref, $contractline->ref).
'</b>';
1366 if ($contractline->fk_product > 0) {
1367 $contractline->fetch_product();
1368 $text .=
'<br>'.$contractline->product->ref.($contractline->product->label ?
' - '.$contractline->product->label :
'');
1370 if ($contractline->description) {
1371 $text .=
'<br>'.dol_htmlentitiesbr($contractline->description);
1377 if ($contractline->date_end) {
1378 $text .=
'<br>'.$langs->trans(
"ExpiredSince").
': '.
dol_print_date($contractline->date_end);
1380 if (
GETPOST(
'desc',
'alpha')) {
1381 $text =
'<b>'.$langs->trans(
GETPOST(
'desc',
'alpha')).
'</b>';
1383 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Designation");
1384 print
'</td><td class="CTableRow2">'.$text;
1385 print
'<input type="hidden" name="source" value="'.dol_escape_htmltag($source).
'">';
1386 print
'<input type="hidden" name="ref" value="'.dol_escape_htmltag($contractline->ref).
'">';
1387 print
'<input type="hidden" name="dol_id" value="'.dol_escape_htmltag($contractline->id).
'">';
1388 $directdownloadlink = $contract->getLastMainDocLink(
'contract');
1389 if ($directdownloadlink) {
1390 print
'<br><a href="'.$directdownloadlink.
'">';
1391 print
img_mime($contract->last_main_doc,
'');
1392 print $langs->trans(
"DownloadDocument").
'</a>';
1394 print
'</td></tr>'.
"\n";
1397 $label = $langs->trans(
"Quantity");
1400 if ($contractline->fk_product) {
1401 if ($contractline->product->isService() && $contractline->product->duration_value > 0) {
1402 $label = $langs->trans(
"Duration");
1405 if ($contractline->product->duration_value > 1) {
1406 $dur = array(
"h"=>$langs->trans(
"Hours"),
"d"=>$langs->trans(
"DurationDays"),
"w"=>$langs->trans(
"DurationWeeks"),
"m"=>$langs->trans(
"DurationMonths"),
"y"=>$langs->trans(
"DurationYears"));
1408 $dur = array(
"h"=>$langs->trans(
"Hour"),
"d"=>$langs->trans(
"DurationDay"),
"w"=>$langs->trans(
"DurationWeek"),
"m"=>$langs->trans(
"DurationMonth"),
"y"=>$langs->trans(
"DurationYear"));
1410 $duration = $contractline->product->duration_value.
' '.$dur[$contractline->product->duration_unit];
1413 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$label.
'</td>';
1414 print
'<td class="CTableRow2"><b>'.($duration ? $duration : $qty).
'</b>';
1415 print
'<input type="hidden" name="newqty" value="'.dol_escape_htmltag($qty).
'">';
1416 print
'</b></td></tr>'.
"\n";
1419 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Amount");
1420 if (empty($amount)) {
1421 print
' ('.$langs->trans(
"ToComplete").
')';
1423 print
'</td><td class="CTableRow2">';
1424 if (empty($amount) || !is_numeric($amount)) {
1425 print
'<input type="hidden" name="amount" value="'.price2num(
GETPOST(
"amount",
'alpha'),
'MT').
'">';
1426 print
'<input class="flat maxwidth75" type="text" name="newamount" value="'.price2num(
GETPOST(
"newamount",
"alpha"),
'MT').
'">';
1428 print
' <b>'.$langs->trans(
"Currency".$currency).
'</b>';
1430 print
'<b class="amount">'.price($amount, 1, $langs, 1, -1, -1, $currency).
'</b>';
1431 print
'<input type="hidden" name="amount" value="'.$amount.
'">';
1432 print
'<input type="hidden" name="newamount" value="'.$amount.
'">';
1434 print
'<input type="hidden" name="currency" value="'.$currency.
'">';
1435 print
'</td></tr>'.
"\n";
1438 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"PaymentCode");
1439 print
'</td><td class="CTableRow2"><b style="word-break: break-all;">'.$fulltag.
'</b>';
1440 print
'<input type="hidden" name="tag" value="'.$tag.
'">';
1441 print
'<input type="hidden" name="fulltag" value="'.$fulltag.
'">';
1442 print
'</td></tr>'.
"\n";
1445 $shipToName = $contract->thirdparty->name;
1446 $shipToStreet = $contract->thirdparty->address;
1447 $shipToCity = $contract->thirdparty->town;
1448 $shipToState = $contract->thirdparty->state_code;
1449 $shipToCountryCode = $contract->thirdparty->country_code;
1450 $shipToZip = $contract->thirdparty->zip;
1451 $shipToStreet2 =
'';
1452 $phoneNum = $contract->thirdparty->phone;
1453 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
1454 print
'<input type="hidden" name="shipToName" value="'.$shipToName.
'">'.
"\n";
1455 print
'<input type="hidden" name="shipToStreet" value="'.$shipToStreet.
'">'.
"\n";
1456 print
'<input type="hidden" name="shipToCity" value="'.$shipToCity.
'">'.
"\n";
1457 print
'<input type="hidden" name="shipToState" value="'.$shipToState.
'">'.
"\n";
1458 print
'<input type="hidden" name="shipToCountryCode" value="'.$shipToCountryCode.
'">'.
"\n";
1459 print
'<input type="hidden" name="shipToZip" value="'.$shipToZip.
'">'.
"\n";
1460 print
'<input type="hidden" name="shipToStreet2" value="'.$shipToStreet2.
'">'.
"\n";
1461 print
'<input type="hidden" name="phoneNum" value="'.$phoneNum.
'">'.
"\n";
1463 print
'<!-- Shipping address not complete, so we don t use it -->'.
"\n";
1465 if (is_object($contract->thirdparty)) {
1466 print
'<input type="hidden" name="thirdparty_id" value="'.$contract->thirdparty->id.
'">'.
"\n";
1468 print
'<input type="hidden" name="email" value="'.$contract->thirdparty->email.
'">'.
"\n";
1469 print
'<input type="hidden" name="vatnumber" value="'.$contract->thirdparty->tva_intra.
'">'.
"\n";
1470 $labeldesc = $langs->trans(
"Contract").
' '.$contract->ref;
1471 if (
GETPOST(
'desc',
'alpha')) {
1472 $labeldesc =
GETPOST(
'desc',
'alpha');
1474 print
'<input type="hidden" name="desc" value="'.dol_escape_htmltag($labeldesc).
'">'.
"\n";
1478 if ($source ==
'member' || $source ==
'membersubscription') {
1479 $newsource =
'member';
1482 $langs->load(
"members");
1484 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent.class.php';
1485 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent_type.class.php';
1486 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/subscription.class.php';
1491 $result = $member->fetch(
'', $ref);
1493 $mesg = $member->error;
1496 $member->fetch_thirdparty();
1499 $adht->fetch($member->typeid);
1503 if ($action !=
'dopayment') {
1504 $amount = $subscription->total_ttc;
1505 if (
GETPOST(
"amount",
'alpha')) {
1506 $amount =
GETPOST(
"amount",
'alpha');
1509 if (empty($amount)) {
1510 $amount = $adht->amount;
1516 if (
GETPOST(
'fulltag',
'alpha')) {
1517 $fulltag =
GETPOST(
'fulltag',
'alpha');
1521 $tag = $TAG; $fulltag .=
'.TAG='.$TAG;
1527 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Creditor");
1528 print
'</td><td class="CTableRow2"><b>'.$creditor.
'</b>';
1529 print
'<input type="hidden" name="creditor" value="'.$creditor.
'">';
1530 print
'</td></tr>'.
"\n";
1533 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Member");
1534 print
'</td><td class="CTableRow2">';
1536 if ($member->morphy ==
'mor' && !empty($member->company)) {
1537 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1538 print $member->company;
1540 print
img_picto(
'',
'member',
'class="pictofixedwidth"');
1541 print $member->getFullName($langs);
1544 print
'</td></tr>'.
"\n";
1547 $text =
'<b>'.$langs->trans(
"PaymentSubscription").
'</b>';
1548 if (
GETPOST(
'desc',
'alpha')) {
1549 $text =
'<b>'.$langs->trans(
GETPOST(
'desc',
'alpha')).
'</b>';
1551 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Designation");
1552 print
'</td><td class="CTableRow2">'.$text;
1553 print
'<input type="hidden" name="source" value="'.dol_escape_htmltag($newsource).
'">';
1554 print
'<input type="hidden" name="ref" value="'.dol_escape_htmltag($member->ref).
'">';
1555 print
'</td></tr>'.
"\n";
1557 if ($object->datefin > 0) {
1558 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"DateEndSubscription");
1559 print
'</td><td class="CTableRow2">'.dol_print_date($member->datefin,
'day');
1560 print
'</td></tr>'.
"\n";
1563 if ($member->last_subscription_date || $member->last_subscription_amount) {
1566 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"LastSubscriptionDate");
1567 print
'</td><td class="CTableRow2">'.dol_print_date($member->last_subscription_date,
'day');
1568 print
'</td></tr>'.
"\n";
1572 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"LastSubscriptionAmount");
1573 print
'</td><td class="CTableRow2">'.price($member->last_subscription_amount);
1574 print
'</td></tr>'.
"\n";
1576 if (empty($amount) && !
GETPOST(
'newamount',
'alpha')) {
1577 $_GET[
'newamount'] = $member->last_subscription_amount;
1581 if ($member->type) {
1582 $oldtypeid = $member->typeid;
1585 if (!empty($conf->global->MEMBER_ALLOW_CHANGE_OF_TYPE)) {
1586 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent_type.class.php';
1589 $amountbytype = $adht->amountByType(1);
1592 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"LastMemberType");
1593 print
'</td><td class="CTableRow2">'.dol_escape_htmltag($member->type);
1594 print
"</td></tr>\n";
1597 $member->typeid = $newtypeid;
1598 $member->type =
dol_getIdFromCode($db, $newtypeid,
'adherent_type',
'rowid',
'libelle');
1603 $amount = (!empty($amountbytype[$member->typeid])) ? $amountbytype[$member->typeid] : $member->last_subscription_amount;
1605 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"NewSubscription");
1606 print
'</td><td class="CTableRow2">';
1607 print
$form->selectarray(
"typeid", $adht->liste_array(1), $member->typeid, 0, 0, 0,
'onchange="window.location.replace(\''.$urlwithroot.
'/public/payment/newpayment.php?source='.urlencode($source).
'&ref='.urlencode($ref).
'&amount='.urlencode($amount).
'&typeid=\' + this.value + \'&securekey='.urlencode($SECUREKEY).
'\');
"', 0, 0, 0, '', '', 1);
1608 print "</td></tr>\n
";
1609 } elseif ($action == dopayment) {
1610 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("NewMemberType
");
1611 print '</td><td class="CTableRow2
">'.dol_escape_htmltag($member->type);
1612 print '<input type="hidden
" name="membertypeid
" value="'.$member->typeid.'">';
1613 print "</td></tr>\n
";
1616 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("MemberType
");
1617 print '</td><td class="CTableRow2
">'.dol_escape_htmltag($member->type);
1618 print "</td></tr>\n
";
1623 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Amount
");
1624 if (empty($amount)) {
1625 if (empty($conf->global->MEMBER_NEWFORM_AMOUNT)) {
1626 print ' ('.$langs->trans("ToComplete
");
1628 if (!empty($conf->global->MEMBER_EXT_URL_SUBSCRIPTION_INFO)) {
1629 print ' - <a href="'.$conf->global->MEMBER_EXT_URL_SUBSCRIPTION_INFO.'" rel="external
" target="_blank
" rel="noopener noreferrer
">'.$langs->trans("SeeHere
").'</a>';
1631 if (empty($conf->global->MEMBER_NEWFORM_AMOUNT)) {
1635 print '</td><td class="CTableRow2
">';
1637 if (empty($amount) || !is_numeric($amount)) {
1638 $valtoshow = price2num(GETPOST("newamount
", 'alpha'), 'MT');
1639 // force default subscription amount to value defined into constant...
1640 if (empty($valtoshow)) {
1641 if (!empty($conf->global->MEMBER_NEWFORM_EDITAMOUNT)) {
1642 if (!empty($conf->global->MEMBER_NEWFORM_AMOUNT)) {
1643 $valtoshow = $conf->global->MEMBER_NEWFORM_AMOUNT;
1646 if (!empty($conf->global->MEMBER_NEWFORM_AMOUNT)) {
1647 $amount = $conf->global->MEMBER_NEWFORM_AMOUNT;
1652 if (empty($amount) || !is_numeric($amount)) {
1653 //$valtoshow=price2num(GETPOST("newamount
",'alpha'),'MT');
1654 if (!empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) {
1655 $valtoshow = max($conf->global->MEMBER_MIN_AMOUNT, $valtoshow);
1657 print '<input type="hidden
" name="amount
" value="'.price2num(GETPOST("amount", 'alpha
'), 'MT
').'">';
1658 if (empty($conf->global->MEMBER_NEWFORM_EDITAMOUNT)) {
1659 print '<input class="flat maxwidth75
" type="text
" name="newamountbis
" value="'.$valtoshow.'" disabled="disabled
">';
1660 print '<input type="hidden
" name="newamount
" value="'.$valtoshow.'">';
1662 print '<input class="flat maxwidth75
" type="text
" name="newamount
" value="'.$valtoshow.'">';
1664 print ' <b>'.$langs->trans("Currency
".$currency).'</b>';
1666 $valtoshow = $amount;
1667 if (!empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) {
1668 $valtoshow = max($conf->global->MEMBER_MIN_AMOUNT, $valtoshow);
1669 $amount = $valtoshow;
1671 print '<b class="amount
">'.price($valtoshow, 1, $langs, 1, -1, -1, $currency).'</b>'; // Price with currency
1672 print '<input type="hidden
" name="amount
" value="'.$valtoshow.'">';
1673 print '<input type="hidden
" name="newamount
" value="'.$valtoshow.'">';
1675 print '<input type="hidden
" name="currency
" value="'.$currency.'">';
1676 print '</td></tr>'."\n
";
1679 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("PaymentCode
");
1680 print '</td><td class="CTableRow2
"><b style="word-
break:
break-all;
">'.$fulltag.'</b>';
1681 print '<input type="hidden
" name="tag
" value="'.$tag.'">';
1682 print '<input type="hidden
" name="fulltag
" value="'.$fulltag.'">';
1683 print '</td></tr>'."\n
";
1686 $shipToName = $member->getFullName($langs);
1687 $shipToStreet = $member->address;
1688 $shipToCity = $member->town;
1689 $shipToState = $member->state_code;
1690 $shipToCountryCode = $member->country_code;
1691 $shipToZip = $member->zip;
1692 $shipToStreet2 = '';
1693 $phoneNum = $member->phone;
1694 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
1695 print '<!-- Shipping address information -->';
1696 print '<input type="hidden
" name="shipToName
" value="'.$shipToName.'">'."\n
";
1697 print '<input type="hidden
" name="shipToStreet
" value="'.$shipToStreet.'">'."\n
";
1698 print '<input type="hidden
" name="shipToCity
" value="'.$shipToCity.'">'."\n
";
1699 print '<input type="hidden
" name="shipToState
" value="'.$shipToState.'">'."\n
";
1700 print '<input type="hidden
" name="shipToCountryCode
" value="'.$shipToCountryCode.'">'."\n
";
1701 print '<input type="hidden
" name="shipToZip
" value="'.$shipToZip.'">'."\n
";
1702 print '<input type="hidden
" name="shipToStreet2
" value="'.$shipToStreet2.'">'."\n
";
1703 print '<input type="hidden
" name="phoneNum
" value="'.$phoneNum.'">'."\n
";
1705 print '<!-- Shipping address not complete, so we don t use it -->'."\n
";
1707 if (is_object($member->thirdparty)) {
1708 print '<input type="hidden
" name="thirdparty_id
" value="'.$member->thirdparty->id.'">'."\n
";
1710 print '<input type="hidden
" name="email
" value="'.$member->email.'">'."\n
";
1711 $labeldesc = $langs->trans("PaymentSubscription
");
1712 if (GETPOST('desc', 'alpha')) {
1713 $labeldesc = GETPOST('desc', 'alpha');
1715 print '<input type="hidden
" name="desc
" value="'.dol_escape_htmltag($labeldesc).'">'."\n
";
1718 // Payment on donation
1719 if ($source == 'donation') {
1721 $langs->load("don
");
1723 require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php';
1725 $don = new Don($db);
1726 $result = $don->fetch($ref);
1728 $mesg = $don->error;
1731 $don->fetch_thirdparty();
1735 if ($action != 'dopayment') { // Do not change amount if we just click on first dopayment
1736 if (GETPOST("amount
", 'alpha')) {
1737 $amount = GETPOST("amount
", 'alpha');
1739 $amount = $don->getRemainToPay();
1741 $amount = price2num($amount);
1744 if (GETPOST('fulltag', 'alpha')) {
1745 $fulltag = GETPOST('fulltag', 'alpha');
1747 $fulltag = 'DON='.$don->ref.'.DAT='.dol_print_date(dol_now(), '%Y%m%d%H%M%S');
1749 $tag = $TAG; $fulltag .= '.TAG='.$TAG;
1752 $fulltag = dol_string_unaccent($fulltag);
1755 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Creditor
");
1756 print '</td><td class="CTableRow2
"><b>'.$creditor.'</b>';
1757 print '<input type="hidden
" name="creditor
" value="'.$creditor.'">';
1758 print '</td></tr>'."\n
";
1761 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("ThirdParty
");
1762 print '</td><td class="CTableRow2
"><b>';
1763 if ($don->morphy == 'mor' && !empty($don->societe)) {
1764 print $don->societe;
1766 print $don->getFullName($langs);
1769 print '</td></tr>'."\n
";
1773 if (GETPOST('desc', 'alpha')) {
1774 $text = '<b>'.$langs->trans(GETPOST('desc', 'alpha')).'</b>';
1776 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Designation
");
1777 print '</td><td class="CTableRow2
">'.$text;
1778 print '<input type="hidden
" name="source
" value="'.dol_escape_htmltag($source).'">';
1779 print '<input type="hidden
" name="ref" value="'.dol_escape_htmltag($don->ref).'">';
1780 print '</td></tr>'."\n
";
1783 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Amount
");
1784 if (empty($amount)) {
1785 if (empty($conf->global->MEMBER_NEWFORM_AMOUNT)) {
1786 print ' ('.$langs->trans("ToComplete
");
1788 if (!empty($conf->global->MEMBER_EXT_URL_SUBSCRIPTION_INFO)) {
1789 print ' - <a href="'.$conf->global->MEMBER_EXT_URL_SUBSCRIPTION_INFO.'" rel="external
" target="_blank
" rel="noopener noreferrer
">'.$langs->trans("SeeHere
").'</a>';
1791 if (empty($conf->global->MEMBER_NEWFORM_AMOUNT)) {
1795 print '</td><td class="CTableRow2
">';
1797 if (empty($amount) || !is_numeric($amount)) {
1798 $valtoshow = price2num(GETPOST("newamount
", 'alpha'), 'MT');
1799 // force default subscription amount to value defined into constant...
1800 if (empty($valtoshow)) {
1801 if (!empty($conf->global->MEMBER_NEWFORM_EDITAMOUNT)) {
1802 if (!empty($conf->global->MEMBER_NEWFORM_AMOUNT)) {
1803 $valtoshow = $conf->global->MEMBER_NEWFORM_AMOUNT;
1806 if (!empty($conf->global->MEMBER_NEWFORM_AMOUNT)) {
1807 $amount = $conf->global->MEMBER_NEWFORM_AMOUNT;
1812 if (empty($amount) || !is_numeric($amount)) {
1813 //$valtoshow=price2num(GETPOST("newamount
",'alpha'),'MT');
1814 if (!empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) {
1815 $valtoshow = max($conf->global->MEMBER_MIN_AMOUNT, $valtoshow);
1817 print '<input type="hidden
" name="amount
" value="'.price2num(GETPOST("amount", 'alpha
'), 'MT
').'">';
1818 print '<input class="flat maxwidth75
" type="text
" name="newamount
" value="'.$valtoshow.'">';
1820 print ' <b>'.$langs->trans("Currency
".$currency).'</b>';
1822 $valtoshow = $amount;
1823 if (!empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) {
1824 $valtoshow = max($conf->global->MEMBER_MIN_AMOUNT, $valtoshow);
1825 $amount = $valtoshow;
1827 print '<b class="amount
">'.price($valtoshow, 1, $langs, 1, -1, -1, $currency).'</b>'; // Price with currency
1828 print '<input type="hidden
" name="amount
" value="'.$valtoshow.'">';
1829 print '<input type="hidden
" name="newamount
" value="'.$valtoshow.'">';
1831 print '<input type="hidden
" name="currency
" value="'.$currency.'">';
1832 print '</td></tr>'."\n
";
1835 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("PaymentCode
");
1836 print '</td><td class="CTableRow2
"><b style="word-
break:
break-all;
">'.$fulltag.'</b>';
1837 print '<input type="hidden
" name="tag
" value="'.$tag.'">';
1838 print '<input type="hidden
" name="fulltag
" value="'.$fulltag.'">';
1839 print '</td></tr>'."\n
";
1842 $shipToName = $don->getFullName($langs);
1843 $shipToStreet = $don->address;
1844 $shipToCity = $don->town;
1845 $shipToState = $don->state_code;
1846 $shipToCountryCode = $don->country_code;
1847 $shipToZip = $don->zip;
1848 $shipToStreet2 = '';
1849 $phoneNum = $don->phone;
1850 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
1851 print '<!-- Shipping address information -->';
1852 print '<input type="hidden
" name="shipToName
" value="'.$shipToName.'">'."\n
";
1853 print '<input type="hidden
" name="shipToStreet
" value="'.$shipToStreet.'">'."\n
";
1854 print '<input type="hidden
" name="shipToCity
" value="'.$shipToCity.'">'."\n
";
1855 print '<input type="hidden
" name="shipToState
" value="'.$shipToState.'">'."\n
";
1856 print '<input type="hidden
" name="shipToCountryCode
" value="'.$shipToCountryCode.'">'."\n
";
1857 print '<input type="hidden
" name="shipToZip
" value="'.$shipToZip.'">'."\n
";
1858 print '<input type="hidden
" name="shipToStreet2
" value="'.$shipToStreet2.'">'."\n
";
1859 print '<input type="hidden
" name="phoneNum
" value="'.$phoneNum.'">'."\n
";
1861 print '<!-- Shipping address not complete, so we don t use it -->'."\n
";
1863 if (is_object($don->thirdparty)) {
1864 print '<input type="hidden
" name="thirdparty_id
" value="'.$don->thirdparty->id.'">'."\n
";
1866 print '<input type="hidden
" name="email
" value="'.$don->email.'">'."\n
";
1867 $labeldesc = $langs->trans("PaymentSubscription
");
1868 if (GETPOST('desc', 'alpha')) {
1869 $labeldesc = GETPOST('desc', 'alpha');
1871 print '<input type="hidden
" name="desc
" value="'.dol_escape_htmltag($labeldesc).'">'."\n
";
1874 if ($source == 'organizedeventregistration') {
1876 $langs->loadLangs(array("members
", "eventorganization
"));
1878 if (GETPOST('fulltag', 'alpha')) {
1879 $fulltag = GETPOST('fulltag', 'alpha');
1881 $fulltag = 'ATT='.$attendee->id.'.DAT='.dol_print_date(dol_now(), '%Y%m%d%H%M%S');
1883 $tag = $TAG; $fulltag .= '.TAG='.$TAG;
1886 $fulltag = dol_string_unaccent($fulltag);
1889 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Creditor
");
1890 print '</td><td class="CTableRow2
"><b>'.$creditor.'</b>';
1891 print '<input type="hidden
" name="creditor
" value="'.$creditor.'">';
1892 print '</td></tr>'."\n
";
1895 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Attendee
");
1896 print '</td><td class="CTableRow2
"><b>';
1897 print $attendee->email;
1898 print ($thirdparty->name ? ' ('.$thirdparty->name.')' : '');
1900 print '</td></tr>'."\n
";
1902 if (! is_object($attendee->project)) {
1903 $text = 'ErrorProjectNotFound';
1905 $text = $langs->trans("PaymentEvent
").' - '.$attendee->project->title;
1909 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Designation
");
1910 print '</td><td class="CTableRow2
"><b>'.$text.'</b>';
1911 print '<input type="hidden
" name="source
" value="'.dol_escape_htmltag($source).'">';
1912 print '<input type="hidden
" name="ref" value="'.dol_escape_htmltag($invoice->id).'">';
1913 print '</td></tr>'."\n
";
1916 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Amount
");
1917 print '</td><td class="CTableRow2
">';
1918 $valtoshow = $amount;
1919 print '<b class="amount
">'.price($valtoshow, 1, $langs, 1, -1, -1, $currency).'</b>'; // Price with currency
1920 print '<input type="hidden
" name="amount
" value="'.$valtoshow.'">';
1921 print '<input type="hidden
" name="newamount
" value="'.$valtoshow.'">';
1922 print '<input type="hidden
" name="currency
" value="'.$currency.'">';
1923 print '</td></tr>'."\n
";
1926 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("PaymentCode
");
1927 print '</td><td class="CTableRow2
"><b style="word-
break:
break-all;
">'.$fulltag.'</b>';
1928 print '<input type="hidden
" name="tag
" value="'.$tag.'">';
1929 print '<input type="hidden
" name="fulltag
" value="'.$fulltag.'">';
1930 print '</td></tr>'."\n
";
1933 $shipToName = $thirdparty->getFullName($langs);
1934 $shipToStreet = $thirdparty->address;
1935 $shipToCity = $thirdparty->town;
1936 $shipToState = $thirdparty->state_code;
1937 $shipToCountryCode = $thirdparty->country_code;
1938 $shipToZip = $thirdparty->zip;
1939 $shipToStreet2 = '';
1940 $phoneNum = $thirdparty->phone;
1941 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
1942 print '<!-- Shipping address information -->';
1943 print '<input type="hidden
" name="shipToName
" value="'.$shipToName.'">'."\n
";
1944 print '<input type="hidden
" name="shipToStreet
" value="'.$shipToStreet.'">'."\n
";
1945 print '<input type="hidden
" name="shipToCity
" value="'.$shipToCity.'">'."\n
";
1946 print '<input type="hidden
" name="shipToState
" value="'.$shipToState.'">'."\n
";
1947 print '<input type="hidden
" name="shipToCountryCode
" value="'.$shipToCountryCode.'">'."\n
";
1948 print '<input type="hidden
" name="shipToZip
" value="'.$shipToZip.'">'."\n
";
1949 print '<input type="hidden
" name="shipToStreet2
" value="'.$shipToStreet2.'">'."\n
";
1950 print '<input type="hidden
" name="phoneNum
" value="'.$phoneNum.'">'."\n
";
1952 print '<!-- Shipping address not complete, so we don t use it -->'."\n
";
1954 print '<input type="hidden
" name="thirdparty_id
" value="'.$thirdparty->id.'">'."\n
";
1955 print '<input type="hidden
" name="email
" value="'.$thirdparty->email.'">'."\n
";
1956 $labeldesc = $langs->trans("PaymentSubscription
");
1957 if (GETPOST('desc', 'alpha')) {
1958 $labeldesc = GETPOST('desc', 'alpha');
1960 print '<input type="hidden
" name="desc
" value="'.dol_escape_htmltag($labeldesc).'">'."\n
";
1963 if ($source == 'boothlocation') {
1965 $langs->load("members
");
1967 if (GETPOST('fulltag', 'alpha')) {
1968 $fulltag = GETPOST('fulltag', 'alpha');
1970 $fulltag = 'BOO='.GETPOST("booth
").'.DAT='.dol_print_date(dol_now(), '%Y%m%d%H%M%S');
1972 $tag = $TAG; $fulltag .= '.TAG='.$TAG;
1975 $fulltag = dol_string_unaccent($fulltag);
1978 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Creditor
");
1979 print '</td><td class="CTableRow2
"><b>'.$creditor.'</b>';
1980 print '<input type="hidden
" name="creditor
" value="'.$creditor.'">';
1981 print '</td></tr>'."\n
";
1984 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Attendee
");
1985 print '</td><td class="CTableRow2
"><b>';
1986 print $thirdparty->name;
1988 print '</td></tr>'."\n
";
1991 $text = '<b>'.$langs->trans("PaymentBoothLocation
").'</b>';
1992 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Designation
");
1993 print '</td><td class="CTableRow2
">'.$text;
1994 print '<input type="hidden
" name="source
" value="'.dol_escape_htmltag($source).'">';
1995 print '<input type="hidden
" name="ref" value="'.dol_escape_htmltag($invoice->id).'">';
1996 print '</td></tr>'."\n
";
1999 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Amount
");
2000 print '</td><td class="CTableRow2
">';
2001 $valtoshow = $amount;
2002 print '<b class="amount
">'.price($valtoshow, 1, $langs, 1, -1, -1, $currency).'</b>'; // Price with currency
2003 print '<input type="hidden
" name="amount
" value="'.$valtoshow.'">';
2004 print '<input type="hidden
" name="newamount
" value="'.$valtoshow.'">';
2005 print '<input type="hidden
" name="currency
" value="'.$currency.'">';
2006 print '</td></tr>'."\n
";
2009 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("PaymentCode
");
2010 print '</td><td class="CTableRow2
"><b style="word-
break:
break-all;
">'.$fulltag.'</b>';
2011 print '<input type="hidden
" name="tag
" value="'.$tag.'">';
2012 print '<input type="hidden
" name="fulltag
" value="'.$fulltag.'">';
2013 print '</td></tr>'."\n
";
2016 $shipToName = $thirdparty->getFullName($langs);
2017 $shipToStreet = $thirdparty->address;
2018 $shipToCity = $thirdparty->town;
2019 $shipToState = $thirdparty->state_code;
2020 $shipToCountryCode = $thirdparty->country_code;
2021 $shipToZip = $thirdparty->zip;
2022 $shipToStreet2 = '';
2023 $phoneNum = $thirdparty->phone;
2024 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
2025 print '<!-- Shipping address information -->';
2026 print '<input type="hidden
" name="shipToName
" value="'.$shipToName.'">'."\n
";
2027 print '<input type="hidden
" name="shipToStreet
" value="'.$shipToStreet.'">'."\n
";
2028 print '<input type="hidden
" name="shipToCity
" value="'.$shipToCity.'">'."\n
";
2029 print '<input type="hidden
" name="shipToState
" value="'.$shipToState.'">'."\n
";
2030 print '<input type="hidden
" name="shipToCountryCode
" value="'.$shipToCountryCode.'">'."\n
";
2031 print '<input type="hidden
" name="shipToZip
" value="'.$shipToZip.'">'."\n
";
2032 print '<input type="hidden
" name="shipToStreet2
" value="'.$shipToStreet2.'">'."\n
";
2033 print '<input type="hidden
" name="phoneNum
" value="'.$phoneNum.'">'."\n
";
2035 print '<!-- Shipping address not complete, so we don t use it -->'."\n
";
2037 print '<input type="hidden
" name="thirdparty_id
" value="'.$thirdparty->id.'">'."\n
";
2038 print '<input type="hidden
" name="email
" value="'.$thirdparty->email.'">'."\n
";
2039 $labeldesc = $langs->trans("PaymentSubscription
");
2040 if (GETPOST('desc', 'alpha')) {
2041 $labeldesc = GETPOST('desc', 'alpha');
2043 print '<input type="hidden
" name="desc
" value="'.dol_escape_htmltag($labeldesc).'">'."\n
";
2046 if (!$found && !$mesg) {
2047 $mesg = $langs->trans("ErrorBadParameters
");
2051 print '<tr><td align="center
" colspan="2
"><br><div class="warning
">'.dol_escape_htmltag($mesg, 1, 1, 'br').'</div></td></tr>'."\n
";
2054 print '</table>'."\n
";
2058 // Show all payment mode buttons (Stripe, Paypal, ...)
2059 if ($action != 'dopayment') {
2060 if ($found && !$error) { // We are in a management option and no error
2061 // Check status of the object (Invoice) to verify if it is paid by external payment modules (ie Payzen, ...)
2063 'source' => $source,
2066 $reshook = $hookmanager->executeHooks('doCheckStatus', $parameters, $object, $action);
2068 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
2069 } elseif ($reshook > 0) {
2070 print $hookmanager->resPrint;
2073 if ($source == 'order' && $object->billed) {
2074 print '<br><br><span class="amountpaymentcomplete size15x
">'.$langs->trans("OrderBilled
").'</span>';
2075 } elseif ($source == 'invoice' && $object->paye) {
2076 print '<br><br><span class="amountpaymentcomplete size15x
">'.$langs->trans("InvoicePaid
").'</span>';
2077 } elseif ($source == 'donation' && $object->paid) {
2078 print '<br><br><span class="amountpaymentcomplete size15x
">'.$langs->trans("DonationPaid
").'</span>';
2080 // Membership can be paid and we still allow to make renewal
2081 if (($source == 'member' || $source == 'membersubscription') && $object->datefin > dol_now()) {
2082 $langs->load("members
");
2083 print '<br><span class="amountpaymentcomplete size15x
">'.$langs->trans("MembershipPaid
", dol_print_date($object->datefin, 'day')).'</span><br>';
2084 print '<div class="opacitymedium margintoponly
">'.$langs->trans("PaymentWillBeRecordedForNextPeriod
").'</div>';
2087 // Buttons for all payments registration methods
2089 // This hook is used to add Button to newpayment.php for external payment modules (ie Payzen, ...)
2091 'paymentmethod' => $paymentmethod
2093 $reshook = $hookmanager->executeHooks('doAddButton', $parameters, $object, $action);
2095 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
2096 } elseif ($reshook > 0) {
2097 print $hookmanager->resPrint;
2100 if ((empty($paymentmethod) || $paymentmethod == 'paybox') && !empty($conf->paybox->enabled)) {
2101 print '<div class="button buttonpayment
" id="div_dopayment_paybox
"><span class="fa fa-credit-card
"></span> <input class="" type="submit
" id="dopayment_paybox
" name="dopayment_paybox
" value="'.$langs->trans("PayBoxDoPayment").'">';
2103 print '<span class="buttonpaymentsmall
">'.$langs->trans("CreditOrDebitCard
").'</span>';
2106 $( document ).ready(function() {
2107 $("#div_dopayment_paybox
").click(function(){
2108 $("#dopayment_paybox
").click();
2110 $("#dopayment_paybox
").click(function(e){
2111 $("#div_dopayment_paybox
").css( \'cursor\', \'wait\' );
2112 e.stopPropagation();
2119 if ((empty($paymentmethod) || $paymentmethod == 'stripe') && !empty($conf->stripe->enabled)) {
2120 print '<div class="button buttonpayment
" id="div_dopayment_stripe
"><span class="fa fa-credit-card
"></span> <input class="" type="submit
" id="dopayment_stripe
" name="dopayment_stripe
" value="'.$langs->trans("StripeDoPayment").'">';
2121 print '<input type="hidden
" name="noidempotency
" value="'.GETPOST('noidempotency
', 'int').'">';
2123 print '<span class="buttonpaymentsmall
">'.$langs->trans("CreditOrDebitCard
").'</span>';
2126 $( document ).ready(function() {
2127 $("#div_dopayment_stripe
").click(function(){
2128 $("#dopayment_stripe
").click();
2130 $("#dopayment_stripe
").click(function(e){
2131 $("#div_dopayment_stripe
").css( \'cursor\', \'wait\' );
2132 e.stopPropagation();
2140 if ((empty($paymentmethod) || $paymentmethod == 'paypal') && !empty($conf->paypal->enabled)) {
2141 if (empty($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY)) {
2142 $conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY = 'integral';
2145 print '<div class="button buttonpayment
" id="div_dopayment_paypal
">';
2146 if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY != 'integral') {
2147 print '<div style="line-height: 1em
"> </div>';
2149 print '<span class="fa fa-paypal
"></span> <input class="" type="submit
" id="dopayment_paypal
" name="dopayment_paypal
" value="'.$langs->trans("PaypalDoPayment").'">';
2150 if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'integral') {
2152 print '<span class="buttonpaymentsmall
">'.$langs->trans("CreditOrDebitCard
").'</span><span class="buttonpaymentsmall
"> - </span>';
2153 print '<span class="buttonpaymentsmall
">'.$langs->trans("PayPalBalance
").'</span>';
2155 if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'paypalonly') {
2157 //print '<span class="buttonpaymentsmall
">'.$langs->trans("PayPalBalance
").'"></span>
';
2161 $( document ).ready(
function() {
2162 $(
"#div_dopayment_paypal").click(
function(){
2163 $(
"#dopayment_paypal").click();
2165 $(
"#dopayment_paypal").click(
function(e){
2166 $(
"#div_dopayment_paypal").css( \
'cursor\', \'wait\' );
2167 e.stopPropagation();
2182 print
'</td></tr>'.
"\n";
2184 print
'</table>'.
"\n";
2186 print
'</form>'.
"\n";
2187 print
'</div>'.
"\n";
2194 if (preg_match(
'/^dopayment/', $action)) {
2197 $_SESSION[
"currencyCodeType"] = $currency;
2198 $_SESSION[
"FinalPaymentAmt"] = $amount;
2199 $_SESSION[
'ipaddress'] = ($remoteip ? $remoteip :
'unknown');
2200 $_SESSION[
"paymentType"] =
'';
2203 if (
GETPOST(
'dopayment_stripe',
'alpha')) {
2211 background-color: white;
2214 border: 1px solid transparent;
2215 box-shadow: 0 1px 3px 0 #e6ebf1;
2216 -webkit-transition: box-shadow 150ms ease;
2217 transition: box-shadow 150ms ease;
2220 .StripeElement--focus {
2221 box-shadow: 0 1px 3px 0 #cfd7df;
2224 .StripeElement--invalid {
2225 border-color: #fa755a;
2228 .StripeElement--webkit-autofill {
2229 background-color: #fefde5 !important;
2235 print
'<!-- Form payment-form STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION = '.$conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION.
' STRIPE_USE_NEW_CHECKOUT = '.$conf->global->STRIPE_USE_NEW_CHECKOUT.
' -->'.
"\n";
2236 print
'<form action="'.$_SERVER[
'REQUEST_URI'].
'" method="POST" id="payment-form">'.
"\n";
2238 print
'<input type="hidden" name="token" value="'.newToken().
'">'.
"\n";
2239 print
'<input type="hidden" name="dopayment_stripe" value="1">'.
"\n";
2240 print
'<input type="hidden" name="action" value="charge">'.
"\n";
2241 print
'<input type="hidden" name="tag" value="'.$TAG.
'">'.
"\n";
2242 print
'<input type="hidden" name="s" value="'.$source.
'">'.
"\n";
2243 print
'<input type="hidden" name="ref" value="'.$REF.
'">'.
"\n";
2244 print
'<input type="hidden" name="fulltag" value="'.$FULLTAG.
'">'.
"\n";
2245 print
'<input type="hidden" name="suffix" value="'.$suffix.
'">'.
"\n";
2246 print
'<input type="hidden" name="securekey" value="'.$SECUREKEY.
'">'.
"\n";
2247 print
'<input type="hidden" name="e" value="'.$entity.
'" />';
2248 print
'<input type="hidden" name="amount" value="'.$amount.
'">'.
"\n";
2249 print
'<input type="hidden" name="currency" value="'.$currency.
'">'.
"\n";
2250 print
'<input type="hidden" name="forcesandbox" value="'.GETPOST(
'forcesandbox',
'int').
'" />';
2251 print
'<input type="hidden" name="email" value="'.GETPOST(
'email',
'alpha').
'" />';
2252 print
'<input type="hidden" name="thirdparty_id" value="'.GETPOST(
'thirdparty_id',
'int').
'" />';
2253 print
'<input type="hidden" name="lang" value="'.$getpostlang.
'">';
2255 if (!empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION) || !empty($conf->global->STRIPE_USE_NEW_CHECKOUT)) {
2256 require_once DOL_DOCUMENT_ROOT.
'/stripe/class/stripe.class.php';
2258 $service =
'StripeLive';
2260 if (empty($conf->global->STRIPE_LIVE) ||
GETPOST(
'forcesandbox',
'alpha')) {
2261 $service =
'StripeTest';
2265 $stripe =
new Stripe($db);
2266 $stripeacc = $stripe->getStripeAccount($service);
2268 if (is_object($object) && is_object($object->thirdparty)) {
2269 $stripecu = $stripe->customerStripe($object->thirdparty, $stripeacc, $servicestatus, 1);
2272 if (!empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) {
2273 $noidempotency_key = (
GETPOSTISSET(
'noidempotency') ?
GETPOST(
'noidempotency',
'int') : 0);
2274 $paymentintent = $stripe->getPaymentIntent($amount, $currency, $tag,
'Stripe payment: '.$fulltag.(is_object($object) ?
' ref='.$object->ref :
''), $object, $stripecu, $stripeacc, $servicestatus, 0,
'automatic',
false,
null, 0, $noidempotency_key);
2277 if ($stripe->error) {
2290 <table id="dolpaymenttable" summary="Payment form" class="center centpercent">
2291 <tbody><tr><td class="textpublicpayment">';
2293 if (!empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) {
2294 print
'<div id="payment-request-button"><!-- A Stripe Element will be inserted here. --></div>';
2297 print
'<div class="form-row '.(getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 2 ?
'center' :
'left').
'">';
2298 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 1) {
2299 print
'<label for="card-element">'.$langs->trans(
"CreditOrDebitCard").
'</label>';
2300 print
'<br><input id="cardholder-name" class="marginbottomonly" name="cardholder-name" value="" type="text" placeholder="'.$langs->trans(
"CardOwner").
'" autocomplete="off" autofocus required>';
2303 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 1) {
2304 print
'<div id="card-element">
2305 <!-- a Stripe Element will be inserted here. -->
2308 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 2) {
2309 print
'<div id="payment-element">
2310 <!-- a Stripe Element will be inserted here. -->
2314 print
'<!-- Used to display form errors -->
2315 <div id="card-errors" role="alert"></div>
2319 print
'<button class="button buttonpayment" style="text-align: center; padding-left: 0; padding-right: 0;" id="buttontopay" data-secret="'.(is_object($paymentintent) ? $paymentintent->client_secret :
'').
'">'.$langs->trans(
"ValidatePayment").
'</button>';
2320 print
'<img id="hourglasstopay" class="hidden" src="'.DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/img/working.gif">';
2322 print
'</td></tr></tbody>';
2326 if (!empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) {
2327 if (empty($paymentintent)) {
2328 print
'<center>'.$langs->trans(
"Error").
'</center>';
2330 print
'<input type="hidden" name="paymentintent_id" value="'.$paymentintent->id.
'">';
2335 print
'</form>'.
"\n";
2339 if (empty($stripearrayofkeys[
'publishable_key'])) {
2340 $langs->load(
"errors");
2341 print
info_admin($langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"Stripe")), 0, 0,
'error');
2343 print
'<!-- JS Code for Stripe components -->';
2344 print
'<script src="https://js.stripe.com/v3/"></script>'.
"\n";
2345 print
'<!-- urllogofull = '.$urllogofull.
' -->'.
"\n";
2348 print
'<script type="text/javascript">'.
"\n";
2350 if (!empty($conf->global->STRIPE_USE_NEW_CHECKOUT)) {
2351 $amountstripe = $amount;
2355 $arrayzerounitcurrency = array(
'BIF',
'CLP',
'DJF',
'GNF',
'JPY',
'KMF',
'KRW',
'MGA',
'PYG',
'RWF',
'VND',
'VUV',
'XAF',
'XOF',
'XPF');
2356 if (!in_array($currency, $arrayzerounitcurrency)) {
2357 $amountstripe = $amountstripe * 100;
2361 $metadata = array(
'dol_version'=>DOL_VERSION,
'dol_entity'=>$conf->entity,
'ipaddress'=>$ipaddress);
2362 if (is_object($object)) {
2363 $metadata[
'dol_type'] = $object->element;
2364 $metadata[
'dol_id'] = $object->id;
2366 $ref = $object->ref;
2370 $arrayforpaymentintent = array(
2371 'description'=>
'Stripe payment: '.$FULLTAG.($ref ?
' ref='.$ref :
''),
2372 "metadata" => $metadata
2375 $arrayforpaymentintent[
"statement_descriptor"] =
dol_trunc($TAG, 10,
'right',
'UTF-8', 1);
2378 $arrayforcheckout = array(
2379 'payment_method_types' => array(
'card'),
2380 'line_items' => array(array(
2381 'name' => $langs->transnoentitiesnoconv(
"Payment").
' '.$TAG,
2382 'description' =>
'Stripe payment: '.$FULLTAG.($ref ?
' ref='.$ref :
''),
2383 'amount' => $amountstripe,
2384 'currency' => $currency,
2388 'client_reference_id' => $FULLTAG,
2389 'success_url' => $urlok,
2390 'cancel_url' => $urlko,
2391 'payment_intent_data' => $arrayforpaymentintent
2394 $arrayforcheckout[
'customer'] = $stripecu;
2396 $arrayforcheckout[
'customer_email'] =
GETPOST(
'email',
'alpha');
2398 $sessionstripe = \Stripe\Checkout\Session::create($arrayforcheckout);
2403 $_SESSION[
"currencyCodeType"] = $currency;
2404 $_SESSION[
"paymentType"] =
'';
2405 $_SESSION[
"FinalPaymentAmt"] = $amount;
2406 $_SESSION[
'ipaddress'] = ($remoteip ? $remoteip :
'unknown');
2407 $_SESSION[
'payerID'] = is_object($stripecu) ? $stripecu->id :
'';
2408 $_SESSION[
'TRANSACTIONID'] = $sessionstripe->id;
2410 print $e->getMessage();
2417 if (empty($stripeacc)) {
2419 var stripe =
Stripe(
'<?php echo $stripearrayofkeys['publishable_key
']; // Defined into config.php ?>');
2423 var stripe =
Stripe(
'<?php echo $stripearrayofkeys['publishable_key
']; // Defined into config.php ?>', { stripeAccount:
'<?php echo $stripeacc; ?>' });
2429 var elements = stripe.elements();
2437 fontFamily:
'"Helvetica Neue", Helvetica, sans-serif',
2438 fontSmoothing:
'antialiased',
2446 iconColor:
'#fa755a'
2450 var cardElement = elements.create(
'card', {style: style});
2453 stripe.redirectToCheckout({
2457 sessionId:
'<?php print $sessionstripe->id; ?>'
2458 }).then(
function (result) {
2466 } elseif (!empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) {
2472 if (empty($stripeacc)) {
2474 var stripe =
Stripe(
'<?php echo $stripearrayofkeys['publishable_key
']; // Defined into config.php ?>');
2478 var stripe =
Stripe(
'<?php echo $stripearrayofkeys['publishable_key
']; // Defined into config.php ?>', { stripeAccount:
'<?php echo $stripeacc; ?>' });
2484 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 2) {
2486 var cardButton = document.getElementById(
'buttontopay');
2487 var clientSecret = cardButton.dataset.secret;
2488 var options = { clientSecret: clientSecret,};
2491 var elements = stripe.elements(options);
2496 var elements = stripe.elements();
2507 fontFamily:
'"Helvetica Neue", Helvetica, sans-serif',
2508 fontSmoothing:
'antialiased',
2516 iconColor:
'#fa755a'
2521 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 2) {
2523 var paymentElement = elements.create(
"payment");
2526 paymentElement.mount(
"#payment-element");
2529 var cardButton = document.getElementById(
'buttontopay');
2531 cardButton.addEventListener(
'click',
function(event) {
2532 console.log(
"We click on buttontopay");
2533 event.preventDefault();
2536 jQuery(
'#hourglasstopay').show();
2537 jQuery(
'#buttontopay').hide();
2539 stripe.confirmPayment({
2540 elements,confirmParams: {
2541 return_url:
'<?php echo $urlok; ?>',
2542 payment_method_data: {
2545 <?php
if (
GETPOST(
'email',
'alpha') || (is_object($object) && is_object($object->thirdparty) && !empty($object->thirdparty->email))) {
2546 ?>, email:
'<?php echo dol_escape_js(GETPOST('email
', 'alpha
') ? GETPOST('email
', 'alpha
') : $object->thirdparty->email); ?>'<?php
2548 <?php
if (is_object($object) && is_object($object->thirdparty) && !empty($object->thirdparty->phone)) {
2549 ?>, phone:
'<?php echo dol_escape_js($object->thirdparty->phone); ?>'<?php
2551 <?php
if (is_object($object) && is_object($object->thirdparty)) {
2553 city:
'<?php echo dol_escape_js($object->thirdparty->town); ?>',
2554 <?php if ($object->thirdparty->country_code) {
2555 ?>country:
'<?php echo dol_escape_js($object->thirdparty->country_code); ?>',<?php
2557 line1:
'<?php echo dol_escape_js(preg_replace('/\s\s+/
', ' ', $object->thirdparty->address)); ?>',
2558 postal_code:
'<?php echo dol_escape_js($object->thirdparty->zip); ?>'
2563 save_payment_method:<?php
if ($stripecu) {
2570 ).then(
function(result) {
2571 console.log(result);
2573 console.log(
"Error on result of handleCardPayment");
2574 jQuery(
'#buttontopay').show();
2575 jQuery(
'#hourglasstopay').hide();
2577 var errorElement = document.getElementById(
'card-errors');
2578 console.log(result);
2579 errorElement.textContent = result.error.message;
2582 console.log(
"No error on result of handleCardPayment, so we submit the form");
2584 jQuery(
'#buttontopay').hide();
2585 jQuery(
'#hourglasstopay').show();
2587 jQuery(
'#payment-form').submit();
2595 var cardElement = elements.create(
'card', {style: style});
2598 cardElement.mount(
'#card-element');
2601 cardElement.addEventListener(
'change',
function(event) {
2602 var displayError = document.getElementById(
'card-errors');
2604 console.log(
"Show event error (like 'Incorrect card number', ...)");
2605 displayError.textContent =
event.error.message;
2607 console.log(
"Reset error message");
2608 displayError.textContent =
'';
2613 var cardholderName = document.getElementById(
'cardholder-name');
2614 var cardButton = document.getElementById(
'buttontopay');
2615 var clientSecret = cardButton.dataset.secret;
2617 cardButton.addEventListener(
'click',
function(event) {
2618 console.log(
"We click on buttontopay");
2619 event.preventDefault();
2621 if (cardholderName.value ==
'')
2623 console.log(
"Field Card holder is empty");
2624 var displayError = document.getElementById(
'card-errors');
2625 displayError.textContent =
'<?php print dol_escape_js($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CardOwner"))); ?>';
2630 jQuery(
'#hourglasstopay').show();
2631 jQuery(
'#buttontopay').hide();
2633 stripe.handleCardPayment(
2634 clientSecret, cardElement, {
2635 payment_method_data: {
2637 name: cardholderName.value
2638 <?php
if (
GETPOST(
'email',
'alpha') || (is_object($object) && is_object($object->thirdparty) && !empty($object->thirdparty->email))) {
2639 ?>, email:
'<?php echo dol_escape_js(GETPOST('email
', 'alpha
') ? GETPOST('email
', 'alpha
') : $object->thirdparty->email); ?>'<?php
2641 <?php
if (is_object($object) && is_object($object->thirdparty) && !empty($object->thirdparty->phone)) {
2642 ?>, phone:
'<?php echo dol_escape_js($object->thirdparty->phone); ?>'<?php
2644 <?php
if (is_object($object) && is_object($object->thirdparty)) {
2646 city:
'<?php echo dol_escape_js($object->thirdparty->town); ?>',
2647 <?php if ($object->thirdparty->country_code) {
2648 ?>country:
'<?php echo dol_escape_js($object->thirdparty->country_code); ?>',<?php
2650 line1:
'<?php echo dol_escape_js(preg_replace('/\s\s+/
', ' ', $object->thirdparty->address)); ?>',
2651 postal_code:
'<?php echo dol_escape_js($object->thirdparty->zip); ?>'
2656 save_payment_method:<?php
if ($stripecu) {
2662 ).then(
function(result) {
2663 console.log(result);
2665 console.log(
"Error on result of handleCardPayment");
2666 jQuery(
'#buttontopay').show();
2667 jQuery(
'#hourglasstopay').hide();
2669 var errorElement = document.getElementById(
'card-errors');
2670 errorElement.textContent = result.error.message;
2673 console.log(
"No error on result of handleCardPayment, so we submit the form");
2675 jQuery(
'#buttontopay').hide();
2676 jQuery(
'#hourglasstopay').show();
2678 jQuery(
'#payment-form').submit();
2697 'paymentmethod' => $paymentmethod,
2698 'amount' => $amount,
2699 'currency' => $currency,
2700 'tag' =>
GETPOST(
"tag",
'alpha'),
2701 'dopayment' =>
GETPOST(
'dopayment',
'alpha')
2703 $reshook = $hookmanager->executeHooks(
'doPayment', $parameters, $object, $action);
2706 } elseif ($reshook > 0) {
2707 print $hookmanager->resPrint;
2711 htmlPrintOnlinePaymentFooter($mysoc, $langs, 1, $suffix, $object);