diff --git a/.gitignore b/.gitignore
index ca21e90..a5b3da1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,129 @@
-/.settings/
-/.buildpath
-/.project
+### JetBrains template
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff:
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/dictionaries
+
+# Sensitive or high-churn files:
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.xml
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+
+# Gradle:
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# CMake
+cmake-build-debug/
+
+# Mongo Explorer plugin:
+.idea/**/mongoSettings.xml
+
+## File-based project format:
+*.iws
+
+## Plugin-specific files:
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+### macOS template
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+### Eclipse template
+
+.metadata
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.settings/
+.loadpath
+.recommenders
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# PyDev specific (Python IDE for Eclipse)
+*.pydevproject
+
+# CDT-specific (C/C++ Development Tooling)
+.cproject
+
+# Java annotation processor (APT)
+.factorypath
+
+# PDT-specific (PHP Development Tools)
+.buildpath
+
+# sbteclipse plugin
+.target
+
+# Tern plugin
+.tern-project
+
+# TeXlipse plugin
+.texlipse
+
+# STS (Spring Tool Suite)
+.springBeans
+
+# Code Recommenders
+.recommenders/
+
+# Scala IDE specific (Scala & Java development for Eclipse)
+.cache-main
+.scala_dependencies
+.worksheet
+
diff --git a/replay_paybox.php b/replay_paybox.php
new file mode 100644
index 0000000..6c4172b
--- /dev/null
+++ b/replay_paybox.php
@@ -0,0 +1,346 @@
+id) {
+ Logger::addLog('Cart not valid', 4);
+ die('Cart not valid');
+ }
+
+
+ if (!Order::getOrderByCartId($cart->id)) {
+ echo "order nok \n";
+ $errorcount++;
+ echo json_encode($values) . "\n";
+ echo "processing order" . "\n";
+
+ $customer = new Customer((int)$cart->id_customer);
+
+ if ($x3) {
+ $total_paid = ($values['m'] * 3) / 100;
+ if (($cart->getOrderTotal() - $total_paid) < 2) {
+ $total_paid = $cart->getOrderTotal();
+ }
+ } else {
+ $total_paid = $values['m'] / 100;
+ }
+
+ $pbx_error = trim($values['e']);
+ $statut = '';
+ if ($test_mode === 0) {
+ if (empty($error) && $pbx_error == '00000') {
+ $error = '***TEST*** : Validated Payment
' . "\n";
+ $statut = _PS_OS_PAYMENT_;
+ } else {
+ $error = '***TEST*** : Invalid Payment
' . "\n" . $error;
+ $statut = _PS_OS_ERROR_;
+ }
+ } elseif ($test_mode === 1) {
+ if ($pbx_error == '00000' && empty($error)) {
+ $statut = _PS_OS_PAYMENT_;
+ } else {
+ $statut = _PS_OS_ERROR_;
+ }
+ }
+
+ switch ($pbx_error) {
+ case '00001':
+ $error .= 'Connection to the authorization center failed or an internal error occurred
' . "\n";
+ break;
+ case '00003':
+ $error .= 'Paybox error
' . "\n";
+ break;
+ case '00004':
+ $error .= 'Card number invalid or visual cryptogram invalid
' . "\n";
+ break;
+ case '00006':
+ $error .= 'Access refused or site/rank/identifier incorrect
' . "\n";
+ break;
+ case '00008':
+ $error .= 'Incorrect expiry date.
' . "\n";
+ break;
+ case '00009':
+ $error .= 'Error when during subscriber creation
' . "\n";
+ break;
+ case '00010':
+ $error .= 'Unknown currency
' . "\n";
+ break;
+ case '00011':
+ $error .= 'Amount incorrect
' . "\n";
+ break;
+ case '00015':
+ $error .= 'Payment already done
' . "\n";
+ break;
+ case '00016':
+ $error .= 'Subscriber already exists
' . "\n";
+ break;
+ case '00021':
+ $error .= 'Not authorized bin card
' . "\n";
+ break;
+ case '00029':
+ $error .= 'Not the same card used for the first payment.
' . "\n";
+ break;
+ case '00030':
+ $error .= 'Time-out > 15 mn before validation by the buyer when the buyer is on the page of payments of PAYBOX
' . "\n";
+ break;
+ case '00031':
+ case '00032':
+ $error .= 'Reserved
' . "\n";
+ break;
+ case '00033':
+ $error .= 'Unauthorized country code of the IP address of the cardholder’s browser
' . "\n";
+ break;
+ case '00040':
+ $error .= 'Operation without 3DSecure authentication, blocked by the fraud filter.
' . "\n";
+ break;
+ case '99999':
+ $error .= 'Payment waiting confirmation from the issuer
' . "\n";
+ break;
+
+ // Card schemes Carte Bancaire, American Express and Diners
+ case '00100':
+ $error .= 'Transaction approved or successfully processed.
' . "\n";
+ break;
+ case '00101':
+ case '00102':
+ $error .= 'Contact the card issuer
' . "\n";
+ break;
+ case '00103':
+ $error .= 'Invalid retailer
' . "\n";
+ break;
+ case '00104':
+ $error .= 'Keep the card
' . "\n";
+ break;
+ case '00105':
+ $error .= 'Do not honor
' . "\n";
+ break;
+ case '00107':
+ $error .= 'Keep the card, special conditions
' . "\n";
+ break;
+ case '00108':
+ $error .= 'Approve after holder identification
' . "\n";
+ break;
+ case '00112':
+ $error .= 'Invalid transaction
' . "\n";
+ break;
+ case '00113':
+ $error .= 'Invalid amount
' . "\n";
+ break;
+ case '00114':
+ $error .= 'Invalid holder number
' . "\n";
+ break;
+ case '00115':
+ $error .= 'Card issuer unknown
' . "\n";
+ break;
+ case '00117':
+ $error .= 'Client cancellation
' . "\n";
+ break;
+ case '00119':
+ $error .= 'Repeat the transaction later
' . "\n";
+ break;
+ case '00120':
+ $error .= 'Error in reply (error in the server’s domain).
' . "\n";
+ break;
+ case '00124':
+ $error .= 'File update not withstood
' . "\n";
+ break;
+ case '00125':
+ $error .= 'Impossible to situate the record in the file
' . "\n";
+ break;
+ case '00126':
+ $error .= 'Record duplicated, former record replaced
' . "\n";
+ break;
+ case '00127':
+ $error .= 'Error in ‘edit’ in file update field
' . "\n";
+ break;
+ case '00128':
+ $error .= 'Access to file denied
' . "\n";
+ break;
+ case '00129':
+ $error .= 'File update impossible
' . "\n";
+ break;
+ case '00130':
+ $error .= 'Error in format
' . "\n";
+ break;
+ case '00133':
+ $error .= 'Expired card
' . "\n";
+ break;
+ case '00138':
+ $error .= 'Too many attempts at secret code.
' . "\n";
+ break;
+ case '00151':
+ $error .= 'provision insuffisante.
' . "\n";
+ break;
+ case '00159':
+ $error .= 'Suspicion of fraud.
' . "\n";
+ break;
+
+ case '00000':
+ default:
+ $error .= 'Successful operation
' . "\n\n";
+ break;
+ }
+
+ echo 'PayBox version: ' . $paybox->version . "\n";
+ echo "(int)$cart->id, $statut, $total_paid, $paybox->displayName, $error, $customer->secure_key, $values\n";
+ $paybox->validateOrder((int)$cart->id, $statut, $total_paid, $paybox->displayName, $error, array(), NULL, false, $customer->secure_key, $values);
+
+ // save info paiement BDD
+ $paybox->saveInformationPaiement($values);
+
+ }
+ }
+ }
+ fclose($fp);
+}
+
+echo 'count ok ' . $count . "\n";
+echo 'count nok ' . $errorcount . "\n";
+
+die();
+/*
+$error = '';
+$paybox = new Paybox();
+$values = array(
+ 'm', 'r', 't', 'p', 'c', 's'
+);
+$needed_vars = array('m', 'r', 't', 'p', 'c', 's');
+
+if ((!isset($values['a']) || empty($values['a'])))
+{
+ Logger::addLog('No autorisation number', 4);
+ die('No autorisation number');
+}
+
+$x3 = false;
+if (substr($values['r'],0, 1) == 'x')
+{
+ $x3 = true;
+ $id_cart = substr($values['r'],1);
+}
+else
+ $id_cart = $values['r'];
+
+$cart = new Cart((int)$id_cart);
+if (!$cart->id)
+{
+ Logger::addLog('Cart not valid', 4);
+ die('Cart not valid');
+}
+
+if ($id_order = (int)Order::getOrderByCartId($cart->id))
+{
+ $paybox->saveInformationPaiement($values);
+
+ if (empty($error))
+ {
+ $order = new Order($id_order);
+ $order->valid = 1;
+ $order->total_paid_real = $values['m'] / 100;
+ $order->update();
+
+ if ($order->getCurrentState() != _PS_OS_PAYMENT_)
+ {
+ $products = $cart->getProducts();
+ foreach ($products as $product)
+ {
+ Product::updateQuantity($product);
+ Hook::updateQuantity($product, $order);
+ }
+ }
+
+ $history = new OrderHistory();
+ $history->id_order = $id_order;
+ $history->changeIdOrderState((int)_PS_OS_PAYMENT_, $id_order);
+ $history->addWithemail(true, array());
+
+
+ $order_message = '';
+ foreach ($values as $key => $value)
+ $order_message .= $key.': '.$value.'
';
+
+ if (isset($order_message) && !empty($order_message))
+ {
+ $msg = new Message();
+ $message = $order_message;
+ if (Validate::isCleanHtml($order_message))
+ {
+ $msg->message = $order_message;
+ $msg->id_order = (int)$order->id;
+ $msg->private = 1;
+ $msg->add();
+ }
+ }
+ }
+ die($error);
+}
+
+*/
diff --git a/replay_paypal.php b/replay_paypal.php
new file mode 100644
index 0000000..dedc246
--- /dev/null
+++ b/replay_paypal.php
@@ -0,0 +1,280 @@
+ array(),
+ 'missingOrder' => array(),
+ 'multipleOrders' => array(),
+ 'foundWithEmail' => array(),
+ 'foundWithPaypalTable' => array(),
+ 'foundWithFnLn' => array(),
+ 'lostCustomers' => array(),
+ 'orderToProcess' => array()
+);
+if ($fp) {
+ echo 'Reading ' . __DIR__ . '/Download.csv' . "\n";
+ while (($line = fgets($fp)) !== false) {
+ $splitCsvLine = str_getcsv($line, ',', '"');
+ $error = '';
+ if ($splitCsvLine[1] !== 'Heure' && $splitCsvLine[10] !== 'contact@bebeboutik.com') {
+ $count++;
+ $values = array();
+ $values['amount'] = str_replace(',', '.', $splitCsvLine[7]);
+ $values['email'] = $splitCsvLine[10];
+ $values['firstname_lastname'] = $splitCsvLine[3];
+ $values['id_transaction'] = $splitCsvLine[12];
+ $values['shipping_cost'] = str_replace(',', '.', $splitCsvLine[17]);
+ $values['date'] = $splitCsvLine[0] . ' ' . $splitCsvLine[1];
+ $exploded = explode(' ', $values['firstname_lastname']);
+ if (count($exploded) === 2) {
+ $values['possible_first_name'] = $exploded[0];
+ $values['possible_last_name'] = $exploded[1];
+ } else {
+ $values['possible_first_name'] = $exploded[0];
+ unset($exploded[0]);
+ $values['possible_last_name'] = implode(' ', $exploded);
+ }
+
+ if (!array_key_exists($values['email'], $emailToIdCustomerArray)) {
+ //check paypal table first
+ $result = Db::getInstance()->getRow('
+ SELECT id_customer
+ FROM ps_paypal_customer
+ WHERE paypal_email = \'' . pSQL($values['email']) . '\'');
+ if ($result) {
+ $customer = new Customer((int)$result['id_customer']);
+ }
+ if ($customer->id !== null && $result) {
+ $report['foundWithPaypalTable'][$values['email']] = $customer->id;
+ $emailToIdCustomerArray[$values['email']] = (int)$customer->id;
+ } else {
+ $customer = new Customer();
+ $customer->getByEmail($values['email']);
+ if (Validate::isLoadedObject($customer)) {
+ $emailToIdCustomerArray[$values['email']] = (int)$customer->id;
+ $report['foundWithEmail'][$values['email']] = (int)$customer->id;
+ } else {
+ $result = Db::getInstance()->getRow('
+ SELECT id_customer
+ FROM `ps_customer`
+ WHERE `active` = 1
+ AND lower(`firstname`) = \'' . pSQL(strtolower($values['possible_first_name'])) . '\'
+ AND lower(`lastname`) = \'' . pSQL(strtolower($values['possible_last_name'])) . '\'
+ AND `deleted` = 0
+ AND `is_guest` = 0');
+ if ($result) {
+ $customer = new Customer((int)$result['id_customer']);
+ $report['foundWithFnLn'][$values['email']] = $customer->id;
+ $emailToIdCustomerArray[$values['email']] = (int)$customer->id;
+ } else {
+ $result = Db::getInstance()->getRow('
+ SELECT id_customer
+ FROM `ps_customer`
+ WHERE `active` = 1
+ AND lower(`lastname`) = \'' . pSQL(strtolower($values['possible_first_name'])) . '\'
+ AND lower(`firstname`) = \'' . pSQL(strtolower($values['possible_last_name'])) . '\'
+ AND `deleted` = 0
+ AND `is_guest` = 0');
+ if ($result) {
+ $customer = new Customer((int)$result['id_customer']);
+ $report['foundWithFnLn'][$values['email']] = $customer->id;
+ $emailToIdCustomerArray[$values['email']] = (int)$customer->id;
+ } else {
+ $report['lostCustomers'][] = array('email' => $values['email'],
+ 'info' => $splitCsvLine);
+ }
+ }
+ }
+ }
+ }
+
+ if (Validate::isLoadedObject($customer)) {
+ $order = Db::getInstance()->getRow('
+ SELECT po.id_order, o.total_paid
+ FROM ps_paypal_order po
+ JOIN ps_orders o ON o.id_order = po.id_order
+ WHERE id_transaction = \'' . $values['id_transaction'] . '\''
+ );
+ if ($order) {
+ if ($values['amount'] !== $order['total_paid']) {
+ $report['wrongTotal'][] = $order['id_order'];
+ }
+ } else {
+ $orders = Db::getInstance()->ExecuteS('
+ SELECT o.id_order , o.total_paid
+ FROM `ps_orders` o
+ WHERE o.`id_customer` = ' . (int)$customer->id . '
+ AND o.date_add BETWEEN "2017-12-20 00:00:00" AND "2017-12-23 23:59:00"'
+ );
+ if ($orders) {
+ if (count($orders) === 1) {
+ if ($values['amount'] !== $orders[0]['total_paid']) {
+ $report['wrongTotal'][] = $orders[0]['id_order'];
+ }
+ } else {
+ $report['multipleOrders'][] = $customer->id;
+ }
+ } else {
+ //try to find
+ //now we try to find id_cart that could do the job
+ if (534175 === (int)$customer->id) {
+ echo 'test 534175';
+ }
+ $result = Db::getInstance()->ExecuteS('
+ SELECT c.`id_cart` , c.date_upd
+ FROM `ps_cart` c
+ WHERE c.`id_customer` = ' . (int)$customer->id . '
+ ORDER BY c.date_upd desc');
+ if (534175 === (int)$customer->id) {
+ echo json_encode($result);
+ }
+ if ($result && count($result) > 0) {
+ $selectedCartId = $result[0]['id_cart'];
+ foreach ($result as $cartResult) {
+ $cart = new Cart((int)$cartResult['id_cart']);
+ $cartValue = $cart->getOrderTotal();
+ if ((float)$values['amount'] === $cartValue) {
+ $selectedCartId = (int)$cartResult['id_cart'];
+ continue;
+ }
+ }
+
+ $selectedCart = new Cart($selectedCartId);
+ $cartValue = $selectedCart->getOrderTotal();
+
+ if ((float)$values['amount'] === $cartValue) {
+ $errorWIthCartValue = 'ok';
+ } else {
+ $errorWIthCartValue = 'not ok';
+ }
+
+ $foundVia = 'nothing';
+ if (array_key_exists($values['email'], $report['foundWithPaypalTable'])) {
+ $foundVia = 'paypaltable';
+ } elseif (array_key_exists($values['email'], $report['foundWithEmail'])) {
+ $foundVia = 'email';
+ } elseif (array_key_exists($values['email'], $report['foundWithFnLn'])) {
+ $foundVia = 'lastname';
+ }
+ $report['missingOrder'][] = array('customer_id' => $customer->id,
+ 'amount' => $values['amount'],
+ 'transaction_id' => $values['id_transaction'],
+ 'id_cart' => $selectedCart->id,
+ 'cart_value' => $cartValue,
+ 'error_with_cart_value' => $errorWIthCartValue,
+ 'foundVia' => $foundVia
+ );
+ if ($errorWIthCartValue === 'ok') {
+
+ $report['orderToProcess'][$values['id_transaction']] = array('customer_id' => $customer->id,
+ 'amount' => $values['amount'],
+ 'transaction_id' => $values['id_transaction'],
+ 'id_cart' => $selectedCart->id,
+ 'email' => $values['email'],
+ 'shipping_cost' => $values['shipping_cost'],
+ 'order_time' => $values['date']
+ );
+ }
+ } else {
+ $report['missingOrder'][] = array('customer_id' => $customer->id,
+ 'amount' => $values['amount'],
+ 'transaction_id' => $values['id_transaction'],
+ 'id_cart' => 'not found'
+ );
+ }
+ }
+ }
+ }
+ }
+ }
+ $report['missingOrderCount'] = count($report['missingOrder']);
+ $report['wrongTotalCount'] = count($report['wrongTotal']);
+ $report['missingOrderCount'] = count($report['missingOrder']);
+ $report['foundWithEmailCount'] = count($report['foundWithEmail']);
+ $report['foundWithPaypalTableCount'] = count($report['foundWithPaypalTable']);
+ $report['foundWithFnLnCount'] = count($report['foundWithFnLn']);
+ $report['lostCustomersCount'] = count($report['lostCustomers']);
+ $report['orderToProcessCount'] = count($report['orderToProcess']);
+ fclose($fp);
+}
+if ($scriptDebug) {
+ echo 'count nb lines ' . $count . "\n";
+ echo 'unique customers found ' . count($emailToIdCustomerArray) . "\n";
+ echo 'customer not found ' . $customerNotFoundCount . "\n";
+ echo '---report' . "\n";
+ echo json_encode($report) . "\n";
+}
+
+unset($values);
+
+foreach ($report['orderToProcess'] as $id_transaction => $orderToProcess) {
+
+ echo 'treating cart ' . $orderToProcess['id_cart'] . "\n";
+ $request_type = 'payment_cart';
+ $ppec = new PaypalExpressCheckout($request_type);
+ $cart = new Cart((int)$orderToProcess['id_cart']);
+ $customer = new Customer((int)$cart->id_customer);
+
+ if (!$cart->OrderExists()) {
+
+ $payment_type = (int)Configuration::get('PS_OS_PAYMENT');
+ $payment_status = 'Completed';
+ $message = $ppec->l('Payment accepted.') . '
';
+ $transaction = array(
+ 'currency' => 'EUR',
+ 'id_invoice' => null,
+ 'id_transaction' => $id_transaction,
+ 'transaction_id' => $id_transaction,
+ 'total_paid' => (float)$orderToProcess['amount'],
+ 'shipping' => (float)$orderToProcess['shipping_cost'],
+ 'payment_date' => $orderToProcess['order_time'],
+ 'payment_status' => $payment_status
+ );
+
+ $order_total = (float)$cart->getOrderTotal(true, Cart::BOTH);
+ if ($scriptDebug) {
+ $params = array(
+ 'cart_id ' => (int)$cart->id,
+ 'payment_type' => $payment_type,
+ 'order_total' => $order_total,
+ 'displayName' => 'PayPal',
+ 'message' => $message,
+ 'transaction' => $transaction,
+ 'cart->id_currency' => (int)$cart->id_currency,
+ 'customer->secure_key' => $customer->secure_key
+ );
+ echo json_encode($params);
+ } else {
+
+ $ppec->validateOrder((int)$cart->id, $payment_type, $order_total, 'PayPal', $message, $transaction,
+ (int)$cart->id_currency, false, $customer->secure_key);
+ }
+ }
+}