<?php
/*
* 2007-2013 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-2013 PrestaShop SA
*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

/**
 * @since 1.5.0
 */
class AdminStockConfigurationControllerCore extends AdminController
{
	/*
	 * By default, we use StockMvtReason as the table / className
	 */
	public function __construct()
	{
		$this->bootstrap = true;
		$this->context = Context::getContext();
	 	$this->table = 'stock_mvt_reason';
	 	$this->className = 'StockMvtReason';
		$this->lang = true;
		$this->multishop_context = Shop::CONTEXT_ALL;

		// defines fields
		$this->fields_list = array(
			'id_stock_mvt_reason' => array(
				'title' => $this->l('ID'),
				'align' => 'center',
				'search' => false,
				'class' => 'fixed-width-xs'
			),
			'sign' => array(
				'title' => $this->l('Sign'),
				'align' => 'center',
				'type' => 'select',
				'filter_key' => 'a!sign',
				'list' => array(
					'1' => $this->l('Increase'),
					'-1' => $this->l('Decrease'),
				),
				'icon' => array(
					-1 => 'remove_stock.png',
					1 => 'add_stock.png'
				),
				'orderby' => false,
				'class' => 'fixed-width-sm'
			),
			'name' => array(
				'title' => $this->l('Name'),
				'filter_key' => 'b!name'
			),
		);

		// loads labels (incremenation)
		$reasons_inc = StockMvtReason::getStockMvtReasonsWithFilter($this->context->language->id,
																	array(Configuration::get('PS_STOCK_MVT_TRANSFER_TO')), 1);
		// loads labaels (decremenation)
		$reasons_dec = StockMvtReason::getStockMvtReasonsWithFilter($this->context->language->id,
																	array(Configuration::get('PS_STOCK_MVT_TRANSFER_FROM')), -1);

		// defines options for StockMvt
		$this->fields_options = array(
			'general' => array(
				'title' =>	$this->l('Options'),
				'fields' =>	array(
					'PS_STOCK_MVT_INC_REASON_DEFAULT' => array(
						'title' => $this->l('Default label for increasing stock:'),
						'cast' => 'intval',
						'type' => 'select',
						'list' => $reasons_inc,
						'identifier' => 'id_stock_mvt_reason',
						'visibility' => Shop::CONTEXT_ALL
					),
					'PS_STOCK_MVT_DEC_REASON_DEFAULT' => array(
						'title' => $this->l('Default label for decreasing stock:'),
						'cast' => 'intval',
						'type' => 'select',
						'list' => $reasons_dec,
						'identifier' => 'id_stock_mvt_reason',
						'visibility' => Shop::CONTEXT_ALL
					),
					'PS_STOCK_CUSTOMER_ORDER_REASON' => array(
						'title' => $this->l('Default label for decreasing stock when a customer order is shipped:'),
						'cast' => 'intval',
						'type' => 'select',
						'list' => $reasons_dec,
						'identifier' => 'id_stock_mvt_reason',
						'visibility' => Shop::CONTEXT_ALL
					),
					'PS_STOCK_MVT_SUPPLY_ORDER' => array(
						'title' => $this->l('Default label for increasing stock when a supply order is received:'),
						'cast' => 'intval',
						'type' => 'select',
						'list' => $reasons_inc,
						'identifier' => 'id_stock_mvt_reason',
						'visibility' => Shop::CONTEXT_ALL
					),
				),
				'submit' => array(),
			)
		);

		parent::__construct();
	}

	public function init()
	{
		// if we are managing the second list (i.e. supply order state)
		if (Tools::isSubmit('submitAddsupply_order_state') ||
			Tools::isSubmit('addsupply_order_state') ||
			Tools::isSubmit('updatesupply_order_state') ||
			Tools::isSubmit('deletesupply_order_state'))
		{
			$this->table = 'supply_order_state';
		 	$this->className = 'SupplyOrderState';
		 	$this->identifier = 'id_supply_order_state';
			$this->display = 'edit';
		}
		parent::init();
	}

	/**
	 * AdminController::renderForm() override
	 * @see AdminController::renderForm()
	 */
	public function renderForm()
	{
		// if we are managing StockMvtReason
		if (Tools::isSubmit('addstock_mvt_reason') ||
			Tools::isSubmit('updatestock_mvt_reason') ||
			Tools::isSubmit('submitAddstock_mvt_reason') ||
			Tools::isSubmit('submitUpdatestock_mvt_reason'))
		{
			$this->toolbar_title = $this->l('Stock: Add stock movement label');

			$this->fields_form = array(
				'legend' => array(
					'title' => $this->l('Stock Movement label'),
					'icon' => 'icon-pencil'
				),
				'input' => array(
					array(
						'type' => 'text',
						'lang' => true,
						'label' => $this->l('Name:'),
						'name' => 'name',
						'required' => true
					),
					array(
						'type' => 'select',
						'label' => $this->l('Action:'),
						'name' => 'sign',
						'required' => true,
						'options' => array(
							'query' => array(
								array(
									'id' => '1',
									'name' => $this->l('Increase stock')
								),
								array(
									'id' => '-1',
									'name' => $this->l('Decrease stock')
								),
							),
							'id' => 'id',
							'name' => 'name'
						),
						'hint' => $this->l('Select the corresponding action: Increase or decrease stock?')
					),
				),
				'submit' => array(
					'title' => $this->l('Save'),
					'class' => 'btn btn-default'
				)
			);
		}
		// else, if we are managing Supply Order State
		else if (Tools::isSubmit('addsupply_order_state') ||
				 Tools::isSubmit('updatesupply_order_state') ||
				 Tools::isSubmit('submitAddsupply_order_state') ||
				 Tools::isSubmit('submitUpdatesupply_order_state'))
		{
			$this->fields_form = array(
					'legend' => array(
						'title' => $this->l('Supply Order Status'),
						'icon' => 'icon-pencil'
					),
					'input' => array(
						array(
							'type' => 'text',
							'lang' => true,
							'label' => $this->l('Status:'),
							'name' => 'name',
							'required' => true
						),
						array(
							'type' => 'color',
							'label' => $this->l('Color:'),
							'name' => 'color',
							'hint' => $this->l('The background of the PrestaShop Back Office will be displayed in this color (HTML colors only, please).'),
						),
						array(
							'type' => 'switch',
							'label' => $this->l('Editable:'),
							'name' => 'editable',
							'required' => true,
							'is_bool' => true,
							'values' => array(
								array(
									'id' => 'active_on',
									'value' => 1,
									'label' => $this->l('Yes')
								),
								array(
									'id' => 'active_off',
									'value' => 0,
									'label' => $this->l('No')
								)
							),
							'hint' => $this->l('Is it is possible to edit the order? Keep in mind that an editable order can not be sent to the supplier.')
						),
						array(
							'type' => 'switch',
							'label' => $this->l('Delivery note:'),
							'name' => 'delivery_note',
							'required' => true,
							'is_bool' => true,
							'values' => array(
								array(
									'id' => 'active_on',
									'value' => 1,
									'label' => $this->l('Yes')
								),
								array(
									'id' => 'active_off',
									'value' => 0,
									'label' => $this->l('No')
								)
							),
							'hint' => $this->l('Is it possible to generate a delivery note for the order?')
						),
						array(
							'type' => 'switch',
							'label' => $this->l('Delivery state:'),
							'name' => 'receipt_state',
							'required' => true,
							'is_bool' => true,
							'values' => array(
								array(
									'id' => 'active_on',
									'value' => 1,
									'label' => $this->l('Yes')
								),
								array(
									'id' => 'active_off',
									'value' => 0,
									'label' => $this->l('No')
								)
							),
							'hint' => $this->l('Define if products have been either partially or completely received. This will allow you to know if ordered products have to be added to the corresponding warehouse.'),
						),
						array(
							'type' => 'switch',
							'label' => $this->l('Pending receipt:'),
							'name' => 'pending_receipt',
							'required' => true,
							'is_bool' => true,
							'values' => array(
								array(
									'id' => 'active_on',
									'value' => 1,
									'label' => $this->l('Yes')
								),
								array(
									'id' => 'active_off',
									'value' => 0,
									'label' => $this->l('No')
								)
							),
							'hint' => $this->l('The customer is awaiting delivery.')
						),
					),
					'submit' => array(
						'title' => $this->l('Save'),
						'class' => 'btn btn-default'
					)
				);

				if (Tools::isSubmit('addsupply_order_state'))
					$this->toolbar_title = $this->l('Stock: Add supply order status');
				else
				{
					$this->toolbar_title = $this->l('Stock: Update supply order status');

					$id_supply_order_state = Tools::getValue('id_supply_order_state', 0);

					// only some fields are editable for initial states
					if (in_array($id_supply_order_state, array(1, 2, 3, 4, 5, 6)))
					{
						$this->fields_form = array(
							'legend' => array(
								'title' => $this->l('Supply order status'),
								'icon' => 'icon-pencil'
							),
							'input' => array(
								array(
									'type' => 'text',
									'lang' => true,
									'label' => $this->l('Status:'),
									'name' => 'name',
									'required' => true
								),
								array(
									'type' => 'color',
									'label' => $this->l('Back Office color:'),
									'name' => 'color',
									'desc' => $this->l('The background of PrestaShop\'s Back Office will be displayed in this color (HTML colors only, please).'),
								),
							),
							'submit' => array(
								'title' => $this->l('Save'),
								'class' => 'btn btn-default'
							)
						);
					}

					if (!($obj = new SupplyOrderState((int)$id_supply_order_state)))
						return;

					$this->fields_value = array(
						'color' => $obj->color,
						'editable' => $obj->editable,
						'delivery_note' => $obj->delivery_note,
						'receipt_state' => $obj->receipt_state,
						'pending_receipt' => $obj->pending_receipt,
					);
					foreach ($this->getLanguages() as $language)
							$this->fields_value['name'][$language['id_lang']] = $this->getFieldValue($obj, 'name', $language['id_lang']);
				}
		}

		return parent::renderForm();
	}

	/**
	 * AdminController::renderList() override
	 * @see AdminController::renderList()
	 */
	public function renderList()
	{
		/**
		 * General messages displayed for all lists
		 */
		$this->displayInformation($this->l('This interface allows you to configure your supply order status and stock movement labels.').'<br />');

		// Checks access
		if (!($this->tabAccess['add'] === '1'))
			unset($this->toolbar_btn['new']);

		/**
		 * First list
		 * Stock Mvt Labels/Reasons
		 */
		$first_list = null;
		$this->list_no_link = true;
		$this->addRowAction('edit');
		$this->addRowAction('delete');
		$this->addRowActionSkipList('edit', array(1, 2, 3, 4, 5, 6, 7, 8));
		$this->addRowActionSkipList('delete', array(1, 2, 3, 4, 5, 6, 7, 8));
		$this->_where = ' AND a.deleted = 0';

		$this->toolbar_title = $this->l('Stock: Stock movement labels');
		$first_list = parent::renderList();

		/**
		 * Second list
		 * Supply Order Status/State
		 */
		$second_list = null;
		unset($this->_select, $this->_where, $this->_join, $this->_group, $this->_filterHaving, $this->_filter, $this->list_skip_actions['delete'], $this->list_skip_actions['edit']);

		// generates the actual second list
		$second_list = $this->initSupplyOrderStatusList();

		// resets default table and className for options list management
		$this->table = 'stock_mvt_reason';
	 	$this->className = 'StockMvtReason';

		// returns the final list
		return $second_list.$first_list;
	}

	/*
	 * Help function for AdminStockConfigurationController::renderList()
	 * @see AdminStockConfigurationController::renderList()
	 */
	public function initSupplyOrderStatusList()
	{
		$this->table = 'supply_order_state';
		$this->className = 'SupplyOrderState';
		$this->identifier = 'id_supply_order_state';
		$this->_defaultOrderBy = 'id_supply_order_state';
		$this->lang = true;
		$this->list_no_link = true;
		$this->_orderBy = null;
		$this->addRowActionSkipList('delete', array(1, 2, 3, 4, 5, 6));
		$this->toolbar_title = $this->l('Stock: Supply order status');
		$this->initToolbar();

		$this->fields_list = array(
			'name' => array(
				'title' => $this->l('Name'),
				'color' => 'color',
			),
			'editable' => array(
				'title' => $this->l('Editable?'),
				'align' => 'center',
				'icon' => array(
					'1' => 'enabled.gif',
					'0' => 'disabled.gif'
				),
				'type' => 'bool',
				'orderby' => false,
				'class' => 'fixed-width-sm'
			),
			'delivery_note' => array(
				'title' => $this->l('Is there a delivery note available?'),
				'align' => 'center',
				'icon' => array(
					'1' => 'enabled.gif',
					'0' => 'disabled.gif'
				),
				'type' => 'bool',
				'orderby' => false,
				'class' => 'fixed-width-sm'
			),
			'pending_receipt' => array(
				'title' => $this->l('Is there a pending receipt?'),
				'align' => 'center',
				'icon' => array(
					'1' => 'enabled.gif',
					'0' => 'disabled.gif'
				),
				'type' => 'bool',
				'orderby' => false,
				'class' => 'fixed-width-sm'
			),
			'receipt_state' => array(
				'title' => $this->l('Delivery state?'),
				'align' => 'center',
				'icon' => array(
					'1' => 'enabled.gif',
					'0' => 'disabled.gif'
				),
				'type' => 'bool',
				'orderby' => false,
				'class' => 'fixed-width-sm'
			),
			'enclosed' => array(
				'title' => $this->l('Enclosed order state?'),
				'align' => 'center',
				'icon' => array(
					'1' => 'enabled.gif',
					'0' => 'disabled.gif'
				),
				'type' => 'bool',
				'orderby' => false,
				'class' => 'fixed-width-sm'
			),
		);

		return parent::renderList();
	}

	/**
	 * AdminController::postProcess() override
	 * @see AdminController::postProcess()
	 */
	public function postProcess()
	{
		// SupplyOrderState
		if (Tools::isSubmit('submitAddsupply_order_state') ||
			Tools::isSubmit('deletesupply_order_state') ||
			Tools::isSubmit('submitUpdatesupply_order_state'))
		{
			if (Tools::isSubmit('deletesupply_order_state'))
				$this->action = 'delete';
			else
				$this->action = 'save';
			$this->table = 'supply_order_state';
		 	$this->className = 'SupplyOrderState';
		 	$this->identifier = 'id_supply_order_state';
		 	$this->_defaultOrderBy = 'id_supply_order_state';
		}
		// StockMvtReason
		else if (Tools::isSubmit('delete'.$this->table))
			$this->deleted = true;

		return parent::postProcess();
	}

	/**
	 * AdminController::getList() override
	 * @see AdminController::getList()
	 */
	public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false)
	{
		parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop);

		//If there is a field product_name in the list, check if this field is null and display standard message
		foreach ($this->fields_list as $key => $value)
			if ($key == 'product_name')
			{
				$nb_items = count($this->_list);

				for ($i = 0; $i < $nb_items; ++$i)
				{
					$item = &$this->_list[$i];

					if (empty($item['product_name']))
						$item['product_name'] = $this->l('The name of this product is not available. It may have been deleted from the system.');
				}
			}
	}
	
	public function initContent()
	{
		if (!Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT'))
		{
			$this->warnings[md5('PS_ADVANCED_STOCK_MANAGEMENT')] = $this->l('You need to activate advanced stock management before using this feature.');
			return false;
		}
		parent::initContent();
	}
	
	public function initProcess()
	{
		if (!Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT'))
		{
			$this->warnings[md5('PS_ADVANCED_STOCK_MANAGEMENT')] = $this->l('You need to activate advanced stock management before using this feature.');
			return false;
		}
		parent::initProcess();	
	}
}
