41if (!defined(
'NOLOGIN')) {
44if (!defined(
'NOCSRFCHECK')) {
45 define(
"NOCSRFCHECK", 1);
47if (!defined(
'NOIPCHECK')) {
48 define(
'NOIPCHECK',
'1');
50if (!defined(
'NOBROWSERNOTIF')) {
51 define(
'NOBROWSERNOTIF',
'1');
54if (!defined(
'XFRAMEOPTIONS_ALLOWALL')) {
55 define(
'XFRAMEOPTIONS_ALLOWALL',
'1');
61$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))));
62if (is_numeric($entity)) {
63 define(
"DOLENTITY", $entity);
67require
'../../main.inc.php';
68require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
69require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
70require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
71require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
72require_once DOL_DOCUMENT_ROOT.
'/eventorganization/class/conferenceorboothattendee.class.php';
73require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
74require_once DOL_DOCUMENT_ROOT.
'/societe/class/societeaccount.class.php';
75require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
76require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
88$langs->loadLangs(array(
"main",
"other",
"dict",
"bills",
"companies",
"errors",
"paybox",
"paypal",
"stripe"));
92$hookmanager->initHooks(array(
'newpayment'));
98$action =
GETPOST(
'action',
'aZ09');
107$suffix =
GETPOST(
"suffix",
'aZ09');
109if (!
GETPOST(
"currency",
'alpha')) {
110 $currency =
$conf->currency;
112 $currency =
GETPOST(
"currency",
'aZ09');
115$getpostlang =
GETPOST(
'lang',
'aZ09');
120 if (!
GETPOST(
"amount",
'alpha') && !$source) {
121 print $langs->trans(
'ErrorBadParameters').
" - amount or source";
124 if (is_numeric($amount) && !
GETPOST(
"tag",
'alpha') && !$source) {
125 print $langs->trans(
'ErrorBadParameters').
" - tag or source";
128 if ($source && !
GETPOST(
"ref",
'alpha')) {
129 print $langs->trans(
'ErrorBadParameters').
" - ref";
137$paymentintent =
null;
141if ($source ==
'organizedeventregistration') {
148 $resultinvoice = $invoice->fetch($invoiceid);
150 if ($resultinvoice <= 0) {
163 $sql =
"SELECT rowid FROM ".MAIN_DB_PREFIX.
"eventorganization_conferenceorboothattendee";
164 $sql .=
" WHERE fk_invoice = ".((int) $invoiceid);
166 $resql = $db->query($sql);
168 $obj = $db->fetch_object($resql);
170 $attendeeid = $obj->rowid;
174 if ($attendeeid > 0) {
175 $resultattendee = $attendee->fetch($attendeeid);
177 if ($resultattendee <= 0) {
180 $attendee->fetch_projet();
182 $amount =
price2num($invoice->total_ttc);
184 $thirdparty =
new Societe($db);
185 $resultthirdparty = $thirdparty->fetch($invoice->socid);
186 if ($resultthirdparty <= 0) {
193} elseif ($source ==
'boothlocation') {
197 $resultinvoice = $invoice->fetch($invoiceid);
198 if ($resultinvoice <= 0) {
201 $amount =
price2num($invoice->total_ttc);
203 $thirdparty =
new Societe($db);
204 $resultthirdparty = $thirdparty->fetch($invoice->socid);
205 if ($resultthirdparty <= 0) {
213$paymentmethod =
GETPOST(
'paymentmethod',
'alphanohtml') ?
GETPOST(
'paymentmethod',
'alphanohtml') :
'';
214$validpaymentmethod = array();
217foreach ($_POST as $key => $val) {
219 if (preg_match(
'/^dopayment_(.*)$/', $key, $reg)) {
220 $paymentmethod = $reg[1];
226$ref = $REF =
GETPOST(
'ref',
'alpha');
228$FULLTAG =
GETPOST(
"fulltag",
'alpha');
229$SECUREKEY =
GETPOST(
"securekey");
232$PAYPAL_API_SANDBOX =
"";
233$PAYPAL_API_USER =
"";
234$PAYPAL_API_PASSWORD =
"";
235$PAYPAL_API_SIGNATURE =
"";
238if (empty($ws) && preg_match(
'/WS=([^=&]+)/', $FULLTAG, $reg)) {
245$urlwithroot = DOL_MAIN_URL_ROOT;
247$urlok = $urlwithroot.
'/public/payment/paymentok.php?';
248$urlko = $urlwithroot.
'/public/payment/paymentko.php?';
250if ($ws && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
251 include_once DOL_DOCUMENT_ROOT.
'/website/class/website.class.php';
252 $tmpwebsite =
new Website($db);
253 $tmpwebsite->fetch(0, $ws);
254 $urlok = $tmpwebsite->virtualhost.
'/public/payment/paymentok.php?';
255 $urlko = $tmpwebsite->virtualhost.
'/public/payment/paymentko.php?';
258if ($paymentmethod && !preg_match(
'/'.preg_quote(
'PM='.$paymentmethod,
'/').
'/', $FULLTAG)) {
259 $FULLTAG .= ($FULLTAG ?
'.' :
'').
'PM='.$paymentmethod;
262if ($ws && !preg_match(
'/'.preg_quote(
'WS='.$ws,
'/').
'/', $FULLTAG)) {
263 $FULLTAG .= ($FULLTAG ?
'.' :
'').
'WS='.$ws;
266if (!empty($suffix)) {
267 $urlok .=
'suffix='.urlencode($suffix).
'&';
268 $urlko .=
'suffix='.urlencode($suffix).
'&';
271 $urlok .=
's='.urlencode($source).
'&';
272 $urlko .=
's='.urlencode($source).
'&';
275 $urlok .=
'ref='.urlencode($REF).
'&';
276 $urlko .=
'ref='.urlencode($REF).
'&';
279 $urlok .=
'tag='.urlencode($TAG).
'&';
280 $urlko .=
'tag='.urlencode($TAG).
'&';
282if (!empty($FULLTAG)) {
283 $urlok .=
'fulltag='.urlencode($FULLTAG).
'&';
284 $urlko .=
'fulltag='.urlencode($FULLTAG).
'&';
286if (!empty($SECUREKEY)) {
287 $urlok .=
'securekey='.urlencode($SECUREKEY).
'&';
288 $urlko .=
'securekey='.urlencode($SECUREKEY).
'&';
290if (!empty($entity)) {
291 $urlok .=
'e='.urlencode((
string) ($entity)).
'&';
292 $urlko .=
'e='.urlencode((
string) ($entity)).
'&';
294if (!empty($getpostlang)) {
295 $urlok .=
'lang='.urlencode($getpostlang).
'&';
296 $urlko .=
'lang='.urlencode($getpostlang).
'&';
298$urlok = preg_replace(
'/&$/',
'', $urlok);
299$urlko = preg_replace(
'/&$/',
'', $urlko);
306@phan-var-force string $PAYPAL_API_SANDBOX
307@phan-var-force string $PAYPAL_API_OK
308@phan-var-force string $PAYPAL_API_KO
311if ((empty($paymentmethod) || $paymentmethod ==
'paypal') && isModEnabled(
'paypal')) {
312 global $PAYPAL_API_SANDBOX, $PAYPAL_API_OK, $PAYPAL_API_KO, $PAYPAL_API_USER, $PAYPAL_API_PASSWORD, $PAYPAL_API_SIGNATURE;
313 require_once DOL_DOCUMENT_ROOT.
'/paypal/lib/paypal.lib.php';
314 require_once DOL_DOCUMENT_ROOT.
'/paypal/lib/paypalfunctions.lib.php';
320 $PAYPAL_API_OK = $urlok;
324 $PAYPAL_API_KO = $urlko;
326 if (empty($PAYPAL_API_USER)) {
327 print
'Paypal parameter PAYPAL_API_USER is not defined. Please <a href="'.DOL_URL_ROOT.
'/paypal/admin/paypal.php">complete the setup of module PayPal first</a>.';
330 if (empty($PAYPAL_API_PASSWORD)) {
331 print
'Paypal parameter PAYPAL_API_PASSWORD is not defined. Please <a href="'.DOL_URL_ROOT.
'/paypal/admin/paypal.php">complete the setup of module PayPal first</a>.';
334 if (empty($PAYPAL_API_SIGNATURE)) {
335 print
'Paypal parameter PAYPAL_API_SIGNATURE is not defined. Please <a href="'.DOL_URL_ROOT.
'/paypal/admin/paypal.php">complete the setup of module PayPal first</a>.';
342if ((empty($paymentmethod) || $paymentmethod ==
'stripe') && isModEnabled(
'stripe')) {
343 require_once DOL_DOCUMENT_ROOT.
'/stripe/config.php';
348$validpaymentmethod = getValidOnlinePaymentMethods($paymentmethod);
352if ($tmpsource ==
'membersubscription') {
353 $tmpsource =
'member';
359 if ($tmpsource && $REF) {
363 if ($tmpsource != $source) {
377 dol_syslog(
"Warning: PAYMENT_SECURITY_ACCEPT_ANY_TOKEN is on", LOG_WARNING);
378 dol_syslog(
"Warning: PAYMENT_SECURITY_ACCEPT_ANY_TOKEN is on", LOG_WARNING, 0,
'_payment');
383 print
'<div class="error">Bad value for key.</div>';
389if (!empty($paymentmethod) && empty($validpaymentmethod[$paymentmethod])) {
390 print
'Payment module for payment method '.$paymentmethod.
' is not active';
393if (empty($validpaymentmethod)) {
394 print
'No active payment module (Paypal, Stripe, Paybox, ...)';
399$creditor = $mysoc->name;
400$paramcreditor =
'ONLINE_PAYMENT_CREDITOR';
401$paramcreditorlong =
'ONLINE_PAYMENT_CREDITOR_'.$suffix;
416dol_syslog(
"--- newpayment.php action=".$action.
" paymentmethod=".$paymentmethod.
' amount='.$amount.
' newamount='.
GETPOST(
"newamount",
'alpha'), LOG_DEBUG, 0,
'_payment');
418dol_syslog(
"fulltag=".
GETPOST(
"fulltag",
'alpha').
" ws=".$ws.
" urlok=".$urlok, LOG_DEBUG, 0,
'_payment');
421if ($action ==
'dopayment') {
422 if ($paymentmethod ==
'paypal') {
424 $PAYPAL_PAYMENT_TYPE =
'Sale';
427 $origfulltag =
GETPOST(
"fulltag",
'alpha');
428 $shipToName =
GETPOST(
"shipToName",
'alpha');
429 $shipToStreet =
GETPOST(
"shipToStreet",
'alpha');
430 $shipToCity =
GETPOST(
"shipToCity",
'alpha');
431 $shipToState =
GETPOST(
"shipToState",
'alpha');
432 $shipToCountryCode =
GETPOST(
"shipToCountryCode",
'alpha');
433 $shipToZip =
GETPOST(
"shipToZip",
'alpha');
434 $shipToStreet2 =
GETPOST(
"shipToStreet2",
'alpha');
435 $phoneNum =
GETPOST(
"phoneNum",
'alpha');
436 $email =
GETPOST(
"email",
'alpha');
437 $desc =
GETPOST(
"desc",
'alpha');
441 if ($shipToCountryCode ==
'ID' && !preg_match(
'/\-/', $shipToState)) {
442 $shipToState =
'ID-'.$shipToState;
445 if (empty($PAYPAL_API_PRICE) || !is_numeric($PAYPAL_API_PRICE)) {
446 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Amount"));
450 } elseif (!$origfulltag) {
451 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"PaymentCode"));
456 dol_syslog(
"newpayment.php call paypal api and do redirect", LOG_DEBUG);
457 dol_syslog(
"newpayment.php call paypal api and do redirect", LOG_DEBUG, 0,
'_payment');
460 $PAYPAL_API_DEVISE =
"USD";
461 if (!empty($currency)) {
462 $PAYPAL_API_DEVISE = $currency;
467 dol_syslog(
"Submit Paypal form", LOG_DEBUG, 0,
'_payment');
469 dol_syslog(
"PAYPAL_API_USER: $PAYPAL_API_USER", LOG_DEBUG, 0,
'_payment');
470 dol_syslog(
"PAYPAL_API_PASSWORD: ".preg_replace(
'/./',
'*', $PAYPAL_API_PASSWORD), LOG_DEBUG, 0,
'_payment');
471 dol_syslog(
"PAYPAL_API_SIGNATURE: $PAYPAL_API_SIGNATURE", LOG_DEBUG, 0,
'_payment');
472 dol_syslog(
"PAYPAL_API_SANDBOX: $PAYPAL_API_SANDBOX", LOG_DEBUG, 0,
'_payment');
473 dol_syslog(
"PAYPAL_API_OK: $PAYPAL_API_OK", LOG_DEBUG, 0,
'_payment');
474 dol_syslog(
"PAYPAL_API_KO: $PAYPAL_API_KO", LOG_DEBUG, 0,
'_payment');
475 dol_syslog(
"PAYPAL_API_PRICE: $PAYPAL_API_PRICE", LOG_DEBUG, 0,
'_payment');
476 dol_syslog(
"PAYPAL_API_DEVISE: $PAYPAL_API_DEVISE", LOG_DEBUG, 0,
'_payment');
478 dol_syslog(
"shipToName: $shipToName", LOG_DEBUG, 0,
'_payment');
479 dol_syslog(
"shipToStreet: $shipToStreet", LOG_DEBUG, 0,
'_payment');
480 dol_syslog(
"shipToCity: $shipToCity", LOG_DEBUG, 0,
'_payment');
481 dol_syslog(
"shipToState: $shipToState", LOG_DEBUG, 0,
'_payment');
482 dol_syslog(
"shipToCountryCode: $shipToCountryCode", LOG_DEBUG, 0,
'_payment');
483 dol_syslog(
"shipToZip: $shipToZip", LOG_DEBUG, 0,
'_payment');
484 dol_syslog(
"shipToStreet2: $shipToStreet2", LOG_DEBUG, 0,
'_payment');
485 dol_syslog(
"phoneNum: $phoneNum", LOG_DEBUG, 0,
'_payment');
486 dol_syslog(
"email: $email", LOG_DEBUG, 0,
'_payment');
487 dol_syslog(
"desc: $desc", LOG_DEBUG, 0,
'_payment');
489 dol_syslog(
"SCRIPT_URI: ".(empty($_SERVER[
"SCRIPT_URI"]) ?
'' : $_SERVER[
"SCRIPT_URI"]), LOG_DEBUG, 0,
'_payment');
492 $mesg =
print_paypal_redirect($PAYPAL_API_PRICE, $PAYPAL_API_DEVISE, $PAYPAL_PAYMENT_TYPE, $PAYPAL_API_OK, $PAYPAL_API_KO, $FULLTAG);
499 if ($paymentmethod ==
'paybox') {
504 $origfulltag =
GETPOST(
"fulltag",
'alpha');
507 $urlok = preg_replace(
'/securekey=[^&]+&?/',
'', $urlok);
508 $urlko = preg_replace(
'/securekey=[^&]+&?/',
'', $urlko);
510 if (empty($PRICE) || !is_numeric($PRICE)) {
511 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Amount"));
512 } elseif (empty($email)) {
513 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ONLINE_PAYMENT_SENDEMAIL"));
515 $mesg = $langs->trans(
"ErrorBadEMail", $email);
516 } elseif (!$origfulltag) {
517 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"PaymentCode"));
519 $mesg =
'Error urlok too long '.$urlok.
' (Paybox requires 150, found '.strlen($urlok).
')';
521 $mesg =
'Error urlko too long '.$urlko.
' (Paybox requires 150, found '.strlen($urlok).
')';
525 dol_syslog(
"newpayment.php call paybox api and do redirect", LOG_DEBUG, 0,
'_payment');
527 include_once DOL_DOCUMENT_ROOT.
'/paybox/lib/paybox.lib.php';
535 if ($paymentmethod ==
'stripe') {
536 if (
GETPOST(
'newamount',
'alpha')) {
539 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Amount")),
null,
'errors');
549if ($action ==
'charge' && isModEnabled(
'stripe')) {
550 $amountstripe = (float) $amount;
554 $arrayzerounitcurrency = array(
'BIF',
'CLP',
'DJF',
'GNF',
'JPY',
'KMF',
'KRW',
'MGA',
'PYG',
'RWF',
'VND',
'VUV',
'XAF',
'XOF',
'XPF');
555 if (!in_array($currency, $arrayzerounitcurrency)) {
556 $amountstripe *= 100;
559 dol_syslog(
"newpayment.php execute action = ".$action.
" STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION=".
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION'), LOG_DEBUG, 0,
'_payment');
560 dol_syslog(
"GET=".var_export($_GET,
true), LOG_DEBUG, 0,
'_payment');
561 dol_syslog(
"POST=".var_export($_POST,
true), LOG_DEBUG, 0,
'_payment');
563 $stripeToken =
GETPOST(
"stripeToken",
'alpha');
564 $email =
GETPOST(
"email",
'alpha');
568 $vatnumber =
GETPOST(
'vatnumber',
'alpha');
569 $savesource = GETPOSTISSET(
'savesource') ?
GETPOSTINT(
'savesource') : 1;
571 dol_syslog(
"POST stripeToken = ".$stripeToken, LOG_DEBUG, 0,
'_payment');
572 dol_syslog(
"POST email = ".$email, LOG_DEBUG, 0,
'_payment');
573 dol_syslog(
"POST thirdparty_id = ".$thirdparty_id, LOG_DEBUG, 0,
'_payment');
574 dol_syslog(
"POST vatnumber = ".$vatnumber, LOG_DEBUG, 0,
'_payment');
581 if (!
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION')) {
584 'dol_version' => DOL_VERSION,
585 'dol_entity' =>
$conf->entity,
586 'dol_company' => $mysoc->name,
587 'dol_tax_num' => $vatnumber,
591 if (!empty($thirdparty_id)) {
592 $metadata[
"dol_thirdparty_id"] = $thirdparty_id;
595 if ($thirdparty_id > 0) {
596 dol_syslog(
"Search existing Stripe customer profile for thirdparty_id=".$thirdparty_id, LOG_DEBUG, 0,
'_payment');
598 $service =
'StripeTest';
601 $service =
'StripeLive';
605 $thirdparty =
new Societe($db);
606 $thirdparty->fetch($thirdparty_id);
609 include_once DOL_DOCUMENT_ROOT.
'/stripe/class/stripe.class.php';
610 $stripe =
new Stripe($db);
611 $stripeacc = $stripe->getStripeAccount($service);
612 $customer = $stripe->customerStripe($thirdparty, $stripeacc, $servicestatus, 1);
613 if (empty($customer)) {
615 dol_syslog(
'Failed to get/create stripe customer for thirdparty id = '.$thirdparty_id.
' and servicestatus = '.$servicestatus.
': '.$stripe->error, LOG_ERR, 0,
'_payment');
616 setEventMessages(
'Failed to get/create stripe customer for thirdparty id = '.$thirdparty_id.
' and servicestatus = '.$servicestatus.
': '.$stripe->error,
null,
'errors');
623 $card = $customer->sources->create(array(
"source" => $stripeToken,
"metadata" => $metadata));
625 $card = $stripeToken;
630 dol_syslog(
'Failed to create card record', LOG_WARNING, 0,
'_payment');
634 if (!empty($FULLTAG)) {
635 $metadata[
"FULLTAG"] = $FULLTAG;
637 if (!empty($dol_id)) {
638 $metadata[
"dol_id"] = $dol_id;
640 if (!empty($dol_type)) {
641 $metadata[
"dol_type"] = $dol_type;
644 dol_syslog(
"Create charge on card ".$card->id, LOG_DEBUG, 0,
'_payment');
645 $charge = \Stripe\Charge::create(array(
646 'amount' =>
price2num($amountstripe,
'MU'),
647 'currency' => $currency,
649 'description' =>
'Stripe payment: '.$FULLTAG.
' ref='.$ref,
650 'metadata' => $metadata,
651 'customer' => $customer->id,
653 'statement_descriptor_suffix' =>
dol_trunc($FULLTAG, 10,
'right',
'UTF-8', 1),
654 ), array(
"idempotency_key" =>
"$FULLTAG",
"stripe_account" =>
"$stripeacc"));
656 if (empty($charge)) {
658 dol_syslog(
'Failed to charge card', LOG_WARNING, 0,
'_payment');
665 $vatcleaned = $vatnumber ? $vatnumber :
null;
676 dol_syslog(
"Create anonymous customer card profile", LOG_DEBUG, 0,
'_payment');
678 $customer = \Stripe\Customer::create(array(
680 'description' => ($email ?
'Anonymous customer for '.$email :
'Anonymous customer'),
681 'metadata' => $metadata,
682 'source' => $stripeToken
700 if (!empty($FULLTAG)) {
701 $metadata[
"FULLTAG"] = $FULLTAG;
703 if (!empty($dol_id)) {
704 $metadata[
"dol_id"] = $dol_id;
706 if (!empty($dol_type)) {
707 $metadata[
"dol_type"] = $dol_type;
712 dol_syslog(
"Create charge", LOG_DEBUG, 0,
'_payment');
713 $charge = \Stripe\Charge::create(array(
714 'customer' => $customer->id,
715 'amount' =>
price2num($amountstripe,
'MU'),
716 'currency' => $currency,
718 'description' =>
'Stripe payment: '.$FULLTAG.
' ref='.$ref,
719 'metadata' => $metadata,
720 'statement_descriptor' =>
dol_trunc($FULLTAG, 10,
'right',
'UTF-8', 1),
721 ), array(
"idempotency_key" => (
string) $FULLTAG,
"stripe_account" => (
string) $stripeacc));
723 if (empty($charge)) {
725 dol_syslog(
'Failed to charge card', LOG_WARNING, 0,
'_payment');
732 $body = $e->getJsonBody();
733 $err = $body[
'error'];
735 print(
'Status is:'.$e->getHttpStatus().
"\n");
736 print(
'Type is:'.$err[
'type'].
"\n");
737 print(
'Code is:'.$err[
'code'].
"\n");
739 print(
'Param is:'.$err[
'param'].
"\n");
740 print(
'Message is:'.$err[
'message'].
"\n");
743 $errormessage =
"ErrorCard ".$e->getMessage().
" err=".var_export($err,
true);
744 dol_syslog($errormessage, LOG_WARNING, 0,
'_payment');
750 $errormessage =
"ErrorRateLimit ".$e->getMessage();
751 dol_syslog($errormessage, LOG_WARNING, 0,
'_payment');
757 $errormessage =
"ErrorInvalidRequest ".$e->getMessage();
758 dol_syslog($errormessage, LOG_WARNING, 0,
'_payment');
765 $errormessage =
"ErrorAuthentication ".$e->getMessage();
766 dol_syslog($errormessage, LOG_WARNING, 0,
'_payment');
772 $errormessage =
"ErrorApiConnection ".$e->getMessage();
773 dol_syslog($errormessage, LOG_WARNING, 0,
'_payment');
780 $errormessage =
"ErrorBase ".$e->getMessage();
781 dol_syslog($errormessage, LOG_WARNING, 0,
'_payment');
787 $errormessage =
"ErrorException ".$e->getMessage();
788 dol_syslog($errormessage, LOG_WARNING, 0,
'_payment');
795 $_SESSION[
'paymentkosessioncode'] = $randomseckey;
797 $urlko .=
'&paymentkosessioncode='.urlencode($randomseckey);
800 $_SESSION[
'paymentoksessioncode'] = $randomseckey;
802 $urlok .=
'&paymentoksessioncode='.urlencode($randomseckey);
807 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION')) {
808 $service =
'StripeTest';
811 $service =
'StripeLive';
814 include_once DOL_DOCUMENT_ROOT.
'/stripe/class/stripe.class.php';
815 $stripe =
new Stripe($db);
816 $stripeacc = $stripe->getStripeAccount($service);
820 $paymentintent_id =
GETPOST(
"paymentintent_id",
"alpha");
823 global $stripearrayofkeysbyenv;
824 \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$servicestatus][
'secret_key']);
827 if (empty($stripeacc)) {
828 $paymentintent = \Stripe\PaymentIntent::retrieve($paymentintent_id);
830 $paymentintent = \Stripe\PaymentIntent::retrieve($paymentintent_id, array(
"stripe_account" => $stripeacc));
834 $errormessage =
"CantRetrievePaymentIntent ".$e->getMessage();
835 dol_syslog($errormessage, LOG_WARNING, 0,
'_payment');
840 if ($paymentintent->status !=
'succeeded') {
842 $errormessage =
"StatusOfRetrievedIntent is not succeeded: ".$paymentintent->status;
843 dol_syslog($errormessage, LOG_WARNING, 0,
'_payment');
848 $_SESSION[
'paymentkosessioncode'] = $randomseckey;
850 $urlko .=
'&paymentkosessioncode='.urlencode($randomseckey);
858 $amount = $paymentintent->amount;
861 if (!empty($paymentintent->currency)) {
862 $currency = strtoupper($paymentintent->currency);
866 $arrayzerounitcurrency = array(
'BIF',
'CLP',
'DJF',
'GNF',
'JPY',
'KMF',
'KRW',
'MGA',
'PYG',
'RWF',
'VND',
'VUV',
'XAF',
'XOF',
'XPF');
867 if (!in_array($currency, $arrayzerounitcurrency)) {
872 dol_syslog(
"StatusOfRetrievedIntent is succeeded for amount = ".$amount.
" currency = ".$currency, LOG_DEBUG, 0,
'_payment');
875 $_SESSION[
'paymentoksessioncode'] = $randomseckey;
877 $urlok .=
'&paymentoksessioncode='.urlencode($randomseckey);
884 $_SESSION[
"onlinetoken"] = $stripeToken;
885 $_SESSION[
"FinalPaymentAmt"] = $amount;
886 $_SESSION[
"currencyCodeType"] = $currency;
887 $_SESSION[
"paymentType"] =
'';
888 $_SESSION[
'ipaddress'] = ($remoteip ? $remoteip :
'unknown');
889 $_SESSION[
'payerID'] = is_object($customer) ? $customer->id :
'';
890 $_SESSION[
'TRANSACTIONID'] = (is_object($charge) ? $charge->id : (is_object($paymentintent) ? $paymentintent->id :
''));
891 $_SESSION[
'errormessage'] = $errormessage;
893 dol_syslog(
"Action charge stripe STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION=".
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION').
" ip=".$remoteip, LOG_DEBUG, 0,
'_payment');
894 dol_syslog(
"onlinetoken=".$_SESSION[
"onlinetoken"].
" paymentoksessioncode=".$_SESSION[
"paymentoksessioncode"].
" paymentkosessioncode=".$_SESSION[
"paymentkosessioncode"], LOG_DEBUG, 0,
'_payment');
895 dol_syslog(
"FinalPaymentAmt=".$_SESSION[
"FinalPaymentAmt"].
" currencyCodeType=".$_SESSION[
"currencyCodeType"].
" payerID=".$_SESSION[
'payerID'].
" TRANSACTIONID=".$_SESSION[
'TRANSACTIONID'], LOG_DEBUG, 0,
'_payment');
896 dol_syslog(
"FULLTAG=".$FULLTAG, LOG_DEBUG, 0,
'_payment');
897 dol_syslog(
"error=".$error.
" errormessage=".$errormessage, LOG_DEBUG, 0,
'_payment');
898 dol_syslog(
"_SERVER[SERVER_NAME] = ".(empty($_SERVER[
"SERVER_NAME"]) ?
'' :
dol_escape_htmltag($_SERVER[
"SERVER_NAME"])), LOG_DEBUG, 0,
'_payment');
899 dol_syslog(
"_SERVER[SERVER_ADDR] = ".(empty($_SERVER[
"SERVER_ADDR"]) ?
'' :
dol_escape_htmltag($_SERVER[
"SERVER_ADDR"])), LOG_DEBUG, 0,
'_payment');
900 dol_syslog(
"Now call the redirect to paymentok or paymentko, URL = ".($error ? $urlko : $urlok), LOG_DEBUG, 0,
'_payment');
903 header(
"Location: ".$urlko);
906 header(
"Location: ".$urlok);
913 'paymentmethod' => $paymentmethod,
914 'validpaymentmethod' => &$validpaymentmethod
916$reshook = $hookmanager->executeHooks(
'doPayment', $parameters,
$object, $action);
919} elseif ($reshook > 0) {
920 print $hookmanager->resPrint;
929$form =
new Form($db);
933 $head =
'<link rel="stylesheet" type="text/css" href="' .
getDolGlobalString(
'ONLINE_PAYMENT_CSS_URL').
'?lang='.(!empty($getpostlang) ? $getpostlang : $langs->defaultlang).
'">'.
"\n";
936$conf->dol_hide_topmenu = 1;
937$conf->dol_hide_leftmenu = 1;
939$replacemainarea = (empty(
$conf->dol_hide_leftmenu) ?
'<div>' :
'').
'<div>';
940llxHeader($head, $langs->trans(
"PaymentForm"),
'',
'', 0, 0,
'',
'',
'',
'onlinepaymentbody', $replacemainarea);
942dol_syslog(
"newpayment.php show page source=".$source.
" paymentmethod=".$paymentmethod.
' amount='.$amount.
' newamount='.
GETPOST(
"newamount",
'alpha').
" ref=".$ref, LOG_DEBUG, 0,
'_payment');
943dol_syslog(
"_SERVER[SERVER_NAME] = ".(empty($_SERVER[
"SERVER_NAME"]) ?
'' :
dol_escape_htmltag($_SERVER[
"SERVER_NAME"])), LOG_DEBUG, 0,
'_payment');
944dol_syslog(
"_SERVER[SERVER_ADDR] = ".(empty($_SERVER[
"SERVER_ADDR"]) ?
'' :
dol_escape_htmltag($_SERVER[
"SERVER_ADDR"])), LOG_DEBUG, 0,
'_payment');
947if ($source && in_array($ref, array(
'member_ref',
'contractline_ref',
'invoice_ref',
'order_ref',
'donation_ref',
''))) {
948 $langs->load(
"errors");
949 dol_print_error_email(
'BADREFINPAYMENTFORM', $langs->trans(
"ErrorBadLinkSourceSetButBadValueForRef", $source, $ref));
958if ((empty($paymentmethod) || $paymentmethod ==
'paypal') && isModEnabled(
'paypal') && (
getDolGlobalString(
'PAYPAL_API_SANDBOX') ||
GETPOSTINT(
'forcesandbox'))) {
959 dol_htmloutput_mesg($langs->trans(
'YouAreCurrentlyInSandboxMode',
'Paypal'), array(),
'warning');
961if ((empty($paymentmethod) || $paymentmethod ==
'stripe') && isModEnabled(
'stripe') && (!
getDolGlobalString(
'STRIPE_LIVE') ||
GETPOSTINT(
'forcesandbox'))) {
962 dol_htmloutput_mesg($langs->trans(
'YouAreCurrentlyInSandboxMode',
'Stripe'), array(),
'warning');
966print
'<span id="dolpaymentspan"></span>'.
"\n";
967print
'<div class="center">'.
"\n";
968print
'<form id="dolpaymentform" class="center" name="paymentform" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">'.
"\n";
969print
'<input type="hidden" name="token" value="'.newToken().
'">'.
"\n";
970print
'<input type="hidden" name="action" value="dopayment">'.
"\n";
971print
'<input type="hidden" name="tag" value="'.GETPOST(
"tag",
'alpha').
'">'.
"\n";
972print
'<input type="hidden" name="suffix" value="'.dol_escape_htmltag($suffix).
'">'.
"\n";
973print
'<input type="hidden" name="securekey" value="'.dol_escape_htmltag($SECUREKEY).
'">'.
"\n";
974print
'<input type="hidden" name="e" value="'.$entity.
'" />';
975print
'<input type="hidden" name="forcesandbox" value="'.GETPOSTINT(
'forcesandbox').
'" />';
976print
'<input type="hidden" name="lang" value="'.$getpostlang.
'">';
977print
'<input type="hidden" name="ws" value="'.$ws.
'">';
983$logosmall = $mysoc->logo_small;
985$paramlogo =
'ONLINE_PAYMENT_LOGO_'.$suffix;
995if (!empty($logosmall) && is_readable(
$conf->mycompany->dir_output.
'/logos/thumbs/'.$logosmall)) {
996 $urllogo = DOL_URL_ROOT.
'/viewimage.php?modulepart=mycompany&entity='.
$conf->entity.
'&file='.urlencode(
'logos/thumbs/'.$logosmall);
997 $urllogofull = $dolibarr_main_url_root.
'/viewimage.php?modulepart=mycompany&entity='.
$conf->entity.
'&file='.urlencode(
'logos/thumbs/'.$logosmall);
998} elseif (!empty($logo) && is_readable(
$conf->mycompany->dir_output.
'/logos/'.$logo)) {
999 $urllogo = DOL_URL_ROOT.
'/viewimage.php?modulepart=mycompany&entity='.
$conf->entity.
'&file='.urlencode(
'logos/'.$logo);
1000 $urllogofull = $dolibarr_main_url_root.
'/viewimage.php?modulepart=mycompany&entity='.
$conf->entity.
'&file='.urlencode(
'logos/'.$logo);
1004if ($urllogo && !$ws) {
1005 print
'<div class="backgreypublicpayment">';
1006 print
'<div class="logopublicpayment">';
1007 print
'<img id="dolpaymentlogo" src="'.$urllogo.
'"';
1011 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>';
1014} elseif ($creditor && !$ws) {
1015 print
'<div class="backgreypublicpayment">';
1016 print
'<div class="logopublicpayment">';
1022 print
'<div class="backimagepublicpayment">';
1023 print
'<img id="idMAIN_IMAGE_PUBLIC_PAYMENT" src="'.getDolGlobalString(
'MAIN_IMAGE_PUBLIC_PAYMENT').
'">';
1030print
'<!-- Form to send a payment -->'.
"\n";
1031print
'<!-- creditor = '.dol_escape_htmltag($creditor).
' -->'.
"\n";
1033if (isModEnabled(
'paypal')) {
1034 print
'<!-- PAYPAL_API_SANDBOX = '.getDolGlobalString(
'PAYPAL_API_SANDBOX').
' -->'.
"\n";
1035 print
'<!-- PAYPAL_API_INTEGRAL_OR_PAYPALONLY = '.getDolGlobalString(
'PAYPAL_API_INTEGRAL_OR_PAYPALONLY').
' -->'.
"\n";
1037if (isModEnabled(
'paybox')) {
1038 print
'<!-- PAYBOX_CGI_URL = '.getDolGlobalString(
'PAYBOX_CGI_URL_V2').
' -->'.
"\n";
1040if (isModEnabled(
'stripe')) {
1041 print
'<!-- STRIPE_LIVE = '.getDolGlobalString(
'STRIPE_LIVE').
' -->'.
"\n";
1042 print
'<!-- STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION = '.getDolGlobalString(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION').
' -->'.
"\n";
1044print
'<!-- urlok = '.$urlok.
' -->'.
"\n";
1045print
'<!-- urlko = '.$urlko.
' -->'.
"\n";
1049print
'<table id="dolpublictable" summary="Payment form" class="center">'.
"\n";
1054 $langs->load(
"members");
1056 if (preg_match(
'/^\((.*)\)$/',
getDolGlobalString(
'PAYMENT_NEWFORM_TEXT'), $reg)) {
1057 $text .= $langs->trans($reg[1]).
"<br>\n";
1061 $text =
'<tr><td align="center"><br>'.$text.
'<br></td></tr>'.
"\n";
1064 $text .=
'<tr><td class="textpublicpayment"><br><strong>'.$langs->trans(
"WelcomeOnPaymentPage").
'</strong></td></tr>'.
"\n";
1065 $text .=
'<tr><td class="textpublicpayment"><span class="opacitymedium">'.$langs->trans(
"ThisScreenAllowsYouToPay", $creditor).
'</span><br><br></td></tr>'.
"\n";
1070print
'<tr><td align="center">';
1071print
'<table class="centpercent left" id="tablepublicpayment">';
1072print
'<tr class="hideonsmartphone"><td colspan="2" align="left" class="opacitymedium">'.$langs->trans(
"ThisIsInformationOnPayment").
' :</td></tr>'.
"\n";
1085 $tag =
GETPOST(
"tag",
'alpha');
1086 if (
GETPOST(
'fulltag',
'alpha')) {
1087 $fulltag =
GETPOST(
'fulltag',
'alpha');
1089 $fulltag =
"TAG=".$tag;
1093 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Creditor");
1094 print
'</td><td class="CTableRow2">';
1095 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1096 print
'<b>'.$creditor.
'</b>';
1097 print
'<input type="hidden" name="creditor" value="'.$creditor.
'">';
1098 print
'</td></tr>'.
"\n";
1101 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Amount");
1102 if (empty($amount)) {
1103 print
' ('.$langs->trans(
"ToComplete").
')';
1105 print
'</td><td class="CTableRow2">';
1106 if (empty($amount) || !is_numeric($amount)) {
1107 print
'<input type="hidden" name="amount" value="'.price2num(
GETPOST(
"amount",
'alpha'),
'MT').
'">';
1108 print
'<input class="flat maxwidth75" type="text" name="newamount" value="'.price2num(
GETPOST(
"newamount",
"alpha"),
'MT').
'">';
1110 print
' <b>'.$langs->trans(
"Currency".$currency).
'</b>';
1112 print
'<b class="amount">'.price($amount, 1, $langs, 1, -1, -1, $currency).
'</b>';
1113 print
'<input type="hidden" name="amount" value="'.$amount.
'">';
1114 print
'<input type="hidden" name="newamount" value="'.$amount.
'">';
1116 print
'<input type="hidden" name="currency" value="'.$currency.
'">';
1117 print
'</td></tr>'.
"\n";
1120 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"PaymentCode");
1121 print
'</td><td class="CTableRow2"><b style="word-break: break-all;">'.$fulltag.
'</b>';
1122 print
'<input type="hidden" name="tag" value="'.$tag.
'">';
1123 print
'<input type="hidden" name="fulltag" value="'.$fulltag.
'">';
1124 print
'</td></tr>'.
"\n";
1132if ($source ==
'order') {
1134 $langs->load(
"orders");
1136 require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
1139 $result = $order->fetch(0, $ref);
1141 $mesg = $order->error;
1144 $result = $order->fetch_thirdparty($order->socid);
1148 if ($action !=
'dopayment') {
1149 $amount = $order->total_ttc;
1150 if (
GETPOST(
"amount",
'alpha')) {
1151 $amount =
GETPOST(
"amount",
'alpha');
1157 if (
GETPOST(
'fulltag',
'alpha')) {
1158 $fulltag =
GETPOST(
'fulltag',
'alpha');
1160 $fulltag =
'ORD='.$order->id.
'.CUS='.$order->thirdparty->id;
1163 $fulltag .=
'.TAG='.$TAG;
1169 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Creditor");
1170 print
'</td><td class="CTableRow2">';
1171 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1172 print
'<b>'.$creditor.
'</b>';
1173 print
'<input type="hidden" name="creditor" value="'.$creditor.
'">';
1174 print
'</td></tr>'.
"\n";
1177 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"ThirdParty");
1178 print
'</td><td class="CTableRow2">';
1179 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1180 print
'<b>'.$order->thirdparty->name.
'</b>';
1181 print
'</td></tr>'.
"\n";
1184 $text =
'<b>'.$langs->trans(
"PaymentOrderRef", $order->ref).
'</b>';
1185 if (
GETPOST(
'desc',
'alpha')) {
1186 $text =
'<b>'.$langs->trans(
GETPOST(
'desc',
'alpha')).
'</b>';
1188 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Designation");
1189 print
'</td><td class="CTableRow2">'.$text;
1190 print
'<input type="hidden" name="s" value="'.dol_escape_htmltag($source).
'">';
1191 print
'<input type="hidden" name="ref" value="'.dol_escape_htmltag($order->ref).
'">';
1192 print
'<input type="hidden" name="dol_id" value="'.dol_escape_htmltag((
string) $order->id).
'">';
1193 $directdownloadlink = $order->getLastMainDocLink(
'commande');
1194 if ($directdownloadlink) {
1195 print
'<br><a href="'.$directdownloadlink.
'" rel="nofollow noopener">';
1196 print
img_mime($order->last_main_doc,
'');
1197 print $langs->trans(
"DownloadDocument").
'</a>';
1199 print
'</td></tr>'.
"\n";
1202 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Amount");
1203 if (empty($amount)) {
1204 print
' ('.$langs->trans(
"ToComplete").
')';
1206 print
'</td><td class="CTableRow2">';
1207 if (empty($amount) || !is_numeric($amount)) {
1208 print
'<input type="hidden" name="amount" value="'.price2num(
GETPOST(
"amount",
'alpha'),
'MT').
'">';
1209 print
'<input class="flat maxwidth75" type="text" name="newamount" value="'.price2num(
GETPOST(
"newamount",
"alpha"),
'MT').
'">';
1211 print
' <b>'.$langs->trans(
"Currency".$currency).
'</b>';
1213 print
'<b class="amount">'.price($amount, 1, $langs, 1, -1, -1, $currency).
'</b>';
1214 print
'<input type="hidden" name="amount" value="'.$amount.
'">';
1215 print
'<input type="hidden" name="newamount" value="'.$amount.
'">';
1217 print
'<input type="hidden" name="currency" value="'.$currency.
'">';
1218 print
'</td></tr>'.
"\n";
1221 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"PaymentCode");
1222 print
'</td><td class="CTableRow2"><b style="word-break: break-all;">'.$fulltag.
'</b>';
1223 print
'<input type="hidden" name="tag" value="'.dol_escape_htmltag($tag).
'">';
1224 print
'<input type="hidden" name="fulltag" value="'.dol_escape_htmltag($fulltag).
'">';
1225 print
'</td></tr>'.
"\n";
1228 $shipToName = $order->thirdparty->name;
1229 $shipToStreet = $order->thirdparty->address;
1230 $shipToCity = $order->thirdparty->town;
1231 $shipToState = $order->thirdparty->state_code;
1232 $shipToCountryCode = $order->thirdparty->country_code;
1233 $shipToZip = $order->thirdparty->zip;
1234 $shipToStreet2 =
'';
1235 $phoneNum = $order->thirdparty->phone;
1236 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
1237 print
'<input type="hidden" name="shipToName" value="'.dol_escape_htmltag($shipToName).
'">'.
"\n";
1238 print
'<input type="hidden" name="shipToStreet" value="'.dol_escape_htmltag($shipToStreet).
'">'.
"\n";
1239 print
'<input type="hidden" name="shipToCity" value="'.dol_escape_htmltag($shipToCity).
'">'.
"\n";
1240 print
'<input type="hidden" name="shipToState" value="'.dol_escape_htmltag($shipToState).
'">'.
"\n";
1241 print
'<input type="hidden" name="shipToCountryCode" value="'.dol_escape_htmltag($shipToCountryCode).
'">'.
"\n";
1242 print
'<input type="hidden" name="shipToZip" value="'.dol_escape_htmltag($shipToZip).
'">'.
"\n";
1243 print
'<input type="hidden" name="shipToStreet2" value="'.dol_escape_htmltag($shipToStreet2).
'">'.
"\n";
1244 print
'<input type="hidden" name="phoneNum" value="'.dol_escape_htmltag($phoneNum).
'">'.
"\n";
1246 print
'<!-- Shipping address not complete, so we don t use it -->'.
"\n";
1248 if (is_object($order->thirdparty)) {
1249 print
'<input type="hidden" name="thirdparty_id" value="'.$order->thirdparty->id.
'">'.
"\n";
1251 print
'<input type="hidden" name="email" value="'.$order->thirdparty->email.
'">'.
"\n";
1252 print
'<input type="hidden" name="vatnumber" value="'.dol_escape_htmltag($order->thirdparty->tva_intra).
'">'.
"\n";
1253 $labeldesc = $langs->trans(
"Order").
' '.$order->ref;
1254 if (
GETPOST(
'desc',
'alpha')) {
1255 $labeldesc =
GETPOST(
'desc',
'alpha');
1257 print
'<input type="hidden" name="desc" value="'.dol_escape_htmltag($labeldesc).
'">'.
"\n";
1262if ($source ==
'invoice') {
1264 $langs->load(
"bills");
1265 $form->load_cache_types_paiements();
1267 require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
1270 $result = $invoice->fetch(0, $ref);
1272 $mesg = $invoice->error;
1275 $result = $invoice->fetch_thirdparty($invoice->socid);
1279 if ($action !=
'dopayment') {
1280 $amount =
price2num($invoice->total_ttc - ($invoice->getSommePaiement() + $invoice->getSumCreditNotesUsed() + $invoice->getSumDepositsUsed()));
1281 if (
GETPOST(
"amount",
'alpha')) {
1282 $amount =
GETPOST(
"amount",
'alpha');
1287 if (
GETPOST(
'fulltag',
'alpha')) {
1288 $fulltag =
GETPOST(
'fulltag',
'alpha');
1290 $fulltag =
'INV='.$invoice->id.
'.CUS='.$invoice->thirdparty->id;
1293 $fulltag .=
'.TAG='.$TAG;
1299 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Creditor");
1300 print
'</td><td class="CTableRow2">';
1301 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1302 print
'<b>'.$creditor.
'</b>';
1303 print
'<input type="hidden" name="creditor" value="'.dol_escape_htmltag($creditor).
'">';
1304 print
'</td></tr>'.
"\n";
1307 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"ThirdParty");
1308 print
'</td><td class="CTableRow2">';
1309 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1310 print
'<b>'.$invoice->thirdparty->name.
'</b>';
1311 print
'</td></tr>'.
"\n";
1314 $text =
'<b>'.$langs->trans(
"PaymentInvoiceRef", $invoice->ref).
'</b>';
1315 if (
GETPOST(
'desc',
'alpha')) {
1316 $text =
'<b>'.$langs->trans(
GETPOST(
'desc',
'alpha')).
'</b>';
1318 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Designation");
1319 print
'</td><td class="CTableRow2">'.$text;
1320 print
'<input type="hidden" name="s" value="'.dol_escape_htmltag($source).
'">';
1321 print
'<input type="hidden" name="ref" value="'.dol_escape_htmltag($invoice->ref).
'">';
1322 print
'<input type="hidden" name="dol_id" value="'.dol_escape_htmltag((
string) $invoice->id).
'">';
1323 $directdownloadlink = $invoice->getLastMainDocLink(
'facture');
1324 if ($directdownloadlink) {
1325 print
'<br><a href="'.$directdownloadlink.
'">';
1326 print
img_mime($invoice->last_main_doc,
'');
1327 print $langs->trans(
"DownloadDocument").
'</a>';
1329 print
'</td></tr>'.
"\n";
1332 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"PaymentAmount");
1333 if (empty($amount) && empty(
$object->paye)) {
1334 print
' ('.$langs->trans(
"ToComplete").
')';
1336 print
'</td><td class="CTableRow2">';
1337 if (
$object->type == $object::TYPE_CREDIT_NOTE) {
1338 print
'<b>'.$langs->trans(
"CreditNote").
'</b>';
1339 } elseif (empty(
$object->paye)) {
1340 if (empty($amount) || !is_numeric($amount)) {
1341 print
'<input type="hidden" name="amount" value="'.price2num(
GETPOST(
"amount",
'alpha'),
'MT').
'">';
1342 print
'<input class="flat maxwidth75" type="text" name="newamount" value="'.price2num(
GETPOST(
"newamount",
"alpha"),
'MT').
'">';
1343 print
' <b>'.$langs->trans(
"Currency".$currency).
'</b>';
1345 print
'<b class="amount">'.price($amount, 1, $langs, 1, -1, -1, $currency).
'</b>';
1346 print
'<input type="hidden" name="amount" value="'.$amount.
'">';
1347 print
'<input type="hidden" name="newamount" value="'.$amount.
'">';
1350 print
'<b class="amount">'.price(
$object->total_ttc, 1, $langs, 1, -1, -1, $currency).
'</b>';
1352 print
'<input type="hidden" name="currency" value="'.$currency.
'">';
1353 print
'</td></tr>'.
"\n";
1356 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"PaymentCode");
1357 print
'</td><td class="CTableRow2"><b style="word-break: break-all;">'.$fulltag.
'</b>';
1358 print
'<input type="hidden" name="tag" value="'.(empty($tag) ?
'' : $tag).
'">';
1359 print
'<input type="hidden" name="fulltag" value="'.$fulltag.
'">';
1360 print
'</td></tr>'.
"\n";
1363 if ($invoice->status == $invoice::STATUS_VALIDATED && $invoice->mode_reglement_id > 0 && $form->cache_types_paiements[$invoice->mode_reglement_id][
"code"] ==
"VIR") {
1364 print
'<tr class="CTableRow2 center"><td class="CTableRow2" colspan="2">';
1365 print
'<div class="warning maxwidth1000">';
1366 print $langs->trans(
"PayOfBankTransferInvoice");
1368 print
'</td></tr>'.
"\n";
1372 $shipToName = $invoice->thirdparty->name;
1373 $shipToStreet = $invoice->thirdparty->address;
1374 $shipToCity = $invoice->thirdparty->town;
1375 $shipToState = $invoice->thirdparty->state_code;
1376 $shipToCountryCode = $invoice->thirdparty->country_code;
1377 $shipToZip = $invoice->thirdparty->zip;
1378 $shipToStreet2 =
'';
1379 $phoneNum = $invoice->thirdparty->phone;
1380 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
1381 print
'<input type="hidden" name="shipToName" value="'.$shipToName.
'">'.
"\n";
1382 print
'<input type="hidden" name="shipToStreet" value="'.$shipToStreet.
'">'.
"\n";
1383 print
'<input type="hidden" name="shipToCity" value="'.$shipToCity.
'">'.
"\n";
1384 print
'<input type="hidden" name="shipToState" value="'.$shipToState.
'">'.
"\n";
1385 print
'<input type="hidden" name="shipToCountryCode" value="'.$shipToCountryCode.
'">'.
"\n";
1386 print
'<input type="hidden" name="shipToZip" value="'.$shipToZip.
'">'.
"\n";
1387 print
'<input type="hidden" name="shipToStreet2" value="'.$shipToStreet2.
'">'.
"\n";
1388 print
'<input type="hidden" name="phoneNum" value="'.$phoneNum.
'">'.
"\n";
1390 print
'<!-- Shipping address not complete, so we don t use it -->'.
"\n";
1392 if (is_object($invoice->thirdparty)) {
1393 print
'<input type="hidden" name="thirdparty_id" value="'.$invoice->thirdparty->id.
'">'.
"\n";
1395 print
'<input type="hidden" name="email" value="'.$invoice->thirdparty->email.
'">'.
"\n";
1396 print
'<input type="hidden" name="vatnumber" value="'.$invoice->thirdparty->tva_intra.
'">'.
"\n";
1397 $labeldesc = $langs->trans(
"Invoice").
' '.$invoice->ref;
1398 if (
GETPOST(
'desc',
'alpha')) {
1399 $labeldesc =
GETPOST(
'desc',
'alpha');
1401 print
'<input type="hidden" name="desc" value="'.dol_escape_htmltag($labeldesc).
'">'.
"\n";
1405if ($source ==
'contractline') {
1407 $langs->load(
"contracts");
1409 require_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
1414 $result = $contractline->fetch(0, $ref);
1416 $mesg = $contractline->error;
1419 if ($contractline->fk_contrat > 0) {
1420 $result = $contract->fetch($contractline->fk_contrat);
1422 $result = $contract->fetch_thirdparty($contract->socid);
1424 $mesg = $contract->error;
1428 $mesg =
'ErrorRecordNotFound';
1434 if ($action !=
'dopayment') {
1435 $amount = $contractline->total_ttc;
1437 if ($contractline->fk_product &&
getDolGlobalString(
'PAYMENT_USE_NEW_PRICE_FOR_CONTRACTLINES')) {
1439 $result = $product->fetch($contractline->fk_product);
1443 $pu_ht = $product->multiprices[$contract->thirdparty->price_level];
1444 $pu_ttc = $product->multiprices_ttc[$contract->thirdparty->price_level];
1445 $price_base_type = $product->multiprices_base_type[$contract->thirdparty->price_level];
1447 $pu_ht = $product->price;
1448 $pu_ttc = $product->price_ttc;
1449 $price_base_type = $product->price_base_type;
1453 if (empty($amount)) {
1459 if (
GETPOST(
"amount",
'alpha')) {
1460 $amount =
GETPOST(
"amount",
'alpha');
1465 if (
GETPOST(
'fulltag',
'alpha')) {
1466 $fulltag =
GETPOST(
'fulltag',
'alpha');
1468 $fulltag =
'COL='.$contractline->id.
'.CON='.$contract->id.
'.CUS='.$contract->thirdparty->id.
'.DAT='.
dol_print_date(
dol_now(),
'%Y%m%d%H%M%S');
1471 $fulltag .=
'.TAG='.$TAG;
1482 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Creditor");
1483 print
'</td><td class="CTableRow2"><b>'.$creditor.
'</b>';
1484 print
'<input type="hidden" name="creditor" value="'.$creditor.
'">';
1485 print
'</td></tr>'.
"\n";
1488 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"ThirdParty");
1489 print
'</td><td class="CTableRow2"><b>'.$contract->thirdparty->name.
'</b>';
1490 print
'</td></tr>'.
"\n";
1493 $text =
'<b>'.$langs->trans(
"PaymentRenewContractId", $contract->ref, $contractline->ref).
'</b>';
1494 if ($contractline->fk_product > 0) {
1495 $contractline->fetch_product();
1496 $text .=
'<br>'.$contractline->product->ref.($contractline->product->label ?
' - '.$contractline->product->label :
'');
1498 if ($contractline->description) {
1499 $text .=
'<br>'.dol_htmlentitiesbr($contractline->description);
1501 if ($contractline->date_end) {
1502 $text .=
'<br>'.$langs->trans(
"ExpiredSince").
': '.
dol_print_date($contractline->date_end);
1504 if (
GETPOST(
'desc',
'alpha')) {
1505 $text =
'<b>'.$langs->trans(
GETPOST(
'desc',
'alpha')).
'</b>';
1507 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Designation");
1508 print
'</td><td class="CTableRow2">'.$text;
1509 print
'<input type="hidden" name="source" value="'.dol_escape_htmltag($source).
'">';
1510 print
'<input type="hidden" name="ref" value="'.dol_escape_htmltag($contractline->ref).
'">';
1511 print
'<input type="hidden" name="dol_id" value="'.dol_escape_htmltag((
string) $contractline->id).
'">';
1512 $directdownloadlink = $contract->getLastMainDocLink(
'contract');
1513 if ($directdownloadlink) {
1514 print
'<br><a href="'.$directdownloadlink.
'">';
1515 print
img_mime($contract->last_main_doc,
'');
1516 print $langs->trans(
"DownloadDocument").
'</a>';
1518 print
'</td></tr>'.
"\n";
1521 $label = $langs->trans(
"Quantity");
1524 if ($contractline->fk_product) {
1525 if ($contractline->product->isService() && $contractline->product->duration_value > 0) {
1526 $label = $langs->trans(
"Duration");
1529 if ($contractline->product->duration_value > 1) {
1530 $dur = array(
"h" => $langs->trans(
"Hours"),
"d" => $langs->trans(
"DurationDays"),
"w" => $langs->trans(
"DurationWeeks"),
"m" => $langs->trans(
"DurationMonths"),
"y" => $langs->trans(
"DurationYears"));
1532 $dur = array(
"h" => $langs->trans(
"Hour"),
"d" => $langs->trans(
"DurationDay"),
"w" => $langs->trans(
"DurationWeek"),
"m" => $langs->trans(
"DurationMonth"),
"y" => $langs->trans(
"DurationYear"));
1534 $duration = $contractline->product->duration_value.
' '.$dur[$contractline->product->duration_unit];
1537 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$label.
'</td>';
1538 print
'<td class="CTableRow2"><b>'.($duration ? $duration : $qty).
'</b>';
1539 print
'<input type="hidden" name="newqty" value="'.dol_escape_htmltag((
string) $qty).
'">';
1540 print
'</b></td></tr>'.
"\n";
1543 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Amount");
1544 if (empty($amount)) {
1545 print
' ('.$langs->trans(
"ToComplete").
')';
1547 print
'</td><td class="CTableRow2">';
1548 if (empty($amount) || !is_numeric($amount)) {
1549 print
'<input type="hidden" name="amount" value="'.price2num(
GETPOST(
"amount",
'alpha'),
'MT').
'">';
1550 print
'<input class="flat maxwidth75" type="text" name="newamount" value="'.price2num(
GETPOST(
"newamount",
"alpha"),
'MT').
'">';
1552 print
' <b>'.$langs->trans(
"Currency".$currency).
'</b>';
1554 print
'<b class="amount">'.price($amount, 1, $langs, 1, -1, -1, $currency).
'</b>';
1555 print
'<input type="hidden" name="amount" value="'.$amount.
'">';
1556 print
'<input type="hidden" name="newamount" value="'.$amount.
'">';
1558 print
'<input type="hidden" name="currency" value="'.$currency.
'">';
1559 print
'</td></tr>'.
"\n";
1562 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"PaymentCode");
1563 print
'</td><td class="CTableRow2"><b style="word-break: break-all;">'.$fulltag.
'</b>';
1564 print
'<input type="hidden" name="tag" value="'.$tag.
'">';
1565 print
'<input type="hidden" name="fulltag" value="'.$fulltag.
'">';
1566 print
'</td></tr>'.
"\n";
1569 $shipToName = $contract->thirdparty->name;
1570 $shipToStreet = $contract->thirdparty->address;
1571 $shipToCity = $contract->thirdparty->town;
1572 $shipToState = $contract->thirdparty->state_code;
1573 $shipToCountryCode = $contract->thirdparty->country_code;
1574 $shipToZip = $contract->thirdparty->zip;
1575 $shipToStreet2 =
'';
1576 $phoneNum = $contract->thirdparty->phone;
1577 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
1578 print
'<input type="hidden" name="shipToName" value="'.$shipToName.
'">'.
"\n";
1579 print
'<input type="hidden" name="shipToStreet" value="'.$shipToStreet.
'">'.
"\n";
1580 print
'<input type="hidden" name="shipToCity" value="'.$shipToCity.
'">'.
"\n";
1581 print
'<input type="hidden" name="shipToState" value="'.$shipToState.
'">'.
"\n";
1582 print
'<input type="hidden" name="shipToCountryCode" value="'.$shipToCountryCode.
'">'.
"\n";
1583 print
'<input type="hidden" name="shipToZip" value="'.$shipToZip.
'">'.
"\n";
1584 print
'<input type="hidden" name="shipToStreet2" value="'.$shipToStreet2.
'">'.
"\n";
1585 print
'<input type="hidden" name="phoneNum" value="'.$phoneNum.
'">'.
"\n";
1587 print
'<!-- Shipping address not complete, so we don t use it -->'.
"\n";
1589 if (is_object($contract->thirdparty)) {
1590 print
'<input type="hidden" name="thirdparty_id" value="'.$contract->thirdparty->id.
'">'.
"\n";
1592 print
'<input type="hidden" name="email" value="'.$contract->thirdparty->email.
'">'.
"\n";
1593 print
'<input type="hidden" name="vatnumber" value="'.$contract->thirdparty->tva_intra.
'">'.
"\n";
1594 $labeldesc = $langs->trans(
"Contract").
' '.$contract->ref;
1595 if (
GETPOST(
'desc',
'alpha')) {
1596 $labeldesc =
GETPOST(
'desc',
'alpha');
1598 print
'<input type="hidden" name="desc" value="'.dol_escape_htmltag($labeldesc).
'">'.
"\n";
1602if ($source ==
'member' || $source ==
'membersubscription') {
1603 $newsource =
'member';
1607 $langs->load(
"members");
1609 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent.class.php';
1610 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent_type.class.php';
1611 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/subscription.class.php';
1616 $result = $member->fetch(0, $ref, 0,
'',
true,
true);
1618 $mesg = $member->error;
1621 $member->fetch_thirdparty();
1623 $adht->fetch($member->typeid);
1627 if ($action !=
'dopayment') {
1628 $amount = $member->last_subscription_amount;
1629 if (
GETPOST(
"amount",
'alpha')) {
1633 if (empty($amount)) {
1634 $amount = $adht->amount;
1637 $amount = max(0,
price2num($amount,
'MT'));
1640 if (
GETPOST(
'fulltag',
'alpha')) {
1641 $fulltag =
GETPOST(
'fulltag',
'alpha');
1646 $fulltag .=
'.TAG='.$TAG;
1652 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Creditor");
1653 print
'</td><td class="CTableRow2"><b>'.$creditor.
'</b>';
1654 print
'<input type="hidden" name="creditor" value="'.$creditor.
'">';
1655 print
'</td></tr>'.
"\n";
1658 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Member");
1659 print
'</td><td class="CTableRow2">';
1661 if ($member->morphy ==
'mor' && !empty($member->company)) {
1662 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1663 print $member->company;
1665 print
img_picto(
'',
'member',
'class="pictofixedwidth"');
1666 print $member->getFullName($langs);
1669 print
'</td></tr>'.
"\n";
1672 $text =
'<b>'.$langs->trans(
"PaymentSubscription").
'</b>';
1673 if (
GETPOST(
'desc',
'alpha')) {
1674 $text =
'<b>'.$langs->trans(
GETPOST(
'desc',
'alpha')).
'</b>';
1676 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"Designation");
1677 print
'</td><td class="CTableRow2">'.$text;
1678 print
'<input type="hidden" name="source" value="'.dol_escape_htmltag($newsource).
'">';
1679 print
'<input type="hidden" name="ref" value="'.dol_escape_htmltag($member->ref).
'">';
1680 print
'</td></tr>'.
"\n";
1683 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"DateEndSubscription");
1684 print
'</td><td class="CTableRow2">'.dol_print_date($member->datefin,
'day');
1685 print
'</td></tr>'.
"\n";
1688 if ($member->last_subscription_date || $member->last_subscription_amount) {
1691 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"LastSubscriptionDate");
1692 print
'</td><td class="CTableRow2">'.dol_print_date($member->last_subscription_date,
'day');
1693 print
'</td></tr>'.
"\n";
1697 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"LastSubscriptionAmount");
1698 print
'</td><td class="CTableRow2">'.price($member->last_subscription_amount);
1699 print
'</td></tr>'.
"\n";
1701 if (empty($amount) && !
GETPOST(
'newamount',
'alpha')) {
1702 $_GET[
'newamount'] = $member->last_subscription_amount;
1703 $_GET[
'amount'] = $member->last_subscription_amount;
1705 if (!empty($member->last_subscription_amount) && !GETPOSTISSET(
'newamount') && is_numeric($amount)) {
1706 $amount = max($member->last_subscription_amount, $amount);
1710 $amountbytype = $adht->amountByType(1);
1712 $typeid = $adht->id;
1713 $caneditamount = $adht->caneditamount;
1715 if ($member->type) {
1716 $oldtypeid = $member->typeid;
1717 $newtypeid = (int) (GETPOSTISSET(
"typeid") ?
GETPOSTINT(
"typeid") : $member->typeid);
1719 $typeid = $newtypeid;
1720 $adht->fetch($typeid);
1723 $caneditamount = $adht->caneditamount;
1727 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"LastMemberType");
1728 print
'</td><td class="CTableRow2">'.dol_escape_htmltag($member->type);
1729 print
"</td></tr>\n";
1732 $member->typeid = $newtypeid;
1733 $member->type = (string)
dol_getIdFromCode($db, $newtypeid,
'adherent_type',
'rowid',
'libelle');
1739 $amount = (!empty($amountbytype[$member->typeid])) ? $amountbytype[$member->typeid] : $member->last_subscription_amount;
1741 print
'<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans(
"NewSubscription");
1742 print
'</td><td class="CTableRow2">';
1743 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);
1744 print "</td></tr>\n
";
1745 } elseif ($action == 'dopayment') {
1746 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("NewMemberType
");
1747 print '</td><td class="CTableRow2
">'.dol_escape_htmltag($member->type);
1748 print '<input type="hidden
" name="membertypeid
" value="'.$member->typeid.'">';
1749 print "</td></tr>\n
";
1752 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("MemberType
");
1753 print '</td><td class="CTableRow2
">'.dol_escape_htmltag($member->type);
1754 print "</td></tr>\n
";
1758 // Set amount for the subscription from the the type and options:
1759 // - First check the amount of the member type if not previous payment.
1760 $amount = ($member->last_subscription_amount ? $member->last_subscription_amount : (empty($amountbytype[$typeid]) ? 0 : $amountbytype[$typeid]));
1761 // - If not found, take the default amount
1762 if (empty($amount) && getDolGlobalString('MEMBER_NEWFORM_AMOUNT')) {
1763 $amount = getDolGlobalString('MEMBER_NEWFORM_AMOUNT');
1765 // - If an amount was posted from the form (for example from page with types of membership)
1766 if ($caneditamount && GETPOSTISSET('amount') && GETPOSTFLOAT('amount', 'MT') > 0) {
1767 $amount = GETPOSTFLOAT('amount', 'MT');
1769 // - If a new amount was posted from the form
1770 if ($caneditamount && GETPOSTISSET('newamount') && GETPOSTFLOAT('newamount', 'MT') > 0) {
1771 $amount = GETPOSTFLOAT('newamount', 'MT');
1773 // - If a min is set or an amount from the posted form, we take them into account
1774 $amount = max(0, (float) $amount, (float) getDolGlobalInt("MEMBER_MIN_AMOUNT
"));
1777 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Amount
");
1778 // This place no longer allows amount edition
1779 if (getDolGlobalString('MEMBER_EXT_URL_SUBSCRIPTION_INFO')) {
1780 print ' - <a href="' . getDolGlobalString('MEMBER_EXT_URL_SUBSCRIPTION_INFO
').'" rel="external
" target="_blank
" rel="noopener noreferrer
">'.$langs->trans("SeeHere
").'</a>';
1782 print '</td><td class="CTableRow2
">';
1784 $caneditamount = $adht->caneditamount;
1785 $minimumamount = !getDolGlobalString('MEMBER_MIN_AMOUNT') ? $adht->amount : max(getDolGlobalString('MEMBER_MIN_AMOUNT'), $adht->amount, $amount);
1787 if ($caneditamount && $action != 'dopayment') {
1788 if (GETPOSTISSET('newamount')) {
1789 print '<input type="text
" class="width75
" name="newamount
" value="'.price(price2num(GETPOST('newamount
'), '', 2), 1, $langs, 1, -1, -1).'">';
1791 print '<input type="text
" class="width75
" name="newamount
" value="'.price($amount, 1, $langs, 1, -1, -1).'">';
1794 print '<b class="amount
">'.price($amount, 1, $langs, 1, -1, -1, $currency).'</b>'; // Price with currency
1795 if ($minimumamount > $amount) {
1796 print ' <span class="opacitymedium small
">'. $langs->trans("AmountIsLowerToMinimumNotice
", price($minimumamount, 1, $langs, 1, -1, -1, $currency)).'</span>';
1798 print '<input type="hidden
" name="newamount
" value="'.$amount.'">';
1800 print '<input type="hidden
" name="amount
" value="'.$amount.'">';
1801 print '<input type="hidden
" name="currency
" value="'.$currency.'">';
1802 print '</td></tr>'."\n
";
1805 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("PaymentCode
");
1806 print '</td><td class="CTableRow2
"><b style="word-
break:
break-all;
">'.$fulltag.'</b>';
1807 print '<input type="hidden
" name="tag
" value="'.$tag.'">';
1808 print '<input type="hidden
" name="fulltag
" value="'.$fulltag.'">';
1809 print '</td></tr>'."\n
";
1812 $shipToName = $member->getFullName($langs);
1813 $shipToStreet = $member->address;
1814 $shipToCity = $member->town;
1815 $shipToState = $member->state_code;
1816 $shipToCountryCode = $member->country_code;
1817 $shipToZip = $member->zip;
1818 $shipToStreet2 = '';
1819 $phoneNum = $member->phone;
1820 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
1821 print '<!-- Shipping address information -->';
1822 print '<input type="hidden
" name="shipToName
" value="'.$shipToName.'">'."\n
";
1823 print '<input type="hidden
" name="shipToStreet
" value="'.$shipToStreet.'">'."\n
";
1824 print '<input type="hidden
" name="shipToCity
" value="'.$shipToCity.'">'."\n
";
1825 print '<input type="hidden
" name="shipToState
" value="'.$shipToState.'">'."\n
";
1826 print '<input type="hidden
" name="shipToCountryCode
" value="'.$shipToCountryCode.'">'."\n
";
1827 print '<input type="hidden
" name="shipToZip
" value="'.$shipToZip.'">'."\n
";
1828 print '<input type="hidden
" name="shipToStreet2
" value="'.$shipToStreet2.'">'."\n
";
1829 print '<input type="hidden
" name="phoneNum
" value="'.$phoneNum.'">'."\n
";
1831 print '<!-- Shipping address not complete, so we don t use it -->'."\n
";
1833 if (is_object($member->thirdparty)) {
1834 print '<input type="hidden
" name="thirdparty_id
" value="'.$member->thirdparty->id.'">'."\n
";
1836 print '<input type="hidden
" name="email" value="'.$member->email.'">'."\n
";
1837 $labeldesc = $langs->trans("PaymentSubscription
");
1838 if (GETPOST('desc', 'alpha')) {
1839 $labeldesc = GETPOST('desc', 'alpha');
1841 print '<input type="hidden
" name="desc
" value="'.dol_escape_htmltag($labeldesc).'">'."\n
";
1844// Payment on donation
1845if ($source == 'donation') {
1847 $langs->load("don
");
1849 require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php';
1851 $don = new Don($db);
1852 // @phan-suppress-next-line PhanPluginSuspiciousParamPosition
1853 $result = $don->fetch($ref);
1855 $mesg = $don->error;
1858 $don->fetch_thirdparty();
1862 if ($action != 'dopayment') { // Do not change amount if we just click on first dopayment
1863 if (GETPOST("amount
", 'alpha')) {
1864 $amount = GETPOST("amount
", 'alpha');
1866 $amount = $don->getRemainToPay();
1868 $amount = price2num($amount);
1871 if (GETPOST('fulltag', 'alpha')) {
1872 $fulltag = GETPOST('fulltag', 'alpha');
1874 $fulltag = 'DON='.$don->ref.'.DAT='.dol_print_date(dol_now(), '%Y%m%d%H%M%S');
1877 $fulltag .= '.TAG='.$TAG;
1880 $fulltag = dol_string_unaccent($fulltag);
1883 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Creditor
");
1884 print '</td><td class="CTableRow2
"><b>'.$creditor.'</b>';
1885 print '<input type="hidden
" name="creditor
" value="'.$creditor.'">';
1886 print '</td></tr>'."\n
";
1889 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("ThirdParty
");
1890 print '</td><td class="CTableRow2
"><b>';
1891 if ($don->morphy == 'mor' && !empty($don->societe)) {
1892 print $don->societe;
1894 print $don->getFullName($langs);
1897 print '</td></tr>'."\n
";
1901 if (GETPOST('desc', 'alpha')) {
1902 $text = '<b>'.$langs->trans(GETPOST('desc', 'alpha')).'</b>';
1904 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Designation
");
1905 print '</td><td class="CTableRow2
">'.$text;
1906 print '<input type="hidden
" name="source
" value="'.dol_escape_htmltag($source).'">';
1907 print '<input type="hidden
" name="ref" value="'.dol_escape_htmltag($don->ref).'">';
1908 print '</td></tr>'."\n
";
1911 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Amount
");
1912 if (empty($amount)) {
1913 if (!getDolGlobalString('DONATION_NEWFORM_AMOUNT')) {
1914 print ' ('.$langs->trans("ToComplete
");
1916 if (getDolGlobalString('DONATION_EXT_URL_SUBSCRIPTION_INFO')) {
1917 print ' - <a href="' . getDolGlobalString('DONATION_EXT_URL_SUBSCRIPTION_INFO
').'" rel="external
" target="_blank
" rel="noopener noreferrer
">'.$langs->trans("SeeHere
").'</a>';
1919 if (!getDolGlobalString('DONATION_NEWFORM_AMOUNT')) {
1923 print '</td><td class="CTableRow2
">';
1925 if (empty($amount) || !is_numeric($amount)) {
1926 $valtoshow = price2num(GETPOST("newamount
", 'alpha'), 'MT');
1927 // force default subscription amount to value defined into constant...
1928 if (empty($valtoshow)) {
1929 if (getDolGlobalString('DONATION_NEWFORM_EDITAMOUNT')) {
1930 if (getDolGlobalString('DONATION_NEWFORM_AMOUNT')) {
1931 $valtoshow = getDolGlobalString('DONATION_NEWFORM_AMOUNT');
1934 if (getDolGlobalString('DONATION_NEWFORM_AMOUNT')) {
1935 $amount = getDolGlobalString('DONATION_NEWFORM_AMOUNT');
1940 if (empty($amount) || !is_numeric($amount)) {
1941 //$valtoshow=price2num(GETPOST("newamount
",'alpha'),'MT');
1942 if (getDolGlobalString('DONATION_MIN_AMOUNT') && $valtoshow) {
1943 $valtoshow = max(getDolGlobalString('DONATION_MIN_AMOUNT'), $valtoshow);
1945 print '<input type="hidden
" name="amount
" value="'.price2num(GETPOST("amount", 'alpha
'), 'MT
').'">';
1946 print '<input class="flat maxwidth75
" type="text
" name="newamount
" value="'.$valtoshow.'">';
1948 print ' <b>'.$langs->trans("Currency
".$currency).'</b>';
1950 $valtoshow = $amount;
1951 if (getDolGlobalString('DONATION_MIN_AMOUNT') && $valtoshow) {
1952 $valtoshow = max(getDolGlobalString('DONATION_MIN_AMOUNT'), $valtoshow);
1953 $amount = $valtoshow;
1955 print '<b class="amount
">'.price($valtoshow, 1, $langs, 1, -1, -1, $currency).'</b>'; // Price with currency
1956 print '<input type="hidden
" name="amount
" value="'.$valtoshow.'">';
1957 print '<input type="hidden
" name="newamount
" value="'.$valtoshow.'">';
1959 print '<input type="hidden
" name="currency
" value="'.$currency.'">';
1960 print '</td></tr>'."\n
";
1963 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("PaymentCode
");
1964 print '</td><td class="CTableRow2
"><b style="word-
break:
break-all;
">'.$fulltag.'</b>';
1965 print '<input type="hidden
" name="tag
" value="'.$tag.'">';
1966 print '<input type="hidden
" name="fulltag
" value="'.$fulltag.'">';
1967 print '</td></tr>'."\n
";
1970 $shipToName = $don->getFullName($langs);
1971 $shipToStreet = $don->address;
1972 $shipToCity = $don->town;
1973 $shipToState = $don->state_code;
1974 $shipToCountryCode = $don->country_code;
1975 $shipToZip = $don->zip;
1976 $shipToStreet2 = '';
1977 $phoneNum = $don->phone;
1978 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
1979 print '<!-- Shipping address information -->';
1980 print '<input type="hidden
" name="shipToName
" value="'.$shipToName.'">'."\n
";
1981 print '<input type="hidden
" name="shipToStreet
" value="'.$shipToStreet.'">'."\n
";
1982 print '<input type="hidden
" name="shipToCity
" value="'.$shipToCity.'">'."\n
";
1983 print '<input type="hidden
" name="shipToState
" value="'.$shipToState.'">'."\n
";
1984 print '<input type="hidden
" name="shipToCountryCode
" value="'.$shipToCountryCode.'">'."\n
";
1985 print '<input type="hidden
" name="shipToZip
" value="'.$shipToZip.'">'."\n
";
1986 print '<input type="hidden
" name="shipToStreet2
" value="'.$shipToStreet2.'">'."\n
";
1987 print '<input type="hidden
" name="phoneNum
" value="'.$phoneNum.'">'."\n
";
1989 print '<!-- Shipping address not complete, so we don t use it -->'."\n
";
1991 if (is_object($don->thirdparty)) {
1992 print '<input type="hidden
" name="thirdparty_id
" value="'.$don->thirdparty->id.'">'."\n
";
1994 print '<input type="hidden
" name="email" value="'.$don->email.'">'."\n
";
1995 $labeldesc = $langs->trans("PaymentSubscription
");
1996 if (GETPOST('desc', 'alpha')) {
1997 $labeldesc = GETPOST('desc', 'alpha');
1999 print '<input type="hidden
" name="desc
" value="'.dol_escape_htmltag($labeldesc).'">'."\n
";
2002if ($source == 'organizedeventregistration' && is_object($thirdparty)) {
2004 $langs->loadLangs(array("members
", "eventorganization
"));
2006 if (GETPOST('fulltag', 'alpha')) {
2007 $fulltag = GETPOST('fulltag', 'alpha');
2009 $fulltag = 'ATT='.$attendee->id.'.DAT='.dol_print_date(dol_now(), '%Y%m%d%H%M%S');
2012 $fulltag .= '.TAG='.$TAG;
2015 $fulltag = dol_string_unaccent($fulltag);
2018 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Creditor
");
2019 print '</td><td class="CTableRow2
"><b>'.$creditor.'</b>';
2020 print '<input type="hidden
" name="creditor
" value="'.$creditor.'">';
2021 print '</td></tr>'."\n
";
2024 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Attendee
");
2025 print '</td><td class="CTableRow2
"><b>';
2026 print $attendee->email;
2027 print($thirdparty->name ? ' ('.$thirdparty->name.')' : '');
2029 print '</td></tr>'."\n
";
2031 if (! is_object($attendee->project)) {
2032 $text = 'ErrorProjectNotFound';
2034 $text = $langs->trans("PaymentEvent
").' - '.$attendee->project->title;
2038 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Designation
");
2039 print '</td><td class="CTableRow2
"><b>'.$text.'</b>';
2040 print '<input type="hidden
" name="source
" value="'.dol_escape_htmltag($source).'">';
2041 print '<input type="hidden
" name="ref" value="'.dol_escape_htmltag($invoice->id).'">';
2042 print '</td></tr>'."\n
";
2045 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Amount
");
2046 print '</td><td class="CTableRow2
">';
2047 $valtoshow = $amount;
2048 print '<b class="amount
">'.price($valtoshow, 1, $langs, 1, -1, -1, $currency).'</b>'; // Price with currency
2049 print '<input type="hidden
" name="amount
" value="'.$valtoshow.'">';
2050 print '<input type="hidden
" name="newamount
" value="'.$valtoshow.'">';
2051 print '<input type="hidden
" name="currency
" value="'.$currency.'">';
2052 print '</td></tr>'."\n
";
2055 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("PaymentCode
");
2056 print '</td><td class="CTableRow2
"><b style="word-
break:
break-all;
">'.$fulltag.'</b>';
2057 print '<input type="hidden
" name="tag
" value="'.$tag.'">';
2058 print '<input type="hidden
" name="fulltag
" value="'.$fulltag.'">';
2059 print '</td></tr>'."\n
";
2062 $shipToName = $thirdparty->getFullName($langs);
2063 $shipToStreet = $thirdparty->address;
2064 $shipToCity = $thirdparty->town;
2065 $shipToState = $thirdparty->state_code;
2066 $shipToCountryCode = $thirdparty->country_code;
2067 $shipToZip = $thirdparty->zip;
2068 $shipToStreet2 = '';
2069 $phoneNum = $thirdparty->phone;
2070 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
2071 print '<!-- Shipping address information -->';
2072 print '<input type="hidden
" name="shipToName
" value="'.$shipToName.'">'."\n
";
2073 print '<input type="hidden
" name="shipToStreet
" value="'.$shipToStreet.'">'."\n
";
2074 print '<input type="hidden
" name="shipToCity
" value="'.$shipToCity.'">'."\n
";
2075 print '<input type="hidden
" name="shipToState
" value="'.$shipToState.'">'."\n
";
2076 print '<input type="hidden
" name="shipToCountryCode
" value="'.$shipToCountryCode.'">'."\n
";
2077 print '<input type="hidden
" name="shipToZip
" value="'.$shipToZip.'">'."\n
";
2078 print '<input type="hidden
" name="shipToStreet2
" value="'.$shipToStreet2.'">'."\n
";
2079 print '<input type="hidden
" name="phoneNum
" value="'.$phoneNum.'">'."\n
";
2081 print '<!-- Shipping address not complete, so we don t use it -->'."\n
";
2083 print '<input type="hidden
" name="thirdparty_id
" value="'.$thirdparty->id.'">'."\n
";
2084 print '<input type="hidden
" name="email" value="'.$thirdparty->email.'">'."\n
";
2085 $labeldesc = $langs->trans("PaymentSubscription
");
2086 if (GETPOST('desc', 'alpha')) {
2087 $labeldesc = GETPOST('desc', 'alpha');
2089 print '<input type="hidden
" name="desc
" value="'.dol_escape_htmltag($labeldesc).'">'."\n
";
2092if ($source == 'boothlocation') {
2094 $langs->load("members
");
2096 if (GETPOST('fulltag', 'alpha')) {
2097 $fulltag = GETPOST('fulltag', 'alpha');
2099 $fulltag = 'BOO='.GETPOST("booth
").'.DAT='.dol_print_date(dol_now(), '%Y%m%d%H%M%S');
2102 $fulltag .= '.TAG='.$TAG;
2105 $fulltag = dol_string_unaccent($fulltag);
2108 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Creditor
");
2109 print '</td><td class="CTableRow2
"><b>'.$creditor.'</b>';
2110 print '<input type="hidden
" name="creditor
" value="'.$creditor.'">';
2111 print '</td></tr>'."\n
";
2114 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Attendee
");
2115 print '</td><td class="CTableRow2
"><b>';
2116 print $thirdparty->name;
2118 print '</td></tr>'."\n
";
2121 $text = '<b>'.$langs->trans("PaymentBoothLocation
").'</b>';
2122 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Designation
");
2123 print '</td><td class="CTableRow2
">'.$text;
2124 print '<input type="hidden
" name="source
" value="'.dol_escape_htmltag($source).'">';
2125 print '<input type="hidden
" name="ref" value="'.dol_escape_htmltag($invoice->id).'">';
2126 print '</td></tr>'."\n
";
2129 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("Amount
");
2130 print '</td><td class="CTableRow2
">';
2131 $valtoshow = $amount;
2132 print '<b class="amount
">'.price($valtoshow, 1, $langs, 1, -1, -1, $currency).'</b>'; // Price with currency
2133 print '<input type="hidden
" name="amount
" value="'.$valtoshow.'">';
2134 print '<input type="hidden
" name="newamount
" value="'.$valtoshow.'">';
2135 print '<input type="hidden
" name="currency
" value="'.$currency.'">';
2136 print '</td></tr>'."\n
";
2139 print '<tr class="CTableRow2
"><td class="CTableRow2
">'.$langs->trans("PaymentCode
");
2140 print '</td><td class="CTableRow2
"><b style="word-
break:
break-all;
">'.$fulltag.'</b>';
2141 print '<input type="hidden
" name="tag
" value="'.$tag.'">';
2142 print '<input type="hidden
" name="fulltag
" value="'.$fulltag.'">';
2143 print '</td></tr>'."\n
";
2146 $shipToName = $thirdparty->getFullName($langs);
2147 $shipToStreet = $thirdparty->address;
2148 $shipToCity = $thirdparty->town;
2149 $shipToState = $thirdparty->state_code;
2150 $shipToCountryCode = $thirdparty->country_code;
2151 $shipToZip = $thirdparty->zip;
2152 $shipToStreet2 = '';
2153 $phoneNum = $thirdparty->phone;
2154 if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) {
2155 print '<!-- Shipping address information -->';
2156 print '<input type="hidden
" name="shipToName
" value="'.$shipToName.'">'."\n
";
2157 print '<input type="hidden
" name="shipToStreet
" value="'.$shipToStreet.'">'."\n
";
2158 print '<input type="hidden
" name="shipToCity
" value="'.$shipToCity.'">'."\n
";
2159 print '<input type="hidden
" name="shipToState
" value="'.$shipToState.'">'."\n
";
2160 print '<input type="hidden
" name="shipToCountryCode
" value="'.$shipToCountryCode.'">'."\n
";
2161 print '<input type="hidden
" name="shipToZip
" value="'.$shipToZip.'">'."\n
";
2162 print '<input type="hidden
" name="shipToStreet2
" value="'.$shipToStreet2.'">'."\n
";
2163 print '<input type="hidden
" name="phoneNum
" value="'.$phoneNum.'">'."\n
";
2165 print '<!-- Shipping address not complete, so we don t use it -->'."\n
";
2167 print '<input type="hidden
" name="thirdparty_id
" value="'.$thirdparty->id.'">'."\n
";
2168 print '<input type="hidden
" name="email" value="'.$thirdparty->email.'">'."\n
";
2169 $labeldesc = $langs->trans("PaymentSubscription
");
2170 if (GETPOST('desc', 'alpha')) {
2171 $labeldesc = GETPOST('desc', 'alpha');
2173 print '<input type="hidden
" name="desc
" value="'.dol_escape_htmltag($labeldesc).'">'."\n
";
2176if (!$found && !$mesg) {
2177 $mesg = $langs->trans("ErrorBadParameters
");
2181 print '<tr><td align="center
" colspan="2
"><br><div class="warning
">'.dol_escape_htmltag($mesg, 1, 1, 'br').'</div></td></tr>'."\n
";
2184print '</table>'."\n
";
2188// Show all payment mode buttons (Stripe, Paypal, ...)
2189if ($action != 'dopayment') {
2190 if ($found && !$error) { // We are in a management option and no error
2191 // Check status of the object (Invoice) to verify if it is paid by external payment modules (ie Payzen, ...)
2193 'source' => $source,
2196 $reshook = $hookmanager->executeHooks('doCheckStatus', $parameters, $object, $action);
2198 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
2199 } elseif ($reshook > 0) {
2200 print $hookmanager->resPrint;
2203 if ($source == 'order' && $object->billed) {
2204 print '<br><br><div class="amountpaymentcomplete size12x wrapimp
">'.$langs->trans("OrderBilled
").'</div>';
2205 } elseif ($source == 'invoice' && $object->paye) {
2206 print '<br><br><div class="amountpaymentcomplete size12x wrapimp
">'.$langs->trans("InvoicePaid
").'</div>';
2207 } elseif ($source == 'donation' && $object->paid) {
2208 print '<br><br><div class="amountpaymentcomplete size12x wrapimp
">'.$langs->trans("DonationPaid
").'</div>';
2210 // Membership can be paid and we still allow to make renewal
2211 if (($source == 'member' || $source == 'membersubscription') && $object->datefin > dol_now()) {
2212 $langs->load("members
");
2213 print '<br><div class="amountpaymentcomplete size12x wrapimp
">';
2214 $s = $langs->trans("MembershipPaid
", '{s1}');
2215 print str_replace('{s1}', '<span class="nobold
">'.dol_print_date($object->datefin, 'day').'</span>', $s);
2217 print '<div class="opacitymedium margintoponly
">'.$langs->trans("PaymentWillBeRecordedForNextPeriod
").'</div>';
2221 // Buttons for all payments registration methods
2223 // This hook is used to add Button to newpayment.php for external payment modules (ie Payzen, ...)
2225 'paymentmethod' => $paymentmethod
2227 $reshook = $hookmanager->executeHooks('doAddButton', $parameters, $object, $action);
2229 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
2230 } elseif ($reshook >= 0) {
2231 print $hookmanager->resPrint;
2234 if ((empty($paymentmethod) || $paymentmethod == 'paybox') && isModEnabled('paybox')) {
2235 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").'">';
2237 print '<span class="buttonpaymentsmall
">'.$langs->trans("CreditOrDebitCard
").'</span>';
2240 $( document ).ready(function() {
2241 $("#div_dopayment_paybox
").click(function(){
2242 $("#dopayment_paybox
").click();
2244 $("#dopayment_paybox
").click(function(e){
2245 $("#div_dopayment_paybox
").css( \'cursor\', \'wait\' );
2246 e.stopPropagation();
2253 if ((empty($paymentmethod) || $paymentmethod == 'stripe') && isModEnabled('stripe')) {
2255 if (getDolGlobalString(strtoupper($source).'_FORCE_DISABLE_STRIPE')) { // Example: MEMBER_FORCE_DISABLE_STRIPE
2260 // By default noidempotency is set to 1, to avoid the error "Keys
for idempotant requests...
". It means we can pay several times the same tag/ref.
2261 // If STRIPE_USE_IDEMPOTENCY_BY_DEFAULT is set or param noidempotency=0 is added, then with add an idempotent key, so we must use a different tag/ref for each payment (if not we will get an error).
2262 $noidempotency_key = (GETPOSTISSET('noidempotency') ? GETPOSTINT('noidempotency') : (getDolGlobalInt('STRIPE_USE_IDEMPOTENCY_BY_DEFAULT') ? 0 : 1));
2264 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").'">';
2265 print '<input type="hidden
" name="noidempotency
" value="'.$noidempotency_key.'">';
2267 print '<span class="buttonpaymentsmall
">'.$langs->trans("CreditOrDebitCard
").'</span>';
2270 $( document ).ready(function() {
2271 $("#div_dopayment_stripe
").click(function(){
2272 $("#dopayment_stripe
").click();
2274 $("#dopayment_stripe
").click(function(e){
2275 $("#div_dopayment_stripe
").css( \'cursor\', \'wait\' );
2276 e.stopPropagation();
2285 if ((empty($paymentmethod) || $paymentmethod == 'paypal') && isModEnabled('paypal')) {
2286 if (!getDolGlobalString('PAYPAL_API_INTEGRAL_OR_PAYPALONLY')) {
2287 $conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY = 'integral';
2291 if (getDolGlobalString(strtoupper($source).'_FORCE_DISABLE_PAYPAL')) { // Example: MEMBER_FORCE_DISABLE_PAYPAL
2296 print '<div class="button buttonpayment
" id="div_dopayment_paypal
">';
2297 if (getDolGlobalString('PAYPAL_API_INTEGRAL_OR_PAYPALONLY') != 'integral') {
2298 print '<div style="line-height: 1em
"> </div>';
2300 print '<span class="fab fa-paypal
"></span> <input class="" type="submit
" id="dopayment_paypal
" name="dopayment_paypal
" value="'.$langs->trans("PaypalDoPayment").'">';
2301 if (getDolGlobalString('PAYPAL_API_INTEGRAL_OR_PAYPALONLY') == 'integral') {
2303 print '<span class="buttonpaymentsmall
">'.$langs->trans("CreditOrDebitCard
").'</span><span class="buttonpaymentsmall
"> - </span>';
2304 print '<span class="buttonpaymentsmall
">'.$langs->trans("PayPalBalance
").'</span>';
2306 //if (getDolGlobalString('PAYPAL_API_INTEGRAL_OR_PAYPALONLY') == 'paypalonly') {
2308 //print '<span class="buttonpaymentsmall
">'.$langs->trans("PayPalBalance
").'"></span>
';
2312 $( document ).ready(
function() {
2313 $(
"#div_dopayment_paypal").click(
function(){
2314 $(
"#dopayment_paypal").click();
2316 $(
"#dopayment_paypal").click(
function(e){
2317 $(
"#div_dopayment_paypal").css( \
'cursor\', \'wait\' );
2318 e.stopPropagation();
2334print
'</td></tr>'.
"\n";
2336print
'</table>'.
"\n";
2338print
'</form>'.
"\n";
2346if (preg_match(
'/^dopayment/', $action)) {
2349 $_SESSION[
"currencyCodeType"] = $currency;
2350 $_SESSION[
"FinalPaymentAmt"] = $amount;
2351 $_SESSION[
'ipaddress'] = ($remoteip ? $remoteip :
'unknown');
2352 $_SESSION[
"paymentType"] =
'';
2357 if (
GETPOST(
'dopayment_stripe',
'alpha')) {
2365 background-color: white;
2368 border: 1px solid transparent;
2369 box-shadow: 0 1px 3px 0 #e6ebf1;
2370 -webkit-transition: box-shadow 150ms ease;
2371 transition: box-shadow 150ms ease;
2374 .StripeElement--focus {
2375 box-shadow: 0 1px 3px 0 #cfd7df;
2378 .StripeElement--invalid {
2379 border-color: #fa755a;
2382 .StripeElement--webkit-autofill {
2383 background-color: #fefde5 !important;
2389 print
'<!-- Show Stripe form payment-form STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION = ' .
getDolGlobalString(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION').
' STRIPE_USE_NEW_CHECKOUT = ' .
getDolGlobalString(
'STRIPE_USE_NEW_CHECKOUT').
' -->'.
"\n";
2390 print
'<form action="'.$_SERVER[
'REQUEST_URI'].
'" method="POST" id="payment-form">'.
"\n";
2392 print
'<input type="hidden" name="token" value="'.newToken().
'">'.
"\n";
2393 print
'<input type="hidden" name="dopayment_stripe" value="1">'.
"\n";
2394 print
'<input type="hidden" name="action" value="charge">'.
"\n";
2395 print
'<input type="hidden" name="tag" value="'.$TAG.
'">'.
"\n";
2396 print
'<input type="hidden" name="s" value="'.$source.
'">'.
"\n";
2397 print
'<input type="hidden" name="ref" value="'.$REF.
'">'.
"\n";
2398 print
'<input type="hidden" name="fulltag" value="'.$FULLTAG.
'">'.
"\n";
2399 print
'<input type="hidden" name="suffix" value="'.$suffix.
'">'.
"\n";
2400 print
'<input type="hidden" name="securekey" value="'.$SECUREKEY.
'">'.
"\n";
2401 print
'<input type="hidden" name="e" value="'.$entity.
'" />'.
"\n";
2402 print
'<input type="hidden" name="amount" value="'.$amount.
'">'.
"\n";
2403 print
'<input type="hidden" name="currency" value="'.$currency.
'">'.
"\n";
2404 print
'<input type="hidden" name="forcesandbox" value="'.GETPOSTINT(
'forcesandbox').
'" />';
2405 print
'<input type="hidden" name="email" value="'.GETPOST(
'email',
'alpha').
'" />';
2406 print
'<input type="hidden" name="thirdparty_id" value="'.GETPOSTINT(
'thirdparty_id').
'" />';
2407 print
'<input type="hidden" name="lang" value="'.$getpostlang.
'">';
2413 if (array_key_exists(
'ORD', $tmptag) && (
int) $tmptag[
'ORD'] > 0) {
2414 include_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
2416 $result =
$object->fetch((
int) $tmptag[
'ORD']);
2418 if (
$object->total_ttc != $amount) {
2425 if (!$checkamount) {
2426 dol_syslog(
"Hack attempt detected", LOG_WARNING);
2427 setEventMessages(
'Bad value for amount. Reported as a hack attempt.',
null,
'errors');
2431 require_once DOL_DOCUMENT_ROOT.
'/stripe/class/stripe.class.php';
2433 $service =
'StripeLive';
2436 $service =
'StripeTest';
2440 $stripe =
new Stripe($db);
2441 $stripeacc = $stripe->getStripeAccount($service);
2443 $stripecu = $stripe->customerStripe(
$object->thirdparty, $stripeacc, $servicestatus, 1);
2449 $noidempotency_key = (GETPOSTISSET(
'noidempotency') ?
GETPOSTINT(
'noidempotency') : (
getDolGlobalInt(
'STRIPE_USE_IDEMPOTENCY_BY_DEFAULT') ? 0 : 1));
2451 $paymentintent = $stripe->getPaymentIntent($amount, $currency, ($tag ? $tag : $fulltag),
'Stripe payment: '.$fulltag.(is_object(
$object) ?
' ref='.
$object->
ref :
''),
$object, $stripecu, $stripeacc, $servicestatus, 0,
'automatic', false, null, 0, $noidempotency_key);
2454 if ($stripe->error) {
2465 <table id="dolpaymenttable" summary="Payment form" class="center centpercent">
2466 <tbody><tr><td class="textpublicpayment">';
2469 print
'<div id="payment-request-button"><!-- A Stripe Element will be inserted here. --></div>';
2472 print
'<div class="form-row '.(getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 2 ?
'center' :
'left').
'">';
2473 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 1) {
2474 print
'<label for="card-element">'.$langs->trans(
"CreditOrDebitCard").
'</label>';
2475 print
'<br><input id="cardholder-name" class="marginbottomonly" name="cardholder-name" value="" type="text" placeholder="'.$langs->trans(
"CardOwner").
'" autocomplete="off" autofocus required>';
2478 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 1) {
2479 print
'<div id="card-element">
2480 <!-- a Stripe Element will be inserted here. -->
2483 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 2) {
2484 print
'<div id="payment-element">
2485 <!-- a Stripe Element will be inserted here. -->
2489 print
'<!-- Used to display form errors -->
2490 <div id="card-errors" role="alert"></div>
2494 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>';
2495 print
'<img id="hourglasstopay" class="hidden" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/img/working.gif">';
2497 print
'</td></tr></tbody>';
2502 if (empty($paymentintent)) {
2503 print
'<center>'.$langs->trans(
"Error").
' - Failed to get PaymentIntent</center>';
2505 print
'<input type="hidden" name="paymentintent_id" value="'.$paymentintent->id.
'">';
2510 print
'</form>'.
"\n";
2514 if (empty($stripearrayofkeys[
'publishable_key'])) {
2515 $langs->load(
"errors");
2516 print
info_admin($langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"Stripe")), 0, 0,
'error');
2518 print
'<!-- JS Code for Stripe components -->';
2519 print
'<script src="https://js.stripe.com/v3/"></script>'.
"\n";
2520 print
'<!-- urllogofull = '.$urllogofull.
' -->'.
"\n";
2523 print
'<script type="text/javascript">'.
"\n";
2526 $amountstripe = $amount;
2530 $arrayzerounitcurrency = array(
'BIF',
'CLP',
'DJF',
'GNF',
'JPY',
'KMF',
'KRW',
'MGA',
'PYG',
'RWF',
'VND',
'VUV',
'XAF',
'XOF',
'XPF');
2531 if (!in_array($currency, $arrayzerounitcurrency)) {
2532 $amountstripe *= 100;
2536 $metadata = array(
'dol_version' => DOL_VERSION,
'dol_entity' =>
$conf->entity,
'ipaddress' => $ipaddress);
2538 $metadata[
'dol_type'] =
$object->element;
2539 $metadata[
'dol_id'] =
$object->id;
2545 $arrayforpaymentintent = array(
2546 'description' =>
'Stripe payment: '.$FULLTAG.($ref ?
' ref='.$ref :
''),
2547 "metadata" => $metadata
2550 $arrayforpaymentintent[
"statement_descriptor"] =
dol_trunc($TAG, 10,
'right',
'UTF-8', 1);
2553 $arrayforcheckout = array(
2554 'payment_method_types' => array(
'card'),
2555 'line_items' => array(array(
2556 'price_data' => array(
2557 'currency' => $currency,
2558 'unit_amount' => $amountstripe,
2559 'product_data' => array(
2560 'name' => $langs->transnoentitiesnoconv(
"Payment").
' '.$TAG,
2561 'description' =>
'Stripe payment: '.$FULLTAG.($ref ?
' ref='.$ref :
''),
2567 'mode' =>
'payment',
2568 'client_reference_id' => $FULLTAG,
2569 'success_url' => $urlok,
2570 'cancel_url' => $urlko,
2571 'payment_intent_data' => $arrayforpaymentintent
2574 $arrayforcheckout[
'customer'] = $stripecu;
2576 $arrayforcheckout[
'customer_email'] =
GETPOST(
'email',
'alpha');
2578 $sessionstripe = \Stripe\Checkout\Session::create($arrayforcheckout);
2583 $_SESSION[
"currencyCodeType"] = $currency;
2584 $_SESSION[
"paymentType"] =
'';
2585 $_SESSION[
"FinalPaymentAmt"] = $amount;
2586 $_SESSION[
'ipaddress'] = ($remoteip ? $remoteip :
'unknown');
2587 $_SESSION[
'payerID'] = is_object($stripecu) ? $stripecu->id :
'';
2588 $_SESSION[
'TRANSACTIONID'] = $sessionstripe->id;
2590 print $e->getMessage();
2596 if (empty($stripeacc)) {
2598 var stripe =
Stripe(
'<?php echo $stripearrayofkeys['publishable_key
']; // Defined into config.php?>');
2602 var stripe =
Stripe(
'<?php echo $stripearrayofkeys['publishable_key
']; // Defined into config.php?>', { stripeAccount:
'<?php echo $stripeacc; ?>' });
2607 var elements = stripe.elements();
2615 fontFamily:
'"Helvetica Neue", Helvetica, sans-serif',
2616 fontSmoothing:
'antialiased',
2624 iconColor:
'#fa755a'
2628 var cardElement = elements.create(
'card', {style: style});
2631 stripe.redirectToCheckout({
2635 sessionId:
'<?php print $sessionstripe->id; ?>'
2636 }).then(
function (result) {
2650 if (empty($stripeacc)) {
2652 var stripe =
Stripe(
'<?php echo $stripearrayofkeys['publishable_key
']; // Defined into config.php?>');
2656 var stripe =
Stripe(
'<?php echo $stripearrayofkeys['publishable_key
']; // Defined into config.php?>', { stripeAccount:
'<?php echo $stripeacc; ?>' });
2661 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 2) {
2663 var cardButton = document.getElementById(
'buttontopay');
2664 var clientSecret = cardButton.dataset.secret;
2665 var options = { clientSecret: clientSecret };
2668 var elements = stripe.elements(options);
2673 var elements = stripe.elements();
2683 fontFamily:
'"Helvetica Neue", Helvetica, sans-serif',
2684 fontSmoothing:
'antialiased',
2692 iconColor:
'#fa755a'
2697 if (
getDolGlobalInt(
'STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION') == 2) {
2699 var paymentElement = elements.create(
"payment");
2702 paymentElement.mount(
"#payment-element");
2705 var cardButton = document.getElementById(
'buttontopay');
2707 cardButton.addEventListener(
'click',
function(event) {
2708 console.log(
"We click on buttontopay");
2709 event.preventDefault();
2712 jQuery(
'#hourglasstopay').show();
2713 jQuery(
'#buttontopay').hide();
2715 stripe.confirmPayment({
2716 elements,confirmParams: {
2717 return_url:
'<?php echo $urlok; ?>',
2718 payment_method_data: {
2722 ?>, email:
'<?php echo dol_escape_js(GETPOST('email
', 'alpha
') ? GETPOST('email
', 'alpha
') : $object->thirdparty->email); ?>'<?php
2725 ?>, phone:
'<?php echo dol_escape_js($object->thirdparty->phone); ?>'<?php
2729 city:
'<?php echo dol_escape_js($object->thirdparty->town); ?>',
2730 <?php if ($object->thirdparty->country_code) {
2731 ?>country:
'<?php echo dol_escape_js($object->thirdparty->country_code); ?>',<?php
2733 line1:
'<?php echo dol_escape_js(preg_replace('/\s\s+/
', ' ', $object->thirdparty->address)); ?>',
2734 postal_code:
'<?php echo dol_escape_js($object->thirdparty->zip); ?>'
2740 save_payment_method:<?php
if ($stripecu) {
2747 ).then(
function(result) {
2748 console.log(result);
2750 console.log(
"Error on result of handleCardPayment");
2751 jQuery(
'#buttontopay').show();
2752 jQuery(
'#hourglasstopay').hide();
2754 var errorElement = document.getElementById(
'card-errors');
2755 console.log(result);
2756 errorElement.textContent = result.error.message;
2759 console.log(
"No error on result of handleCardPayment, so we submit the form");
2761 jQuery(
'#buttontopay').hide();
2762 jQuery(
'#hourglasstopay').show();
2764 jQuery(
'#payment-form').submit();
2772 var cardElement = elements.create(
'card', {style: style});
2775 cardElement.mount(
'#card-element');
2778 cardElement.addEventListener(
'change',
function(event) {
2779 var displayError = document.getElementById(
'card-errors');
2781 console.log(
"Show event error (like 'Incorrect card number', ...)");
2782 displayError.textContent =
event.error.message;
2784 console.log(
"Reset error message");
2785 displayError.textContent =
'';
2790 var cardholderName = document.getElementById(
'cardholder-name');
2791 var cardButton = document.getElementById(
'buttontopay');
2792 var clientSecret = cardButton.dataset.secret;
2794 cardButton.addEventListener(
'click',
function(event) {
2795 console.log(
"We click on buttontopay");
2796 event.preventDefault();
2798 if (cardholderName.value ==
'')
2800 console.log(
"Field Card holder is empty");
2801 var displayError = document.getElementById(
'card-errors');
2802 displayError.textContent =
'<?php print dol_escape_js($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CardOwner"))); ?>';
2807 jQuery(
'#hourglasstopay').show();
2808 jQuery(
'#buttontopay').hide();
2810 stripe.handleCardPayment(
2811 clientSecret, cardElement, {
2812 payment_method_data: {
2814 name: cardholderName.value
2816 ?>, email:
'<?php echo dol_escape_js(GETPOST('email
', 'alpha
') ? GETPOST('email
', 'alpha
') : $object->thirdparty->email); ?>'<?php
2819 ?>, phone:
'<?php echo dol_escape_js($object->thirdparty->phone); ?>'<?php
2823 city:
'<?php echo dol_escape_js($object->thirdparty->town); ?>',
2824 <?php if ($object->thirdparty->country_code) {
2825 ?>country:
'<?php echo dol_escape_js($object->thirdparty->country_code); ?>',<?php
2827 line1:
'<?php echo dol_escape_js(preg_replace('/\s\s+/
', ' ', $object->thirdparty->address)); ?>',
2828 postal_code:
'<?php echo dol_escape_js($object->thirdparty->zip); ?>'
2834 save_payment_method:<?php
if ($stripecu) {
2840 ).then(
function(result) {
2841 console.log(result);
2843 console.log(
"Error on result of handleCardPayment");
2844 jQuery(
'#buttontopay').show();
2845 jQuery(
'#hourglasstopay').hide();
2847 var errorElement = document.getElementById(
'card-errors');
2848 errorElement.textContent = result.error.message;
2851 console.log(
"No error on result of handleCardPayment, so we submit the form");
2853 jQuery(
'#buttontopay').hide();
2854 jQuery(
'#hourglasstopay').show();
2856 jQuery(
'#payment-form').submit();
2874 'paymentmethod' => $paymentmethod,
2875 'amount' => $amount,
2876 'currency' => $currency,
2877 'tag' =>
GETPOST(
"tag",
'alpha'),
2878 'dopayment' =>
GETPOST(
'dopayment',
'alpha')
2880 $reshook = $hookmanager->executeHooks(
'doPayment', $parameters,
$object, $action);
2883 } elseif ($reshook > 0) {
2884 print $hookmanager->resPrint;
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage members of a foundation.
Class to manage members type.
Class to manage customers orders.
Class for ConferenceOrBoothAttendee.
Class to manage lines of contracts.
Class to manage invoices.
Class to manage payments of donations.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
Stripe class @TODO No reason to extends CommonObject.
htmlPrintOnlineFooter($fromcompany, $langs, $addformmessage=0, $suffix='', $object=null)
Show footer of company in HTML public pages.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as p label as s rowid as s nom as s email
Sender: Who sends the email ("Sender" has sent emails on behalf of "From").
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
dolExplodeIntoArray($string, $delimiter=';', $kv='=')
Split a string with 2 keys into key array.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
dol_now($mode='auto')
Return date for now.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_string_unaccent($str)
Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error_email($prefixcode, $errormessage='', $errormessages=array(), $morecss='error', $email='')
Show a public email and error code to contact if technical error.
dol_htmloutput_mesg($mesgstring='', $mesgarray=array(), $style='ok', $keepembedded=0)
Print formatted messages to output (Used to show messages on html output).
getUserRemoteIP($trusted=0)
Return the real IP of remote user.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
ui state ui widget content ui state ui widget header ui state a ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
if(!defined( 'CSRFCHECK_WITH_TOKEN'))
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
print_paybox_redirect($PRICE, $CURRENCY, $EMAIL, $urlok, $urlko, $TAG)
Create a redirect form to paybox form.
print_paypal_redirect($paymentAmount, $currencyCodeType, $paymentType, $returnURL, $cancelURL, $tag)
Send redirect to paypal to browser.
$conf db name
Only used if Module[ID]Name translation string is not found.
getRandomPassword($generic=false, $replaceambiguouschars=null, $length=32)
Return a generated password using default module.
dol_verifyHash($chain, $hash, $type='0')
Compute a hash and compare it to the given one For backward compatibility reasons,...