19 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
 
   20 require_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
 
   21 require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
 
   22 require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
 
   23 require_once DOL_DOCUMENT_ROOT.
'/stripe/config.php'; 
 
   95       $entity = $conf->entity;
 
   98     $sql = 
"SELECT tokenstring";
 
   99     $sql .= 
" FROM ".MAIN_DB_PREFIX.
"oauth_token";
 
  100     $sql .= 
" WHERE service = '".$this->db->escape($mode).
"'";
 
  101     $sql .= 
" AND entity = ".((int) $entity);
 
  103       $sql .= 
" AND fk_soc = ".((int) $fk_soc);
 
  105       $sql .= 
" AND fk_soc IS NULL";
 
  107     $sql .= 
" AND fk_user IS NULL AND fk_adherent IS NULL";
 
  109     dol_syslog(get_class($this).
"::getStripeAccount", LOG_DEBUG);
 
  111     $result = $this->
db->query($sql);
 
  113       if ($this->
db->num_rows($result)) {
 
  114         $obj = $this->
db->fetch_object($result);
 
  115         $tokenstring = $obj->tokenstring;
 
  117         $tmparray = json_decode($tokenstring);
 
  118         $key = empty($tmparray->stripe_user_id) ? 
'' : $tmparray->stripe_user_id;
 
  126     dol_syslog(
"No dedicated Stripe Connect account available for entity ".$conf->entity);
 
  140     include_once DOL_DOCUMENT_ROOT.
'/societe/class/societeaccount.class.php';
 
  142     return $societeaccount->getCustomerAccount($id, 
'stripe', $status, $site_account); 
 
  160     if (empty($object->id)) {
 
  161       dol_syslog(
"customerStripe is called with the parameter object that is not loaded");
 
  168     global $stripearrayofkeysbyenv;
 
  169     \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
 
  171     $sql = 
"SELECT sa.key_account as key_account, sa.entity"; 
 
  172     $sql .= 
" FROM ".MAIN_DB_PREFIX.
"societe_account as sa";
 
  173     $sql .= 
" WHERE sa.fk_soc = ".((int) $object->id);
 
  174     $sql .= 
" AND sa.entity IN (".getEntity(
'societe').
")";
 
  175     $sql .= 
" AND sa.site = 'stripe' AND sa.status = ".((int) $status);
 
  176     $sql .= 
" AND (sa.site_account IS NULL OR sa.site_account = '' OR sa.site_account = '".$this->db->escape($stripearrayofkeysbyenv[$status][
'publishable_key']).
"')";
 
  177     $sql .= 
" AND sa.key_account IS NOT NULL AND sa.key_account <> ''";
 
  179     dol_syslog(get_class($this).
"::customerStripe search stripe customer id for thirdparty id=".$object->id, LOG_DEBUG);
 
  184         $obj = $this->
db->fetch_object(
$resql);
 
  185         $tiers = $obj->key_account;
 
  187         dol_syslog(get_class($this).
"::customerStripe found stripe customer key_account = ".$tiers.
". We will try to read it on Stripe with publishable_key = ".$stripearrayofkeysbyenv[$status][
'publishable_key']);
 
  192             $customer = \Stripe\Customer::retrieve(array(
'id'=>
"$tiers", 
'expand[]'=>
'sources'));
 
  195             $customer = \Stripe\Customer::retrieve(array(
'id'=>
"$tiers", 
'expand[]'=>
'sources'), array(
"stripe_account" => $key));
 
  199           $this->error = $e->getMessage();
 
  201       } elseif ($createifnotlinkedtostripe) {
 
  204         $dataforcustomer = array(
 
  205           "email" => $object->email,
 
  206           "description" => $object->name,
 
  207           "metadata" => array(
'dol_id'=>$object->id, 
'dol_version'=>DOL_VERSION, 
'dol_entity'=>$conf->entity, 
'ipaddress'=>$ipaddress)
 
  210         $vatcleaned = $object->tva_intra ? $object->tva_intra : 
null;
 
  227           global $stripearrayofkeysbyenv;
 
  228           \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
 
  231             $customer = \Stripe\Customer::create($dataforcustomer);
 
  233             $customer = \Stripe\Customer::create($dataforcustomer, array(
"stripe_account" => $key));
 
  237           if (!empty($conf->global->STRIPE_SAVE_TAX_IDS)) { 
 
  238             if (!empty($vatcleaned)) {
 
  240               if ($object->country_code && $isineec) {
 
  242                 $customer->createTaxId($customer->id, array(
'type'=>
'eu_vat', 
'value'=>$vatcleaned));
 
  248           $sql = 
"INSERT INTO ".MAIN_DB_PREFIX.
"societe_account (fk_soc, login, key_account, site, site_account, status, entity, date_creation, fk_user_creat)";
 
  249           $sql .= 
" VALUES (".((int) $object->id).
", '', '".$this->
db->escape($customer->id).
"', 'stripe', '".$this->
db->escape($stripearrayofkeysbyenv[$status][
'publishable_key']).
"', ".((int) $status).
", ".((int) $conf->entity).
", '".$this->
db->idate(
dol_now()).
"', ".((
int) $user->id).
")";
 
  252             $this->error = $this->
db->lasterror();
 
  255           $this->error = $e->getMessage();
 
  275     $stripepaymentmethod = 
null;
 
  279       global $stripearrayofkeysbyenv;
 
  280       \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
 
  282         $stripepaymentmethod = \Stripe\PaymentMethod::retrieve((
string) $paymentmethod->id);
 
  284         $stripepaymentmethod = \Stripe\PaymentMethod::retrieve((
string) $paymentmethod->id, array(
"stripe_account" => $key));
 
  287       $this->error = $e->getMessage();
 
  290     return $stripepaymentmethod;
 
  303     $selectedreader = 
null;
 
  307       global $stripearrayofkeysbyenv;
 
  308       \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
 
  310         $selectedreader = \Stripe\Terminal\Reader::retrieve((
string) $reader);
 
  312         $stripepaymentmethod = \Stripe\Terminal\Reader::retrieve((
string) $reader, array(
"stripe_account" => $key));
 
  315       $this->error = $e->getMessage();
 
  318     return $selectedreader;
 
  346   public function getPaymentIntent($amount, $currency_code, $tag, $description = 
'', $object = 
null, $customer = 
null, $key = 
null, $status = 0, $usethirdpartyemailforreceiptemail = 0, $mode = 
'automatic', $confirmnow = 
false, $payment_method = 
null, $off_session = 0, $noidempotency_key = 1)
 
  350     dol_syslog(get_class($this).
"::getPaymentIntent", LOG_INFO, 1);
 
  354     if (empty($status)) {
 
  355       $service = 
'StripeTest';
 
  357       $service = 
'StripeLive';
 
  360     $arrayzerounitcurrency = array(
'BIF', 
'CLP', 
'DJF', 
'GNF', 
'JPY', 
'KMF', 
'KRW', 
'MGA', 
'PYG', 
'RWF', 
'VND', 
'VUV', 
'XAF', 
'XOF', 
'XPF');
 
  361     if (!in_array($currency_code, $arrayzerounitcurrency)) {
 
  362       $stripeamount = $amount * 100;
 
  364       $stripeamount = $amount;
 
  367     $fee = $amount * ($conf->global->STRIPE_APPLICATION_FEE_PERCENT / 100) + $conf->global->STRIPE_APPLICATION_FEE;
 
  368     if ($fee >= $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL && $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL > $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) {
 
  369       $fee = $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL;
 
  370     } elseif ($fee < $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) {
 
  371       $fee = $conf->global->STRIPE_APPLICATION_FEE_MINIMAL;
 
  373     if (!in_array($currency_code, $arrayzerounitcurrency)) {
 
  374       $stripefee = round($fee * 100);
 
  376       $stripefee = round($fee);
 
  379     $paymentintent = 
null;
 
  388       $sql = 
"SELECT pi.ext_payment_id, pi.entity, pi.fk_facture, pi.sourcetype, pi.ext_payment_site";
 
  389       $sql .= 
" FROM ".MAIN_DB_PREFIX.
"prelevement_demande as pi";
 
  390       $sql .= 
" WHERE pi.fk_facture = ".((int) $object->id);
 
  391       $sql .= 
" AND pi.sourcetype = '".$this->db->escape($object->element).
"'";
 
  392       $sql .= 
" AND pi.entity IN (".getEntity(
'societe').
")";
 
  393       $sql .= 
" AND pi.ext_payment_site = '".$this->db->escape($service).
"'";
 
  395       dol_syslog(get_class($this).
"::getPaymentIntent search stripe payment intent for object id = ".$object->id, LOG_DEBUG);
 
  400           $obj = $this->
db->fetch_object(
$resql);
 
  401           $intent = $obj->ext_payment_id;
 
  403           dol_syslog(get_class($this).
"::getPaymentIntent found existing payment intent record");
 
  406           global $stripearrayofkeysbyenv;
 
  407           \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
 
  411               $paymentintent = \Stripe\PaymentIntent::retrieve($intent);
 
  413               $paymentintent = \Stripe\PaymentIntent::retrieve($intent, array(
"stripe_account" => $key));
 
  417             $this->error = $e->getMessage();
 
  423     if (empty($paymentintent)) {
 
  426       $metadata = array(
'dol_version'=>DOL_VERSION, 
'dol_entity'=>$conf->entity, 
'ipaddress'=>$ipaddress);
 
  427       if (is_object($object)) {
 
  428         $metadata[
'dol_type'] = $object->element;
 
  429         $metadata[
'dol_id'] = $object->id;
 
  430         if (is_object($object->thirdparty) && $object->thirdparty->id > 0) {
 
  431           $metadata[
'dol_thirdparty_id'] = $object->thirdparty->id;
 
  436       $paymentmethodtypes = array(
"card");
 
  437       $descriptor = 
dol_trunc($tag, 10, 
'right', 
'UTF-8', 1);
 
  439         $paymentmethodtypes[] = 
"sepa_debit"; 
 
  443         $paymentmethodtypes[] = 
"klarna";
 
  446         $paymentmethodtypes[] = 
"bancontact";
 
  449         $paymentmethodtypes[] = 
"ideal";
 
  452         $paymentmethodtypes[] = 
"giropay";
 
  455         $paymentmethodtypes[] = 
"sofort";
 
  458         $paymentmethodtypes = array(
"card_present");
 
  461       $dataforintent = array(
 
  462         "confirm" => $confirmnow, 
 
  463         "confirmation_method" => $mode,
 
  464         "amount" => $stripeamount,
 
  465         "currency" => $currency_code,
 
  466         "payment_method_types" => $paymentmethodtypes,
 
  467         "description" => $description,
 
  468         "statement_descriptor_suffix" => $descriptor, 
 
  469         "statement_descriptor" => $descriptor, 
 
  471         "setup_future_usage" => 
"on_session",
 
  472         "metadata" => $metadata
 
  474       if (!is_null($customer)) {
 
  475         $dataforintent[
"customer"] = $customer;
 
  481         unset($dataforintent[
'setup_future_usage']);
 
  485         $dataforintent[
"off_session"] = 
true;
 
  488         unset($dataforintent[
'setup_future_usage']);
 
  491         unset($dataforintent[
'setup_future_usage']);
 
  494         unset($dataforintent[
'setup_future_usage']);
 
  495         $dataforintent[
"capture_method"] = 
"manual";
 
  496         $dataforintent[
"confirmation_method"] = 
"manual";
 
  498       if (!is_null($payment_method)) {
 
  499         $dataforintent[
"payment_method"] = $payment_method;
 
  500         $description .= 
' - '.$payment_method;
 
  503       if ($conf->entity != 
getDolGlobalInt(
'STRIPECONNECT_PRINCIPAL') && $stripefee > 0) {
 
  504         $dataforintent[
"application_fee_amount"] = $stripefee;
 
  506       if ($usethirdpartyemailforreceiptemail && is_object($object) && $object->thirdparty->email) {
 
  507         $dataforintent[
"receipt_email"] = $object->thirdparty->email;
 
  512         global $stripearrayofkeysbyenv;
 
  513         \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
 
  515         $arrayofoptions = array();
 
  516         if (empty($noidempotency_key)) {
 
  517           $arrayofoptions[
"idempotency_key"] = $description;
 
  521           $arrayofoptions[
"stripe_account"] = $key;
 
  524         dol_syslog(
"dataforintent to create paymentintent = ".var_export($dataforintent, 
true));
 
  526         $paymentintent = \Stripe\PaymentIntent::create($dataforintent, $arrayofoptions);
 
  529         if (is_object($object)) {
 
  530           $paymentintentalreadyexists = 0;
 
  532           $sql = 
"SELECT pi.rowid";
 
  533           $sql .= 
" FROM ".MAIN_DB_PREFIX.
"prelevement_demande as pi";
 
  534           $sql .= 
" WHERE pi.entity IN (".getEntity(
'societe').
")";
 
  535           $sql .= 
" AND pi.ext_payment_site = '".$this->db->escape($service).
"'";
 
  536           $sql .= 
" AND pi.ext_payment_id = '".$this->db->escape($paymentintent->id).
"'";
 
  538           dol_syslog(get_class($this).
"::getPaymentIntent search if payment intent already in prelevement_demande", LOG_DEBUG);
 
  543               $obj = $this->
db->fetch_object(
$resql);
 
  545                 $paymentintentalreadyexists++;
 
  553           if (!$paymentintentalreadyexists) {
 
  555             $sql = 
"INSERT INTO ".MAIN_DB_PREFIX.
"prelevement_demande (date_demande, fk_user_demande, ext_payment_id, fk_facture, sourcetype, entity, ext_payment_site, amount)";
 
  556             $sql .= 
" VALUES ('".$this->db->idate($now).
"', ".((int) $user->id).
", '".$this->
db->escape($paymentintent->id).
"', ".((int) $object->id).
", '".$this->
db->escape($object->element).
"', ".((int) $conf->entity).
", '".$this->
db->escape($service).
"', ".((
float) $amount).
")";
 
  560               $this->error = $this->
db->lasterror();
 
  561               dol_syslog(get_class($this).
"::PaymentIntent failed to insert paymentintent with id=".$paymentintent->id.
" into database.", LOG_ERR);
 
  565           $_SESSION[
"stripe_payment_intent"] = $paymentintent;
 
  567       } 
catch (
Stripe\Error\Card $e) {
 
  569         $this->error = $e->getMessage();
 
  570         $this->
code = $e->getStripeCode();
 
  571         $this->declinecode = $e->getDeclineCode();
 
  580         $this->error = $e->getMessage();
 
  582         $this->declinecode = 
'';
 
  586     dol_syslog(get_class($this).
"::getPaymentIntent return error=".$error.
" this->error=".$this->error, LOG_INFO, -1);
 
  589       return $paymentintent;
 
  613   public function getSetupIntent($description, $object, $customer, $key, $status, $usethirdpartyemailforreceiptemail = 0, $confirmnow = 
false)
 
  617     dol_syslog(
"getSetupIntent description=".$description.
' confirmnow='.$confirmnow, LOG_INFO, 1);
 
  621     if (empty($status)) {
 
  622       $service = 
'StripeTest';
 
  624       $service = 
'StripeLive';
 
  629     if (empty($setupintent)) {
 
  631       $metadata = array(
'dol_version'=>DOL_VERSION, 
'dol_entity'=>$conf->entity, 
'ipaddress'=>$ipaddress);
 
  632       if (is_object($object)) {
 
  633         $metadata[
'dol_type'] = $object->element;
 
  634         $metadata[
'dol_id'] = $object->id;
 
  635         if (is_object($object->thirdparty) && $object->thirdparty->id > 0) {
 
  636           $metadata[
'dol_thirdparty_id'] = $object->thirdparty->id;
 
  641       $paymentmethodtypes = array(
"card");
 
  642       if (!empty($conf->global->STRIPE_SEPA_DIRECT_DEBIT)) {
 
  643         $paymentmethodtypes[] = 
"sepa_debit"; 
 
  645       if (!empty($conf->global->STRIPE_BANCONTACT)) {
 
  646         $paymentmethodtypes[] = 
"bancontact";
 
  648       if (!empty($conf->global->STRIPE_IDEAL)) {
 
  649         $paymentmethodtypes[] = 
"ideal";
 
  652       if (!empty($conf->global->STRIPE_SOFORT)) {
 
  653         $paymentmethodtypes[] = 
"sofort";
 
  656       $dataforintent = array(
 
  657         "confirm" => $confirmnow, 
 
  658         "payment_method_types" => $paymentmethodtypes,
 
  659         "usage" => 
"off_session",
 
  660         "metadata" => $metadata
 
  662       if (!is_null($customer)) {
 
  663         $dataforintent[
"customer"] = $customer;
 
  665       if (!is_null($description)) {
 
  666         $dataforintent[
"description"] = $description;
 
  672       if ($usethirdpartyemailforreceiptemail && is_object($object) && $object->thirdparty->email) {
 
  673         $dataforintent[
"receipt_email"] = $object->thirdparty->email;
 
  678         global $stripearrayofkeysbyenv;
 
  679         \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
 
  681         dol_syslog(
"getSetupIntent ".$stripearrayofkeysbyenv[$status][
'publishable_key'], LOG_DEBUG);
 
  686           $setupintent = \Stripe\SetupIntent::create($dataforintent, array());
 
  689           $setupintent = \Stripe\SetupIntent::create($dataforintent, array(
"stripe_account" => $key));
 
  742         $this->error = $e->getMessage();
 
  747       dol_syslog(
"getSetupIntent ".(is_object($setupintent) ? $setupintent->id : 
''), LOG_INFO, -1);
 
  750       dol_syslog(
"getSetupIntent return error=".$error, LOG_INFO, -1);
 
  768     global $conf, $user, $langs;
 
  772     $sql = 
"SELECT sa.stripe_card_ref, sa.proprio, sa.exp_date_month, sa.exp_date_year, sa.number, sa.cvn"; 
 
  773     $sql .= 
" FROM ".MAIN_DB_PREFIX.
"societe_rib as sa";
 
  774     $sql .= 
" WHERE sa.rowid = ".((int) $object->id); 
 
  775     $sql .= 
" AND sa.type = 'card'";
 
  777     dol_syslog(get_class($this).
"::cardStripe search stripe card id for paymentmode id=".$object->id.
", stripeacc=".$stripeacc.
", status=".$status.
", createifnotlinkedtostripe=".$createifnotlinkedtostripe, LOG_DEBUG);
 
  782         $obj = $this->
db->fetch_object(
$resql);
 
  783         $cardref = $obj->stripe_card_ref;
 
  784         dol_syslog(get_class($this).
"::cardStripe cardref=".$cardref);
 
  787             if (empty($stripeacc)) {        
 
  788               if (!preg_match(
'/^pm_/', $cardref) && !empty($cu->sources)) {
 
  789                 $card = $cu->sources->retrieve($cardref);
 
  791                 $card = \Stripe\PaymentMethod::retrieve($cardref);
 
  794               if (!preg_match(
'/^pm_/', $cardref) && !empty($cu->sources)) {
 
  796                 $card = $cu->sources->retrieve($cardref);
 
  799                 $card = \Stripe\PaymentMethod::retrieve($cardref);
 
  803             $this->error = $e->getMessage();
 
  806         } elseif ($createifnotlinkedtostripe) {
 
  807           $exp_date_month = $obj->exp_date_month;
 
  808           $exp_date_year = $obj->exp_date_year;
 
  809           $number = $obj->number;
 
  811           $cardholdername = $obj->proprio;
 
  815           $dataforcard = array(
 
  816             "source" => array(
'object'=>
'card', 
'exp_month'=>$exp_date_month, 
'exp_year'=>$exp_date_year, 
'number'=>$number, 
'cvc'=>$cvc, 
'name'=>$cardholdername),
 
  817             "metadata" => array(
'dol_id'=>$object->id, 
'dol_version'=>DOL_VERSION, 
'dol_entity'=>$conf->entity, 
'ipaddress'=>$ipaddress)
 
  824             if (empty($stripeacc)) {        
 
  825               if (empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) {
 
  826                 dol_syslog(
"Try to create card with dataforcard = ".json_encode($dataforcard));
 
  827                 $card = $cu->sources->create($dataforcard);
 
  829                   $this->error = 
'Creation of card on Stripe has failed';
 
  833                 if (!empty($stripeacc)) {
 
  834                   $connect = $stripeacc.
'/';
 
  836                 $url = 
'https://dashboard.stripe.com/'.$connect.
'test/customers/'.$cu->id;
 
  838                   $url = 
'https://dashboard.stripe.com/'.$connect.
'customers/'.$cu->id;
 
  840                 $urtoswitchonstripe = 
' <a href="'.$url.
'" target="_stripe">'.
img_picto($langs->trans(
'ShowInStripe'), 
'globe').
'</a>';
 
  843                 $this->error = $langs->trans(
'CreationOfPaymentModeMustBeDoneFromStripeInterface', $urtoswitchonstripe);
 
  846               if (empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) {
 
  847                 dol_syslog(
"Try to create card with dataforcard = ".json_encode($dataforcard));
 
  848                 $card = $cu->sources->create($dataforcard, array(
"stripe_account" => $stripeacc));
 
  850                   $this->error = 
'Creation of card on Stripe has failed';
 
  854                 if (!empty($stripeacc)) {
 
  855                   $connect = $stripeacc.
'/';
 
  857                 $url = 
'https://dashboard.stripe.com/'.$connect.
'test/customers/'.$cu->id;
 
  859                   $url = 
'https://dashboard.stripe.com/'.$connect.
'customers/'.$cu->id;
 
  861                 $urtoswitchonstripe = 
' <a href="'.$url.
'" target="_stripe">'.
img_picto($langs->trans(
'ShowInStripe'), 
'globe').
'</a>';
 
  864                 $this->error = $langs->trans(
'CreationOfPaymentModeMustBeDoneFromStripeInterface', $urtoswitchonstripe);
 
  869               $sql = 
"UPDATE ".MAIN_DB_PREFIX.
"societe_rib";
 
  870               $sql .= 
" SET stripe_card_ref = '".$this->db->escape($card->id).
"', card_type = '".$this->
db->escape($card->brand).
"',";
 
  871               $sql .= 
" country_code = '".$this->db->escape($card->country).
"',";
 
  872               $sql .= 
" approved = ".($card->cvc_check == 
'pass' ? 1 : 0);
 
  873               $sql .= 
" WHERE rowid = ".((int) $object->id);
 
  874               $sql .= 
" AND type = 'card'";
 
  877                 $this->error = $this->
db->lasterror();
 
  881             $this->error = $e->getMessage();
 
  906     global $conf, $user, $langs;
 
  909     $sql = 
"SELECT sa.stripe_card_ref, sa.proprio, sa.iban_prefix"; 
 
  910     $sql .= 
" FROM ".MAIN_DB_PREFIX.
"societe_rib as sa";
 
  911     $sql .= 
" WHERE sa.rowid = ".((int) $object->id); 
 
  912     $sql .= 
" AND sa.type = 'ban'"; 
 
  915     $soc->fetch($object->fk_soc);
 
  917     dol_syslog(get_class($this).
"::sepaStripe search stripe ban id for paymentmode id=".$object->id.
", stripeacc=".$stripeacc.
", status=".$status.
", createifnotlinkedtostripe=".$createifnotlinkedtostripe, LOG_DEBUG);
 
  922         $obj = $this->
db->fetch_object(
$resql);
 
  923         $cardref = $obj->stripe_card_ref;
 
  924         dol_syslog(get_class($this).
"::sepaStripe cardref=".$cardref);
 
  927             if (empty($stripeacc)) {        
 
  928               if (!preg_match(
'/^pm_/', $cardref) && !empty($cu->sources)) {
 
  929                 $sepa = $cu->sources->retrieve($cardref);
 
  931                 $sepa = \Stripe\PaymentMethod::retrieve($cardref);
 
  934               if (!preg_match(
'/^pm_/', $cardref) && !empty($cu->sources)) {
 
  936                 $sepa = $cu->sources->retrieve($cardref);
 
  939                 $sepa = \Stripe\PaymentMethod::retrieve($cardref);
 
  943             $this->error = $e->getMessage();
 
  946         } elseif ($createifnotlinkedtostripe) {
 
  947           $iban = $obj->iban_prefix; 
 
  950           $dataforcard = array(
 
  951             'type'=>
'sepa_debit',
 
  952             "sepa_debit" => array(
'iban' => $iban),
 
  954             'usage' => 
'reusable',
 
  956               'name' => $soc->name,
 
  958             "metadata" => array(
'dol_id'=>$object->id, 
'dol_version'=>DOL_VERSION, 
'dol_entity'=>$conf->entity, 
'ipaddress'=>$ipaddress)
 
  966             $service = 
'StripeTest';
 
  968             if (!empty($conf->global->STRIPE_LIVE) && !
GETPOST(
'forcesandbox', 
'alpha')) {
 
  969               $service = 
'StripeLive';
 
  973             global $stripearrayofkeysbyenv;
 
  974             $stripeacc = $stripearrayofkeysbyenv[$servicestatus][
'secret_key'];
 
  976             dol_syslog(
"Try to create sepa_debit with data = ".json_encode($dataforcard));
 
  977             $s = new \Stripe\StripeClient($stripeacc);
 
  978             $sepa = $s->sources->create($dataforcard);
 
  980               $this->error = 
'Creation of sepa_debit on Stripe has failed';
 
  983               $cs = $cu->createSource($cu->id, array(
'source' => $sepa->id));
 
  985                 $this->error = 
'Link SEPA <-> Customer failed';
 
  990                 $sql = 
"UPDATE ".MAIN_DB_PREFIX.
"societe_rib";
 
  991                 $sql .= 
" SET stripe_card_ref = '".$this->db->escape($sepa->id).
"', card_type = 'sepa_debit',";
 
  992                 $sql .= 
" stripe_account= '" . $this->
db->escape($cu->id . 
"@" . $stripeacc) . 
"'";
 
  993                 $sql .= 
" WHERE rowid = ".((int) $object->id);
 
  994                 $sql .= 
" AND type = 'ban'";
 
  997                   $this->error = $this->
db->lasterror();
 
 1002             $this->error = $e->getMessage();
 
 1030   public function createPaymentStripe($amount, $currency, $origin, $item, $source, $customer, $account, $status = 0, $usethirdpartyemailforreceiptemail = 0, $capture = 
true)
 
 1036     if (empty($status)) {
 
 1037       $service = 
'StripeTest';
 
 1039       $service = 
'StripeLive';
 
 1042     $sql = 
"SELECT sa.key_account as key_account, sa.fk_soc, sa.entity";
 
 1043     $sql .= 
" FROM ".MAIN_DB_PREFIX.
"societe_account as sa";
 
 1044     $sql .= 
" WHERE sa.key_account = '".$this->db->escape($customer).
"'";
 
 1046     $sql .= 
" AND sa.site = 'stripe' AND sa.status = ".((int) $status);
 
 1048     dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
 
 1049     $result = $this->
db->query($sql);
 
 1051       if ($this->
db->num_rows($result)) {
 
 1052         $obj = $this->
db->fetch_object($result);
 
 1053         $key = $obj->fk_soc;
 
 1061     $arrayzerounitcurrency = array(
'BIF', 
'CLP', 
'DJF', 
'GNF', 
'JPY', 
'KMF', 
'KRW', 
'MGA', 
'PYG', 
'RWF', 
'VND', 
'VUV', 
'XAF', 
'XOF', 
'XPF');
 
 1062     if (!in_array($currency, $arrayzerounitcurrency)) {
 
 1063       $stripeamount = $amount * 100;
 
 1065       $stripeamount = $amount;
 
 1070       $societe->fetch($key);
 
 1075     if ($origin == 
'order') {
 
 1077       $order->fetch($item);
 
 1079       $description = 
"ORD=".$ref.
".CUS=".$societe->id.
".PM=stripe";
 
 1080     } elseif ($origin == 
'invoice') {
 
 1082       $invoice->fetch($item);
 
 1083       $ref = $invoice->ref;
 
 1084       $description = 
"INV=".$ref.
".CUS=".$societe->id.
".PM=stripe";
 
 1090       "dol_id" => (
string) $item,
 
 1091       "dol_type" => (
string) $origin,
 
 1092       "dol_thirdparty_id" => (
string) $societe->id,
 
 1093       'dol_thirdparty_name' => $societe->name,
 
 1094       'dol_version' => DOL_VERSION,
 
 1095       'dol_entity' => $conf->entity,
 
 1096       'ipaddress' => $ipaddress
 
 1101       global $stripearrayofkeysbyenv;
 
 1102       \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
 
 1104       if (empty($conf->stripeconnect->enabled)) { 
 
 1105         if (preg_match(
'/pm_/i', $source)) {
 
 1106           $stripecard = $source;
 
 1107           $amountstripe = $stripeamount;
 
 1110           $amounttopay = $amount;
 
 1111           $servicestatus = $status;
 
 1113           dol_syslog(
"* createPaymentStripe get stripeacc", LOG_DEBUG);
 
 1114           $stripeacc = $stripe->getStripeAccount($service); 
 
 1116           dol_syslog(
"* createPaymentStripe Create payment for customer ".$customer->id.
" on source card ".$stripecard->id.
", amounttopay=".$amounttopay.
", amountstripe=".$amountstripe.
", FULLTAG=".$FULLTAG, LOG_DEBUG);
 
 1119           $paymentintent = $stripe->getPaymentIntent($amounttopay, $currency, $FULLTAG, $description, $invoice, $customer->id, $stripeacc, $servicestatus, 0, 
'automatic', 
true, $stripecard->id, 1);
 
 1121           $charge = 
new stdClass();
 
 1122           if ($paymentintent->status == 
'succeeded') {
 
 1123             $charge->status = 
'ok';
 
 1125             $charge->status = 
'failed';
 
 1126             $charge->failure_code = $stripe->code;
 
 1127             $charge->failure_message = $stripe->error;
 
 1128             $charge->failure_declinecode = $stripe->declinecode;
 
 1129             $stripefailurecode = $stripe->code;
 
 1130             $stripefailuremessage = $stripe->error;
 
 1131             $stripefailuredeclinecode = $stripe->declinecode;
 
 1133         } elseif (preg_match(
'/acct_/i', $source)) {
 
 1134           $charge = \Stripe\Charge::create(array(
 
 1135             "amount" => 
"$stripeamount",
 
 1136             "currency" => 
"$currency",
 
 1137             "statement_descriptor_suffix" => 
dol_trunc($description, 10, 
'right', 
'UTF-8', 1), 
 
 1138             "description" => 
"Stripe payment: ".$description,
 
 1139             "capture"  => $capture,
 
 1140             "metadata" => $metadata,
 
 1141             "source" => 
"$source" 
 1144           $paymentarray = array(
 
 1145             "amount" => 
"$stripeamount",
 
 1146             "currency" => 
"$currency",
 
 1147             "statement_descriptor_suffix" => 
dol_trunc($description, 10, 
'right', 
'UTF-8', 1), 
 
 1148             "description" => 
"Stripe payment: ".$description,
 
 1149             "capture"  => $capture,
 
 1150             "metadata" => $metadata,
 
 1151             "source" => 
"$source",
 
 1152             "customer" => 
"$customer" 
 1155           if ($societe->email && $usethirdpartyemailforreceiptemail) {
 
 1156             $paymentarray[
"receipt_email"] = $societe->email;
 
 1159           $charge = \Stripe\Charge::create($paymentarray, array(
"idempotency_key" => 
"$description"));
 
 1163         $fee = $amount * ($conf->global->STRIPE_APPLICATION_FEE_PERCENT / 100) + $conf->global->STRIPE_APPLICATION_FEE;
 
 1164         if ($fee >= $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL && $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL > $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) {
 
 1165           $fee = $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL;
 
 1166         } elseif ($fee < $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) {
 
 1167           $fee = $conf->global->STRIPE_APPLICATION_FEE_MINIMAL;
 
 1170         if (!in_array($currency, $arrayzerounitcurrency)) {
 
 1171           $stripefee = round($fee * 100);
 
 1173           $stripefee = round($fee);
 
 1176         $paymentarray = array(
 
 1177           "amount" => 
"$stripeamount",
 
 1178           "currency" => 
"$currency",
 
 1179         "statement_descriptor_suffix" => 
dol_trunc($description, 10, 
'right', 
'UTF-8', 1), 
 
 1180           "description" => 
"Stripe payment: ".$description,
 
 1181           "capture"  => $capture,
 
 1182           "metadata" => $metadata,
 
 1183           "source" => 
"$source",
 
 1184           "customer" => 
"$customer" 
 1186         if ($conf->entity != $conf->global->STRIPECONNECT_PRINCIPAL && $stripefee > 0) {
 
 1187           $paymentarray[
"application_fee_amount"] = $stripefee;
 
 1189         if ($societe->email && $usethirdpartyemailforreceiptemail) {
 
 1190           $paymentarray[
"receipt_email"] = $societe->email;
 
 1193         if (preg_match(
'/pm_/i', $source)) {
 
 1194           $stripecard = $source;
 
 1195           $amountstripe = $stripeamount;
 
 1198           $amounttopay = $amount;
 
 1199           $servicestatus = $status;
 
 1201           dol_syslog(
"* createPaymentStripe get stripeacc", LOG_DEBUG);
 
 1202           $stripeacc = $stripe->getStripeAccount($service); 
 
 1204           dol_syslog(
"* createPaymentStripe Create payment on card ".$stripecard->id.
", amounttopay=".$amounttopay.
", amountstripe=".$amountstripe.
", FULLTAG=".$FULLTAG, LOG_DEBUG);
 
 1207           $paymentintent = $stripe->getPaymentIntent($amounttopay, $currency, $FULLTAG, $description, $invoice, $customer->id, $stripeacc, $servicestatus, 0, 
'automatic', 
true, $stripecard->id, 1);
 
 1209           $charge = 
new stdClass();
 
 1210           if ($paymentintent->status == 
'succeeded') {
 
 1211             $charge->status = 
'ok';
 
 1212             $charge->id = $paymentintent->id;
 
 1214             $charge->status = 
'failed';
 
 1215             $charge->failure_code = $stripe->code;
 
 1216             $charge->failure_message = $stripe->error;
 
 1217             $charge->failure_declinecode = $stripe->declinecode;
 
 1220           $charge = \Stripe\Charge::create($paymentarray, array(
"idempotency_key" => 
"$description", 
"stripe_account" => 
"$account"));
 
 1223       if (isset($charge->id)) {
 
 1226       $return->statut = 
'success';
 
 1227       $return->id = $charge->id;
 
 1229       if (preg_match(
'/pm_/i', $source)) {
 
 1230         $return->message = 
'Payment retrieved by card status = '.$charge->status;
 
 1232         if ($charge->source->type == 
'card') {
 
 1233           $return->message = $charge->source->card->brand.
" ....".$charge->source->card->last4;
 
 1234         } elseif ($charge->source->type == 
'three_d_secure') {
 
 1236           $src = \Stripe\Source::retrieve(
"".$charge->source->three_d_secure->card, array(
 
 1237           "stripe_account" => $stripe->getStripeAccount($service)
 
 1239           $return->message = $src->card->brand.
" ....".$src->card->last4;
 
 1241           $return->message = $charge->id;
 
 1244     } 
catch (\
Stripe\Error\Card $e) {
 
 1245       include DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
 
 1247       $body = $e->getJsonBody();
 
 1248       $err = $body[
'error'];
 
 1250       $return->statut = 
'error';
 
 1251       $return->id = $err[
'charge'];
 
 1252       $return->type = $err[
'type'];
 
 1253       $return->code = $err[
'code'];
 
 1254       $return->message = $err[
'message'];
 
 1255       $body = 
"Error: <br>".$return->id.
" ".$return->message.
" ";
 
 1256       $subject = 
'[Alert] Payment error using Stripe';
 
 1257       $cmailfile = 
new CMailFile($subject, $conf->global->ONLINE_PAYMENT_SENDEMAIL, $conf->global->MAIN_INFO_SOCIETE_MAIL, $body);
 
 1258       $cmailfile->sendfile();
 
 1261       dol_syslog($e->getMessage(), LOG_WARNING, 0, 
'_stripe');
 
 1262     } 
catch (\
Stripe\Error\RateLimit $e) {
 
 1265       dol_syslog($e->getMessage(), LOG_WARNING, 0, 
'_stripe');
 
 1266     } 
catch (\
Stripe\Error\InvalidRequest $e) {
 
 1269       dol_syslog($e->getMessage(), LOG_WARNING, 0, 
'_stripe');
 
 1270     } 
catch (\
Stripe\Error\Authentication $e) {
 
 1274       dol_syslog($e->getMessage(), LOG_WARNING, 0, 
'_stripe');
 
 1275     } 
catch (\
Stripe\Error\ApiConnection $e) {
 
 1278       dol_syslog($e->getMessage(), LOG_WARNING, 0, 
'_stripe');
 
 1279     } 
catch (\
Stripe\Error\Base $e) {
 
 1283       dol_syslog($e->getMessage(), LOG_WARNING, 0, 
'_stripe');
 
 1287       dol_syslog($e->getMessage(), LOG_WARNING, 0, 
'_stripe');
 
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
 
Class to manage customers orders.
 
Parent class of all other business classes (invoices, contracts, proposals, orders,...
 
Class for CompanyPaymentMode.
 
Class to manage invoices.
 
Class for SocieteAccount.
 
Class to manage third parties objects (customers, suppliers, prospects...)
 
getPaymentIntent($amount, $currency_code, $tag, $description='', $object=null, $customer=null, $key=null, $status=0, $usethirdpartyemailforreceiptemail=0, $mode='automatic', $confirmnow=false, $payment_method=null, $off_session=0, $noidempotency_key=1)
Get the Stripe payment intent.
 
getSetupIntent($description, $object, $customer, $key, $status, $usethirdpartyemailforreceiptemail=0, $confirmnow=false)
Get the Stripe payment intent.
 
getPaymentMethodStripe($paymentmethod, $key='', $status=0)
Get the Stripe payment method Object from its ID.
 
sepaStripe($cu, CompanyPaymentMode $object, $stripeacc='', $status=0, $createifnotlinkedtostripe=0)
Get the Stripe SEPA of a company payment mode.
 
getStripeCustomerAccount($id, $status=0, $site_account='')
getStripeCustomerAccount
 
cardStripe($cu, CompanyPaymentMode $object, $stripeacc='', $status=0, $createifnotlinkedtostripe=0)
Get the Stripe card of a company payment mode (option to create it on Stripe if not linked yet is no ...
 
createPaymentStripe($amount, $currency, $origin, $item, $source, $customer, $account, $status=0, $usethirdpartyemailforreceiptemail=0, $capture=true)
Create charge.
 
__construct($db)
Constructor.
 
getStripeAccount($mode='StripeTest', $fk_soc=0, $entity=-1)
Return main company OAuth Connect stripe account.
 
customerStripe(Societe $object, $key='', $status=0, $createifnotlinkedtostripe=0)
Get the Stripe customer of a thirdparty (with option to create it in Stripe if not linked yet).
 
getSelectedReader($reader, $key='', $status=0)
Get the Stripe reader Object from its ID.
 
isInEEC($object)
Return if a country of an object is inside the EEC (European Economic Community)
 
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
 
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
 
dol_now($mode='auto')
Return date for now.
 
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
 
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
 
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
 
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.
 
getUserRemoteIP()
Return the IP of remote user.
 
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
 
if(!defined( 'CSRFCHECK_WITH_TOKEN'))
 
div float
Buy price without taxes.
 
$conf db
API class for accounts.
 
print *****$script_file(".$version.") pid code
! Closing after partial payment: discount_vat, badcustomer or badsupplier, bankcharge,...