* @copyright 2007-2017 Decanet SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA */ require_once(dirname(__FILE__).'/../../prelevementsepa.php'); class AdminSepaOrdersController extends ModuleAdminController { public $module = 'prelevementsepa'; public $name = 'prelevementsepa'; public function __construct() { $this->path = _PS_MODULE_DIR_.$this->module.'/'; $this->className = 'prelevementsepa'; $this->display = 'edit'; $this->multishop_context = Shop::CONTEXT_ALL; $this->id_lang = (int)Context::getContext()->language->id; $this->lang = true; $this->deleted = false; $this->colorOnBackground = false; $this->url = __PS_BASE_URI__.basename(_PS_MODULE_DIR_).'/'.$this->name.'/'; $this->images = $this->url.'views/img/'; $this->context = Context::getContext(); $this->bootstrap = true; parent::__construct(); } public function postProcess() { if (Tools::isSubmit('submitGenerateXML') || Tools::isSubmit('submitRegenerateXML')) { require_once(dirname(__FILE__).'/../../classes/PrevSepaOrder.php'); require_once(dirname(__FILE__).'/../../classes/PrevSepaOrderTraited.php'); require_once(dirname(__FILE__).'/../../classes/PrevSepa.php'); require_once(dirname(__FILE__).'/../../classes/SepaDD.php'); require_once(dirname(__FILE__).'/../../classes/SepaDDCbi.php'); $order_state = false; if (Tools::isSubmit('submitGenerateXML')) { if ((int)Tools::getValue('id_order_state')>0) { $id_order_state = (int)Tools::getValue('id_order_state'); $order_state = new OrderState($id_order_state); if (!Validate::isLoadedObject($order_state)) { $this->errors[] = sprintf( Tools::displayError('Order status #%d cannot be loaded'), $id_order_state ); } } } $params = array( 'name' => $this->module->conf_keys['creancier'], 'IBAN' => $this->module->conf_keys['IBAN'], 'BIC' => $this->module->conf_keys['BIC'], 'batch' => true, 'creditor_id' => $this->module->conf_keys['ICS'], 'delay_working' => $this->module->conf_keys['delay_working'], 'currency' => 'EUR', 'CBI' => $this->module->conf_keys['CBI'] ); if ($this->module->conf_keys['format']!='cbi') { $sepadd = new SepaDD($params); } else { $sepadd = new SepaDDCbi($params); } if (Tools::isSubmit('submitGenerateXML')) { $sepatraited_obj = new PrevSepaOrderTraited(); $sepatraited_obj->order_state = (int)Tools::getValue('id_order_state'); $sepatraited_obj->add(); } if (Tools::getIsset('sepaordersBox') && is_array(Tools::getValue('sepaordersBox')) && count(Tools::getValue('sepaordersBox'))>0) { foreach (Tools::getValue('sepaordersBox') as $id_sepa) { if (count($this->errors)==0) { $sepa_obj = new PrevSepaOrder((int)$id_sepa); $order = new Order((int)$sepa_obj->id_order); $id_order = $order->id; if (!Validate::isLoadedObject($order)) { $this->errors[] = sprintf( Tools::displayError('Order #%d cannot be loaded'), $id_order ); } else { if (Tools::isSubmit('submitGenerateXML')) { $sepatraited_obj->addOrder($id_order); } try { $customer = new Customer((int)$order->id_customer); $sepa_customer_obj = new PrevSepa($sepa_obj->id_sepa); $sepa_obj->traite = 1; $amount = (int)round($order->total_paid * 100); $sepa_obj->save(); if ((Tools::strlen($customer->company)>0)) { $name = $customer->company; } elseif (Tools::strlen($customer->firstname.$customer->lastname) > 3) { $name = $customer->firstname.' '.$customer->lastname; } else { $name = 'No name'; } $mandateid = $order->invoice_number ? Configuration::get('PS_INVOICE_PREFIX', $order->id_lang).sprintf('%06d', $order->invoice_number) : $order->reference; $payment = array( 'name' => $name, 'IBAN' => $sepa_customer_obj->iban, 'BIC' => $sepa_customer_obj->bic, 'amount' => $amount, 'type' => empty($sepa_customer_obj->sepa_type) ? 'RCUR' : $sepa_customer_obj->sepa_type, 'collection_date' => date( 'Y-m-d', $this->getWorkingDays( time(), ($this->module->conf_keys['delay_working']? $this->module->conf_keys['delay_working']:2) ) ), 'mandate_id' => $mandateid, 'mandate_date' => date('Y-m-d'), 'description' => str_replace( '[reference]', $order->reference, $this->module->conf_keys['label'] ) ); $sepadd->addPayment($payment); if ($sepa_customer_obj->sepa_type=='FRST') { $sepa_customer_obj->sepa_type='RCUR'; $sepa_customer_obj->save(); } if (Tools::isSubmit('submitGenerateXML')) { if ($order_state && Validate::isLoadedObject($order_state)) { $current_order_state = $order->getCurrentOrderState(); if ($current_order_state->id == $order_state->id) { $this->errors[] = $this->displayWarning( sprintf('Order #%d has already been assigned this status.', $id_order) ); } else { $history = new OrderHistory(); $history->id_order = $order->id; $history->id_employee = (int)$this->context->employee->id; $use_existings_payment = !$order->hasInvoice(); $history->changeIdOrderState( (int)$order_state->id, $order, $use_existings_payment ); $carrier = new Carrier($order->id_carrier, $order->id_lang); $templateVars = array(); if ($history->id_order_state == Configuration::get('PS_OS_SHIPPING') && $order->shipping_number ) { $templateVars = array( '{followup}' => str_replace( '@', $order->shipping_number, $carrier->url ) ); } if ($history->addWithemail(true, $templateVars)) { if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) { foreach ($order->getProducts() as $product) { if (StockAvailable::dependsOnStock($product['product_id'])) { StockAvailable::synchronize( $product['product_id'], (int)$product['id_shop'] ); } } } } else { $this->errors[] = sprintf( Tools::displayError('Cannot change status for order #%d.'), $id_order ); } } } } } catch (Exception $e) { $this->errors[] = 'Order '.$order->reference.' : '.$e->getMessage(); } } } } } if (count($this->errors)==0) { $filename = 'sepa_file_'.date('Y-m-d-His').'.xml'; file_put_contents(_PS_CACHE_DIR_.$filename, $sepadd->save()); Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token .'&file='.$filename); } } parent::postProcess(); } public function renderForm() { if (Tools::getIsset('dl')) { if (!file_exists(_PS_CACHE_DIR_.Tools::getValue('dl'))) { $this->errors[] = $this->module->l('A problem occurred with the file download. ' . 'Maybe you have already downloaded it?'); } else { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.Tools::getValue('dl')); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: '.filesize(_PS_CACHE_DIR_.Tools::getValue('dl'))); readfile(_PS_CACHE_DIR_.Tools::getValue('dl')); @unlink(_PS_CACHE_DIR_.Tools::getValue('dl')); die(); } } require_once(dirname(__FILE__).'/../../classes/PrevSepaOrder.php'); $traited = (int)Tools::getValue('etat', 0); if (Tools::getIsset('submitResetsepaorders')) { $_POST['sepaordersFilter_id_sepa_detail'] = null; $_POST['sepaordersFilter_order'] = null; $_POST['sepaordersFilter_customer'] = null; } $fields_list = array( 'id_sepa_detail' => array( 'title' => $this->l('Id'), 'width' => 140, 'type' => 'text', ), 'order' => array( 'title' => $this->l('Order number'), 'width' => 140, 'type' => 'text', 'search' => 'true', 'orderby' => false ), 'customer' => array( 'title' => $this->l('Customer'), 'width' => 140, 'type' => 'text', 'search' => 'true', 'orderby' => false ), 'sepa_date' => array( 'title' => $this->l('Payment date'), 'width' => 70, 'type' => 'date', 'search' => false, 'orderby' => false ), 'jn' => array( 'title' => $this->l('J +/-N'), 'width' => 70, 'type' => 'text', 'search' => false, 'orderby' => false ), 'remarks' => array( 'title' => $this->l('Remarks'), 'width' => 140, 'type' => 'text', 'search' => false, 'orderby' => false, ) ); $helper = new HelperList(); $helper->module = $this->module; $helper->shopLinkType = ''; //$helper->simple_header = true; $helper->list_id = $list_id = 'sepaorders'; if ($traited == 1) { $helper->actions = array('view'); } $helper->identifier = 'id_sepa_detail'; //$helper->show_toolbar = true; $helper->title = $this->l('SEPA Direct Debits'); $helper->no_link = true; $helper->token = $this->token; $helper->currentIndex = self::$currentIndex; // if (!$traited) { $helper->bulk_actions = array( 'generateXML' => array( 'text' => $this->l('Generate the XML file'), 'icon' => 'icon-refresh' ) ); $helper->force_show_bulk_actions = true; // } if (Tools::getIsset('file')) { $helper->tpl_vars['dlFile'] = Tools::getValue('file'); } if (Tools::isSubmit('submitBulkgenerateXMLconfiguration')) { if (Tools::getIsset('cancel')) { Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token); } $helper->tpl_vars['updateOrderStatus_mode'] = 1; $statuses = OrderState::getOrderStates((int)$this->context->language->id); $helper->tpl_vars['order_statuses'] = array(); foreach ($statuses as $status) { $helper->tpl_vars['order_statuses'][$status['id_order_state']] = $status['name']; } $helper->tpl_vars['REQUEST_URI'] = $_SERVER['REQUEST_URI']; } $helper->tpl_vars['POST'] = $_POST; if ($traited == 2) { $sepa = PrevSepaOrder::getAllSepa(0, 0, null); } else { $sepa = PrevSepaOrder::getAllSepa($traited); } $sepa_list = array(); if ($sepa && count($sepa)>0) { foreach ($sepa as $s) { if (Tools::getValue('sepaordersFilter_id_sepa_detail') && Tools::getValue('sepaordersFilter_id_sepa_detail') != $s['id_sepa_detail']) { continue; } $s['remarks'] = ''; $s['jn'] = ''; if (empty($s['rum'])) { $s['remarks'] .= $this->l('RUM is empty')."; "; } if (empty($s['iban'])) { $s['remarks'] .= $this->l('IBAN is empty')."; "; } if (empty($s['bic'])) { $s['remarks'] .= $this->l('BIC is empty')."; "; } $s['order'] = new Order((int)$s['id_order']); if ($s['order']->valid == 1) { if (Tools::getValue('sepaordersFilter_order') && !preg_match('#'.Tools::getValue('sepaordersFilter_order').'#i', $s['order']->reference)) { continue; } $nbdays = (strtotime($s['sepa_date']) - time()) / 86400; // die(var_dump(intval($nbdays))); if ($nbdays < 0) { $s['jn'] = 'J -'.floor(abs($nbdays)); } else { $s['jn'] = 'J +'.floor(abs($nbdays)); } $customer_obj = new Customer((int)$s['order']->id_customer); if (Tools::getValue('sepaordersFilter_customer') && !preg_match('#'.Tools::getValue('sepaordersFilter_customer').'#i', $customer_obj->firstname) && !preg_match('#'.Tools::getValue('sepaordersFilter_customer').'#i', $customer_obj->lastname)) { continue; } $sepa_list[] = array( 'id_sepa_detail' => $s['id_sepa_detail'], 'order' => $s['order']->reference, 'customer' => Tools::strtoupper(Tools::substr($customer_obj->firstname, 0, 1).'. '.$customer_obj->lastname), 'sepa_date' => $s['sepa_date'], 'jn' => $s['jn'], 'remarks' => $s['remarks'] ); } } } return $helper->generateList($sepa_list, $fields_list); } public function ajaxProcessGetUnvalidOrdersSEPA() { $sepa = PrevSepaOrder::getAllUnActive(); if (is_array($sepa) && count($sepa)) { foreach ($sepa as &$s) { $s['order'] = new Order((int)$s['id_order']); $s['customer'] = new Customer((int)$s['order']->id_customer); } } $this->context->smarty->assign('path', $this->url); $this->context->smarty->assign('modimgdir', $this->images); $this->context->smarty->assign('sepaList', $sepa); echo $this->context->smarty->fetch($this->path.'views/templates/admin/sepa_list.tpl'); die(); } public function getWorkingDays($date_start, $nb_days) { $wd = 1; $i = 1; while ($wd <= $nb_days) { $date_mk = $date_start + (86400 * $i); if ((date("N", $date_mk) != 6) && (date("N", $date_mk) != 7)) { $wd++; } $i++; } return $date_start +(86400 * ($i-1)); } public function getWorkingDay($date_start, $nb_days) { $date_start = $date_start + (86400 * $nb_days); if ((date("N", $date_start) != 6) && (date("N", $date_start) != 7)) { return $date_start; } else { $date_start = $date_start + 86400; if ((date("N", $date_start) != 6) && (date("N", $date_start) != 7)) { return $date_start; } else { return $date_start + 86400; } } } public function renderView() { require_once(dirname(__FILE__).'/../../classes/PrevSepaOrder.php'); $sepa_obj = new PrevSepaOrder((int) Tools::getValue('id_sepa_detail')); $sepa = PrevSepaOrder::getGeneratedSepaList($sepa_obj->id_order); $fields_list = array( 'id_sepa_detail' => array( 'title' => $this->l('Id'), 'width' => 140, 'type' => 'text', ), 'order' => array( 'title' => $this->l('Order number'), 'width' => 140, 'type' => 'text', ), 'sepa_date' => array( 'title' => $this->l('Payment date'), 'width' => 140, 'type' => 'date', ), 'jn' => array( 'title' => $this->l('J +/-N'), 'width' => 140, 'type' => 'text', 'search' => false, 'orderby' => false, ), 'remarks' => array( 'title' => $this->l('Remarks'), 'width' => 140, 'type' => 'text', 'search' => false, 'orderby' => false, ) ); $helper = new HelperList(); // $helper->module = $this->module; $helper->shopLinkType = ''; $helper->simple_header = false; $helper->actions = array(''); $helper->identifier = 'id_sepa_detail'; $helper->title = $this->l('SEPA Direct Debits'); $helper->no_link = true; $helper->token = $this->token; $helper->currentIndex = self::$currentIndex; $sepa_list = array(); if (count($sepa)>0) { foreach ($sepa as $s) { $s['remarks'] = ''; $s['jn'] = ''; if (empty($s['rum'])) { $s['remarks'] .= $this->l('RUM is empty')."; "; } if (empty($s['iban'])) { $s['remarks'] .= $this->l('IBAN is empty')."; "; } if (empty($s['bic'])) { $s['remarks'] .= $this->l('BIC is empty')."; "; } $s['order'] = new Order((int)$s['id_order']); if ($s['order']->valid == 1) { $nbdays = (strtotime($s['sepa_date']) - time()) / 86400; if ($nbdays < 0) { $s['jn'] = 'J -'.floor(abs($nbdays)); } else { $s['jn'] = 'J +'.floor(abs($nbdays)); } $sepa_list[] = array( 'id_sepa_detail' => $s['id_sepa_detail'], 'order' => $s['order']->reference, 'sepa_date' => $s['sepa_date'], 'jn' => $s['jn'], 'remarks' => $s['remarks'] ); } } } $this->tpl_view_vars = array( 'sepas' => $sepa_list, 'sepalist' => $helper->generateList($sepa_list, $fields_list) ); if (Tools::getIsset('file')) { $this->tpl_view_vars['dlFile'] = Tools::getValue('file'); } return parent::renderView(); } }