diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php
new file mode 100644
index 00000000000..c3fded06264
--- /dev/null
+++ b/htdocs/stripe/class/stripe.class.php
@@ -0,0 +1,320 @@
+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+// Put here all includes required by your class file
+require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
+require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
+require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
+require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
+require_once DOL_DOCUMENT_ROOT.'/stripe/config.php';
+/**
+ * \class Rewards
+ * \brief Class for Rewards
+ */
+class Stripe extends CommonObject
+{
+ public $rowid;
+ public $fk_soc;
+ public $fk_key;
+ public $id;
+ public $mode;
+ public $entity;
+ public $statut;
+ public $type;
+ public $code;
+ public $message;
+
+ /**
+ * Constructor
+ *
+ * @param DoliDB $db Database handler
+ */
+ public function __construct($db)
+ {
+ $this->db = $db;
+
+ }
+
+
+public function GetStripeAccount($id) // TODO: move /transforme optimize function/data
+ {
+ global $conf;
+
+ $sql = "SELECT key_account";
+ $sql.= " FROM ".MAIN_DB_PREFIX."stripe_entity";
+ $sql.= " WHERE entity = ".$id."";
+
+ dol_syslog(get_class($this) . "::fetch", LOG_DEBUG);
+ $result = $this->db->query($sql);
+ if ($result)
+ {
+ if ($this->db->num_rows($result))
+ {
+ $obj = $this->db->fetch_object($result);
+ $key=$obj->key_account;
+ }
+ else {$key=0;}
+ }
+ else {$key=0;}
+
+return $key;
+ }
+
+public function GetStripeCustomerAccount($id)
+ {
+ global $conf;
+
+ $sql = "SELECT s.key_account as key_account, s.entity, e.fk_object";
+ $sql.= " FROM ".MAIN_DB_PREFIX."stripe_entity as s";
+ $sql.= " JOIN ".MAIN_DB_PREFIX."entity_extrafields as e ON s.entity=e.fk_object";
+ $sql.= " WHERE e.fk_soc=".$id." ";
+
+ dol_syslog(get_class($this) . "::fetch", LOG_DEBUG);
+ $result = $this->db->query($sql);
+ if ($result)
+ {
+ if ($this->db->num_rows($result))
+ {
+ $obj = $this->db->fetch_object($result);
+ $key=$obj->key_account;
+ }
+ else {$key=NULL;}
+ }
+ else {$key=NULL;}
+
+return $key;
+ }
+
+public function CustomerStripe($id,$key)
+ {
+global $conf;
+if (empty($conf->global->STRIPECONNECT_LIVE))
+{
+$mode=0;
+}
+else
+{
+if (empty($conf->global->STRIPE_LIVE))
+{
+$mode=0;
+}
+else
+{
+$mode=$conf->global->STRIPE_LIVE;
+}
+}
+ $sql = "SELECT rowid,fk_soc,fk_key,mode,entity";
+ $sql.= " FROM ".MAIN_DB_PREFIX."societe_stripe";
+ $sql.= " WHERE fk_soc = ".$id." ";
+ $sql.= " AND mode=".$mode." AND entity IN (" . getEntity('stripe') . ")";
+
+ dol_syslog(get_class($this) . "::fetch", LOG_DEBUG);
+ $resql = $this->db->query($sql);
+ if ($resql) {
+ $soc = new Societe($this->db);
+ $soc->fetch($id);
+ $num=$this->db->num_rows($resql);
+ if ($num) {
+ $obj = $this->db->fetch_object($resql);
+ $tiers = $obj->fk_key;
+ if ($conf->entity==1){
+ $customer = \Stripe\Customer::retrieve("$tiers");
+ }else{
+ $customer = \Stripe\Customer::retrieve("$tiers",array("stripe_account" => $key));
+ }}
+ else {
+ if ($conf->entity==1){
+ $customer = \Stripe\Customer::create(array(
+ "email" => $soc->email,
+ "description" => $soc->name
+ ));
+ }else{
+ $customer = \Stripe\Customer::create(array(
+ "email" => $soc->email,
+ "description" => $soc->name
+ ), array("stripe_account" => $key));
+ }
+ $customer_id = "".$customer->id."";
+ $sql = "INSERT INTO ".MAIN_DB_PREFIX."societe_stripe (fk_soc,fk_key,mode,entity)";
+ $sql .= " VALUES ($id,'$customer_id',".$mode.",".$conf->entity.")";
+ dol_syslog(get_class($this) . "::create sql=" . $sql, LOG_DEBUG);
+ $resql = $this->db->query($sql);
+ }}
+return $customer;
+ }
+
+public function CreatePaymentStripe($amount,$currency,$origin,$item,$source,$customer,$account)
+{
+global $conf;
+if (empty($conf->global->STRIPECONNECT_LIVE))
+{
+$mode=0;
+}
+else
+{
+if (empty($conf->global->STRIPE_LIVE))
+{
+$mode=0;
+}
+else
+{
+$mode=$conf->global->STRIPE_LIVE;
+}
+}
+ $sql = "SELECT fk_soc,fk_key,mode,entity";
+ $sql.= " FROM ".MAIN_DB_PREFIX."societe_stripe";
+ $sql.= " WHERE fk_key = '$customer' ";
+ $sql.= " AND mode=".$mode." ";
+
+ dol_syslog(get_class($this) . "::fetch", LOG_DEBUG);
+ $result = $this->db->query($sql);
+ if ($result)
+ {
+ if ($this->db->num_rows($result))
+ {
+ $obj = $this->db->fetch_object($result);
+ $entite=$obj->entity;
+ $fksoc=$obj->fk_soc;
+ }
+ }
+$stripeamount=round($amount*100);
+$societe = new Societe($this->db);
+$societe->fetch($fksoc);
+
+if ($origin==order){
+$order=new Commande($this->db);
+$order->fetch($item);
+$ref=$order->ref;
+$description="ORD=".$ref.".CUS=".$societe->code_client;
+}
+elseif ($origin==invoice) {
+$invoice=new Facture($this->db);
+$invoice->fetch($item);
+$ref=$invoice->ref;
+$description="INV=".$ref.".CUS=".$societe->code_client;
+}
+
+$metadata = array(
+ "source" => "".$origin."",
+ "idsource" => "".$item."",
+ "idcustomer" => "".$societe->id.""
+ );
+$return = new StripeConnexion($this->db);
+try {
+if ($stripeamount>=100) {
+if ($entite=='1' or empty($conf->stripeconnect->enabled)){
+if (preg_match('/acct_/i',$source)){
+ $charge = \Stripe\Charge::create(array(
+ "amount" => "$stripeamount",
+ "currency" => "$currency",
+// "statement_descriptor" => " ",
+ "metadata" => $metadata,
+ "source" => "$source"
+)
+);
+} else {
+$charge = \Stripe\Charge::create(array(
+ "amount" => "$stripeamount",
+ "currency" => "$currency",
+// "statement_descriptor" => " ",
+ "description" => "$description",
+ "metadata" => $metadata,
+ "receipt_email" => $societe->email,
+ "source" => "$source",
+ "customer" => "$customer")
+ ,array("idempotency_key" => "$ref")
+);
+}}else{
+$fee=round(($amount*($conf->global->STRIPE_APPLICATION_FEE_PERCENT/100)+$conf->global->STRIPE_APPLICATION_FEE)*100);
+if ($fee<($conf->global->STRIPE_APPLICATION_FEE_MINIMAL*100)){
+$fee=round($conf->global->STRIPE_APPLICATION_FEE_MINIMAL*100);
+}
+$charge = \Stripe\Charge::create(array(
+ "amount" => "$stripeamount",
+ "currency" => "$currency",
+// "statement_descriptor" => " ",
+ "description" => "$description",
+ "metadata" => $metadata,
+ "source" => "$source",
+ "customer" => "$customer",
+ "application_fee" => "$fee"
+), array("idempotency_key" => "$ref","stripe_account" => "$account"));
+}
+if (isset($charge->id)){
+
+}
+}
+
+$return->statut = 'success';
+$return->id = $charge->id;
+if ($charge->source->type=='card'){
+$return->message = $charge->source->card->brand." ****".$charge->source->card->last4;
+}elseif ($charge->source->type=='three_d_secure'){
+$stripeconnect=new StripeConnexion($this->db);
+$src = \Stripe\Source::retrieve("".$charge->source->three_d_secure->card."",array("stripe_account" => $stripeconnect->GetStripeAccount($conf->entity)));
+$return->message = $src->card->brand." ****".$src->card->last4;
+}else {
+$return->message = $charge->id;
+}
+
+} catch(\Stripe\Error\Card $e) {
+ // Since it's a decline, \Stripe\Error\Card will be caught
+ $body = $e->getJsonBody();
+ $err = $body['error'];
+
+$return->statut = 'error';
+$return->id = $err['charge'];
+$return->type = $err['type'];
+$return->code = $err['code'];
+$return->message = $err['message'];
+$body = "Une erreur de paiement est survenue. Voici le code d'erreur:
".$return->id." ".$return->message." ";
+$subject = '[NOTIFICATION] Erreur de paiement';
+$headers = 'From: "ptibogxiv.net" <'.$conf->global->MAIN_INFO_SOCIETE_MAIL.'>';
+mail(''.$conf->global->MAIN_INFO_SOCIETE_MAIL.'', $subject, $body, $headers);
+ $error++;
+ dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe');
+ } catch (\Stripe\Error\RateLimit $e) {
+ // Too many requests made to the API too quickly
+ $error++;
+ dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe');
+ } catch (\Stripe\Error\InvalidRequest $e) {
+ // Invalid parameters were supplied to Stripe's API
+ $error++;
+ dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe');
+ } catch (\Stripe\Error\Authentication $e) {
+ // Authentication with Stripe's API failed
+ // (maybe you changed API keys recently)
+ $error++;
+ dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe');
+ } catch (\Stripe\Error\ApiConnection $e) {
+ // Network communication with Stripe failed
+ $error++;
+ dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe');
+ } catch (\Stripe\Error\Base $e) {
+ // Display a very generic error to the user, and maybe send
+ // yourself an email
+ $error++;
+ dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe');
+ } catch (Exception $e) {
+ // Something else happened, completely unrelated to Stripe
+ $error++;
+ dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe');
+ }
+ return $return;
+}
+
+}