diff --git a/retailcrm/cli.php b/retailcrm/cli.php index 452d769..d49eff0 100644 --- a/retailcrm/cli.php +++ b/retailcrm/cli.php @@ -42,6 +42,10 @@ if (!isset($_SERVER['REQUEST_METHOD'])) { $_SERVER['REQUEST_METHOD'] = 'POST'; } +if (!isset($_SERVER['REMOTE_ADDR'])) { + $_SERVER['REMOTE_ADDR'] = '0.0.0.0'; +} + require_once dirname(__FILE__) . '/lib/RetailcrmCli.php'; function retailcrmCliInterruptHandler($signo) diff --git a/retailcrm/controllers/front/Consultant.php b/retailcrm/controllers/front/Consultant.php index bfbf738..244e994 100644 --- a/retailcrm/controllers/front/Consultant.php +++ b/retailcrm/controllers/front/Consultant.php @@ -49,7 +49,9 @@ class RetailcrmConsultantModuleFrontController extends ModuleFrontController $this->ajax = true; } - header('Content-Type: application/json'); + if (!headers_sent()) { + header('Content-Type: application/json'); + } if (Tools::substr(_PS_VERSION_, 0, 3) == '1.6') { echo $response; diff --git a/retailcrm/controllers/front/DaemonCollector.php b/retailcrm/controllers/front/DaemonCollector.php index 3a79481..e5fca39 100644 --- a/retailcrm/controllers/front/DaemonCollector.php +++ b/retailcrm/controllers/front/DaemonCollector.php @@ -49,7 +49,9 @@ class RetailcrmDaemonCollectorModuleFrontController extends ModuleFrontControlle $this->ajax = true; } - header('Content-Type: application/json'); + if (!headers_sent()) { + header('Content-Type: application/json'); + } if (Tools::substr(_PS_VERSION_, 0, 3) == '1.6') { echo $response; diff --git a/retailcrm/controllers/front/Jobs.php b/retailcrm/controllers/front/Jobs.php index fb910a8..2e1cc72 100644 --- a/retailcrm/controllers/front/Jobs.php +++ b/retailcrm/controllers/front/Jobs.php @@ -49,7 +49,9 @@ class RetailcrmJobsModuleFrontController extends ModuleFrontController $this->ajax = true; } - header('Content-Type: application/json'); + if (!headers_sent()) { + header('Content-Type: application/json'); + } if (Tools::substr(_PS_VERSION_, 0, 3) == '1.6') { echo $response; diff --git a/retailcrm/lib/RetailcrmHistory.php b/retailcrm/lib/RetailcrmHistory.php index abcfa0d..0ca5a51 100644 --- a/retailcrm/lib/RetailcrmHistory.php +++ b/retailcrm/lib/RetailcrmHistory.php @@ -489,8 +489,23 @@ class RetailcrmHistory static::assignAddressIdByFields($customer, $address); if (empty($address->id)) { + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + ' %s::%s', + $address->id_customer, + get_class($address), + 'add' + ) + ); + $address->add(); } else { + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf('<%d> %s::%s', $address->id, get_class($address), 'save') + ); + $address->save(); } @@ -502,12 +517,26 @@ class RetailcrmHistory $cart->id_address_invoice = (int) $address->id; $cart->id_carrier = (int) $deliveryType; + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + ' %s::%s', + $cart->id_customer, + get_class($cart), + 'add' + ) + ); + $cart->add(); $products = array(); if (!empty($order['items'])) { foreach ($order['items'] as $item) { + if (RetailcrmOrderBuilder::isGiftItem($item)) { + continue; + } + $productId = explode('#', $item['offer']['externalId']); $product = array(); @@ -520,6 +549,17 @@ class RetailcrmHistory } $cart->setWsCartRows($products); + + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + '<%d> %s::%s', + $cart->id, + get_class($cart), + 'update' + ) + ); + $cart->update(); /* @@ -581,6 +621,10 @@ class RetailcrmHistory $product_id = $item['offer']['externalId']; $product_attribute_id = 0; + if (RetailcrmReferences::GIFT_WRAPPING_ITEM_EXTERNAL_ID == $product_id) { + continue; + } + if (strpos($item['offer']['externalId'], '#') !== false) { $product_id = explode('#', $item['offer']['externalId']); $product_attribute_id = $product_id[1]; @@ -625,6 +669,16 @@ class RetailcrmHistory } try { + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + ' %s::%s', + $newOrder->id_customer, + get_class($newOrder), + 'add' + ) + ); + $newOrder->add(false, false); if (isset($newOrderHistoryRecord)) { @@ -633,6 +687,17 @@ class RetailcrmHistory $newOrderHistoryRecord->id_employee = static::getFirstEmployeeId(); $newOrderHistoryRecord->date_add = date('Y-m-d H:i:s'); $newOrderHistoryRecord->date_upd = $newOrderHistoryRecord->date_add; + + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + ' %s::%s', + $newOrderHistoryRecord->id_order, + get_class($newOrderHistoryRecord), + 'add' + ) + ); + $newOrderHistoryRecord->add(); } } catch (\Exception $e) { @@ -664,6 +729,17 @@ class RetailcrmHistory $orderPayment->id_currency = $default_currency; $orderPayment->amount = $payment['amount']; $orderPayment->date_add = $payment['paidAt']; + + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + ' %s::%s', + $newOrder->reference, + get_class($orderPayment), + 'save' + ) + ); + $orderPayment->save(); } } @@ -675,6 +751,17 @@ class RetailcrmHistory $carrier->id_carrier = $deliveryType; $carrier->shipping_cost_tax_excl = $order['delivery']['cost']; $carrier->shipping_cost_tax_incl = $order['delivery']['cost']; + + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + ' %s::%s', + $carrier->id_order, + get_class($carrier), + 'add' + ) + ); + $carrier->add(false, false); /* @@ -738,6 +825,16 @@ class RetailcrmHistory $orderCarrier->id_order = $orderToUpdate->id; + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + '<%d> %s::%s', + $orderCarrier->id, + get_class($orderCarrier), + 'update' + ) + ); + $orderCarrier->update(); } } @@ -777,6 +874,17 @@ class RetailcrmHistory $orderPayment->id_currency = $default_currency; $orderPayment->date_add = isset($payment['paidAt']) ? $payment['paidAt'] : date('Y-m-d H:i:s'); + + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + ' %s::%s', + $orderToUpdate->reference, + get_class($orderPayment), + 'save' + ) + ); + $orderPayment->save(); } } @@ -800,9 +908,31 @@ class RetailcrmHistory $orderHistory->id_order = $orderToUpdate->id; $orderHistory->id_order_state = $statuses[$stype]; $orderHistory->date_add = date('Y-m-d H:i:s'); + + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + ' %s::%s', + $orderToUpdate->id, + get_class($orderHistory), + 'save' + ) + ); + $orderHistory->save(); $orderToUpdate->current_state = $statuses[$stype]; + + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + ' %s::%s', + $orderToUpdate->id, + get_class($orderToUpdate), + 'update' + ) + ); + $orderToUpdate->update(); } } @@ -834,6 +964,10 @@ class RetailcrmHistory foreach ($order['items'] as $key => $item) { if (isset($item['delete']) && $item['delete'] == true) { + if (RetailcrmOrderBuilder::isGiftItem($item)) { + $orderToUpdate->gift = false; + } + $parsedExtId = static::parseItemExternalId($item); $product_id = $parsedExtId['product_id']; $product_attribute_id = $parsedExtId['product_attribute_id']; @@ -852,6 +986,10 @@ class RetailcrmHistory */ foreach ($orderToUpdate->getProductsDetail() as $orderItem) { foreach ($order['items'] as $key => $item) { + if (RetailcrmOrderBuilder::isGiftItem($item)) { + continue; + } + $parsedExtId = static::parseItemExternalId($item); $product_id = $parsedExtId['product_id']; $product_attribute_id = $parsedExtId['product_attribute_id']; @@ -909,6 +1047,16 @@ class RetailcrmHistory $orderDetail->product_attribute_id = (int) $product_attribute_id; $orderDetail->product_quantity = (int) $item['quantity']; + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + ' %s::%s', + $orderDetail->id_order, + get_class($orderDetail), + 'save' + ) + ); + if ($orderDetail->save()) { $upOrderItems = array( 'externalId' => $orderDetail->id_order, @@ -943,6 +1091,16 @@ class RetailcrmHistory } } + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + '<%d> %s::%s', + $orderDetail->id, + get_class($orderDetail), + 'update' + ) + ); + $orderDetail->update(); $ItemDiscount = true; unset($order['items'][$key]); @@ -955,6 +1113,10 @@ class RetailcrmHistory */ if (!empty($order['items'])) { foreach ($order['items'] as $key => $newItem) { + if (RetailcrmOrderBuilder::isGiftItem($newItem)) { + continue; + } + $isNewItem = isset($newItem['create']) ? $newItem['create'] : false; if (!$isNewItem) { @@ -1013,6 +1175,16 @@ class RetailcrmHistory $orderDetail->id_order_detail = !empty($parsedExtId['id_order_detail']) ? $parsedExtId['id_order_detail'] : null; + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + ' %s::%s', + $orderDetail->id_order, + get_class($orderDetail), + 'save' + ) + ); + if ($orderDetail->save()) { $upOrderItems = array( 'externalId' => $orderDetail->id_order, @@ -1053,6 +1225,17 @@ class RetailcrmHistory $infoOrder = $infoOrd->order; $totalPaid = $infoOrder['totalSumm']; $orderToUpdate->total_paid = $totalPaid; + + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + '<%d> %s::%s', + $orderToUpdate->id, + get_class($orderToUpdate), + 'update' + ) + ); + $orderToUpdate->update(); /* @@ -1085,6 +1268,17 @@ class RetailcrmHistory $orderToUpdate->total_paid_tax_incl = $totalPaid; $orderToUpdate->total_paid_tax_excl = $totalPaid; $orderToUpdate->total_products_wt = $orderTotalProducts; + + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + '<%d> %s::%s', + $orderToUpdate->id, + get_class($orderToUpdate), + 'update' + ) + ); + $orderToUpdate->update(); unset($ItemDiscount); } @@ -1127,6 +1321,28 @@ class RetailcrmHistory */ private static function loadInCMS($object, $action) { + $prefix = $object->id; + + if (empty($object->id)) { + if (property_exists(get_class($object), 'id_customer')) { + $prefix = sprintf('Customer ID: %d', $object->id_customer); + } + + if (property_exists(get_class($object), 'id_order')) { + $prefix = sprintf('Order ID: %d', $object->id_order); + } + } + + RetailcrmLogger::writeDebug( + __METHOD__, + sprintf( + '<%s> %s::%s', + $prefix, + get_class($object), + $action + ) + ); + try { $object->$action(); } catch (PrestaShopException $e) { diff --git a/retailcrm/lib/RetailcrmJobManager.php b/retailcrm/lib/RetailcrmJobManager.php index f8f142b..3c82a1d 100644 --- a/retailcrm/lib/RetailcrmJobManager.php +++ b/retailcrm/lib/RetailcrmJobManager.php @@ -392,7 +392,7 @@ class RetailcrmJobManager register_shutdown_function(function() { $error = error_get_last(); - if(null !== $error) { + if(null !== $error && $error['type'] === E_ERROR) { self::defaultShutdownHandler($error); } }); diff --git a/retailcrm/lib/RetailcrmOrderBuilder.php b/retailcrm/lib/RetailcrmOrderBuilder.php index 753ae7f..331112e 100644 --- a/retailcrm/lib/RetailcrmOrderBuilder.php +++ b/retailcrm/lib/RetailcrmOrderBuilder.php @@ -1016,6 +1016,10 @@ class RetailcrmOrderBuilder $crmOrder['items'][] = $item; } + if ($order->gift && $order->total_wrapping > 0) { + self::setOrderGiftItem($order, $crmOrder); + } + if ($order->id_customer) { if (empty($corporateCustomerId)) { $crmOrder['customer']['externalId'] = $order->id_customer; @@ -1214,4 +1218,80 @@ class RetailcrmOrderBuilder return RetailcrmTools::clearArray($customer); } + + /** + * Returns true if provided item array contains placeholder item added for equal price with payment. + * + * @param array $item + * + * @return bool + */ + public static function isGiftItem($item) + { + if (isset($item['offer']) + && isset($item['offer']['externalId']) + && $item['offer']['externalId'] == RetailcrmReferences::GIFT_WRAPPING_ITEM_EXTERNAL_ID + ) { + return true; + } + + if (isset($item['externalIds'])) { + foreach ($item['externalIds'] as $externalId) { + if ($externalId['code'] == 'prestashop' + && $externalId['value'] == RetailcrmReferences::GIFT_WRAPPING_ITEM_EXTERNAL_ID + ) { + return true; + } + } + } + + return false; + } + + /** + * Returns gift item + * + * @param float $giftItemPrice + * + * @return array + */ + public static function getGiftItem($giftItemPrice) + { + return array( + 'externalIds' => array(array( + 'code' => 'prestashop', + 'value' => RetailcrmReferences::GIFT_WRAPPING_ITEM_EXTERNAL_ID + )), + 'offer' => array('externalId' => RetailcrmReferences::GIFT_WRAPPING_ITEM_EXTERNAL_ID), + 'productName' => 'Gift Wrapping Cost', + 'quantity' => 1, + 'initialPrice' => $giftItemPrice, + 'purchasePrice' => $giftItemPrice + ); + } + + /** + * Sets gift item to order (should be called if order is marked as gift) + * + * @param Order|\OrderCore $orderCms + * @param array $orderCrm + */ + private static function setOrderGiftItem($orderCms, &$orderCrm) + { + $isFound = false; + $giftItemPrice = round($orderCms->total_wrapping, 2); + + foreach ($orderCrm['items'] as $key => $item) { + if (self::isGiftItem($item)) { + $orderCrm['items'][$key] = self::getGiftItem($giftItemPrice); + $isFound = true; + + break; + } + } + + if (!$isFound) { + $orderCrm['items'][] = self::getGiftItem($giftItemPrice); + } + } } diff --git a/retailcrm/lib/RetailcrmReferences.php b/retailcrm/lib/RetailcrmReferences.php index d47bd52..c4be561 100644 --- a/retailcrm/lib/RetailcrmReferences.php +++ b/retailcrm/lib/RetailcrmReferences.php @@ -37,6 +37,8 @@ */ class RetailcrmReferences { + const GIFT_WRAPPING_ITEM_EXTERNAL_ID = 'giftWrappingCost'; + public $default_lang; public $carriers; public $payment_modules = array(); diff --git a/tests/RetailcrmHistoryTest.php b/tests/RetailcrmHistoryTest.php index e23d351..b8191ea 100644 --- a/tests/RetailcrmHistoryTest.php +++ b/tests/RetailcrmHistoryTest.php @@ -216,7 +216,8 @@ class RetailcrmHistoryTest extends RetailcrmTestCase ), 'properties' => array(), 'purchasePrice' => 50 - ) + ), + array_merge(RetailcrmOrderBuilder::getGiftItem(10), array('id' => 25919)) ), 'fromApi' => false, 'length' => 0, @@ -231,7 +232,7 @@ class RetailcrmHistoryTest extends RetailcrmTestCase $order['payments'][] = array( 'id' => 97, 'type' => 'cheque', - 'amount' => 200 + 'amount' => 210 ); return $order;