Files
bio-concept-labo/web/modules/ps_legalcompliance/ps_legalcompliance.php
2019-11-20 07:44:43 +01:00

1692 lines
83 KiB
PHP

<?php
/**
* 2007-2017 PrestaShop.
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2017 PrestaShop SA
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
if (!defined('_PS_VERSION_')) {
exit;
}
/* Namespaces used in this module */
use PrestaShop\PrestaShop\Core\Foundation\Database\EntityManager;
use PrestaShop\PrestaShop\Core\Foundation\Filesystem\FileSystem;
use PrestaShop\PrestaShop\Core\Email\EmailLister;
use PrestaShop\PrestaShop\Core\Checkout\TermsAndConditions;
use PrestaShop\PrestaShop\Core\Payment\PaymentOption;
/* Include required entities */
include_once dirname(__FILE__).'/entities/AeucCMSRoleEmailEntity.php';
include_once dirname(__FILE__).'/entities/AeucEmailEntity.php';
class Ps_LegalCompliance extends Module
{
/* Class members */
protected $config_form = false;
protected $entity_manager;
protected $filesystem;
protected $emails;
protected $_errors = array();
protected $_warnings = array();
/* Constants used for LEGAL/CMS Management */
const LEGAL_NO_ASSOC = 'NO_ASSOC';
const LEGAL_NOTICE = 'LEGAL_NOTICE';
const LEGAL_CONDITIONS = 'LEGAL_CONDITIONS';
const LEGAL_REVOCATION = 'LEGAL_REVOCATION';
const LEGAL_REVOCATION_FORM = 'LEGAL_REVOCATION_FORM';
const LEGAL_PRIVACY = 'LEGAL_PRIVACY';
const LEGAL_ENVIRONMENTAL = 'LEGAL_ENVIRONMENTAL';
const LEGAL_SHIP_PAY = 'LEGAL_SHIP_PAY';
public function __construct(EntityManager $entity_manager,
FileSystem $fs,
EmailLister $email)
{
$this->name = 'ps_legalcompliance';
$this->tab = 'administration';
$this->version = '3.0.1';
$this->author = 'PrestaShop';
$this->need_instance = 0;
$this->bootstrap = true;
parent::__construct();
/* Register dependencies to module */
$this->entity_manager = $entity_manager;
$this->filesystem = $fs;
$this->emails = $email;
$this->displayName = $this->trans('Legal Compliance', array(), 'Modules.Legalcompliance.Admin');
$this->description = $this->trans('This module helps merchants comply with applicable e-commerce laws.', array(), 'Modules.Legalcompliance.Admin');
$this->confirmUninstall = $this->trans('Are you sure you want to uninstall this module?', array(), 'Modules.Legalcompliance.Admin');
$this->ps_versions_compliancy = array('min' => '1.7.3.0', 'max' => _PS_VERSION_);
/* Init errors var */
$this->_errors = array();
}
/**
* Don't forget to create update methods if needed:
* http://doc.prestashop.com/display/PS16/Enabling+the+Auto-Update.
*/
public function install()
{
$return = parent::install() &&
$this->loadTables() &&
$this->installHooks() &&
$this->registerModulesBackwardCompatHook() &&
$this->registerHook('header') &&
$this->registerHook('displayProductPriceBlock') &&
$this->registerHook('displayCheckoutSubtotalDetails') &&
$this->registerHook('displayFooter') &&
$this->registerHook('displayFooterAfter') &&
$this->registerHook('actionEmailAddAfterContent') &&
$this->registerHook('advancedPaymentOptions') &&
$this->registerHook('displayCartTotalPriceLabel') &&
$this->registerHook('displayCMSPrintButton') &&
$this->registerHook('displayCMSDisputeInformation') &&
$this->registerHook('termsAndConditions') &&
$this->registerHook('displayOverrideTemplate') &&
$this->registerHook('displayCheckoutSummaryTop') &&
$this->registerHook('sendMailAlterTemplateVars') &&
$this->registerHook('displayReassurance') &&
$this->createConfig() &&
$this->generateAndLinkCMSPages() &&
$this->removeCMSPagesIfNeeded() &&
$this->setLegalContentToOrderMails() &&
$this->hideWirePaymentInviteAtOrderConfirmation();
$this->emptyTemplatesCache();
return (bool) $return;
}
public function hideWirePaymentInviteAtOrderConfirmation()
{
return $this->updateWirePaymentInviteDisplayAtOrderConfirmation(false);
}
public function updateWirePaymentInviteDisplayAtOrderConfirmation($display)
{
$wirePaymentModule = Module::getInstanceByName('ps_wirepayment');
if (defined(get_class($wirePaymentModule) . '::FLAG_DISPLAY_PAYMENT_INVITE')) {
$flagName = constant(get_class($wirePaymentModule) . '::FLAG_DISPLAY_PAYMENT_INVITE');
Configuration::updateValue($flagName, $display);
return true;
}
return false;
}
public function showWirePaymentInviteAtOrderConfirmation()
{
return $this->updateWirePaymentInviteDisplayAtOrderConfirmation(true);
}
public function uninstall()
{
return parent::uninstall() &&
$this->dropConfig() &&
$this->showWirePaymentInviteAtOrderConfirmation() &&
$this->unloadTables();
}
public function disable($force_all = false)
{
$is_adv_api_disabled = (bool) Configuration::updateValue('PS_ATCP_SHIPWRAP', false);
return parent::disable() && $is_adv_api_disabled;
}
public function registerModulesBackwardCompatHook()
{
$return = true;
$module_to_check = array(
'bankwire', 'cheque', 'paypal',
'adyen', 'hipay', 'cashondelivery', 'sofortbanking',
'pigmbhpaymill', 'ogone', 'moneybookers',
'syspay',
);
$display_payment_eu_hook_id = (int) Hook::getIdByName('displayPaymentEu');
$already_hooked_modules_ids = array_keys(Hook::getModulesFromHook($display_payment_eu_hook_id));
foreach ($module_to_check as $module_name) {
if (($module = Module::getInstanceByName($module_name)) !== false &&
Module::isInstalled($module_name) &&
$module->active &&
!in_array($module->id, $already_hooked_modules_ids) &&
!$module->isRegisteredInHook('displayPaymentEu')) {
$return &= $module->registerHook('displayPaymentEu');
}
}
return $return;
}
public function installHooks()
{
$hooks = array(
'displayPaymentEu' => array(
'name' => 'Display EU payment options (helper)',
'description' => 'Hook to display payment options',
),
);
$return = true;
foreach ($hooks as $hook_name => $hook) {
if (Hook::getIdByName($hook_name)) {
continue;
}
$new_hook = new Hook();
$new_hook->name = $hook_name;
$new_hook->title = $hook_name;
$new_hook->description = $hook['description'];
$new_hook->position = true;
if (!$new_hook->add()) {
$return &= false;
$this->_errors[] = $this->trans('Could not install new hook', array(), 'Modules.Legalcompliance.Admin').': '.$hook_name;
}
}
return $return;
}
public function createConfig()
{
$custom_cart_text_values = array();
$langs_repository = $this->entity_manager->getRepository('Language');
$langs = $langs_repository->findAll();
foreach ($langs as $lang) {
$custom_cart_text_values[(int) $lang->id] = $this->trans('The order will only be confirmed when you click on the button \'Order with an obligation to pay\' at the end of the checkout!', array(), 'Modules.Legalcompliance.Shop', $lang->locale);
}
/* Base settings */
$this->processAeucFeatReorder(true);
$this->processAeucLabelRevocationTOS(false);
$this->processAeucLabelRevocationVP(false);
$this->processAeucLabelSpecificPrice(true);
$this->processAeucLabelUnitPrice(true);
$this->processAeucLabelTaxIncExc(true);
$this->processAeucLabelShippingIncExc(false);
$this->processAeucLabelCombinationFrom(true);
return Configuration::updateValue('AEUC_LABEL_CUSTOM_CART_TEXT', $custom_cart_text_values) &&
Configuration::updateValue('AEUC_LABEL_DELIVERY_ADDITIONAL', false) &&
Configuration::updateValue('AEUC_LABEL_SPECIFIC_PRICE', false) &&
Configuration::updateValue('AEUC_LABEL_UNIT_PRICE', true) &&
Configuration::updateValue('AEUC_LABEL_TAX_INC_EXC', true) &&
Configuration::updateValue('AEUC_LABEL_REVOCATION_TOS', false) &&
Configuration::updateValue('AEUC_LABEL_REVOCATION_VP', true) &&
Configuration::updateValue('AEUC_LABEL_SHIPPING_INC_EXC', false) &&
Configuration::updateValue('AEUC_LABEL_COMBINATION_FROM', true) &&
Configuration::updateValue('PS_TAX_DISPLAY', true) &&
Configuration::updateValue('PS_FINAL_SUMMARY_ENABLED', true);
}
public function generateAndLinkCMSPages()
{
$cms_pages = array(
self::LEGAL_NOTICE => array('meta_title' => $this->trans('Legal notice', array(), 'Modules.Legalcompliance.Admin'),
'link_rewrite' => 'legal-notice',
'content' => $this->trans('Please add your legal information to this site.', array(), 'Modules.Legalcompliance.Admin'), ),
self::LEGAL_CONDITIONS => array('meta_title' => $this->trans('Terms of Service (ToS)', array(), 'Modules.Legalcompliance.Admin'),
'link_rewrite' => 'terms-of-service-tos',
'content' => $this->trans('Please add your Terms of Service (ToS) to this site.', array(), 'Modules.Legalcompliance.Admin'), ),
self::LEGAL_REVOCATION => array('meta_title' => $this->trans('Revocation terms', array(), 'Modules.Legalcompliance.Admin'),
'link_rewrite' => 'revocation-terms',
'content' => $this->trans('Please add your Revocation terms to this site.', array(), 'Modules.Legalcompliance.Admin'), ),
self::LEGAL_PRIVACY => array('meta_title' => $this->trans('Privacy', array(), 'Modules.Legalcompliance.Admin'),
'link_rewrite' => 'privacy',
'content' => $this->trans('Please insert here your content about privacy. If you have activated Social Media modules, please provide a notice about third-party access to data.', array(), 'Modules.Legalcompliance.Admin'), ),
self::LEGAL_SHIP_PAY => array('meta_title' => $this->trans('Shipping and payment', array(), 'Modules.Legalcompliance.Admin'),
'link_rewrite' => 'shipping-and-payment',
'content' => $this->trans('Please add your Shipping and payment information to this site.', array(), 'Modules.Legalcompliance.Admin'), ),
self::LEGAL_ENVIRONMENTAL => array('meta_title' => $this->trans('Environmental notice', array(), 'Modules.Legalcompliance.Admin'),
'link_rewrite' => 'environmental-notice',
'content' => $this->trans('Please add your Environmental information to this site.', array(), 'Modules.Legalcompliance.Admin'), ),
);
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$langs_repository = $this->entity_manager->getRepository('Language');
$langs = $langs_repository->findAll();
foreach ($cms_pages as $cms_page_role => $cms_page) {
$cms_role = $cms_role_repository->findOneByName($cms_page_role);
if ((int) $cms_role->id_cms == 0) {
$cms = new CMS();
$cms->id_cms_category = 1;
foreach ($langs as $lang) {
$cms->meta_title[(int) $lang->id] = $cms_page['meta_title'];
$cms->link_rewrite[(int) $lang->id] = 'aeu-legal-'.$cms_page['link_rewrite'];
$cms->content[(int) $lang->id] = $cms_page['content'];
}
$cms->active = 1;
$cms->add();
$cms_role->id_cms = (int) $cms->id;
$cms_role->update();
}
}
return true;
}
public function removeCMSPagesIfNeeded()
{
if (Module::isInstalled('ps_linklist')) {
$cms_repository = $this->entity_manager->getRepository('CMS');
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_page_conditions_associated = $cms_role_repository->findOneByName(self::LEGAL_CONDITIONS);
$sql = 'SELECT id_link_block, content
FROM '._DB_PREFIX_.'link_block';
$link_blocks = Db::getInstance()->executeS($sql);
foreach ($link_blocks as $link_block) {
$conditions_found = false;
$content = json_decode($link_block['content'], true);
if (isset($content['cms']) && is_array($content['cms'])) {
foreach ($content['cms'] as $cms_key => $cms_id) {
if ((int) $cms_id == (int) $cms_page_conditions_associated->id_cms) {
unset($content['cms'][$cms_key]);
$conditions_found = true;
}
}
}
if ($conditions_found) {
$content['cms'] = array_values($content['cms']);
$content = json_encode($content);
Db::getInstance()->update('link_block', array('content' => pSQL($content)), '`id_link_block` = '.(int) $link_block['id_link_block']);
}
}
}
return true;
}
public function setLegalContentToOrderMails()
{
$cms_roles_aeuc = $this->getCMSRoles();
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_roles_associated = $cms_role_repository->getCMSRolesAssociated();
$role_ids_to_set = array();
$role_id_legal_notice = false;
$email_ids_to_set = array();
$account_email_ids_to_set = array();
$legal_options = array();
$cleaned_mails_names = array();
foreach ($cms_roles_associated as $role) {
if ($role->name == self::LEGAL_CONDITIONS || $role->name == self::LEGAL_REVOCATION || $role->name == self::LEGAL_NOTICE) {
$role_ids_to_set[] = $role->id;
}
if ($role->name == self::LEGAL_NOTICE) {
$role_id_legal_notice = $role->id;
}
}
$email_filenames = array(
'backoffice_order',
'credit_slip',
'order_canceled',
'order_changed',
'order_conf',
'order_customer_comment',
'order_merchant_comment',
'order_return_state',
'payment',
'refund',
);
foreach (AeucEmailEntity::getAll() as $email) {
if (in_array($email['filename'], $email_filenames)) {
$email_ids_to_set[] = $email['id_mail'];
}
}
$account_newsletter_mail_filenames = array(
'account',
'newsletter',
'password',
'password_query',
);
foreach (AeucEmailEntity::getAll() as $email) {
if (in_array($email['filename'], $account_newsletter_mail_filenames)) {
$account_email_ids_to_set[] = $email['id_mail'];
}
}
AeucCMSRoleEmailEntity::truncate();
foreach ($role_ids_to_set as $role_id) {
foreach ($email_ids_to_set as $email_id) {
$assoc_obj = new AeucCMSRoleEmailEntity();
$assoc_obj->id_mail = (int) $email_id;
$assoc_obj->id_cms_role = (int) $role_id;
$assoc_obj->save();
}
}
if ($role_id_legal_notice) {
foreach ($account_email_ids_to_set as $email_id) {
$assoc_obj = new AeucCMSRoleEmailEntity();
$assoc_obj->id_mail = (int)$email_id;
$assoc_obj->id_cms_role = (int)$role_id_legal_notice;
$assoc_obj->save();
}
}
return true;
}
public function unloadTables()
{
$state = true;
$sql = require dirname(__FILE__).'/install/sql_install.php';
foreach ($sql as $name => $v) {
$state &= Db::getInstance()->execute('DROP TABLE IF EXISTS '.$name);
}
return $state;
}
public function loadTables()
{
$state = true;
// Create module's table
$sql = require dirname(__FILE__).'/install/sql_install.php';
foreach ($sql as $s) {
$state &= Db::getInstance()->execute($s);
}
// Fillin CMS ROLE
$roles_array = $this->getCMSRoles();
$roles = array_keys($roles_array);
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
foreach ($roles as $role) {
if (!$cms_role_repository->findOneByName($role)) {
$cms_role = $cms_role_repository->getNewEntity();
$cms_role->id_cms = 0; // No assoc at this time
$cms_role->name = $role;
$state &= (bool) $cms_role->save();
}
}
$default_path_email = _PS_MAIL_DIR_.'en'.DIRECTORY_SEPARATOR;
// Fill-in aeuc_mail table
foreach ($this->emails->getAvailableMails($default_path_email) as $mail) {
$new_email = new AeucEmailEntity();
$new_email->filename = (string) $mail;
$new_email->display_name = $this->emails->getCleanedMailName($mail);
$new_email->save();
unset($new_email);
}
return $state;
}
public function dropConfig()
{
return Configuration::deleteByName('AEUC_LABEL_DELIVERY_ADDITIONAL') &&
Configuration::deleteByName('AEUC_LABEL_SPECIFIC_PRICE') &&
Configuration::deleteByName('AEUC_LABEL_UNIT_PRICE') &&
Configuration::deleteByName('AEUC_LABEL_TAX_INC_EXC') &&
Configuration::deleteByName('AEUC_LABEL_REVOCATION_TOS') &&
Configuration::deleteByName('AEUC_LABEL_REVOCATION_VP') &&
Configuration::deleteByName('AEUC_LABEL_SHIPPING_INC_EXC') &&
Configuration::deleteByName('AEUC_LABEL_COMBINATION_FROM') &&
Configuration::deleteByName('AEUC_LABEL_CUSTOM_CART_TEXT') &&
Configuration::updateValue('PS_ATCP_SHIPWRAP', false);
}
/*
This method checks if cart has virtual products
It's better to add this method (as hasVirtualProduct) and add 'protected static $_hasVirtualProduct = array(); property
in Cart class in next version of prestashop.
*/
private function hasCartVirtualProduct(Cart $cart)
{
$products = $cart->getProducts();
if (!count($products)) {
return false;
}
foreach ($products as $product) {
if ($product['is_virtual']) {
return true;
}
}
return false;
}
public function hookDisplayCartTotalPriceLabel($param)
{
$smartyVars = array();
if ((bool) Configuration::get('AEUC_LABEL_TAX_INC_EXC') === true) {
$customer_default_group_id = (int) $this->context->customer->id_default_group;
$customer_default_group = new Group($customer_default_group_id);
if ((bool) Configuration::get('PS_TAX') === true && $this->context->country->display_tax_label &&
!(Validate::isLoadedObject($customer_default_group) && (bool) $customer_default_group->price_display_method === true)) {
$smartyVars['price']['tax_str_i18n'] = $this->trans('Tax included', array(), 'Shop.Theme.Checkout');
} else {
$smartyVars['price']['tax_str_i18n'] = $this->trans('Tax excluded', array(), 'Shop.Theme.Checkout');
}
}
if (isset($param['from'])) {
if ($param['from'] == 'shopping_cart') {
$smartyVars['css_class'] = 'aeuc_tax_label_shopping_cart';
}
if ($param['from'] == 'blockcart') {
$smartyVars['css_class'] = 'aeuc_tax_label_blockcart';
}
}
$this->context->smarty->assign(array('smartyVars' => $smartyVars));
return $this->display(__FILE__, 'displayCartTotalPriceLabel.tpl');
}
public function hookDisplayOverrideTemplate($param)
{
if (isset($this->context->controller->php_self) && !$this->context->controller->ajax && ($this->context->controller->php_self == 'order')) {
return $this->getTemplatePath('hookDisplayOverrideTemplateFooter.tpl');
}
}
public function hookDisplayCheckoutSummaryTop($param)
{
$cart_url = $this->context->link->getPageLink(
'cart',
null,
$this->context->language->id,
['action' => 'show']
);
$this->context->smarty->assign('link_shopping_cart', $cart_url);
return $this->display(__FILE__, 'hookDisplayCheckoutSummaryTop.tpl');
}
public function hookDisplayReassurance($param)
{
if (isset($this->context->controller->php_self) && (in_array($this->context->controller->php_self, array('order', 'cart')))) {
$custom_cart_text = Configuration::get('AEUC_LABEL_CUSTOM_CART_TEXT', (int) $this->context->language->id);
if (trim($custom_cart_text) == '') {
return false;
} else {
$this->context->smarty->assign('custom_cart_text', $custom_cart_text);
return $this->display(__FILE__, 'hookDisplayReassurance.tpl');
}
}
}
public function hookDisplayFooter($param)
{
$cms_roles_to_be_displayed = array(self::LEGAL_NOTICE,
self::LEGAL_CONDITIONS,
self::LEGAL_REVOCATION,
self::LEGAL_PRIVACY,
self::LEGAL_SHIP_PAY,
self::LEGAL_ENVIRONMENTAL, );
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_pages_associated = $cms_role_repository->findByName($cms_roles_to_be_displayed);
$is_ssl_enabled = (bool) Configuration::get('PS_SSL_ENABLED');
$cms_links = array();
foreach ($cms_pages_associated as $cms_page_associated) {
if ($cms_page_associated instanceof CMSRole && (int) $cms_page_associated->id_cms > 0) {
$cms = new CMS((int) $cms_page_associated->id_cms);
$cms_links[] = array('link' => $this->context->link->getCMSLink($cms->id, null, $is_ssl_enabled),
'id' => 'cms-page-'.$cms->id,
'title' => $cms->meta_title[$this->context->language->id],
'desc' => $cms->meta_description[$this->context->language->id],
);
}
}
$this->context->smarty->assign('cms_links', $cms_links);
return $this->display(__FILE__, 'hookDisplayFooter.tpl');
}
public function hookDisplayFooterAfter($param)
{
if (isset($this->context->controller->php_self)) {
if (in_array($this->context->controller->php_self, array('index', 'category', 'prices-drop', 'new-products', 'best-sales', 'search', 'product'))) {
$cms_repository = $this->entity_manager->getRepository('CMS');
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_page_shipping_pay = $cms_role_repository->findOneByName(self::LEGAL_SHIP_PAY);
$link_shipping = false;
if ((int) $cms_page_shipping_pay->id_cms > 0) {
$cms_shipping_pay = $cms_repository->i10nFindOneById((int) $cms_page_shipping_pay->id_cms,
(int) $this->context->language->id,
(int) $this->context->shop->id);
$link_shipping =
$this->context->link->getCMSLink($cms_shipping_pay, $cms_shipping_pay->link_rewrite, (bool) Configuration::get('PS_SSL_ENABLED'));
}
if ($this->context->controller->php_self == 'product') {
$delivery_addtional_info = Configuration::get('AEUC_LABEL_DELIVERY_ADDITIONAL', (int) $this->context->language->id);
if (trim($delivery_addtional_info) == '') {
return false;
}
$this->context->smarty->assign('link_shipping', $link_shipping);
$this->context->smarty->assign('delivery_additional_information', $delivery_addtional_info);
} else {
$customer_default_group_id = (int) $this->context->customer->id_default_group;
$customer_default_group = new Group($customer_default_group_id);
if ((bool) Configuration::get('PS_TAX') === true && $this->context->country->display_tax_label &&
!(Validate::isLoadedObject($customer_default_group) && (bool) $customer_default_group->price_display_method === true)) {
$tax_included = true;
} else {
$tax_included = false;
}
$this->context->smarty->assign('show_shipping', (bool) Configuration::get('AEUC_LABEL_SHIPPING_INC_EXC') === true);
$this->context->smarty->assign('link_shipping', $link_shipping);
$this->context->smarty->assign('tax_included', $tax_included);
}
return $this->display(__FILE__, 'hookDisplayFooterAfter.tpl');
}
}
}
/* This hook is present to maintain backward compatibility */
public function hookAdvancedPaymentOptions($param)
{
$legacyOptions = Hook::exec('displayPaymentEU', array(), null, true);
$newOptions = array();
Media::addJsDef(array('aeuc_tos_err_str' => Tools::htmlentitiesUTF8($this->trans('You must agree to our Terms of Service before going any further!', array(), 'Modules.Legalcompliance.Shop'))));
Media::addJsDef(array('aeuc_submit_err_str' => Tools::htmlentitiesUTF8($this->trans('Something went wrong. If the problem persists, please contact us.', array(), 'Modules.Legalcompliance.Shop'))));
Media::addJsDef(array('aeuc_no_pay_err_str' => Tools::htmlentitiesUTF8($this->trans('Select a payment option first.', array(), 'Modules.Legalcompliance.Shop'))));
Media::addJsDef(array('aeuc_virt_prod_err_str' => Tools::htmlentitiesUTF8($this->trans('Please check the "Revocation of virtual products" box first!', array(), 'Modules.Legalcompliance.Shop'))));
if ($legacyOptions) {
foreach ($legacyOptions as $module_name => $legacyOption) {
if (!$legacyOption) {
continue;
}
foreach (PaymentOption::convertLegacyOption($legacyOption) as $option) {
$option->setModuleName($module_name);
$to_be_cleaned = $option->getForm();
if ($to_be_cleaned) {
$cleaned = str_replace('@hiddenSubmit', '', $to_be_cleaned);
$option->setForm($cleaned);
}
$newOptions[] = $option;
}
}
}
return $newOptions;
}
public function hookActionEmailAddAfterContent($param)
{
if (!isset($param['template']) || !isset($param['template_html']) || !isset($param['template_txt'])) {
return;
}
$tpl_name = (string) $param['template'];
$tpl_name_exploded = explode('.', $tpl_name);
if (is_array($tpl_name_exploded)) {
$tpl_name = (string) $tpl_name_exploded[0];
}
$id_lang = (int) $param['id_lang'];
$mail_id = AeucEmailEntity::getMailIdFromTplFilename($tpl_name);
if (!isset($mail_id['id_mail'])) {
return;
}
$mail_id = (int) $mail_id['id_mail'];
$cms_role_ids = AeucCMSRoleEmailEntity::getCMSRoleIdsFromIdMail($mail_id);
if (!$cms_role_ids) {
return;
}
$tmp_cms_role_list = array();
foreach ($cms_role_ids as $cms_role_id) {
$tmp_cms_role_list[] = $cms_role_id['id_cms_role'];
}
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_roles = $cms_role_repository->findByIdCmsRole($tmp_cms_role_list);
if (!$cms_roles) {
return;
}
$cms_repo = $this->entity_manager->getRepository('CMS');
$cms_contents = array();
foreach ($cms_roles as $cms_role) {
$cms_page = $cms_repo->i10nFindOneById((int) $cms_role->id_cms, $id_lang, $this->context->shop->id);
if (!isset($cms_page->content)) {
continue;
}
$cms_contents[] = $cms_page->content;
$param['template_txt'] .= strip_tags($cms_page->content, true);
}
$this->context->smarty->assign(array('cms_contents' => $cms_contents));
$param['template_html'] .= $this->display(__FILE__, 'hook-email-wrapper.tpl');
}
public function hookSendMailAlterTemplateVars($param)
{
if (!isset($param['template']) && !isset($param['{carrier}'])) {
return;
}
$tpl_name = (string) $param['template'];
$tpl_name_exploded = explode('.', $tpl_name);
if (is_array($tpl_name_exploded)) {
$tpl_name = (string) $tpl_name_exploded[0];
}
if ('order_conf' !== $tpl_name) {
return;
}
$carrier = new Carrier((int) $param['cart']->id_carrier);
$param['template_vars']['{carrier}'] .= ' - '.$carrier->delay[(int) $param['cart']->id_lang];
}
public function hookHeader($param)
{
$this->context->controller->registerStylesheet('modules-aeuc_front', 'modules/'.$this->name.'/views/css/aeuc_front.css', ['media' => 'all', 'priority' => 150]);
if (isset($this->context->controller->php_self) && ($this->context->controller->php_self == 'cms')) {
if ($this->isPrintableCMSPage()) {
$this->context->controller->registerStylesheet('modules-aeuc_print', 'modules/'.$this->name.'/views/css/aeuc_print.css', ['media' => 'print', 'priority' => 150]);
}
}
if (Tools::getValue('direct_print') == '1') {
$this->context->controller->registerJavascript('modules-fo_aeuc_print', 'modules/'.$this->name.'/views/js/fo_aeuc_print.js', ['position' => 'bottom', 'priority' => 150]);
}
}
protected function isPrintableCMSPage()
{
$printable_cms_pages = array();
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
foreach (array(self::LEGAL_CONDITIONS, self::LEGAL_REVOCATION, self::LEGAL_SHIP_PAY, self::LEGAL_PRIVACY) as $cms_page_name) {
$cms_page_associated = $cms_role_repository->findOneByName($cms_page_name);
if ($cms_page_associated instanceof CMSRole && (int) $cms_page_associated->id_cms > 0) {
$printable_cms_pages[] = (int) $cms_page_associated->id_cms;
}
}
return in_array(Tools::getValue('id_cms'), $printable_cms_pages);
}
public function hookDisplayCMSDisputeInformation($params)
{
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_page_associated = $cms_role_repository->findOneByName(self::LEGAL_NOTICE);
if ($cms_page_associated instanceof CMSRole && (int) $cms_page_associated->id_cms > 0) {
if (Tools::getValue('id_cms') == $cms_page_associated->id_cms) {
return $this->display(__FILE__, 'hookDisplayCMSDisputeInformation.tpl');
}
}
}
public function hookTermsAndConditions($param)
{
$returned_terms_and_conditions = array();
$cms_repository = $this->entity_manager->getRepository('CMS');
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_page_conditions_associated = $cms_role_repository->findOneByName(self::LEGAL_CONDITIONS);
$cms_page_revocation_associated = $cms_role_repository->findOneByName(self::LEGAL_REVOCATION);
if (Configuration::get('PS_CONDITIONS') && (int) $cms_page_conditions_associated->id_cms > 0 && (int) $cms_page_revocation_associated->id_cms > 0) {
$cms_conditions = $cms_repository->i10nFindOneById((int) $cms_page_conditions_associated->id_cms,
(int) $this->context->language->id,
(int) $this->context->shop->id);
$link_conditions =
$this->context->link->getCMSLink($cms_conditions, $cms_conditions->link_rewrite, (bool) Configuration::get('PS_SSL_ENABLED'));
$cms_revocation = $cms_repository->i10nFindOneById((int) $cms_page_revocation_associated->id_cms,
(int) $this->context->language->id,
(int) $this->context->shop->id);
$link_revocation =
$this->context->link->getCMSLink($cms_revocation, $cms_revocation->link_rewrite, (bool) Configuration::get('PS_SSL_ENABLED'));
$termsAndConditions = new TermsAndConditions();
$termsAndConditions
->setText(
$this->trans('I agree to the [terms of service] and [revocation terms] and will adhere to them unconditionally.', [], 'Modules.Legalcompliance.Shop'),
$link_conditions,
$link_revocation
)
->setIdentifier('terms-and-conditions')
;
$returned_terms_and_conditions[] = $termsAndConditions;
}
if ((bool) Configuration::get('AEUC_LABEL_REVOCATION_VP') && $this->hasCartVirtualProduct($this->context->cart)) {
$termsAndConditions = new TermsAndConditions();
$termsAndConditions
->setText(
$this->trans(
'[1]For digital goods:[/1] I want immediate access to the digital content and I acknowledge that thereby I lose my right to cancel once the service has begun.[2][1]For services:[/1] I agree to the starting of the service and I acknowledge that I lose my right to cancel once the service has been fully performed.',
array(
'[1]' => '<strong>',
'[/1]' => '</strong>',
'[2]' => '<br>',
),
'Modules.Legalcompliance.Shop'
)
)
->setIdentifier('virtual-products')
;
$returned_terms_and_conditions[] = $termsAndConditions;
}
if (sizeof($returned_terms_and_conditions) > 0) {
return $returned_terms_and_conditions;
} else {
return false;
}
}
public function hookDisplayCMSPrintButton($param)
{
if ($this->isPrintableCMSPage()) {
$this->context->smarty->assign('directPrint', Tools::getValue('content_only') != '1');
$cms_repository = $this->entity_manager->getRepository('CMS');
$cms_current = $cms_repository->i10nFindOneById((int)Tools::getValue('id_cms'),
(int)$this->context->language->id,
(int)$this->context->shop->id);
$cms_current_link =
$this->context->link->getCMSLink($cms_current, $cms_current->link_rewrite, (bool)Configuration::get('PS_SSL_ENABLED'));
if (!strpos($cms_current_link, '?')) {
$cms_current_link .= '?direct_print=1';
} else {
$cms_current_link .= '&direct_print=1';
}
$this->context->smarty->assign('print_link', $cms_current_link);
return $this->display(__FILE__, 'hookDisplayCMSPrintButton.tpl');
}
}
public function hookDisplayProductPriceBlock($param)
{
if (!isset($param['product']) || !isset($param['type'])) {
return;
}
$product = $param['product'];
$hook_type = $param['type'];
if (! $product instanceof Product) {
$product_repository = $this->entity_manager->getRepository('Product');
$product = $product_repository->findOne((int) $product['id_product']);
}
if (!Validate::isLoadedObject($product)) {
return;
}
$smartyVars = array();
/* Handle Product Combinations label */
if ($param['type'] == 'before_price' && (bool) Configuration::get('AEUC_LABEL_COMBINATION_FROM') === true) {
if ($product->hasAttributes()) {
$need_display = false;
$combinations = $product->getAttributeCombinations($this->context->language->id);
if ($combinations && is_array($combinations)) {
foreach ($combinations as $combination) {
if ((float) $combination['price'] != 0) {
$need_display = true;
break;
}
}
unset($combinations);
if ($need_display) {
$smartyVars['before_price'] = array();
$smartyVars['before_price']['from_str_i18n'] = $this->trans('From', array(), 'Modules.Legalcompliance.Shop');
return $this->dumpHookDisplayProductPriceBlock($smartyVars, $hook_type);
}
}
return;
}
}
/* Handle Specific Price label*/
if ($param['type'] == 'old_price' && (bool) Configuration::get('AEUC_LABEL_SPECIFIC_PRICE') === true && 'catalog/_partials/miniatures/product.tpl' != $param['smarty']->template_resource) {
$smartyVars['old_price'] = array();
$smartyVars['old_price']['before_str_i18n'] = $this->trans('Our previous price', array(), 'Modules.Legalcompliance.Shop');
return $this->dumpHookDisplayProductPriceBlock($smartyVars, $hook_type);
}
/* Handle Shipping Inc./Exc.*/
if ($param['type'] == 'price') {
$smartyVars['price'] = array();
$need_shipping_label = true;
if ((bool) Configuration::get('AEUC_LABEL_SHIPPING_INC_EXC') === true && $need_shipping_label === true) {
if (!$product->is_virtual) {
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_repository = $this->entity_manager->getRepository('CMS');
$cms_page_associated = $cms_role_repository->findOneByName(self::LEGAL_SHIP_PAY);
if (isset($cms_page_associated->id_cms) && $cms_page_associated->id_cms != 0) {
$cms_ship_pay_id = (int) $cms_page_associated->id_cms;
$cms_revocations = $cms_repository->i10nFindOneById($cms_ship_pay_id, $this->context->language->id,
$this->context->shop->id);
$is_ssl_enabled = (bool) Configuration::get('PS_SSL_ENABLED');
$link_ship_pay = $this->context->link->getCMSLink($cms_revocations, $cms_revocations->link_rewrite, $is_ssl_enabled);
$smartyVars['ship'] = array();
$smartyVars['ship']['link_ship_pay'] = $link_ship_pay;
$smartyVars['ship']['ship_str_i18n'] = $this->trans('Shipping excluded', array(), 'Modules.Legalcompliance.Shop');
}
}
}
return $this->dumpHookDisplayProductPriceBlock($smartyVars, $hook_type);
}
/* Handle Delivery time label */
if ($param['type'] == 'after_price' && !$product->is_virtual) {
$context_id_lang = $this->context->language->id;
$smartyVars['after_price'] = array();
$delivery_addtional_info = Configuration::get('AEUC_LABEL_DELIVERY_ADDITIONAL', (int) $context_id_lang);
if (trim($delivery_addtional_info) != '') {
$smartyVars['after_price']['delivery_str_i18n'] .= '*';
}
return $this->dumpHookDisplayProductPriceBlock($smartyVars, $hook_type);
}
/* Handle Taxes Inc./Exc.*/
if ($param['type'] == 'list_taxes') {
$smartyVars['list_taxes'] = array();
if ((bool) Configuration::get('AEUC_LABEL_TAX_INC_EXC') === true) {
$customer_default_group_id = (int) $this->context->customer->id_default_group;
$customer_default_group = new Group($customer_default_group_id);
if ((bool) Configuration::get('PS_TAX') === true && $this->context->country->display_tax_label &&
!(Validate::isLoadedObject($customer_default_group) && (bool) $customer_default_group->price_display_method === true)) {
$smartyVars['list_taxes']['tax_str_i18n'] = $this->trans('Tax included', array(), 'Shop.Theme.Checkout');
} else {
$smartyVars['list_taxes']['tax_str_i18n'] = $this->trans('Tax excluded', array(), 'Shop.Theme.Checkout');
}
}
return $this->dumpHookDisplayProductPriceBlock($smartyVars, $hook_type);
}
/* Handle Unit prices */
if ($param['type'] == 'unit_price') {
if ((!empty($product->unity) && $product->unit_price_ratio > 0.000000)) {
$smartyVars['unit_price'] = array();
if ((bool) Configuration::get('AEUC_LABEL_UNIT_PRICE') === true) {
if (!(isset($this->context->controller->php_self) && ($this->context->controller->php_self == 'product'))) {
$priceDisplay = Product::getTaxCalculationMethod((int) $this->context->cookie->id_customer);
if (!$priceDisplay || $priceDisplay == 2) {
$productPrice = $product->getPrice(true, null, 6);
} else {
$productPrice = $product->getPrice(false, null, 6);
}
$smartyVars['unit_price']['unit_price'] = $param['product']['unit_price_full'];
$smartyVars['unit_price']['unity'] = $product->unity;
}
}
return $this->dumpHookDisplayProductPriceBlock($smartyVars, $hook_type, $product->id);
}
}
}
public function hookDisplayCheckoutSubtotalDetails($param)
{
// Display "under conditions" when the shipping subtotal equals 0
if ('shipping' === $param['subtotal']['type'] && 0 === $param['subtotal']['amount']) {
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_page_shipping_and_payment = $cms_role_repository->findOneByName(self::LEGAL_SHIP_PAY);
$link = $this->context->link->getCMSLink((int)$cms_page_shipping_and_payment->id_cms);
$this->context->smarty->assign(array('link' => $link));
return $this->display(__FILE__, 'hookDisplayCartPriceBlock_shipping_details.tpl');
}
}
private function emptyTemplatesCache()
{
$this->_clearCache('product.tpl');
$this->_clearCache('product-list.tpl');
}
private function dumpHookDisplayProductPriceBlock(array $smartyVars, $hook_type, $additional_cache_param = false)
{
$cache_id = sha1($hook_type.$additional_cache_param);
$this->context->smarty->assign(array('smartyVars' => $smartyVars));
$this->context->controller->addJS($this->_path.'views/js/fo_aeuc_tnc.js', true);
$template = 'hookDisplayProductPriceBlock_'.$hook_type.'.tpl';
return $this->display(__FILE__, $template, $cache_id);
}
/**
* Load the configuration form.
*/
public function getContent()
{
$theme_warning = null;
$success_band = $this->_postProcess();
$infoMsg = $this->trans(
'This module helps European merchants to comply with legal requirements. Learn how to configure the module and other shop parameters so that you\'re in compliance with the law.[1][2]PrestaShop 1.7 legal compliance documentation[/2]',
array(
'[1]' => '<br>',
'[2]' => '<a href="http://doc.prestashop.com/display/PS17/Complying+with+the+European+legislation" target="_blank">',
'[/2]' => '</a>',
),
'Modules.Legalcompliance.Admin'
);
$this->context->smarty->assign('module_dir', $this->_path);
$this->context->smarty->assign('errors', $this->_errors);
$this->context->controller->addCSS($this->_path.'views/css/configure.css', 'all');
// Render all required form for each 'part'
$formLabelsManager = $this->renderFormLabelsManager();
$formFeaturesManager = $this->renderFormFeaturesManager();
$formLegalContentManager = $this->renderFormLegalContentManager();
$formEmailAttachmentsManager = $this->renderFormEmailAttachmentsManager();
return $theme_warning.$this->adminDisplayInformation($infoMsg).$success_band.$formLabelsManager.$formFeaturesManager.$formLegalContentManager.
$formEmailAttachmentsManager;
}
/**
* Save form data.
*/
protected function _postProcess()
{
$has_processed_something = false;
$post_keys_switchable =
array_keys(array_merge($this->getConfigFormLabelsManagerValues(), $this->getConfigFormFeaturesManagerValues()));
$post_keys_complex = array('AEUC_legalContentManager',
'AEUC_emailAttachmentsManager',
'discard_tpl_warn',
);
$i10n_inputs_received = array();
$received_values = Tools::getAllValues();
foreach (array_keys($received_values) as $key_received) {
/* Case its one of form with only switches in it */
if (in_array($key_received, $post_keys_switchable)) {
$is_option_active = Tools::getValue($key_received);
$key = Tools::strtolower($key_received);
$key = Tools::toCamelCase($key);
if (method_exists($this, 'process'.$key)) {
$this->{'process'.$key}($is_option_active);
$has_processed_something = true;
}
continue;
}
/* Case we are on more complex forms */
if (in_array($key_received, $post_keys_complex)) {
// Clean key
$key = Tools::strtolower($key_received);
$key = Tools::toCamelCase($key, true);
if (method_exists($this, 'process'.$key)) {
$this->{'process'.$key}();
$has_processed_something = true;
}
}
/* Case Multi-lang input */
if (strripos($key_received, 'AEUC_LABEL_CUSTOM_CART_TEXT') !== false) {
$exploded = explode('_', $key_received);
$count = count($exploded);
$id_lang = (int) $exploded[$count - 1];
$i10n_inputs_received['AEUC_LABEL_CUSTOM_CART_TEXT'][$id_lang] = $received_values[$key_received];
}
if (strripos($key_received, 'AEUC_LABEL_DELIVERY_ADDITIONAL') !== false) {
$exploded = explode('_', $key_received);
$count = count($exploded);
$id_lang = (int) $exploded[$count - 1];
$i10n_inputs_received['AEUC_LABEL_DELIVERY_ADDITIONAL'][$id_lang] = $received_values[$key_received];
}
}
if (count($i10n_inputs_received) > 0) {
$this->processAeucLabelMultiLang($i10n_inputs_received);
$has_processed_something = true;
}
if ($has_processed_something) {
$this->emptyTemplatesCache();
return (count($this->_errors) ? $this->displayError($this->_errors) : '').
(count($this->_warnings) ? $this->displayWarning($this->_warnings) : '').
$this->displayConfirmation($this->trans('The settings have been updated.', array(), 'Admin.Notifications.Success'));
} else {
return (count($this->_errors) ? $this->displayError($this->_errors) : '').
(count($this->_warnings) ? $this->displayWarning($this->_warnings) : '').'';
}
}
protected function processAeucLabelMultiLang(array $i10n_inputs)
{
if (isset($i10n_inputs['AEUC_LABEL_DELIVERY_ADDITIONAL'])) {
Configuration::updateValue('AEUC_LABEL_DELIVERY_ADDITIONAL', $i10n_inputs['AEUC_LABEL_DELIVERY_ADDITIONAL']);
}
if (isset($i10n_inputs['AEUC_LABEL_CUSTOM_CART_TEXT'])) {
Configuration::updateValue('AEUC_LABEL_CUSTOM_CART_TEXT', $i10n_inputs['AEUC_LABEL_CUSTOM_CART_TEXT']);
}
}
protected function processAeucLabelCombinationFrom($is_option_active)
{
if ((bool) $is_option_active) {
Configuration::updateValue('AEUC_LABEL_COMBINATION_FROM', true);
} else {
Configuration::updateValue('AEUC_LABEL_COMBINATION_FROM', false);
}
}
protected function processAeucLabelSpecificPrice($is_option_active)
{
if ((bool) $is_option_active) {
Configuration::updateValue('AEUC_LABEL_SPECIFIC_PRICE', true);
} else {
Configuration::updateValue('AEUC_LABEL_SPECIFIC_PRICE', false);
}
}
protected function processAeucEmailAttachmentsManager()
{
$json_attach_assoc = Tools::jsonDecode(Tools::getValue('emails_attach_assoc'));
if (!$json_attach_assoc) {
return;
}
// Empty previous assoc to make new ones
AeucCMSRoleEmailEntity::truncate();
foreach ($json_attach_assoc as $assoc) {
$assoc_obj = new AeucCMSRoleEmailEntity();
$assoc_obj->id_mail = $assoc->id_mail;
$assoc_obj->id_cms_role = $assoc->id_cms_role;
if (!$assoc_obj->save()) {
$this->_errors[] = $this->trans('Failed to associate legal content with an email template.', array(), 'Modules.Legalcompliance.Admin');
}
}
}
protected function processAeucLabelRevocationTOS($is_option_active)
{
// Check first if LEGAL_REVOCATION CMS Role has been set before doing anything here
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_page_associated = $cms_role_repository->findOneByName(self::LEGAL_REVOCATION);
$cms_roles = $this->getCMSRoles();
if ((bool) $is_option_active) {
if (!$cms_page_associated instanceof CMSRole || (int) $cms_page_associated->id_cms == 0) {
$this->_errors[] =
$this->trans(
'\'Revocation Terms within ToS\' label cannot be activated unless you associate "%s" role with a Page.',
array(
'%s' => (string) $cms_roles[self::LEGAL_REVOCATION],
),
'Modules.Legalcompliance.Admin'
);
return;
}
Configuration::updateValue('AEUC_LABEL_REVOCATION_TOS', true);
} else {
Configuration::updateValue('AEUC_LABEL_REVOCATION_TOS', false);
}
}
protected function processAeucLabelRevocationVP($is_option_active)
{
if ((bool) $is_option_active) {
Configuration::updateValue('AEUC_LABEL_REVOCATION_VP', true);
} else {
Configuration::updateValue('AEUC_LABEL_REVOCATION_VP', false);
}
}
protected function processAeucLabelShippingIncExc($is_option_active)
{
// Check first if LEGAL_SHIP_PAY CMS Role has been set before doing anything here
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_page_associated = $cms_role_repository->findOneByName(self::LEGAL_SHIP_PAY);
$cms_roles = $this->getCMSRoles();
if ((bool) $is_option_active) {
if (!$cms_page_associated instanceof CMSRole || (int) $cms_page_associated->id_cms === 0) {
$this->_errors[] =
$this->trans(
'Shipping fees label cannot be activated unless you associate "%s" role with a Page.',
array(
'%s' => (string) $cms_roles[self::LEGAL_SHIP_PAY],
),
'Modules.Legalcompliance.Admin'
);
return;
}
Configuration::updateValue('AEUC_LABEL_SHIPPING_INC_EXC', true);
} else {
Configuration::updateValue('AEUC_LABEL_SHIPPING_INC_EXC', false);
}
}
protected function processAeucLabelTaxIncExc($is_option_active)
{
$countries = Country::getCountries((int) Context::getContext()->language->id, true);
foreach ($countries as $id_country => $country_row) {
$country = new Country($id_country);
$country->display_tax_label = (bool) $is_option_active;
$country->save();
}
Configuration::updateValue('AEUC_LABEL_TAX_INC_EXC', (bool) $is_option_active);
}
protected function processAeucLabelUnitPrice($is_option_active)
{
Configuration::updateValue('AEUC_LABEL_UNIT_PRICE', $is_option_active);
}
protected function processPsAtcpShipWrap($is_option_active)
{
Configuration::updateValue('PS_ATCP_SHIPWRAP', $is_option_active);
}
protected function processAeucFeatReorder($is_option_active)
{
if ((bool) $is_option_active) {
Configuration::updateValue('PS_DISALLOW_HISTORY_REORDERING', false);
} else {
Configuration::updateValue('PS_DISALLOW_HISTORY_REORDERING', true);
}
}
protected function processAeucLegalContentManager()
{
$posted_values = Tools::getAllValues();
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
foreach ($posted_values as $key_name => $assoc_cms_id) {
if (strpos($key_name, 'CMSROLE_') !== false) {
$exploded_key_name = explode('_', $key_name);
$cms_role = $cms_role_repository->findOne((int) $exploded_key_name[1]);
$cms_role->id_cms = (int) $assoc_cms_id;
$cms_role->update();
}
}
unset($cms_role);
}
protected function getCMSRoles()
{
return array(self::LEGAL_NOTICE => $this->trans('Legal notice', array(), 'Modules.Legalcompliance.Admin'),
self::LEGAL_CONDITIONS => $this->trans('Terms of Service (ToS)', array(), 'Modules.Legalcompliance.Admin'),
self::LEGAL_REVOCATION => $this->trans('Revocation terms', array(), 'Modules.Legalcompliance.Admin'),
self::LEGAL_REVOCATION_FORM => $this->trans('Revocation form', array(), 'Modules.Legalcompliance.Admin'),
self::LEGAL_PRIVACY => $this->trans('Privacy', array(), 'Modules.Legalcompliance.Admin'),
self::LEGAL_ENVIRONMENTAL => $this->trans('Environmental notice', array(), 'Modules.Legalcompliance.Admin'),
self::LEGAL_SHIP_PAY => $this->trans('Shipping and payment', array(), 'Modules.Legalcompliance.Admin'),
);
}
/**
* Create the form that will let user choose all the wording options.
*/
protected function renderFormLabelsManager()
{
$helper = new HelperForm();
$helper->show_toolbar = false;
$helper->table = $this->table;
$helper->module = $this;
$helper->default_form_language = $this->context->language->id;
$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG', 0);
$helper->identifier = $this->identifier;
$helper->submit_action = 'submitAEUC_labelsManager';
$helper->currentIndex =
$this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.
$this->tab.'&module_name='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules');
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->tpl_vars =
array('fields_value' => $this->getConfigFormLabelsManagerValues(),
/* Add values for your inputs */
'languages' => $this->context->controller->getLanguages(),
'id_language' => $this->context->language->id,
);
return $helper->generateForm(array($this->getConfigFormLabelsManager()));
}
/**
* Create the structure of your form.
*/
protected function getConfigFormLabelsManager()
{
return array('form' => array('legend' => array('title' => $this->trans('Labels', array(), 'Modules.Legalcompliance.Admin'),
'icon' => 'icon-tags',
),
'input' => array(array('type' => 'text',
'lang' => true,
'label' => $this->trans('Additional information about delivery time', array(), 'Modules.Legalcompliance.Admin'),
'name' => 'AEUC_LABEL_DELIVERY_ADDITIONAL',
'desc' => $this->trans('If you specified a delivery time, this additional information is displayed in the footer of product pages with a link to the "Shipping & Payment" Page. Leave the field empty to disable.', array(), 'Modules.Legalcompliance.Admin'),
'hint' => $this->trans('Indicate for which countries your delivery time applies.', array(), 'Modules.Legalcompliance.Admin'),
),
array('type' => 'switch',
'label' => $this->trans(' \'Our previous price\' label', array(), 'Modules.Legalcompliance.Admin'),
'name' => 'AEUC_LABEL_SPECIFIC_PRICE',
'is_bool' => true,
'desc' => $this->trans('When a product is on sale, displays a \'Our previous price\' label before the original price crossed out, next to the price on the product page.', array(), 'Modules.Legalcompliance.Admin'),
'values' => array(array('id' => 'active_on',
'value' => true,
'label' => $this->trans('Enabled', array(), 'Admin.Global'),
),
array('id' => 'active_off',
'value' => false,
'label' => $this->trans('Disabled', array(), 'Admin.Global'),
),
),
),
array('type' => 'switch',
'label' => $this->trans('Tax \'inc./excl.\' label', array(), 'Modules.Legalcompliance.Admin'),
'name' => 'AEUC_LABEL_TAX_INC_EXC',
'is_bool' => true,
'desc' => $this->trans('Displays whether the tax is included on the product page (\'Tax incl./excl.\' label) and adds a short mention in the footer of other pages.', array(), 'Modules.Legalcompliance.Admin'),
'values' => array(array('id' => 'active_on',
'value' => true,
'label' => $this->trans('Enabled', array(), 'Admin.Global'),
),
array('id' => 'active_off',
'value' => false,
'label' => $this->trans('Disabled', array(), 'Admin.Global'),
),
),
),
array('type' => 'switch',
'label' => $this->trans('Price per unit label', array(), 'Modules.Legalcompliance.Admin'),
'name' => 'AEUC_LABEL_UNIT_PRICE',
'is_bool' => true,
'desc' => $this->trans('If available, displays the price per unit everywhere the product price is listed.', array(), 'Modules.Legalcompliance.Admin'),
'values' => array(array('id' => 'active_on',
'value' => true,
'label' => $this->trans('Enabled', array(), 'Admin.Global'),
),
array('id' => 'active_off',
'value' => false,
'label' => $this->trans('Disabled', array(), 'Admin.Global'),
),
),
),
array('type' => 'switch',
'label' => $this->trans('\'Shipping fees excl.\' label', array(), 'Modules.Legalcompliance.Admin'),
'name' => 'AEUC_LABEL_SHIPPING_INC_EXC',
'is_bool' => true,
'desc' => $this->trans('Displays a label next to the product price (\'Shipping excluded\') and adds a short mention in the footer of other pages.', array(), 'Modules.Legalcompliance.Admin'),
'hint' => $this->trans('If enabled, make sure the Shipping terms are associated with a page below (Legal Content Management). The label will link to this content.', array(), 'Modules.Legalcompliance.Admin'),
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->trans('Enabled', array(), 'Admin.Global'),
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->trans('Disabled', array(), 'Admin.Global'),
),
),
),
array(
'type' => 'switch',
'label' => $this->trans('Revocation Terms within ToS', array(), 'Modules.Legalcompliance.Admin'),
'name' => 'AEUC_LABEL_REVOCATION_TOS',
'is_bool' => true,
'desc' => $this->trans('Includes content from the Revocation Terms page within the Terms of Services (ToS).', array(), 'Modules.Legalcompliance.Admin'),
'hint' => $this->trans('If enabled, make sure the Revocation Terms are associated with a page below (Legal Content Management).', array(), 'Modules.Legalcompliance.Admin'),
'disable' => true,
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->trans('Enabled', array(), 'Admin.Global'),
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->trans('Disabled', array(), 'Admin.Global'),
),
),
),
array(
'type' => 'switch',
'label' => $this->trans('Revocation for virtual products', array(), 'Modules.Legalcompliance.Admin'),
'name' => 'AEUC_LABEL_REVOCATION_VP',
'is_bool' => true,
'desc' => $this->trans('Adds a mandatory checkbox when the cart contains a virtual product. Use it to ensure customers are aware that a virtual product cannot be returned.', array(), 'Modules.Legalcompliance.Admin'),
'hint' => $this->trans('Require customers to renounce their revocation right when purchasing virtual products (digital goods or services).', array(), 'Modules.Legalcompliance.Admin'),
'disable' => true,
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->trans('Enabled', array(), 'Admin.Global'),
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->trans('Disabled', array(), 'Admin.Global'),
),
),
),
array(
'type' => 'switch',
'label' => $this->trans('\'From\' price label (when combinations)', array(), 'Modules.Legalcompliance.Admin'),
'name' => 'AEUC_LABEL_COMBINATION_FROM',
'is_bool' => true,
'desc' => $this->trans('Displays a \'From\' label before the price on products with combinations.', array(), 'Modules.Legalcompliance.Admin'),
'hint' => $this->trans('As prices can vary from a combination to another, this label indicates that the final price may be higher.', array(), 'Modules.Legalcompliance.Admin'),
'disable' => true,
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->trans('Enabled', array(), 'Admin.Global'),
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->trans('Disabled', array(), 'Admin.Global'),
),
),
),
array('type' => 'text',
'lang' => true,
'label' => $this->trans('Custom text in shopping cart page', array(), 'Modules.Legalcompliance.Admin'),
'name' => 'AEUC_LABEL_CUSTOM_CART_TEXT',
'desc' => $this->trans('This text will be displayed on the shopping cart page. Leave empty to disable.', array(), 'Modules.Legalcompliance.Admin'),
'hint' => $this->trans('Please inform your customers about how the order is legally confirmed.', array(), 'Modules.Legalcompliance.Admin'),
),
),
'submit' => array(
'title' => $this->trans('Save', array(), 'Admin.Actions'),
),
),
);
}
/**
* Set values for the inputs.
*/
protected function getConfigFormLabelsManagerValues()
{
$custom_cart_text_values = array();
$langs = Language::getLanguages(false, false);
foreach ($langs as $lang) {
$tmp_id_lang = (int) $lang['id_lang'];
$delivery_additional[$tmp_id_lang] = Configuration::get('AEUC_LABEL_DELIVERY_ADDITIONAL', $tmp_id_lang);
$custom_cart_text_values[$tmp_id_lang] = Configuration::get('AEUC_LABEL_CUSTOM_CART_TEXT', $tmp_id_lang);
}
return array(
'AEUC_LABEL_DELIVERY_ADDITIONAL' => $delivery_additional,
'AEUC_LABEL_CUSTOM_CART_TEXT' => $custom_cart_text_values,
'AEUC_LABEL_SPECIFIC_PRICE' => Configuration::get('AEUC_LABEL_SPECIFIC_PRICE'),
'AEUC_LABEL_UNIT_PRICE' => Configuration::get('AEUC_LABEL_UNIT_PRICE'),
'AEUC_LABEL_TAX_INC_EXC' => Configuration::get('AEUC_LABEL_TAX_INC_EXC'),
'AEUC_LABEL_REVOCATION_TOS' => Configuration::get('AEUC_LABEL_REVOCATION_TOS'),
'AEUC_LABEL_REVOCATION_VP' => Configuration::get('AEUC_LABEL_REVOCATION_VP'),
'AEUC_LABEL_SHIPPING_INC_EXC' => Configuration::get('AEUC_LABEL_SHIPPING_INC_EXC'),
'AEUC_LABEL_COMBINATION_FROM' => Configuration::get('AEUC_LABEL_COMBINATION_FROM'),
);
}
/**
* Create the form that will let user choose all the wording options.
*/
protected function renderFormFeaturesManager()
{
$helper = new HelperForm();
$helper->show_toolbar = false;
$helper->table = $this->table;
$helper->module = $this;
$helper->default_form_language = $this->context->language->id;
$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG', 0);
$helper->identifier = $this->identifier;
$helper->submit_action = 'submitAEUC_featuresManager';
$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->getConfigFormFeaturesManagerValues(),
/* Add values for your inputs */
'languages' => $this->context->controller->getLanguages(),
'id_language' => $this->context->language->id,
);
return $helper->generateForm(array($this->getConfigFormFeaturesManager()));
}
/**
* Create the structure of your form.
*/
protected function getConfigFormFeaturesManager()
{
return array(
'form' => array(
'legend' => array(
'title' => $this->trans('Features', array(), 'Modules.Legalcompliance.Admin'),
'icon' => 'icon-cogs',
),
'input' => array(
array(
'type' => 'switch',
'label' => $this->trans('Enable \'Reordering\' feature', array(), 'Modules.Legalcompliance.Admin'),
'hint' => $this->trans('If enabled, the \'Reorder\' option allows customers to reorder in one click from their Order History page.', array(), 'Modules.Legalcompliance.Admin'),
'name' => 'AEUC_FEAT_REORDER',
'is_bool' => true,
'desc' => $this->trans('Make sure you comply with your local legislation before enabling: it can be considered as unsolicited goods.', array(), 'Modules.Legalcompliance.Admin'),
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->trans('Enabled', array(), 'Admin.Global'),
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->trans('Disabled', array(), 'Admin.Global'),
),
),
),
array(
'type' => 'switch',
'label' => $this->trans('Proportionate tax for shipping and wrapping', array(), 'Modules.Legalcompliance.Admin'),
'name' => 'PS_ATCP_SHIPWRAP',
'is_bool' => true,
'desc' => $this->trans('When enabled, tax for shipping and wrapping costs will be calculated proportionate to taxes applying to the products in the cart.', array(), 'Modules.Legalcompliance.Admin'),
'hint' => $this->trans('If active, your carriers\' shipping fees must be tax included! Make sure it is the case in the Shipping section.', array(), 'Modules.Legalcompliance.Admin'),
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->trans('Enabled', array(), 'Admin.Global'),
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->trans('Disabled', array(), 'Admin.Global'),
),
),
),
),
'submit' => array(
'title' => $this->trans('Save', array(), 'Admin.Actions'),
),
),
);
}
/**
* Set values for the inputs.
*/
protected function getConfigFormFeaturesManagerValues()
{
return array(
'AEUC_FEAT_REORDER' => !Configuration::get('PS_DISALLOW_HISTORY_REORDERING'),
'PS_ATCP_SHIPWRAP' => Configuration::get('PS_ATCP_SHIPWRAP'),
);
}
/**
* Create the form that will let user manage his legal page trough "CMS" feature.
*/
protected function renderFormLegalContentManager()
{
$cms_roles_aeuc = $this->getCMSRoles();
$cms_repository = $this->entity_manager->getRepository('CMS');
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_roles = $cms_role_repository->findByName(array_keys($cms_roles_aeuc));
$cms_roles_assoc = array();
$id_lang = Context::getContext()->employee->id_lang;
$id_shop = Context::getContext()->shop->id;
foreach ($cms_roles as $cms_role) {
if ((int) $cms_role->id_cms > 0) {
$cms_entity = $cms_repository->findOne((int) $cms_role->id_cms);
$assoc_cms_name = $cms_entity->meta_title[(int) $id_lang];
} else {
$assoc_cms_name = $this->trans('-- Select associated page --', array(), 'Modules.Legalcompliance.Admin');
}
$cms_roles_assoc[(int) $cms_role->id] = array('id_cms' => (int) $cms_role->id_cms,
'page_title' => (string) $assoc_cms_name,
'role_title' => (string) $cms_roles_aeuc[$cms_role->name],
);
}
$cms_pages = $cms_repository->i10nFindAll($id_lang, $id_shop);
$fake_object = new stdClass();
$fake_object->id = 0;
$fake_object->meta_title = $this->trans('-- Select associated page --', array(), 'Modules.Legalcompliance.Admin');
$cms_pages[-1] = $fake_object;
unset($fake_object);
$this->context->smarty->assign(array(
'cms_roles_assoc' => $cms_roles_assoc,
'cms_pages' => $cms_pages,
'form_action' => $this->context->link->getAdminLink('AdminModules').'&configure='.$this->name,
'add_cms_link' => $this->context->link->getAdminLink('AdminCMS'),
));
return $this->display(__FILE__, 'views/templates/admin/legal_cms_manager_form.tpl');
}
protected function renderFormEmailAttachmentsManager()
{
$cms_roles_aeuc = $this->getCMSRoles();
$cms_role_repository = $this->entity_manager->getRepository('CMSRole');
$cms_roles_associated = $cms_role_repository->getCMSRolesAssociated();
$legal_options = array();
$cleaned_mails_names = array();
foreach ($cms_roles_associated as $role) {
$list_id_mail_assoc = AeucCMSRoleEmailEntity::getIdEmailFromCMSRoleId((int) $role->id);
$clean_list = array();
foreach ($list_id_mail_assoc as $list_id_mail_assoc) {
$clean_list[] = $list_id_mail_assoc['id_mail'];
}
$legal_options[$role->name] = array(
'name' => $cms_roles_aeuc[$role->name],
'id' => $role->id,
'list_id_mail_assoc' => $clean_list,
);
}
foreach (AeucEmailEntity::getAll() as $email) {
$cleaned_mails_names[] = $email;
}
$this->context->smarty->assign(array(
'has_assoc' => $cms_roles_associated,
'mails_available' => $cleaned_mails_names,
'legal_options' => $legal_options,
'form_action' => $this->context->link->getAdminLink('AdminModules').'&configure='.$this->name,
));
// Insert JS in the page
$this->context->controller->addJS(($this->_path).'views/js/email_attachement.js');
return $this->display(__FILE__, 'views/templates/admin/email_attachments_form.tpl');
}
}