2017-08-30 11:37:48 +02:00

196 lines
6.6 KiB
PHP

<?php
/**
* TNT OFFICIAL MODULE FOR PRESTASHOP.
*
* @author GFI Informatique <www.gfi.fr>
* @copyright 2016-2017 GFI Informatique, 2016-2017 TNT
* @license https://opensource.org/licenses/MIT MIT License
*/
require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php';
require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php';
require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_ShipmentHelper.php';
require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Logger.php';
require_once _PS_MODULE_DIR_.'tntofficiel/libraries/pdf/TNTOfficiel_PDFMerger.php';
class TNTOfficiel_OrderHelper
{
/** @var TNTOfficiel_OrderHelper */
private static $_instance = null;
/** @var TNTOfficiel_Logger */
private $logger;
/**
* Constructor.
*/
public function __construct()
{
TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__));
$this->logger = new TNTOfficiel_Logger();
}
/**
* Creates a singleton.
*
* @param void
*
* @return TNTOfficiel_OrderHelper
*/
public static function getInstance()
{
TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__));
if (is_null(TNTOfficiel_OrderHelper::$_instance)) {
TNTOfficiel_OrderHelper::$_instance = new TNTOfficiel_OrderHelper();
}
return TNTOfficiel_OrderHelper::$_instance;
}
/**
* Gets the tnt product code for an order.
*
* @param $orderId
*
* @return string
*
* @throws Exception
*/
public function getOrderData($orderId, $stopOnException = true)
{
TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__));
$sql = 'SELECT * FROM '._DB_PREFIX_.'tntofficiel_order WHERE id_order = '.(int)$orderId;
$result = Db::getInstance()->getRow($sql, false);
if (!$result && $stopOnException) {
throw new Exception('No tnt product was found for the order '.$orderId);
}
return $result;
}
/**
* Revert the order state to its previous state.
*
* @param $orderId
*
* @throws Exception
*/
public function revertState($orderId)
{
TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__));
$arrTNTOrder = $this->getOrderData($orderId);
$orderState = new OrderState($arrTNTOrder['previous_state']);
$history = new OrderHistory();
$history->id_order = (int)$orderId;
$history->changeIdOrderState((int)$orderState, (int)$orderId);
$history->save();
}
/**
* Change the order state to the prestashop default shipping state.
*
* @param $orderId
*/
public function validateShippedState($orderId)
{
TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__));
$history = new OrderHistory();
$history->id_order = (int)$orderId;
$history->changeIdOrderState((int)(Configuration::get('PS_OS_SHIPPING')), (int)$orderId);
$history->save();
}
/**
* Get all the tnt orders.
*
* @return array
*
* @throws PrestaShopDatabaseException
*/
public function getTntOrders()
{
TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__));
$sql = 'SELECT * FROM '._DB_PREFIX_.'orders o ';
$sql .= 'JOIN '._DB_PREFIX_.'tntofficiel_order t ON o.id_order = t.id_order';
$orders = Db::getInstance()->executeS($sql);
return $orders;
}
/**
* Concatenate all the bt for the given orders.
*
* @param $orderList
*
* @return string
*
* @throws Exception
*/
public function getBt($orderList)
{
TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__));
$pdf = new TNTOfficiel_PDFMerger();
$btCounter = 0;
foreach ($orderList as $orderId) {
try {
$arrTNTOrder = $this->getOrderData($orderId, false);
$strBTFilename = $arrTNTOrder['bt_filename'];
if ($strBTFilename && filesize(_PS_MODULE_DIR_.'tnt_media/media/bt/'.$strBTFilename) > 0) {
++$btCounter;
$pdf->addPDF(_PS_MODULE_DIR_.'tnt_media/media/bt/'.$strBTFilename);
}
} catch (Exception $objException) {
$objFileLogger = new FileLogger();
$objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log');
$objFileLogger->logError($objException->getMessage());
}
}
if ($btCounter > 0) {
return $pdf->merge('download', 'bt_list.pdf');
}
}
/**
* Create a new address and assign it to the order as the deliveray address.
*
* @param $arrProduct
* @param $orderId
*/
public static function createNewAddress($arrProduct, $orderId)
{
TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__));
$strRepoType = (array_key_exists('xett', $arrProduct) && isset($arrProduct['xett'])) ? 'xett' : 'pex';
$order = new Order($orderId);
$oldAddress = new Address($order->id_address_delivery);
$address = new Address();
$address->id_country = (int)Context::getContext()->country->id;
$address->id_customer = 0;
$address->id_manufacturer = 0;
$address->id_supplier = 0;
$address->id_warehouse = 0;
$address->alias = TNTOfficiel::MODULE_NAME;
$address->lastname = $oldAddress->lastname; //lastname cannot be empty
$address->firstname = $oldAddress->firstname; //firstname cannot be empty
$address->company = sprintf('%s - %s', $arrProduct[ $strRepoType ], $arrProduct['name']);
$address->address1 = ($strRepoType === 'xett') ? $arrProduct['address'] : $arrProduct['address1'];
$address->address2 = ($strRepoType === 'xett') ? '' : $arrProduct['address2'];
$address->city = $arrProduct['city'];
$address->postcode = $arrProduct['postcode'];
$address->save();
//assign the new delivery address to the order
$order->id_address_delivery = (int)$address->id;
$order->save();
//Db::getInstance()->update('orders', array('id_address_delivery' => $address->id), 'id_order = '.(int) $orderId);
}
}