Files
lulandia.pl/modules/pdcsvpriceupdate/pdcsvpriceupdate.php
2025-04-01 00:38:54 +02:00

1117 lines
40 KiB
PHP

<?php
/**
* 2012-2019 Patryk Marek PrestaDev.pl
*
* Patryk Marek PrestaDev.pl - PD CSV Price update on products © All rights reserved.
*
* DISCLAIMER
*
* Do not edit, modify or copy this file.
* If you wish to customize it, contact us at info@prestadev.pl.
*
* @author Patryk Marek PrestaDev.pl <info@prestadev.pl>
* @copyright 2012-2019 Patryk Marek - PrestaDev.pl
* @license License is for use in domain / or one multistore enviroment (do not modify or reuse this code or part of it) if you want any changes please contact with me at info@prestadev.pl
* @link http://prestadev.pl
* @package PD CSV Price update on products - PrestaShop 1.5.x and 1.6.x Module and 1.7.x Module
* @version 1.0.3
* @date 20-02-2017
*/
if (!defined('_PS_VERSION_'))
{
exit;
}
include_once(dirname(__FILE__) . '/models/HistoryCsvModel.php');
class PdCsvPriceUpdate extends Module
{
private $html = '';
private $postErrors = array();
private $file = '';
public $csv_file;
public function __construct()
{
@set_time_limit(0);
$this->need_instance = 0;
$this->name = 'pdcsvpriceupdate';
$this->tab = 'administration';
$this->version = '1.1.0';
$this->author = 'PrestaDev.pl';
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('Aktualizacja cen z pliku CSV');
$this->description = $this->l('Aktualizacja cen produktów z pliku CSV');
$this->confirmUninstall = $this->l('Are you sure you want to uninstall my module?');
$this->ps_versions_compliancy = array('min' => '1.5', 'max' => _PS_VERSION_);
if (file_exists(_PS_MODULE_DIR_ . $this->name . '/files/' . Configuration::get('PD_CSVPU_CSV_FILE')))
{
$this->csv_file = _PS_MODULE_DIR_ . $this->name . '/files/' . Configuration::get('PD_CSVPU_CSV_FILE');
}
$this->file = 'raport_z_aktualizacji_nie_znaleziono.csv';
$this->file_export = 'eksport_produktow.csv';
$this->update_type = Configuration::get('PD_CSVPU_UPDATE_TYPE');
$this->products_identifier = Configuration::get('PD_CSVPU_IDENTIFIER');
$this->csv_file_name = Configuration::get('PD_CSVPU_CSV_FILE');
$this->same_csv_allow = Configuration::get('PD_CSVPU_SAME_CSV');
$this->csv_header_ignore = Configuration::get('PD_CSVPU_HEADER_IGN');
$this->csv_delimeter = Configuration::get('PD_CSVPU_CSV_DELIM');
$this->csv_shop_update = Configuration::get('PD_CSVPU_UPDATE_SHOP');
$this->prices_with_tax = Configuration::get('PD_CSVPU_PRICES_WITH_TAX');
$this->products_identifier_export = Configuration::get('PD_CSVPU_IDENTIFIER_EXPORT');
$this->csv_delimeter_export = Configuration::get('PD_CSVPU_CSV_DELIM_EXPORT');
$this->csv_shop_update_export = Configuration::get('PD_CSVPU_UPDATE_SHOP_EXPORT');
$this->zero_base_price = Configuration::get('PD_CSVPU_ZERO_BASE_PRODUCT_PRICE');
$this->update_multiple = Configuration::get('PD_CSVPU_UPDATE_MULTIPLE_IDENTIFIERS');
}
public function install()
{
if (
!parent::install()
|| !HistoryCsvPriceUpdateModel::createTables()
|| !Configuration::updateValue('PD_CSVPU_ZERO_BASE_PRODUCT_PRICE', 0)
|| !Configuration::updateValue('PD_CSVPU_SAME_CSV', 1)
|| !Configuration::updateValue('PD_CSVPU_UPDATE_SHOP', 1)
|| !Configuration::updateValue('PD_CSVPU_IDENTIFIER', 1)
|| !Configuration::updateValue('PD_CSVPU_PRICES_WITH_TAX', 0)
|| !Configuration::updateValue('PD_CSVPU_CSV_FILE', '')
|| !Configuration::updateValue('PD_CSVPU_CSV_DELIM', ';')
|| !Configuration::updateValue('PD_CSVPU_UPDATE_TYPE', 1)
|| !Configuration::updateValue('PD_CSVPU_IDENTIFIER_EXPORT', 1)
|| !Configuration::updateValue('PD_CSVPU_UPDATE_SHOP_EXPORT', 1)
|| !Configuration::updateValue('PD_CSVPU_CSV_DELIM_EXPORT', ';')
|| !Configuration::updateValue('PD_CSVPU_UPDATE_MULTIPLE_IDENTIFIERS', 0)
)
{
return false;
}
return true;
}
public function uninstall()
{
if (
!Configuration::deleteByName('PD_CSVPU_CSV_FILE')
|| !Configuration::updateValue('PD_CSVPU_ZERO_BASE_PRODUCT_PRICE', 0)
|| !Configuration::deleteByName('PD_CSVPU_UPDATE_SHOP')
|| !Configuration::deleteByName('PD_CSVPU_IDENTIFIER')
|| !Configuration::deleteByName('PD_CSVPU_PRICES_WITH_TAX')
|| !Configuration::deleteByName('PD_CSVPU_CSV_FILE')
|| !Configuration::deleteByName('PD_CSVPU_CSV_DELIM')
|| !Configuration::deleteByName('PD_CSVPU_UPDATE_TYPE')
|| !Configuration::deleteByName('PD_CSVPU_SAME_CSV')
|| !Configuration::deleteByName('PD_CSVPU_IDENTIFIER_EXPORT')
|| !Configuration::deleteByName('PD_CSVPU_UPDATE_SHOP_EXPORT')
|| !Configuration::deleteByName('PD_CSVPU_CSV_DELIM_EXPORT')
|| !Configuration::deleteByName('PD_CSVPU_UPDATE_MULTIPLE_IDENTIFIERS')
|| !HistoryCsvPriceUpdateModel::dropTables()
|| !parent::uninstall()
)
{
return false;
}
return true;
}
public function getContent()
{
if (Tools::isSubmit('btnSubmitFile') || Tools::isSubmit('btnSubmitConfig') || Tools::isSubmit('btnDownloadUpdate') || Tools::isSubmit('btnDownloadCSVUpdate'))
{
$this->_postProcess();
}
$this->html .= $this->renderForm();
$this->html .= $this->renderList();
return $this->html;
}
public function _postProcess()
{
if (Tools::isSubmit('btnDownloadUpdate'))
{
if ($this->same_csv_allow == false)
{
if ($this->checkIfCsvNameWasUsed($this->csv_file_name))
{
$this->html .= $this->displayError($this->l('Plik o tej samej nazwie był już raz wgrany prosimy wgrać inny lub włączyć opcje "Ten sam plik" w konfiguracji modułu'));
return false;
}
}
$this->parseAndUpdateProducts();
}
if (Tools::isSubmit('btnDownloadCSVUpdate'))
{
$this->exportCSVProducts();
}
if (Tools::isSubmit('btnSubmitConfig'))
{
Configuration::updateValue('PD_CSVPU_ZERO_BASE_PRODUCT_PRICE', Tools::getValue('PD_CSVPU_ZERO_BASE_PRODUCT_PRICE'));
Configuration::updateValue('PD_CSVPU_SAME_CSV', Tools::getValue('PD_CSVPU_SAME_CSV'));
Configuration::updateValue('PD_CSVPU_CSV_DELIM', Tools::getValue('PD_CSVPU_CSV_DELIM'));
Configuration::updateValue('PD_CSVPU_IDENTIFIER', Tools::getValue('PD_CSVPU_IDENTIFIER'));
Configuration::updateValue('PD_CSVPU_HEADER_IGN', Tools::getValue('PD_CSVPU_HEADER_IGN'));
Configuration::updateValue('PD_CSVPU_UPDATE_TYPE', Tools::getValue('PD_CSVPU_UPDATE_TYPE'));
Configuration::updateValue('PD_CSVPU_UPDATE_SHOP', Tools::getValue('PD_CSVPU_UPDATE_SHOP'));
Configuration::updateValue('PD_CSVPU_PRICES_WITH_TAX', Tools::getValue('PD_CSVPU_PRICES_WITH_TAX'));
Configuration::updateValue('PD_CSVPU_CSV_DELIM_EXPORT', Tools::getValue('PD_CSVPU_CSV_DELIM_EXPORT'));
Configuration::updateValue('PD_CSVPU_IDENTIFIER_EXPORT', Tools::getValue('PD_CSVPU_IDENTIFIER_EXPORT'));
Configuration::updateValue('PD_CSVPU_UPDATE_SHOP_EXPORT', Tools::getValue('PD_CSVPU_UPDATE_SHOP_EXPORT'));
Configuration::updateValue('PD_CSVPU_UPDATE_MULTIPLE_IDENTIFIERS', Tools::getValue('PD_CSVPU_UPDATE_MULTIPLE_IDENTIFIERS'));
$this->update_type = Configuration::get('PD_CSVPU_UPDATE_TYPE');
$this->products_identifier = Configuration::get('PD_CSVPU_IDENTIFIER');
$this->csv_file_name = Configuration::get('PD_CSVPU_CSV_FILE');
$this->same_csv_allow = Configuration::get('PD_CSVPU_SAME_CSV');
$this->csv_header_ignore = Configuration::get('PD_CSVPU_HEADER_IGN');
$this->csv_delimeter = Configuration::get('PD_CSVPU_CSV_DELIM');
$this->csv_shop_update = Configuration::get('PD_CSVPU_UPDATE_SHOP');
$this->prices_with_tax = Configuration::get('PD_CSVPU_PRICES_WITH_TAX');
$this->products_identifier_export = Configuration::get('PD_CSVPU_IDENTIFIER_EXPORT');
$this->csv_delimeter_export = Configuration::get('PD_CSVPU_CSV_DELIM_EXPORT');
$this->csv_shop_update_export = Configuration::get('PD_CSVPU_UPDATE_SHOP_EXPORT');
$this->zero_base_price = Configuration::get('PD_CSVPU_ZERO_BASE_PRODUCT_PRICE');
$this->update_multiple = Configuration::get('PD_CSVPU_UPDATE_MULTIPLE_IDENTIFIERS');
}
if (Tools::isSubmit('btnSubmitFile'))
{
if (isset($_FILES['PD_CSVPU_CSV_FILE']) && isset($_FILES['PD_CSVPU_CSV_FILE']['tmp_name']) && !empty($_FILES['PD_CSVPU_CSV_FILE']['tmp_name']))
{
if ($this->same_csv_allow == false)
{
if ($this->checkIfCsvNameWasUsed($_FILES['PD_CSVQU_CSV_FILE']['name']))
{
$this->html .= $this->displayError($this->l('Plik o tej samej nazwie był już raz wgrany prosimy wgrać inny lub włączyć opcje "Ten sam plik" w konfiguracji modułu'));
return false;
}
}
// Delete previous file
if (file_exists(_PS_MODULE_DIR_ . $this->name . '/files/' . Configuration::get('PD_CSVPU_CSV_FILE')))
{
@unlink(_PS_MODULE_DIR_ . $this->name . '/files/' . Configuration::get('PD_CSVPU_CSV_FILE'));
Configuration::updateValue('PD_CSVPU_CSV_FILE', '');
}
// Store new file name in config
Configuration::updateValue('PD_CSVPU_CSV_FILE', $_FILES['PD_CSVPU_CSV_FILE']['name']);
// Copy the pdf file in the module directory/files with its own name
if (!move_uploaded_file($_FILES['PD_CSVPU_CSV_FILE']['tmp_name'], _PS_MODULE_DIR_ . $this->name . '/files/' . $_FILES['PD_CSVPU_CSV_FILE']['name']))
{
$this->html .= $this->displayError($this->l('Błąd wgrywania pliku CSV'));
}
else
{
$this->html .= $this->displayConfirmation($this->l('Plik CSV został wgrany'));
}
}
else
{
$this->html .= $this->displayError($this->l('Prosimy wybrać plik CSV przed wgraniem go'));
}
}
}
public function checkIfCsvNameWasUsed($file_name)
{
$sql = 'SELECT COUNT(*)
FROM `' . _DB_PREFIX_ . 'pdcsvpriceupdate_history`
WHERE `file_name` = \'' . pSQL($file_name) . '\'';
return Db::getInstance()->getValue($sql);
}
public function renderForm()
{
$switch = version_compare(_PS_VERSION_, '1.6.0', '>=') ? 'switch' : 'radio';
$fields_form_0 = array(
'form' => array(
'legend' => array(
'title' => $this->l('Wgraj plik csv'),
'icon' => 'icon-cogs'
),
'input' => array(
array(
'type' => 'file',
'label' => $this->l('Plik CSV'),
'desc' => $this->l('Wgraj plik CSV (2 kolumny identyfikator, cena)'),
'name' => 'PD_CSVPU_CSV_FILE',
'required' => true,
'file' => Configuration::get('PD_CSVPU_CSV_FILE') ? $this->context->link->protocol_content . Tools::getMediaServer($this->name) . _MODULE_DIR_ . $this->name . '/files/' . Configuration::get('PD_CSVPU_CSV_FILE') : null,
),
),
'submit' => array(
'name' => 'btnSubmitFile',
'title' => $this->l('Wgraj plik'),
)
),
);
$fields_form_1 = array(
'form' => array(
'legend' => array(
'title' => $this->l('Konfiguracja modułu'),
'icon' => 'icon-cogs'
),
'input' => array(
array(
'type' => 'text',
'label' => $this->l('Separator kolumn'),
'desc' => $this->l('Separator kolumn w CSV (domyślinie ";")'),
'lang' => false,
'name' => 'PD_CSVPU_CSV_DELIM',
'required' => true
),
array(
'type' => $switch,
'label' => $this->l('Ignoruj nagłówek'),
'name' => 'PD_CSVPU_HEADER_IGN',
'is_bool' => true,
'class' => 't',
'desc' => $this->l('Jeśli włączone moduł zingonuje pierwszy wiersz w pliku csv (jeśli masz tytuły kolumn w plku CSV to prosimy włączyć)'),
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->l('Enabled')
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->l('Disabled')
)
),
),
array(
'type' => 'select',
'label' => $this->l('Identyfikator produktów'),
'name' => 'PD_CSVPU_IDENTIFIER',
'width' => 300,
'class' => 'fixed-width-ld',
'desc' => $this->l('Proszę wybrać identyfikator produktów / kombinacji produktów znajdujacy się w pierwszej kolumnie pliku CSV (musi być taki sam jak na produktach / kombinacjach w sklepie by możliwa była aktualziacja)'),
'options' => array(
'query' => array(
array(
'id' => '1',
'name' => $this->l('Index (referencja)')
),
array(
'id' => '2',
'name' => $this->l('Ean13')
),
array(
'id' => '3',
'name' => $this->l('UPC')
),
array(
'id' => '4',
'name' => $this->l('Id produktu / Id kombinacji')
),
),
'id' => 'id',
'name' => 'name',
)
),
array(
'type' => 'select',
'label' => $this->l('Sklep'),
'name' => 'PD_CSVPU_UPDATE_SHOP',
'required' => true,
'desc' => $this->l('Wybierz sklep którego aktualizacja ma się dotyczyć'),
'options' => array(
'query' => Shop::getShops(true),
'id' => 'id_shop',
'name' => 'name'
)
),
array(
'type' => 'select',
'label' => $this->l('Typ aktualizacji'),
'name' => 'PD_CSVPU_UPDATE_TYPE',
'width' => 300,
'class' => 'fixed-width-ld',
'desc' => $this->l('Proszę wybrać czy aktualizujemy produkty bazowe czy kombinacje produktów'),
'options' => array(
'query' => array(
array(
'id' => '1',
'name' => $this->l('Produkt bazowy')
),
array(
'id' => '2',
'name' => $this->l('Kombinacje')
),
),
'id' => 'id',
'name' => 'name',
)
),
array(
'type' => $switch,
'label' => $this->l('Ten sam plik'),
'name' => 'PD_CSVPU_SAME_CSV',
'is_bool' => true,
'class' => 't',
'desc' => $this->l('Jeśli opcja jest wyłączona moduł nie pozwoli na wykonanie aktualizacji gdy nazwa wgrywanego pliku była już użyta'),
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->l('Enabled')
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->l('Disabled')
)
),
),
array(
'type' => $switch,
'label' => $this->l('Ceny z podatkiem 23%'),
'name' => 'PD_CSVPU_PRICES_WITH_TAX',
'is_bool' => true,
'class' => 't',
'desc' => $this->l('Jeśli opcja jest wyłączona moduł odejmie stawke 23% vat od cen produktów z CSV przed zapisem do bazy danych Prestahop'),
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->l('Enabled')
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->l('Disabled')
)
),
),
array(
'type' => $switch,
'label' => $this->l('Wyzeruj cenę bazową'),
'name' => 'PD_CSVPU_ZERO_BASE_PRODUCT_PRICE',
'is_bool' => true,
'class' => 't',
'desc' => $this->l('Jeśli opcja jest wyłączona moduł podczas aktualizacji ceny kombinacji atrybutu produktu wyzeruje cenę bazową tego produktu'),
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->l('Enabled')
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->l('Disabled')
)
),
),
array(
'type' => $switch,
'label' => $this->l('Aktualizuj wszystkie wystąpienia'),
'name' => 'PD_CSVPU_UPDATE_MULTIPLE_IDENTIFIERS',
'is_bool' => true,
'class' => 't',
'desc' => $this->l('Jeśli opcja jest wyłączona moduł podczas aktualizacji ceny zaktualizuje wszystkie znalezione wystąpienia danego identyfikatora produktów a nie tylko pierwsze napotkane zakładająć iż identyfikatory sa unikatowe'),
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->l('Enabled')
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->l('Disabled')
)
),
),
),
'submit' => array(
'name' => 'btnSubmitConfig',
'title' => $this->l('Zapisz ustawienia'),
)
),
);
$fields_form_2 = array(
'form' => array(
'legend' => array(
'title' => $this->l('Aktualizacja'),
'icon' => 'icon-cogs'
),
'submit' => array(
'name' => 'btnDownloadUpdate',
'title' => $this->l('Aktualizuj produkty z CSV'),
)
),
);
$fields_form_3 = array(
'form' => array(
'legend' => array(
'title' => $this->l('Konfiguracja exportu CSV'),
'icon' => 'icon-cogs'
),
'input' => array(
array(
'type' => 'text',
'label' => $this->l('Separator kolumn'),
'desc' => $this->l('Separator kolumn w CSV (domyślinie ";")'),
'lang' => false,
'name' => 'PD_CSVPU_CSV_DELIM_EXPORT',
'required' => true
),
array(
'type' => 'select',
'label' => $this->l('Identyfikator produktów'),
'name' => 'PD_CSVPU_IDENTIFIER_EXPORT',
'width' => 300,
'class' => 'fixed-width-ld',
'desc' => $this->l('Proszę wybrać identyfikator produktów / kombinacji produktów znajdujacy się w pierwszej kolumnie pliku CSV (musi być taki sam jak na produktach / kombinacjach w sklepie by możliwa była aktualizacja)'),
'options' => array(
'query' => array(
array(
'id' => '1',
'name' => $this->l('Index (referencja)')
),
array(
'id' => '2',
'name' => $this->l('Ean13')
),
array(
'id' => '3',
'name' => $this->l('UPC')
),
array(
'id' => '4',
'name' => $this->l('Id produktu')
),
),
'id' => 'id',
'name' => 'name',
)
),
array(
'type' => 'select',
'label' => $this->l('Sklep'),
'name' => 'PD_CSVPU_UPDATE_SHOP_EXPORT',
'required' => true,
'desc' => $this->l('Wybierz sklep którego aktualizacja ma się dotyczyć'),
'options' => array(
'query' => Shop::getShops(true),
'id' => 'id_shop',
'name' => 'name'
)
),
),
'submit' => array(
'name' => 'btnSubmitConfig',
'title' => $this->l('Zapisz ustawienia'),
)
),
);
$fields_form_4 = array(
'form' => array(
'legend' => array(
'title' => $this->l('Export do CSV'),
'icon' => 'icon-cogs'
),
'submit' => array(
'name' => 'btnDownloadCSVUpdate',
'title' => $this->l('Exportuj produkty z CSV'),
)
),
);
$helper = new HelperForm();
$helper->show_toolbar = false;
$helper->table = $this->table;
$lang = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
$helper->default_form_language = $lang->id;
$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
$this->fields_form = array();
$helper->module = $this;
$helper->identifier = $this->identifier;
$helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false) . '&configure=' . $this->name . '&tab_module=' . $this->tab . '&module_name=' . $this->name;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->tpl_vars = array(
'fields_value' => $this->getConfigFieldsValues(),
'languages' => $this->context->controller->getLanguages(),
'id_language' => $this->context->language->id
);
return $helper->generateForm(array($fields_form_0, $fields_form_1, $fields_form_2, $fields_form_3, $fields_form_4));
}
public function getConfigFieldsValues()
{
return array(
'PD_CSVPU_ZERO_BASE_PRODUCT_PRICE' => Tools::getValue('PD_CSVPU_ZERO_BASE_PRODUCT_PRICE', Configuration::get('PD_CSVPU_ZERO_BASE_PRODUCT_PRICE')),
'PD_CSVPU_CSV_DELIM_EXPORT' => Tools::getValue('PD_CSVPU_CSV_DELIM_EXPORT', Configuration::get('PD_CSVPU_CSV_DELIM_EXPORT')),
'PD_CSVPU_IDENTIFIER_EXPORT' => Tools::getValue('PD_CSVPU_IDENTIFIER_EXPORT', Configuration::get('PD_CSVPU_IDENTIFIER_EXPORT')),
'PD_CSVPU_UPDATE_SHOP_EXPORT' => Tools::getValue('PD_CSVPU_UPDATE_SHOP_EXPORT', Configuration::get('PD_CSVPU_UPDATE_SHOP_EXPORT')),
'PD_CSVPU_PRICES_WITH_TAX' => Tools::getValue('PD_CSVPU_PRICES_WITH_TAX', Configuration::get('PD_CSVPU_PRICES_WITH_TAX')),
'PD_CSVPU_SAME_CSV' => Tools::getValue('PD_CSVPU_SAME_CSV', Configuration::get('PD_CSVPU_SAME_CSV')),
'PD_CSVPU_UPDATE_SHOP' => Tools::getValue('PD_CSVPU_UPDATE_SHOP', Configuration::get('PD_CSVPU_UPDATE_SHOP')),
'PD_CSVPU_UPDATE_TYPE' => Tools::getValue('PD_CSVPU_UPDATE_TYPE', Configuration::get('PD_CSVPU_UPDATE_TYPE')),
'PD_CSVPU_HEADER_IGN' => Tools::getValue('PD_CSVPU_HEADER_IGN', Configuration::get('PD_CSVPU_HEADER_IGN')),
'PD_CSVPU_IDENTIFIER' => Tools::getValue('PD_CSVPU_IDENTIFIER', Configuration::get('PD_CSVPU_IDENTIFIER')),
'PD_CSVPU_CSV_FILE' => Tools::getValue('PD_CSVPU_CSV_FILE', Configuration::get('PD_CSVPU_CSV_FILE')),
'PD_CSVPU_CSV_DELIM' => Tools::getValue('PD_CSVPU_CSV_DELIM', Configuration::get('PD_CSVPU_CSV_DELIM')),
'PD_CSVPU_UPDATE_MULTIPLE_IDENTIFIERS' => Tools::getValue('PD_CSVPU_UPDATE_MULTIPLE_IDENTIFIERS', Configuration::get('PD_CSVPU_UPDATE_MULTIPLE_IDENTIFIERS'))
);
}
public function renderList()
{
$fields_list = array(
'id_history_csv' => array(
'title' => $this->l('Id'),
'type' => 'text',
'orderby' => true,
'search' => false,
),
'file_name' => array(
'title' => $this->l('Nazwa pliku'),
'width' => 140,
'type' => 'text',
'search' => false,
),
'products_csv' => array(
'title' => $this->l('Produktów w CSV'),
'type' => 'text',
'search' => false,
),
'products_updated' => array(
'title' => $this->l('Zaktualizowanych prouktów'),
'type' => 'text',
'search' => false,
),
'products_attributes_updated' => array(
'title' => $this->l('Zaktualizowanych kombinacji'),
'type' => 'text',
'search' => false,
),
'products_not_found' => array(
'title' => $this->l('Nie znalezionych'),
'type' => 'text',
'search' => false,
),
'csv_delimeter' => array(
'title' => $this->l('Separator kolumn'),
'width' => 140,
'type' => 'text',
'search' => false,
),
'same_csv_allow' => array(
'title' => $this->l('Ten sam plik'),
'type' => 'bool',
'active' => 'same_csv_allow',
'search' => false,
),
'prices_with_tax' => array(
'title' => $this->l('Ceny z vat 23%'),
'type' => 'bool',
'active' => 'prices_with_tax',
'search' => false,
),
'csv_header_ignore' => array(
'title' => $this->l('Pomin nagłowek'),
'type' => 'bool',
'active' => 'csv_header_ignore',
'search' => false,
),
'update_type' => array(
'title' => $this->l('Typ aktualizacji'),
'type' => 'text',
'search' => false,
),
'products_identifier' => array(
'title' => $this->l('Identyfikator produktów'),
'type' => 'text',
'search' => false,
),
'date_add' => array(
'title' => $this->l('Data aktualizacji'),
'type' => 'text',
'search' => false,
),
);
$helper_list = new HelperList();
$helper_list->module = $this;
$helper_list->title = $this->l('Historia i parametry ostatnich aktualizacji');
$helper_list->shopLinkType = '';
$helper_list->no_link = true;
$helper_list->show_toolbar = true;
$helper_list->simple_header = false;
$helper_list->identifier = 'id_history_csv';
$helper_list->table = 'merged';
$helper_list->currentIndex = $this->context->link->getAdminLink('AdminModules', false) . '&configure=' . $this->name;
$helper_list->token = Tools::getAdminTokenLite('AdminModules');
/* Retrieve list data */
$content_list = $this->getListContent();
$helper_list->listTotal = count($content_list);
/* Paginate the result */
$page = ($page = Tools::getValue('submitFilter' . $helper_list->table)) ? $page : 1;
$pagination = ($pagination = Tools::getValue($helper_list->table . '_pagination')) ? $pagination : 50;
$content_list = $this->paginateEntries($content_list, $page, $pagination);
return $helper_list->generateList($content_list, $fields_list);
}
public function paginateEntries($content_list, $page = 1, $pagination = 50)
{
if (count($content_list) > $pagination)
{
$content_list = array_slice($content_list, $pagination * ($page - 1), $pagination);
}
return $content_list;
}
protected function getListContent()
{
$update_type = array(
1 => $this->l('Produkt bazowy'),
2 => $this->l('Kombinacje')
);
$products_identifier = array(
1 => $this->l('Index (referencja) produktu lub kombinacji'),
2 => $this->l('Ean13 produktu lub kombinacji'),
3 => $this->l('UPC produktu lub kombinacji'),
4 => $this->l('Id produktu / id kombinacji produktu')
);
$content = Db::getInstance()->executeS('SELECT * FROM `' . _DB_PREFIX_ . 'pdcsvpriceupdate_history`
ORDER BY `id_history_csv` DESC');
foreach ($content as $k => &$c)
{
$c['update_type'] = $update_type[$c['update_type']];
$c['products_identifier'] = $products_identifier[$c['products_identifier']];
}
return $content;
}
public function getSqlWherePart($product_identifier)
{
switch ($this->products_identifier)
{
case '1': // index / reference
return 'WHERE `reference` = \'' . $product_identifier . '\'';
break;
case '2': // ean13
return 'WHERE `ean13` = \'' . $product_identifier . '\'';
break;
case '3': // upc
return 'WHERE `upc` = \'' . $product_identifier . '\'';
break;
case '4': // id_product
return 'WHERE `id_product` = \'' . $product_identifier . '\'';
break;
default:
break;
}
}
private static function csvToArray($filename = '', $delimiter = ';', $header_ignore)
{
if (!file_exists($filename) || !is_readable($filename))
{
return false;
}
$data = array();
if (($handle = fopen($filename, 'r')) !== false)
{
while (($row = fgetcsv($handle, 1000, $delimiter)) !== false)
{
$data[] = array(self::autoUTF($row[0]) => self::autoUTF($row[1]));
}
fclose($handle);
}
if ($header_ignore)
{
unset($data[0]);
}
return $data;
}
private static function autoUTF($s)
{
// detect UTF-8
if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s))
return $s;
// detect WINDOWS-1250
if (preg_match('#[\x7F-\x9F\xBC]#', $s))
return iconv('WINDOWS-1250', 'UTF-8', $s);
// assume ISO-8859-2
return iconv('ISO-8859-2', 'UTF-8', $s);
}
public function parseAndUpdateProducts()
{
$id_shop = $this->csv_shop_update;
$not_found = array();
$prod_csv_count = 0;
$prod_upd_count = 0;
$prod_attributes_upd_count = 0;
$csv = self::csvToArray($this->csv_file, $this->csv_delimeter, $this->csv_header_ignore);
foreach ($csv as $item)
{
foreach ($item as $product_identifier => $price)
{
$prod_csv_count++;
$product_identifier = trim($product_identifier);
$price = trim($price);
$price = str_replace(',', '.', $price);
if ($this->prices_with_tax)
{
$price = (float)$price / 1.23;
$price = Tools::ps_round($price, 6);
}
if (isset($product_identifier) && $product_identifier != '')
{
if ($this->update_type == 1)
{
$sql = 'SELECT id_product FROM `' . _DB_PREFIX_ . 'product`';
$sql .= $this->getSqlWherePart(str_replace( "ďťż", "", $product_identifier));
$result = Db::getInstance()->executeS($sql);
if ($result && sizeof($result) && !$this->update_multiple)
{
$id_product = (int)$result[0]['id_product'];
$res = Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'product`
SET price = ' . (float)$price . '
WHERE id_product = ' . (int)$id_product);
$res &= Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'product_shop`
SET price = ' . (float)$price . '
WHERE id_product = ' . (int)$id_product . '
AND id_shop = ' . (int)$id_shop);
if ($res)
{
$prod_upd_count++;
}
}
else
{
$not_found[] = $product_identifier;
}
if ($result && sizeof($result) >= 1 && $this->update_multiple)
{
foreach ($result as $r)
{
$id_product = (int)$r['id_product'];
$res = Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'product`
SET price = ' . (float)$price . '
WHERE id_product = ' . (int)$id_product);
$res &= Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'product_shop`
SET price = ' . (float)$price . '
WHERE id_product = ' . (int)$id_product . '
AND id_shop = ' . (int)$id_shop);
if ($res)
{
$prod_upd_count++;
}
}
}
else
{
$not_found[] = $product_identifier;
}
}
elseif ($this->update_type == '2')
{
$sql2 = 'SELECT id_product, id_product_attribute FROM `' . _DB_PREFIX_ . 'product_attribute`';
$sql2 .= $this->getSqlWherePart(str_replace( "ďťż", "", $product_identifier));
$result2 = Db::getInstance()->executeS($sql2);
if ($result2 && sizeof($result2))
{
$id_product = (int)$result2[0]['id_product'];
$id_product_attribute = (int)$result2[0]['id_product_attribute'];
$res2 = Db::getInstance()->execute(
'UPDATE `' . _DB_PREFIX_ . 'product_attribute_shop`
SET price = ' . (float)$price . '
WHERE id_product_attribute = ' . (int)$id_product_attribute . '
AND id_product = ' . (int)$id_product . '
AND id_shop = ' . (int)$id_shop
);
if ($res2)
{
$prod_attributes_upd_count++;
if ($this->zero_base_price)
{
Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'product`
SET price = 0
WHERE id_product = ' . (int)$id_product);
Db::getInstance()->execute(
'UPDATE `' . _DB_PREFIX_ . 'product_shop`
SET price = 0
WHERE id_product = ' . (int)$id_product . '
AND id_shop = ' . (int)$id_shop
);
}
}
}
else
{
$not_found[] = $product_identifier;
}
if ($result2 && sizeof($result2) > 1 && $this->update_multiple)
{
foreach ($result2 as $r)
{
$id_product = (int)$r['id_product'];
$id_product_attribute = (int)$r['id_product_attribute'];
$res2 = Db::getInstance()->execute(
'UPDATE `' . _DB_PREFIX_ . 'product_attribute_shop`
SET price = ' . (float)$price . '
WHERE id_product_attribute = ' . (int)$id_product_attribute . '
AND id_product = ' . (int)$id_product . '
AND id_shop = ' . (int)$id_shop
);
if ($res2)
{
$prod_attributes_upd_count++;
if ($this->zero_base_price)
{
Db::getInstance()->execute('UPDATE `' . _DB_PREFIX_ . 'product`
SET price = 0
WHERE id_product = ' . (int)$id_product);
Db::getInstance()->execute(
'UPDATE `' . _DB_PREFIX_ . 'product_shop`
SET price = 0
WHERE id_product = ' . (int)$id_product . '
AND id_shop = ' . (int)$id_shop
);
}
}
}
}
else
{
$not_found[] = $product_identifier;
}
}
}
}
}
// create history entry
$ho = new HistoryCsvPriceUpdateModel();
$ho->file_name = $this->csv_file_name;
$ho->products_csv = $prod_csv_count;
$ho->products_updated = $prod_upd_count;
$ho->products_attributes_updated = $prod_attributes_upd_count;
$ho->products_not_found = count($not_found);
$ho->update_type = $this->update_type;
$ho->products_identifier = $this->products_identifier;
$ho->same_csv_allow = $this->same_csv_allow;
$ho->csv_header_ignore = $this->csv_header_ignore;
$ho->csv_delimeter = $this->csv_delimeter;
$ho->date_add = date('Y-m-d H:i:s');
$ho->add();
// Save report from update not found references
$this->generateAndSaveReport($not_found);
}
public function getProductsDBLight()
{
$out = array();
$id_shop = $this->csv_shop_update_export;
$sql = 'SELECT DISTINCT p.`id_product`, p.`reference`, p.`ean13`, p.`upc`, product_shop.`price`
FROM `' . _DB_PREFIX_ . 'product` p
INNER JOIN `' . _DB_PREFIX_ . 'product_shop` product_shop ON (product_shop.id_product = p.id_product)
WHERE product_shop.`id_shop` = ' . (int)$id_shop .
($only_active ? ' AND product_shop.`active` = 1' : '') . '
ORDER BY p.`id_product`
';
$products = Db::getInstance()->executeS($sql);
//d($products);
foreach ($products as $product)
{
$out[] = array(
'identifier' => $this->getidentifierExport($product),
'price' => $product['price']
);
}
return $out;
}
public function getidentifierExport($product)
{
switch ($this->products_identifier_export)
{
case '1': // index / reference
return $product['reference'];
break;
case '2': // ean13
return $product['ean13'];
break;
case '3': // upc
return $product['upc'];
break;
case '4': // id_product
return $product['id_product'];
break;
default:
break;
}
}
private function exportCSVProducts()
{
$products = $this->getProductsDBLight();
//d($products);
$date = date('m-d-Y_h-i');
$out = array();
// Clean duplicate references of products in array
$nb = count($result);
if ($nb == 1)
{
$this->html .= $this->displayConfirmation($this->l('Wszystkie produkty zostały zaktualizowane'));
}
elseif ($fd = @fopen(dirname(__FILE__) . '/' . $date . '_' . $this->file_export, 'w'))
{
$header = array('identifier', 'price');
$array_to_export = array_merge(array($header), $products);
foreach ($array_to_export as $tab)
{
$this->_my_fputcsvexport($fd, $tab);
}
fclose($fd);
$this->html .= $this->displayConfirmation(sprintf($this->l('Plik CSV został utworzony zapisano w nim %d rekordów produktów których znaleziono w sklepie'), $nb) . '<br />
<a href="../modules/pdcsvpriceupdate/' . $date . '_' . $this->file_export . '"><b>' . $this->l('Pobierz plik') . ' ' . $date . '_' . $this->file_export . '</b></a>');
}
else
{
$this->html .= $this->displayError($this->l('Bład: nie mogę zapisac pliku') . ' ' . dirname(__FILE__) . '/' . $date . '_' . $this->file_export . ' !');
}
}
private function generateAndSaveReport($not_found)
{
$date = date('m-d-Y_h-i');
$out = array();
// Clean duplicate references of products in array
$not_found = array_unique($not_found);
foreach ($not_found as $item)
{
$out[] = array('identifier' => $item);
}
$header = array('identifier');
$result = (is_array($out) ? array_merge(array($header), $out) : $header);
$nb = count($result);
if ($nb == 1)
{
$this->html .= $this->displayConfirmation($this->l('Wszystkie produkty zostały zaktualizowane'));
}
elseif ($fd = @fopen(dirname(__FILE__) . '/' . $date . '_' . $this->file, 'w'))
{
foreach ($result as $tab)
{
$this->_my_fputcsv($fd, $tab);
}
fclose($fd);
$this->html .= $this->displayConfirmation(sprintf($this->l('Plik raportu z aktualizacji został utworzony zapisano w nim %d rekordów identifikatorów produktów lub kombinacji produktów których nie znaleziono w sklepie'), $nb) . '<br />
<a href="../modules/pdcsvpriceupdate/' . $date . '_' . $this->file . '"><b>' . $this->l('Pobierz plik') . ' ' . $date . '_' . $this->file . '</b></a>');
}
else
{
$this->html .= $this->displayError($this->l('Bład: nie mogę zapisac pliku') . ' ' . dirname(__FILE__) . '/' . $date . '_' . $this->file . ' !');
}
}
private function _my_fputcsvexport($fd, $array)
{
$line = implode($this->csv_delimeter_export, $array);
$line .= "\n";
if (!fwrite($fd, $line, 4096))
{
$this->postErrors[] = $this->l('Bład: nie mogę zapisać') . ' ' . dirname(__FILE__) . '/' . $this->file . ' !';
}
}
private function _my_fputcsv($fd, $array)
{
$line = implode(';', $array);
$line .= "\n";
if (!fwrite($fd, $line, 4096))
{
$this->postErrors[] = $this->l('Bład: nie mogę zapisać') . ' ' . dirname(__FILE__) . '/' . $this->file . ' !';
}
}
}