HEX
Server: Apache
System: Linux p3plzcpnl506847.prod.phx3.secureserver.net 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: slfopp7cb1df (5698090)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: //proc/thread-self/root/proc/thread-self/cwd/pm/plugins/Warehouse/Controllers/Warehouse.php
<?php

namespace Warehouse\Controllers;

use App\Controllers\Security_Controller;
use App\Models\Crud_model;

class Warehouse extends Security_Controller {

	protected $warehouse_model;
	function __construct() {

		parent::__construct();
		$this->warehouse_model = new \Warehouse\Models\Warehouse_model();
		app_hooks()->do_action('app_hook_inventory_init');

	}

	public function commodity_list($id = '') {

		$data['units'] = $this->warehouse_model->get_unit_add_commodity();
		$data['commodity_types'] = $this->warehouse_model->get_commodity_type_add_commodity();
		$data['commodity_groups'] = $this->warehouse_model->get_commodity_group_add_commodity();
		$data['styles'] = $this->warehouse_model->get_style_add_commodity();
		$data['models'] = $this->warehouse_model->get_body_add_commodity();
		$data['sizes'] = $this->warehouse_model->get_size_add_commodity();
		$data['warehouse_filter'] = $this->warehouse_model->get_warehouse();
		$data['colors'] = $this->warehouse_model->get_color_add_commodity();
		$data['warehouses'] = [];
		$data['taxes'] = [];
		$data['sub_groups'] = [];
		$data['item_tags'] = [];

		$data['title'] = _l('commodity_list');

			$data['items'] = $this->warehouse_model->wh_get_grouped('', true);
		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}
		$data['proposal_id'] = $id;
		return $this->template->rander('Warehouse\Views\commodity_list', $data);
	}

	/**
	 * table commodity list
	 * @return [type] 
	 */
	public function table_commodity_list() {
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'table_commodity_list'), $dataPost);
	}

	/**
	 * modal form
	 * @return [type] 
	 */
	public function item_modal_form() {
		$this->access_only_team_members();
		$this->validate_submitted_data(array(
			"id" => "numeric"
		));

		$data['model_info'] = $this->Items_model->get_one($this->request->getPost('id'));
		$data['categories_dropdown'] = $this->Item_categories_model->get_dropdown_list(array("title"));
		$data['units'] = $this->warehouse_model->get_unit_add_commodity();


		$data['commodity_types'] = $this->warehouse_model->get_commodity_type_add_commodity();
		$data['commodity_groups'] = $this->warehouse_model->get_commodity_group_add_commodity();
		$tax_options = array(
			"deleted" => 0,
		);
		$data['taxes'] = $this->Taxes_model->get_details($tax_options)->getResultArray();
		$data['styles'] = $this->warehouse_model->get_style_add_commodity();
		$data['models'] = $this->warehouse_model->get_body_add_commodity();
		$data['sizes'] = $this->warehouse_model->get_size_add_commodity();
		$data['colors'] = $this->warehouse_model->get_color_add_commodity();
		$data['warehouses'] = [];
		//filter
		$data['warehouse_filter'] = [];
		$data['sub_groups'] = [];
		$data['item_tags'] = [];

		$data['title'] = _l('commodity_list');

		$data['ajaxItems'] = false;

		if(!$this->request->getPost('id')){
			if ($this->warehouse_model->count_all_items('parent_id is null or parent_id = "" OR parent_id = 0') <= ajax_on_total_items()) {
				$data['items'] = $this->warehouse_model->get_parent_item_grouped();
			} else {
				$data['items']     = [];
				$data['ajaxItems'] = true;
			}

			/*for create*/
			$variation_html = $this->warehouse_model->get_variation_html('');
			$data['get_commodity_barcode'] = $this->warehouse_model->generate_commodity_barcode();
			$parent_data = $this->template->view('Warehouse\Views\item_include\item_select', ['ajaxItems' => $data['ajaxItems'], 'items' => $data['items'] , 'select_name' => 'parent_id', 'id_name' => 'parent_id', 'data_none_selected_text' => '', 'label_name' => 'parent_item']);
			$data['variation_html'] = $variation_html['html']; 
			$data['variation_index'] = $variation_html['index']; 
			$data['item_html'] = $parent_data;
			$data['parent_item_hide'] = false;

		}else{
			$id = $this->request->getPost('id');
			$data['item'] = $this->warehouse_model->get_commodity($id);

			//check have child item
			$flag_is_parent = false;
			$data['parent_item_hide'] = false;

			$builder = db_connect('default');
			$builder = $builder->table('items');
			$builder->where('parent_id', $id);
			$array_child_value = $builder->get()->getResultArray();

			if(count($array_child_value) > 0){
				$flag_is_parent = true;
				$data['parent_item_hide'] = true;
			}

			if($data['item']){
				$parent_id = $data['item']->parent_id;
			}else{
				$parent_id = '';
			}

			if ($this->warehouse_model->count_all_items('parent_id is null or parent_id = "" OR parent_id = 0') <= ajax_on_total_items()) {
				if(is_numeric($parent_id) && $parent_id != 0 ){
					$data['items'] = $this->warehouse_model->get_parent_item_grouped($parent_id);
				}else{
					$data['items'] = $this->warehouse_model->get_parent_item_grouped();
				}
			} else {
				if(is_numeric($parent_id) && $parent_id != 0 ){
					$data['items']     = $this->warehouse_model->get_parent_item_grouped($parent_id);
				}else{
					$data['items']     = [];
					$data['ajaxItems'] = true;
				}
			}

			$variation_html = $this->warehouse_model->get_variation_html($id);
			$parent_data = $this->template->view('Warehouse\Views\item_include\item_select', ['ajaxItems' => $data['ajaxItems'], 'items' => $data['items'] , 'select_name' => 'parent_id', 'id_name' => 'parent_id', 'data_none_selected_text' => '', 'label_name' => 'parent_item', 'item_id' => $parent_id ], true);
			$data['variation_html'] = $variation_html['html']; 
			$data['variation_index'] = $variation_html['index'];
			$data['item_html'] = $parent_data;

		}

		return $this->template->view('Warehouse\Views\items\item_modal', $data);
	}


	public function wh_commodity_code_search_all($type = 'rate', $can_be = '', $search_all = 'true')
	{
		if ($this->request->getPost()) {
			echo json_encode($this->warehouse_model->wh_commodity_code_search($this->request->getPost('q'), $type, $can_be, $search_all));
		}
	}

	/**
	 * general
	 * @return [type] 
	 */
	public function general() {
		$data['warehouses'] = $this->warehouse_model->get_warehouse();
		return $this->template->rander("Warehouse\Views\includes\\rule_sale_price", $data);
	}

	/**
	 * commodity types
	 * @return [type] 
	 */
	public function commodity_types() {
		$data['commodity_types'] = $this->warehouse_model->get_commodity_type();
		return $this->template->rander("Warehouse\Views\includes\commodity_type", $data);
	}
		
	/**
	 * list commodity type data
	 * @return [type] 
	 */
	public function list_commodity_type_data() {
		$this->access_only_team_members();

		$list_data = $this->warehouse_model->get_commodity_type();

		$result = array();
		foreach ($list_data as $data) {
			$result[] = $this->_make_commodity_type_row($data);
		}
		echo json_encode(array("data" => $result));
	}

	/**
	 * _make commodity type row
	 * @param  [type] $data 
	 * @return [type]       
	 */
	private function _make_commodity_type_row($data) {

		return array(
			$data['commodity_type_id'],
			nl2br($data['commondity_code']),
			nl2br($data['commondity_name']),
			$data['display'] == 1 ? app_lang("display_yes") : app_lang("display_no"),
			$data['note'],
			modal_anchor(get_uri("warehouse/commodity_type_modal_form"), "<i data-feather='edit' class='icon-16'></i>", array("class" => "edit", "title" => app_lang('edit_commodity_type'), "data-post-id" => $data['commodity_type_id']))
			. js_anchor("<i data-feather='x' class='icon-16'></i>", array('title' => app_lang('delete'), "class" => "delete", "data-id" => $data['commodity_type_id'], "data-action-url" => get_uri("warehouse/delete_commodity_type/".$data['commodity_type_id']), "data-action" => "delete-confirmation"))
		);
	}

	/**
	 * commodity type modal form
	 * @return [type] 
	 */
	public function commodity_type_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));
		$data = [];
		$commodity_type_data = [];
		$max_row = 29;
		$min_row = 9;

		$id = $this->request->getPost('id');
		if($id && is_numeric($id)){
			$commodity_type = $this->warehouse_model->get_commodity_type($id);
			if($commodity_type){
				$commodity_type_data[0] = [
					'commodity_type_id' => $commodity_type->commodity_type_id,
					'commondity_code' => $commodity_type->commondity_code,
					'commondity_name' => $commodity_type->commondity_name,
					'order' => $commodity_type->order,
					'display' => $commodity_type->display == 1 ? 'yes' : 'no',
					'note' => $commodity_type->note,
				];

			}
			$data['commodity_type_data'] = $commodity_type_data;
			$max_row = 1;
			$min_row = 1;
		}else{
			$id = '';
		}
		$data['max_row'] = $max_row;
		$data['min_row'] = $min_row;
		$data['id'] = $id;

		return $this->template->view('Warehouse\Views\includes\modal_forms\commodity_type_modal', $data);
	}

	/**
	 * commodity type
	 * @param  integer $id
	 * @return redirect
	 */
	public function commodity_type($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!is_numeric($id)) {

				$mess = $this->warehouse_model->add_commodity_type($data);
				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully").' '.app_lang("commodity_type"));

				} else {
					$this->session->setFlashdata("error_message", app_lang("Add_commodity_type_false"));
				}
				app_redirect("warehouse/commodity_types");

			} else {
				
				$success = $this->warehouse_model->add_commodity_type($data, $id);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully").' '.app_lang("commodity_type"));
				}
				app_redirect("warehouse/commodity_types");
			}
		}
	}

	/**
	 * delete commodity type
	 * @param  integer $id
	 * @return redirect
	 */
	public function delete_commodity_type($id) {
		if (!$id) {
			app_redirect('warehouse/commodity_types');
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$response = $this->warehouse_model->delete_commodity_type($id);
		if (is_array($response) && isset($response['referenced'])) {
			 echo json_encode(array("success" => false, "message" => app_lang('is_referenced')));
		} elseif ($response == true) {
			 echo json_encode(array("success" => true, "message" => app_lang('commodity_type_has_been_deleted')));
		} else {
			 echo json_encode(array("success" => false, "message" => app_lang('problem_deleting_commodity_type')));
		}
	}

	/**
	 * units
	 * @return [type] 
	 */
	public function units() {
		$data = [];
		return $this->template->rander("Warehouse\Views\includes\units", $data);
	}
		
	/**
	 * list commodity type data
	 * @return [type] 
	 */
	public function unit_type_data() {
		$this->access_only_team_members();

		$list_data = $this->warehouse_model->get_unit_type();

		$result = array();
		foreach ($list_data as $data) {
			$result[] = $this->_make_unit_row($data);
		}
		echo json_encode(array("data" => $result));
	}

	/**
	 * _make commodity type row
	 * @param  [type] $data 
	 * @return [type]       
	 */
	private function _make_unit_row($data) {

		return array(
			$data['unit_type_id'],
			nl2br($data['unit_code']),
			nl2br($data['unit_name']),
			nl2br($data['unit_symbol']),
			$data['display'] == 1 ? app_lang("display_yes") : app_lang("display_no"),
			$data['note'],
			modal_anchor(get_uri("warehouse/unit_type_modal_form"), "<i data-feather='edit' class='icon-16'></i>", array("class" => "edit", "title" => app_lang('edit_unit_type'), "data-post-id" => $data['unit_type_id']))
			. js_anchor("<i data-feather='x' class='icon-16'></i>", array('title' => app_lang('delete'), "class" => "delete", "data-id" => $data['unit_type_id'], "data-action-url" => get_uri("warehouse/delete_unit_type/".$data['unit_type_id']), "data-action" => "delete-confirmation"))
		);
	}

	/**
	 * commodity type modal form
	 * @return [type] 
	 */
	public function unit_type_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));
		$data = [];
		$unit_data = [];
		$max_row = 29;
		$min_row = 9;

		$id = $this->request->getPost('id');
		if($id && is_numeric($id)){
			$unit_type = $this->warehouse_model->get_unit_type($id);
			if($unit_type){
				$unit_data[0] = [
					'unit_type_id' => $unit_type->unit_type_id,
					'unit_code' => $unit_type->unit_code,
					'unit_name' => $unit_type->unit_name,
					'unit_symbol' => $unit_type->unit_symbol,
					'order' => $unit_type->order,
					'display' => $unit_type->display == 1 ? 'yes' : 'no',
					'note' => $unit_type->note,
				];

			}
			$data['unit_type_data'] = $unit_data;
			$max_row = 1;
			$min_row = 1;
		}else{
			$id = '';
		}
		$data['max_row'] = $max_row;
		$data['min_row'] = $min_row;
		$data['id'] = $id;

		return $this->template->view('Warehouse\Views\includes\modal_forms\unit_modal', $data);
	}

	/**
	 * unit type
	 * @param  integer $id
	 * @return redirect
	 */
	public function unit_type($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!is_numeric($id)) {

				$mess = $this->warehouse_model->add_unit_type($data);
				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully").' '.app_lang("unit_type"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("Add_unit_type_false"));
				}
				app_redirect("warehouse/units");

			} else {
				
				$success = $this->warehouse_model->add_unit_type($data, $id);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully").' '.app_lang("unit_type"));
				}
				app_redirect("warehouse/units");
			}
		}
	}

	/**
	 * delete unit type
	 * @param  integer $id
	 * @return redirect
	 */
	public function delete_unit_type($id) {
		if (!$id) {
			app_redirect('warehouse/units');
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$response = $this->warehouse_model->delete_unit_type($id);
		
		if (is_array($response) && isset($response['referenced'])) {
			echo json_encode(array("success" => false, "message" => app_lang('is_referenced')));
		} elseif ($response == true) {
			echo json_encode(array("success" => true, "message" => app_lang('unit_type_has_been_deleted')));
		} else {
			echo json_encode(array("success" => false, "message" => app_lang('problem_deleting_unit_type')));
		}
	}

	/**
	 * sizes
	 * @return [type] 
	 */
	public function sizes() {
		$data['sizes'] = $this->warehouse_model->get_size_type();
		return $this->template->rander("Warehouse\Views\includes\sizes", $data);
	}
		
	/**
	 * list size type data
	 * @return [type] 
	 */
	public function list_size_type_data() {
		$this->access_only_team_members();

		$list_data = $this->warehouse_model->get_size_type();

		$result = array();
		foreach ($list_data as $data) {
			$result[] = $this->_make_size_type_row($data);
		}
		echo json_encode(array("data" => $result));
	}

	/**
	 * _make_size_type_row
	 * @param  [type] $data 
	 * @return [type]       
	 */
	private function _make_size_type_row($data) {

		return array(
			$data['size_type_id'],
			nl2br($data['size_code']),
			nl2br($data['size_name']),
			nl2br($data['size_symbol']),
			$data['display'] == 1 ? app_lang("display_yes") : app_lang("display_no"),
			$data['note'],
			modal_anchor(get_uri("warehouse/size_type_modal_form"), "<i data-feather='edit' class='icon-16'></i>", array("class" => "edit", "title" => app_lang('edit_size_type'), "data-post-id" => $data['size_type_id']))
			. js_anchor("<i data-feather='x' class='icon-16'></i>", array('title' => app_lang('delete'), "class" => "delete", "data-id" => $data['size_type_id'], "data-action-url" => get_uri("warehouse/delete_size_type/".$data['size_type_id']), "data-action" => "delete-confirmation"))
		);
	}

	/**
	 * size_type_modal_form
	 * @return [type] 
	 */
	public function size_type_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));
		$data = [];
		$size_type_data = [];
		$max_row = 29;
		$min_row = 9;

		$id = $this->request->getPost('id');
		if($id && is_numeric($id)){
			$size_type = $this->warehouse_model->get_size_type($id);
			if($size_type){
				$size_type_data[0] = [
					'size_type_id' => $size_type->size_type_id,
					'size_code' => $size_type->size_code,
					'size_name' => $size_type->size_name,
					'size_symbol' => $size_type->size_symbol,
					'order' => $size_type->order,
					'display' => $size_type->display == 1 ? 'yes' : 'no',
					'note' => $size_type->note,
				];

			}
			$data['size_type_data'] = $size_type_data;
			$max_row = 1;
			$min_row = 1;
		}else{
			$id = '';
		}
		$data['max_row'] = $max_row;
		$data['min_row'] = $min_row;
		$data['id'] = $id;

		return $this->template->view('Warehouse\Views\includes\modal_forms\size_type_modal', $data);
	}

	/**
	 * size type
	 * @param  integer $id
	 * @return redirect
	 */
	public function size_type($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!is_numeric($id)) {

				$mess = $this->warehouse_model->add_size_type($data);
				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("Add_size_type_false"));
				}
				app_redirect("warehouse/sizes");
			} else {
				
				$success = $this->warehouse_model->add_size_type($data, $id);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				}
				app_redirect("warehouse/sizes");
			}
		}
	}

	/**
	 * delete size type
	 * @param  integer $id
	 * @return redirect
	 */
	public function delete_size_type($id) {
		if (!$id) {
			app_redirect('warehouse/sizes');
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$response = $this->warehouse_model->delete_size_type($id);
		if (is_array($response) && isset($response['referenced'])) {
			echo json_encode(array("success" => false, "message" => app_lang('is_referenced')));
		} elseif ($response == true) {
			echo json_encode(array("success" => true, "message" => app_lang('wh_deleted')));
		} else {
			echo json_encode(array("success" => false, "message" => app_lang('problem_deleting')));
		}
	}

	/**
	 * styles
	 * @return [type] 
	 */
	public function styles() {
		$data['style_types'] = $this->warehouse_model->get_style_type();
		return $this->template->rander("Warehouse\Views\includes\styles", $data);
	}
		
	/**
	 * list_style_type_data
	 * @return [type] 
	 */
	public function list_style_type_data() {
		$this->access_only_team_members();

		$list_data = $this->warehouse_model->get_style_type();

		$result = array();
		foreach ($list_data as $data) {
			$result[] = $this->_make_style_type_row($data);
		}
		echo json_encode(array("data" => $result));
	}

	/**
	 * _make_style_type_row
	 * @param  [type] $data 
	 * @return [type]       
	 */
	private function _make_style_type_row($data) {

		return array(
			$data['style_type_id'],
			nl2br($data['style_code']),
			nl2br($data['style_barcode']),
			nl2br($data['style_name']),
			$data['display'] == 1 ? app_lang("display_yes") : app_lang("display_no"),
			$data['note'],
			modal_anchor(get_uri("warehouse/style_type_modal_form"), "<i data-feather='edit' class='icon-16'></i>", array("class" => "edit", "title" => app_lang('edit_style_type'), "data-post-id" => $data['style_type_id']))
			. js_anchor("<i data-feather='x' class='icon-16'></i>", array('title' => app_lang('delete'), "class" => "delete", "data-id" => $data['style_type_id'], "data-action-url" => get_uri("warehouse/delete_style_type/".$data['style_type_id']), "data-action" => "delete-confirmation"))
		);
	}

	/**
	 * style_type_modal_form
	 * @return [type] 
	 */
	public function style_type_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));
		$data = [];
		$style_type_data = [];
		$max_row = 29;
		$min_row = 9;

		$id = $this->request->getPost('id');
		if($id && is_numeric($id)){
			$style_type = $this->warehouse_model->get_style_type($id);
			if($style_type){
				$style_type_data[0] = [
					'style_type_id' => $style_type->style_type_id,
					'style_code' => $style_type->style_code,
					'style_barcode' => $style_type->style_barcode,
					'style_name' => $style_type->style_name,
					'order' => $style_type->order,
					'display' => $style_type->display == 1 ? 'yes' : 'no',
					'note' => $style_type->note,
				];

			}
			$data['style_type_data'] = $style_type_data;
			$max_row = 1;
			$min_row = 1;
		}else{
			$id = '';
		}
		$data['max_row'] = $max_row;
		$data['min_row'] = $min_row;
		$data['id'] = $id;

		return $this->template->view('Warehouse\Views\includes\modal_forms\style_type_modal', $data);
	}

	/**
	 * style type
	 * @param  integer $id
	 * @return redirect
	 */
	public function style_type($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!is_numeric($id)) {
				$mess = $this->warehouse_model->add_style_type($data);
				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("Add_style_type_false"));
				}
				app_redirect("warehouse/styles");

			} else {

				$success = $this->warehouse_model->add_style_type($data, $id);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				}
				app_redirect("warehouse/styles");
			}
		}
	}
	/**
	 * delete style type
	 * @param  integer $id
	 * @return redirect
	 */
	public function delete_style_type($id) {
		if (!$id) {
			app_redirect('warehouse/styles');
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}


		$response = $this->warehouse_model->delete_style_type($id);
		if (is_array($response) && isset($response['referenced'])) {
			echo json_encode(array("success" => false, "message" => app_lang('is_referenced')));
		} elseif ($response == true) {
			echo json_encode(array("success" => true, "message" => app_lang('wh_deleted')));
		} else {
			echo json_encode(array("success" => false, "message" => app_lang('problem_deleting')));
		}
	}

	/**
	 * body_types
	 * @return [type] 
	 */
	public function models() {
		$data['body_types'] = $this->warehouse_model->get_body_type();
		return $this->template->rander("Warehouse\Views\includes\bodys", $data);
	}
	
	/**
	 * list body type data
	 * @return [type] 
	 */
	public function list_body_type_data() {
		$this->access_only_team_members();

		$list_data = $this->warehouse_model->get_body_type();

		$result = array();
		foreach ($list_data as $data) {
			$result[] = $this->_make_body_type_row($data);
		}
		echo json_encode(array("data" => $result));
	}

	/**
	 * make body type row
	 * @param  [type] $data 
	 * @return [type]       
	 */
	private function _make_body_type_row($data) {

		return array(
			$data['body_type_id'],
			nl2br($data['body_code']),
			nl2br($data['body_name']),
			$data['display'] == 1 ? app_lang("display_yes") : app_lang("display_no"),
			$data['note'],
			modal_anchor(get_uri("warehouse/body_type_modal_form"), "<i data-feather='edit' class='icon-16'></i>", array("class" => "edit", "title" => app_lang('edit_body_type'), "data-post-id" => $data['body_type_id']))
			. js_anchor("<i data-feather='x' class='icon-16'></i>", array('title' => app_lang('delete'), "class" => "delete", "data-id" => $data['body_type_id'], "data-action-url" => get_uri("warehouse/delete_body_type/".$data['body_type_id']), "data-action" => "delete-confirmation"))
		);
	}

	/**
	 * body type modal form
	 * @return [type] 
	 */
	public function body_type_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));
		$data = [];
		$body_type_data = [];
		$max_row = 29;
		$min_row = 9;

		$id = $this->request->getPost('id');
		if($id && is_numeric($id)){
			$body_type = $this->warehouse_model->get_body_type($id);
			if($body_type){
				$body_type_data[0] = [
					'body_type_id' => $body_type->body_type_id,
					'body_code' => $body_type->body_code,
					'body_name' => $body_type->body_name,
					'order' => $body_type->order,
					'display' => $body_type->display == 1 ? 'yes' : 'no',
					'note' => $body_type->note,
				];

			}
			$data['body_type_data'] = $body_type_data;
			$max_row = 1;
			$min_row = 1;
		}else{
			$id = '';
		}
		$data['max_row'] = $max_row;
		$data['min_row'] = $min_row;
		$data['id'] = $id;

		return $this->template->view('Warehouse\Views\includes\modal_forms\body_type_modal', $data);
	}

	/**
	 * body type
	 * @param  integer $id
	 * @return redirect
	 */
	public function body_type($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!is_numeric($id)) {

				$mess = $this->warehouse_model->add_body_type($data);
				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));

				} else {
					$this->session->setFlashdata("error_message", app_lang("Add_body_type_false"));
				}
				app_redirect("warehouse/models");

			} else {
				$success = $this->warehouse_model->add_body_type($data, $id);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				}
				app_redirect("warehouse/models");
			}
		}
	}

	/**
	 * delete body type
	 * @param  integer $id
	 * @return redirect
	 */
	public function delete_body_type($id) {
		if (!$id) {
			app_redirect('warehouse/models');
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$response = $this->warehouse_model->delete_body_type($id);
		if (is_array($response) && isset($response['referenced'])) {
			echo json_encode(array("success" => false, "message" => app_lang('is_referenced')));
		} elseif ($response == true) {
			echo json_encode(array("success" => true, "message" => app_lang('wh_deleted')));
		} else {
			echo json_encode(array("success" => false, "message" => app_lang('problem_deleting')));
		}
	}

	/**
	 * commodity types
	 * @return [type] 
	 */
	public function commodity_groups() {
		$data['commodity_groups'] = $this->warehouse_model->get_commodity_group_type();
		return $this->template->rander("Warehouse\Views\includes\commodity_group", $data);
	}
		
	/**
	 * list commodity type data
	 * @return [type] 
	 */
	public function list_commodity_group_data() {
		$this->access_only_team_members();

		$list_data = $this->warehouse_model->get_commodity_group_type();

		$result = array();
		foreach ($list_data as $data) {
			$result[] = $this->_make_commodity_group_row($data);
		}
		echo json_encode(array("data" => $result));
	}

	/**
	 * _make commodity type row
	 * @param  [type] $data 
	 * @return [type]       
	 */
	private function _make_commodity_group_row($data) {

		return array(
			$data['id'],
			nl2br($data['commodity_group_code']),
			nl2br($data['title']),
			$data['display'] == 1 ? app_lang("display_yes") : app_lang("display_no"),
			$data['note'],
			modal_anchor(get_uri("warehouse/commodity_group_modal_form"), "<i data-feather='edit' class='icon-16'></i>", array("class" => "edit", "title" => app_lang('edit_commodity_group_type'), "data-post-id" => $data['id']))
			. js_anchor("<i data-feather='x' class='icon-16'></i>", array('title' => app_lang('delete'), "class" => "delete", "data-id" => $data['id'], "data-action-url" => get_uri("warehouse/delete_commodity_group_type/".$data['id']), "data-action" => "delete-confirmation"))
		);
	}

	/**
	 * commodity type modal form
	 * @return [type] 
	 */
	public function commodity_group_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));
		$data = [];
		$commodity_group_data = [];
		$max_row = 29;
		$min_row = 9;

		$id = $this->request->getPost('id');
		if($id && is_numeric($id)){
			$commodity_type = $this->warehouse_model->get_commodity_group_type($id);
			if($commodity_type){
				$commodity_group_data[0] = [
					'id' => $commodity_type->id,
					'commodity_group_code' => $commodity_type->commodity_group_code,
					'title' => $commodity_type->title,
					'order' => $commodity_type->order,
					'display' => $commodity_type->display == 1 ? 'yes' : 'no',
					'note' => $commodity_type->note,
				];

			}
			$data['commodity_group_data'] = $commodity_group_data;
			$max_row = 1;
			$min_row = 1;
		}else{
			$id = '';
		}
		$data['max_row'] = $max_row;
		$data['min_row'] = $min_row;
		$data['id'] = $id;

		return $this->template->view('Warehouse\Views\includes\modal_forms\commodity_group_modal', $data);
	}

	/**
	 * commodty group type
	 * @param  integer $id
	 * @return redirect
	 */
	public function commodity_group_type($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!is_numeric($id)) {

				$mess = $this->warehouse_model->add_commodity_group_type($data);
				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully").' '.app_lang("commodity_group_type"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("Add_commodity_group_type_false"));
				}
				app_redirect("warehouse/commodity_groups");
			} else {
				
				$success = $this->warehouse_model->add_commodity_group_type($data, $id);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully").' '.app_lang("commodity_group_type"));
				}
				app_redirect("warehouse/commodity_groups");
			}
		}
	}

	/**
	 * delete commodity group type
	 * @param  integer $id
	 * @return redirect
	 */
	public function delete_commodity_group_type($id) {
		if (!$id) {
			app_redirect('warehouse/commodity_groups');
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}


		$response = $this->warehouse_model->delete_commodity_group_type($id);
		if (is_array($response) && isset($response['referenced'])) {
			echo json_encode(array("success" => false, "message" => app_lang('is_referenced')));
		} elseif ($response == true) {
			echo json_encode(array("success" => true, "message" => app_lang('commodity_type_has_been_deleted')));
		} else {
			echo json_encode(array("success" => false, "message" => app_lang('problem_deleting_commodity_type')));
		}
	}

	/**
	 * warehouses
	 * @return [type] 
	 */
	public function warehouses() {
		$data = [];
		return $this->template->rander("Warehouse\Views\warehouses\warehouse", $data);
	}
		
	/**
	 * list_warehouse_data
	 * @return [type] 
	 */
	public function list_warehouse_data() {
		$this->access_only_team_members();

		$list_data = $this->warehouse_model->get_all_warehouse();

		$result = array();
		foreach ($list_data as $data) {
			$result[] = $this->_make_warehouse_row($data);
		}
		echo json_encode(array("data" => $result));
	}

	/**
	 * _make_warehouse_row
	 * @param  [type] $data 
	 * @return [type]       
	 */
	private function _make_warehouse_row($data) {

		return array(
			// $data['warehouse_id'],
			$data['warehouse_code'],
			nl2br($data['warehouse_name']),
			nl2br($data['warehouse_address']),
			nl2br($data['order']),
			$data['display'] == 1 ? app_lang("display_yes") : app_lang("display_no"),
			$data['note'],
			modal_anchor(get_uri("warehouse/warehouse_modal_form"), "<i data-feather='edit' class='icon-16'></i>", array("class" => "edit", "title" => app_lang('edit_commodity_type'), "data-post-id" => $data['warehouse_id']))
			. js_anchor("<i data-feather='x' class='icon-16'></i>", array('title' => app_lang('delete'), "class" => "delete", "data-id" => $data['warehouse_id'], "data-action-url" => get_uri("warehouse/delete_warehouse/".$data['warehouse_id']), "data-action" => "delete-confirmation"))
		);
	}

	/**
	 * commodity type modal form
	 * @return [type] 
	 */
	public function warehouse_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));
		$data = [];
		$warehouse_data = [];

		$id = $this->request->getPost('id');
		if($id && is_numeric($id)){
			$warehouse = $this->warehouse_model->get_warehouse($id);
			$data['warehouse'] = $warehouse;
		}else{
			$id = '';
		}
		$data['id'] = $id;

		return $this->template->view('Warehouse\Views\warehouses\modal_form', $data);
	}

	/**
	 * warehouse_
	 * @param  integer $id
	 * @return redirect
	 */

	public function create_warehouse($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!is_numeric($id)) {

				$mess = $this->warehouse_model->add_one_warehouse($data);
				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				} else {
					$this->session->setflashdata("error_message", app_lang("add_failed"));
				}
				app_redirect("warehouse/warehouses");

			} else {
				$success = $this->warehouse_model->update_one_warehouse($data, $id);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				}
				app_redirect("warehouse/warehouses");
			}
		}
	}

	/**
	 * delete warehouse
	 * @param  integer $id
	 * @return redirect
	 */
	public function delete_warehouse($id) {
		if (!$id) {
			app_redirect('warehouse/warehouses');
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$response = $this->warehouse_model->delete_warehouse($id);
		if (is_array($response) && isset($response['referenced'])) {
			echo json_encode(array("success" => false, "message" => app_lang('is_referenced')));
		} elseif ($response == true) {
			echo json_encode(array("success" => true, "message" => app_lang('deleted')));
		} else {
			echo json_encode(array("success" => false, "message" => app_lang('problem_deleting')));
		}
	}

	/**
	 * get commodity data ajax
	 * @param  integer $id
	 * @return view
	 */
	public function get_commodity_data_ajax($id) {

		$data['id'] = $id;
		$data['commodites'] = $this->warehouse_model->get_commodity($id);
		$data['inventory_commodity'] = $this->warehouse_model->get_inventory_commodity($id);
		$data['commodity_file'] = $this->warehouse_model->get_warehourse_attachments($id);
		$this->load->view('commodity_detail', $data);
	}

	/**
	 * add commodity list
	 * @param  integer $id
	 * @return redirect
	 */
	public function add_commodity_list($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!$this->request->getPost('id')) {

				$mess = $this->warehouse_model->add_commodity($data);
				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));

				} else {
					$this->session->setFlashdata("error_message", app_lang("Add_commodity_list_false"));
				}
				app_redirect('warehouse/commodity_list');

			} else {
				$id = $data['id'];
				unset($data['id']);
				$success = $this->warehouse_model->add_warehouse($data, $id);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("updated_commodity_list_false"));
				}

				app_redirect('warehouse/commodity_list');
			}
		}
	}

	/**
	 * delete commodity
	 * @param  integer $id
	 * @return redirect
	 */
	public function delete_commodity() {
		$id = $this->request->getPost('id');
		
		if (!$id) {
			app_redirect('warehouse/commodity_list');
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$response = $this->warehouse_model->delete_commodity($id);
		if (is_array($response) && isset($response['referenced'])) {
			$this->session->setFlashdata("error_message", app_lang("is_referenced"));
		} elseif ($response == true) {
			$this->session->setFlashdata("success_message", app_lang("wh_deleted"));
		} else {
			$this->session->setFlashdata("error_message", app_lang("problem_deleting"));
		}
		app_redirect('warehouse/commodity_list');
	}

	/**
	 * table manage goods receipt
	 * @param  integer $id
	 * @return array
	 */
	public function table_manage_goods_receipt() {
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'manage_goods_receipt/table_manage_goods_receipt'), $dataPost);
	}

	/**
	 * manage purchase
	 * @param  integer $id
	 * @return view
	 */
	public function manage_purchase($id = '') {
		$data['title'] = _l('stock_received_manage');
		$data['purchase_id'] = $id;
		return $this->template->rander("Warehouse\Views\manage_goods_receipt\manage_purchase", $data);
	}

	/**
	 * manage goods receipt
	 * @param  integer $id
	 * @return view
	 */
	public function manage_goods_receipt($id = '') {
		$user_id = $this->login_user->id;
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();
			$id = $this->request->getPost('id');

			if (!$this->request->getPost('id')) {

				$mess = $this->warehouse_model->add_goods_receipt($data, $user_id);

				if ($mess) {
					if($data['save_and_send_request'] == 'true'){
						$this->save_and_send_request_send_mail(['rel_id' => $mess, 'rel_type' => '1', 'addedfrom' => $user_id]);
					}
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("Add_stock_received_docket_false"));
				}
				app_redirect("warehouse/manage_purchase");

			}else{

				$id = $this->request->getPost('id');
				$mess = $this->warehouse_model->update_goods_receipt($data, $user_id);

				if($data['save_and_send_request'] == 'true'){
					$this->save_and_send_request_send_mail(['rel_id' => $mess, 'rel_type' => '1', 'addedfrom' => $user_id]);
				}

				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("update_stock_received_docket_false"));
				}
				app_redirect("warehouse/manage_purchase");
			}

		}

		$data['title'] = _l('goods_receipt');

		$data['warehouses'] = $this->warehouse_model->get_warehouse();
		if (get_status_modules_wh('purchase')) {
			$this->load->model('purchase/purchase_model');
			$this->load->model('departments_model');
			$this->load->model('staff_model');
			$this->load->model('projects_model');

			$data['pr_orders'] = get_pr_order();
			$data['pr_orders_status'] = true;

			$data['vendors'] = $this->purchase_model->get_vendor();

			$data['projects'] = $this->projects_model->get();
			$data['staffs'] = $this->staff_model->get();
			$data['departments'] = $this->departments_model->get();


		} else {
			$data['pr_orders'] = [];
			$data['pr_orders_status'] = false;
		}


		$data['goods_code'] = $this->warehouse_model->create_goods_code();

		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$data['staff'] = $this->Users_model->get_details($options)->getResultArray();

		$data['current_day'] = (date('Y-m-d'));

		$tax_options = array(
			"deleted" => 0,
		);
		$data['taxes'] = $this->Taxes_model->get_details($tax_options)->getResultArray();

		$data['ajaxItems'] = false;

		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('can_be_inventory');
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}

		$warehouse_data = $this->warehouse_model->get_warehouse();
		//sample
		$goods_receipt_row_template = $this->warehouse_model->create_goods_receipt_row_template();

		//check status module purchase
		if($id != ''){
			$goods_receipt = $this->warehouse_model->get_goods_receipt($id);
			if (!$goods_receipt) {
				blank_page('Stock received Not Found', 'danger');
			}
			$data['goods_receipt_detail'] = $this->warehouse_model->get_goods_receipt_detail($id);
			$data['goods_receipt'] = $goods_receipt;
			$data['tax_data'] = $this->warehouse_model->get_html_tax_receip($id);
			$data['total_item'] = count($data['goods_receipt_detail']);

			if (count($data['goods_receipt_detail']) > 0) {
				$index_receipt = 0;
				foreach ($data['goods_receipt_detail'] as $receipt_detail) {
					$index_receipt++;
					$unit_name = wh_get_unit_name($receipt_detail['unit_id']);
					$taxname = '';
					$date_manufacture = null;
					$expiry_date = null;
					$commodity_name = $receipt_detail['commodity_name'];
					if($receipt_detail['date_manufacture'] != null && $receipt_detail['date_manufacture'] != ''){
						$date_manufacture = format_to_date($receipt_detail['date_manufacture'], false);
					}
					if($receipt_detail['expiry_date'] != null && $receipt_detail['expiry_date'] != ''){
						$expiry_date = format_to_date($receipt_detail['expiry_date'], false);
					}
					if(strlen($commodity_name) == 0){
						$commodity_name = wh_get_item_variatiom($receipt_detail['commodity_code']);
					}

					$goods_receipt_row_template .= $this->warehouse_model->create_goods_receipt_row_template($warehouse_data, 'items[' . $index_receipt . ']', $commodity_name, $receipt_detail['warehouse_id'], $receipt_detail['quantities'], $unit_name, $receipt_detail['unit_price'], $taxname, $receipt_detail['lot_number'], $date_manufacture, $expiry_date, $receipt_detail['commodity_code'], $receipt_detail['unit_id'] , $receipt_detail['tax_rate'], $receipt_detail['tax_money'], $receipt_detail['goods_money'], $receipt_detail['note'], $receipt_detail['id'], $receipt_detail['sub_total'], $receipt_detail['tax_name'], $receipt_detail['tax'], true, $receipt_detail['serial_number']);
					
				}
			}

			$data['goods_receipt_detail'] = json_encode($this->warehouse_model->get_goods_receipt_detail($id));

		}

		$data['goods_receipt_row_template'] = $goods_receipt_row_template;
		$data['base_currency_id'] = 0;

		return $this->template->rander("Warehouse\Views\manage_goods_receipt\purchase", $data);
	}

	/**
	 * copy pur request
	 * @param  integer $pur request
	 * @return json encode
	 */
	public function coppy_pur_request($pur_request = '') {
		if(is_numeric($pur_request)){
			$pur_request_detail = $this->warehouse_model->get_pur_request($pur_request);

			echo json_encode([

				'result' => $pur_request_detail[0] ? $pur_request_detail[0] : '',
				'total_tax_money' => $pur_request_detail[1] ? $pur_request_detail[1] : '',
				'total_goods_money' => $pur_request_detail[2] ? $pur_request_detail[2] : '',
				'value_of_inventory' => $pur_request_detail[3] ? $pur_request_detail[3] : '',
				'total_money' => $pur_request_detail[4] ? $pur_request_detail[4] : '',
				'total_row' => $pur_request_detail[5] ? $pur_request_detail[5] : '',
				'list_item' => $pur_request_detail[6] ? $pur_request_detail[6] : '',
			]);
		}else{
			$list_item = $this->warehouse_model->create_goods_receipt_row_template();
			echo json_encode([
				'list_item' => $list_item,
			]);
		}
	}

	/**
	 * copy pur vender
	 * @param  integer $pá»§ request
	 * @return json encode
	 */
	public function copy_pur_vender($pur_request) {

		$pur_vendor = $this->warehouse_model->get_vendor_ajax($pur_request);

		echo json_encode([

			'userid' => $pur_vendor['id'] ? $pur_vendor['id'] : '',
			'buyer' => $pur_vendor['buyer'] ? $pur_vendor['buyer'] : '',
			'project' => $pur_vendor['project'] ? $pur_vendor['project'] : '',
			'type' => $pur_vendor['type'] ? $pur_vendor['type'] : '',
			'department' => $pur_vendor['department'] ? $pur_vendor['department'] : '',
			'requester' => $pur_vendor['requester'] ? $pur_vendor['requester'] : '',

		]);
	}

	/**
	 * view purchase
	 * @param  integer $id
	 * @return view
	 */
	public function goods_receipt_detail($id) {
		validate_numeric_value($id);

		//approval
		$session = \Config\Services::session();
		$send_mail_approve = $session->has("send_mail_approve");
		if (($send_mail_approve) && $session->get("send_mail_approve") != '') {

			$data['send_mail_approve'] = $session->get("send_mail_approve");
			$session->remove("send_mail_approve");
		}
		$data['get_staff_sign'] = $this->warehouse_model->get_staff_sign($id, 1);

		$data['check_approve_status'] = $this->warehouse_model->check_approval_details($id, 1);
		$data['list_approve_status'] = $this->warehouse_model->get_list_approval_details($id, 1);
		$data['payslip_log'] = $this->warehouse_model->get_activity_log($id, 1);

		$data['goods_receipt_detail'] = $this->warehouse_model->get_goods_receipt_detail($id);
		$data['goods_receipt'] = $this->warehouse_model->get_goods_receipt($id);
		$data['tax_data'] = $this->warehouse_model->get_html_tax_receip($id);
		$data['title'] = _l('stock_received_info');
		$check_appr = $this->warehouse_model->get_approve_setting('1');
		$data['check_appr'] = $check_appr;

		return $this->template->rander("Warehouse\Views\manage_goods_receipt\goods_receipt_detail", $data);
	}

	/**
	 * edit purchase
	 * @param  integer $id
	 * @return view
	 */
	public function edit_purchase($id) {

		//check exist
		$goods_receipt = $this->warehouse_model->get_goods_receipt($id);
		if (!$goods_receipt) {
			blank_page('Stock received Not Found', 'danger');
		}

		//approval
		$session = \Config\Services::session();
		$send_mail_approve = $session->has("send_mail_approve");

		if (($send_mail_approve) && $session->get("send_mail_approve") != '') {
			$data['send_mail_approve'] = $session->get("send_mail_approve");
			$session->remove("send_mail_approve");
		}

		$data['get_staff_sign'] = $this->warehouse_model->get_staff_sign($id, 1);

		$data['check_approve_status'] = $this->warehouse_model->check_approval_details($id, 1);
		$data['list_approve_status'] = $this->warehouse_model->get_list_approval_details($id, 1);
		$data['payslip_log'] = $this->warehouse_model->get_activity_log($id, 1);

		//get vaule render dropdown select
		$data['commodity_code_name'] = $this->warehouse_model->get_commodity_code_name();
		$data['units_code_name'] = $this->warehouse_model->get_units_code_name();
		$data['units_warehouse_name'] = $this->warehouse_model->get_warehouse_code_name();

		$goods_receipt_data = $this->warehouse_model->get_goods_receipt_detail($id);
		$data['goods_receipt_detail'] = json_encode($goods_receipt_data);
		$tax_options = array(
			"deleted" => 0,
		);
		$data['taxes'] = $this->Taxes_model->get_details($tax_options)->getResultArray();

		$data['goods_receipt'] = $goods_receipt;

		$data['tax_data'] = $this->warehouse_model->get_html_tax_receip($id);

		$data['title'] = _l('stock_received_info');

		$check_appr = $this->warehouse_model->get_approve_setting('1');
		$data['check_appr'] = $check_appr;
		$this->load->model('currencies_model');
		$base_currency = $this->currencies_model->get_base_currency();
		$data['base_currency'] = $base_currency;

		$this->load->view('manage_goods_receipt/edit_purchase', $data);

	}

	public function add_goods_receipt() {

	}

	/**
	 * commodity code change
	 * @param  integer $val
	 * @return json encode
	 */
	public function commodity_code_change($val='') {
		$data = $this->request->getPost();

		if($data['switch_barcode_scanners'] == 'true'){
			$value = $this->warehouse_model->get_commodity_hansometable_by_barcode($data['oldValue']);
		}else{
			$value = $this->warehouse_model->get_commodity_hansometable($data['oldValue']);
		}

		$value->tax1 = $value->tax;
		if($value->tax2 != '' && $value->tax2 != null){
			$tax2 = get_tax_rate($value->tax2);
			if($tax2 && !is_array($tax2)){
				$value->taxrate2 = $tax2->taxrate;
				$value->name_taxrate2 = $tax2->name;
				$value->tax = $value->tax.'|'.$value->tax2;
			}else{
				$value->taxrate2 = 0;
				$value->name_taxrate2 = '';
				$value->tax = $value->tax;
			}
		}

		echo json_encode([
			'value' => get_object_vars($value),
		]);
		die;
	}

	/**
	 * update inventory min
	 * @param  integer $id
	 * @return redirect
	 */
	public function update_inventory_min($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			$success = $this->warehouse_model->update_inventory_min($data);
			if ($success) {
				$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
			} else {
				$this->session->setFlashdata("error_message", app_lang("updated_false"));
			}
			app_redirect("warehouse/inventory");
		}
	}

	/**
	 * table warehouse history
	 *
	 * @return array
	 */
	public function table_warehouse_history() {
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'warehouse_histories/table_warehouse_history'), $dataPost);
	}

	/**
	 * warehouse history
	 *
	 * @return view
	 */
	public function warehouse_history() {
		$data['title'] = app_lang('warehouse_history');

		$data['warehouse_filter'] = $this->warehouse_model->get_warehouse();
		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('', true);
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}
		return $this->template->rander("Warehouse\Views\warehouse_histories\warehouse_history", $data);

	}

	/**
	 * approval setting
	 * @return redirect
	 */
	public function approval_setting($id = '') {
		if ($this->request->getPost()) {
			$data = $this->request->getPost();

			if (!is_numeric($id)) {
				$message = '';
				$success = $this->warehouse_model->add_approval_setting($data);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				}
				app_redirect("warehouse/approval_settings");
			} else {
				$success = $this->warehouse_model->edit_approval_setting($id, $data);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				}
				app_redirect("warehouse/approval_settings");
			}
		}
	}

	/**
	 * delete approval setting
	 * @param  integer $id
	 * @return redirect
	 */
	public function delete_approval_setting($id) {
		if (!$id) {
			app_redirect("warehouse/approval_settings");
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$response = $this->warehouse_model->delete_approval_setting($id);
		if (is_array($response) && isset($response['referenced'])) {
			echo json_encode(array("success" => false, "message" => app_lang('is_referenced')));
		} elseif ($response == true) {
			echo json_encode(array("success" => true, "message" => app_lang('deleted')));
		} else {
			echo json_encode(array("success" => false, "message" => app_lang('problem_deleting')));
		}
	}

	/**
	 * get html approval setting
	 * @param  integer $id
	 * @return html
	 */
	public function get_html_approval_setting($id = '') {
		$index=0;
		$html = '';
		$staffs = $this->staff_model->get();
		$approver = [
			0 => ['id' => 'direct_manager', 'name' => _l('direct_manager')],
			1 => ['id' => 'department_manager', 'name' => _l('department_manager')],
			2 => ['id' => 'staff', 'name' => _l('staff')]];
			$action = [
				1 => ['id' => 'approve', 'name' => _l('approve')],
				0 => ['id' => 'sign', 'name' => _l('sign')],
			];
			if (is_numeric($id)) {
				$approval_setting = $this->warehouse_model->get_approval_setting($id);

				$setting = json_decode($approval_setting->setting);

				foreach ($setting as $key => $value) {
					$index++;
					if ($key == 0) {
						$html .= '<div id="item_approve">
						<div class="col-md-11">
						<div class="col-md-4 hide"> ' .
						render_select1('approver[' . $key . ']', $approver, array('id', 'name'), 'task_single_related', $value->approver) . '
						</div>
						<div class="col-md-8">
						' . render_select1('staff[' . $key . ']', $staffs, array('staffid', 'full_name'), 'staff', $value->staff) . '
						</div>
						<div class="col-md-4 ">
						' . render_select1('action[' . $key . ']', $action, array('id', 'name'), 'action_label', $value->action) . '
						</div>
						</div>
						<div class="col-md-1 button_class" >
						<span class="pull-bot">
						<button name="add" class="btn new_wh_approval btn-success" data-ticket="true" type="button"><i class="fa fa-plus"></i></button>
						</span>
						</div>
						</div>';
					} else {
						$html .= '<div id="item_approve">
						<div class="col-md-11">
						<div class="col-md-4 hide">
						' .
						render_select1('approver[' . $key . ']', $approver, array('id', 'name'), 'task_single_related', $value->approver) . '
						</div>
						<div class="col-md-8">
						' . render_select1('staff[' . $key . ']', $staffs, array('staffid', 'full_name'), 'staff', $value->staff) . '
						</div>
						<div class="col-md-4 ">
						' . render_select1('action[' . $key . ']', $action, array('id', 'name'), 'action_label', $value->action) . '
						</div>
						</div>
						<div class="col-md-1 button_class" >
						<span class="pull-bot">
						<button name="add" class="btn remove_wh_approval btn-danger" data-ticket="true" type="button"><i class="fa fa-minus"></i></button>
						</span>
						</div>
						</div>';
					}
				}
			} else {
				$html .= '<div id="item_approve">
				<div class="col-md-11">
				<div class="col-md-4 hide"> ' .
				render_select1('approver[0]', $approver, array('id', 'name'), 'task_single_related') . '
				</div>
				<div class="col-md-8">
				' . render_select1('staff[0]', $staffs, array('staffid', 'full_name'), 'staff') . '
				</div>
				<div class="col-md-4 ">
				' . render_select1('action[0]', $action, array('id', 'name'), 'action_label') . '
				</div>
				</div>
				<div class="col-md-1 button_class">
				<span class="pull-bot">
				<button name="add" class="btn new_wh_approval btn-success" data-ticket="true" type="button"><i class="fa fa-plus"></i></button>
				</span>
				</div>
				</div>';
			}

			echo json_encode([
				'html' => $html,
				'index' => $index,

			]);
		}

	/**
	 * send request approve
	 * @return json
	 */
	public function send_request_approve() {

		$data = $this->request->getPost();
		if($data['rel_type'] == '1'){
			$message = 'Send request approval fail';
			$success = $this->warehouse_model->send_request_approve($data);

		}elseif($data['rel_type'] == '2'){
			/*check send request with type =2 , inventory delivery voucher*/
			$check_r = $this->warehouse_model->check_inventory_delivery_voucher($data);

			if($check_r['flag_export_warehouse'] == 1){
				$message = 'Send request approval fail';
				$success = $this->warehouse_model->send_request_approve($data);

			}else{
				$message = $check_r['str_error'];
				$success = false;

				echo json_encode([
					'success' => $success,
					'message' => $message,
				]);
				die;

			}
		}elseif($data['rel_type'] == '3'){
			$message = 'Send request approval fail';
			$success = $this->warehouse_model->send_request_approve($data);

		}elseif($data['rel_type'] == '4'){
			/*check send request with type = 4 , internal delivery note*/
			$check_r = $this->warehouse_model->check_internal_delivery_note_send_request($data);

			if($check_r['flag_internal_delivery_warehouse'] == 1){
				$message = 'Send request approval fail';
				$success = $this->warehouse_model->send_request_approve($data);

			}else{
				$message = $check_r['str_error'];
				$success = false;

				echo json_encode([
					'success' => $success,
					'message' => $message,
				]);
				die;

			}

		}elseif($data['rel_type'] == '5'){
			// packing list
			//check before send request approval
			$check_packing_list_send_request = $this->warehouse_model->check_packing_list_send_request($data);

			if($check_packing_list_send_request['flag_update_status']){
				$success = $this->warehouse_model->send_request_approve($data);
			}else{
				$message = $check_packing_list_send_request['str_error'];
				$success = false;
				echo json_encode([
					'success' => $success,
					'message' => $message,
				]);
				die;
			}
		}elseif($data['rel_type'] == '6'){
			// order return

			$success = $this->warehouse_model->send_request_approve($data);
		}

		if ($success === true) {
			$message = 'Send request approval success';
			$data_new = [];
			$data_new['send_mail_approve'] = $data;

			$session = \Config\Services::session();
			$session->set($data_new);

		}elseif($success === false){
			$message = _l('no_matching_process_found');
			$success = false;

		} else {
			$message = _l('could_not_find_approver_with', _l($success));
			$success = false;
		}
		echo json_encode([
			'success' => $success,
			'message' => $message,
		]);
		die;
	}

	/**
	 * approve request
	 * @param  integer $id
	 * @return json
	 */
	public function approve_request() {
		$data = $this->request->getPost();

		$data['staff_approve'] = get_staff_user_id1();
		$success = false;
		$code = '';
		$signature = '';
		$open_warehouse_modal = false;
		$receipt_delivery_type = 'inventory_receipt_voucher_returned_goods';

		if (isset($data['signature'])) {
			$signature = $data['signature'];
			unset($data['signature']);
		}
		$status_string = 'status_' . $data['approve'];
		$check_approve_status = $this->warehouse_model->check_approval_details($data['rel_id'], $data['rel_type']);


		if (isset($data['approve']) && in_array(get_staff_user_id1(), $check_approve_status['staffid'])) {

			$success = $this->warehouse_model->update_approval_details($check_approve_status['id'], $data);

			$message = _l('approved_successfully');

			if ($success) {
				if ($data['approve'] == 1) {
					$message = _l('approved_successfully');
					$data_log = [];

					if ($signature != '') {
						$data_log['note'] = "signed_request";
					} else {
						$data_log['note'] = "approve_request";
					}
					if ($signature != '') {
						switch ($data['rel_type']) {
						// case 'stock_import 1':
							case 1:
							$path = WAREHOUSE_STOCK_IMPORT_MODULE_UPLOAD_FOLDER . $data['rel_id'];
							break;
						// case 'stock_export 2':
							case 2:
							$path = WAREHOUSE_STOCK_EXPORT_MODULE_UPLOAD_FOLDER . $data['rel_id'];
							break;

							case 3:
							$path = WAREHOUSE_LOST_ADJUSTMENT_MODULE_UPLOAD_FOLDER . $data['rel_id'];
							break;

							case 4:
							$path = WAREHOUSE_INTERNAL_DELIVERY_MODULE_UPLOAD_FOLDER . $data['rel_id'];
							break;

							case 5:
							$path = WAREHOUSE_PACKING_LIST_MODULE_UPLOAD_FOLDER . $data['rel_id'];
							break;

							case 6:
							$path = WAREHOUSE_ORDER_RETURN_MODULE_UPLOAD_FOLDER . $data['rel_id'];
							break;
							


							default:
							$path = WAREHOUSE_STOCK_IMPORT_MODULE_UPLOAD_FOLDER;
							break;
						}
						warehouse_process_digital_signature_image($signature, $path, 'signature_' . $check_approve_status['id']);
						$message = _l('sign_successfully');
					}
					$data_log['rel_id'] = $data['rel_id'];
					$data_log['rel_type'] = $data['rel_type'];
					$data_log['staffid'] = get_staff_user_id1();
					$data_log['date'] = date('Y-m-d H:i:s');

					$this->warehouse_model->add_activity_log($data_log);

					$check_approve_status = $this->warehouse_model->check_approval_details($data['rel_id'], $data['rel_type']);

					if ($check_approve_status === true) {
						$this->warehouse_model->update_approve_request($data['rel_id'], $data['rel_type'], 1);
						$open_warehouse_modal = true; 
						if((int)$data['rel_type'] == 6){
							$get_order_return = $this->warehouse_model->get_order_return($data['rel_id']);
							$receipt_delivery_type = $get_order_return->receipt_delivery_type;
						}
					}
				} else {
					$message = app_lang('rejected_successfully');
					$data_log = [];
					$data_log['rel_id'] = $data['rel_id'];
					$data_log['rel_type'] = $data['rel_type'];
					$data_log['staffid'] = get_staff_user_id1();
					$data_log['date'] = date('Y-m-d H:i:s');
					$data_log['note'] = "rejected_request";
					$this->warehouse_model->add_activity_log($data_log);
					$this->warehouse_model->update_approve_request($data['rel_id'], $data['rel_type'], '-1');
				}
			}
		}

		$data_new = [];
		$data_new['send_mail_approve'] = $data;
		$session = \Config\Services::session();
		$session->set($data_new);


		echo json_encode([
			'success' => $success,
			'message' => $message,
			'open_warehouse_modal' => $open_warehouse_modal,
			'receipt_delivery_type' => $receipt_delivery_type,
		]);
		die();
	}

	/**
	 * stock import pdf
	 * @param  integer $id
	 * @return pdf file view
	 */
	public function stock_import_pdf($id) {
		if (!$id) {
			redirect(admin_url('warehouse/manage_goods_receipt/manage_purchase'));
		}

		$stock_import = $this->warehouse_model->get_stock_import_pdf_html($id);
		try {
			$pdf = $this->warehouse_model->stock_import_pdf($stock_import);

		} catch (Exception $e) {
			echo html_entity_decode($e->getMessage());
			die;
		}

		$type = 'D';
		ob_end_clean();

		if ($this->request->getGet('output_type')) {
			$type = $this->request->getGet('output_type');
		}

		if ($this->request->getGet('print')) {
			$type = 'I';
		}

		$pdf->Output('goods_receipt_'.strtotime(date('Y-m-d H:i:s')).'.pdf', $type);
	}

	/**
	 * send mail
	 * @param  integer $id
	 * @return json
	 */
	public function send_mail() {
		$data = $this->request->getGet();
		if ((isset($data)) && $data != '') {
			$this->warehouse_model->send_mail($data);

			$success = 'success';
			echo json_encode([
				'success' => $success,
			]);
		}
	}

	/**
	 * manage delivery
	 * @param  integer $id
	 * @return view
	 */
	public function manage_delivery($id = '') {
		$data['delivery_id'] = $id;
		$data['title'] = _l('stock_delivery_manage');
		return $this->template->rander("Warehouse\Views\manage_goods_delivery\manage_delivery", $data);
	}

	/**
	 * goods delivery
	 * @return view
	 */
	public function goods_delivery($id ='', $edit_approval = false) {

		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();
			$id = $this->request->getPost('id');

			if (!$this->request->getPost('id')) {
				$mess = $this->warehouse_model->add_goods_delivery($data);
				if ($mess) {

					if($data['save_and_send_request'] == 'true'){
						$this->save_and_send_request_send_mail(['rel_id' => $mess, 'rel_type' => '2', 'addedfrom' => get_staff_user_id1()]);
					}
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("Add_stock_delivery_docket_false"));
				}
				app_redirect("warehouse/manage_delivery");

			}else{
				$id = $this->request->getPost('id');
				if($data['edit_approval'] == 'true'){
					$mess = $this->warehouse_model->update_goods_delivery_approval($data);

				}else{
					$mess = $this->warehouse_model->update_goods_delivery($data);
				}

				if($data['save_and_send_request'] == 'true'){
					$this->save_and_send_request_send_mail(['rel_id' => $id, 'rel_type' => '2', 'addedfrom' => get_staff_user_id1()]);
				}

				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				} 
				app_redirect("warehouse/manage_delivery");
			}

		}
	
		$tax_options = array(
			"deleted" => 0,
		);
		$data['taxes'] = $this->Taxes_model->get_details($tax_options)->getResultArray();

		$data['title'] = _l('goods_delivery');

		$data['commodity_codes'] = $this->warehouse_model->get_commodity();
		$data['warehouses'] = $this->warehouse_model->get_warehouse();

		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('can_be_inventory');
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}

		$warehouse_data = $this->warehouse_model->get_warehouse();
		//sample
		$goods_delivery_row_template = $this->warehouse_model->create_goods_delivery_row_template();

		if (get_status_modules_wh('purchase')) {
			if ($this->db->field_exists('delivery_status' ,db_prefix() . 'pur_orders')) { 
				$this->load->model('purchase/purchase_model');
				$this->load->model('departments_model');
				$this->load->model('staff_model');
				$this->load->model('projects_model');

				$data['pr_orders'] = $this->warehouse_model->get_pr_order_delivered();
				$data['pr_orders_status'] = true;

				$data['vendors'] = $this->purchase_model->get_vendor();

				$data['projects'] = $this->projects_model->get();
				$data['staffs'] = $this->staff_model->get();
				$data['departments'] = $this->departments_model->get();
			}else{
				$data['pr_orders'] = [];
				$data['pr_orders_status'] = false;
			}

		} else {
			$data['pr_orders'] = [];
			$data['pr_orders_status'] = false;
		}
		
		$tax_options = array(
			"deleted" => 0,
		);
		$data['customer_code'] = $this->Clients_model->get_details($tax_options)->getResultArray();

		if($edit_approval){
			$invoices_data = $this->warehouse_model->warehouse_run_query('select *, iv.id as id from '.get_db_prefix().'invoices as iv left join '.get_db_prefix().'projects as pj on pj.id = iv.project_id left join '.get_db_prefix().'clients as cl on cl.id = iv.client_id  order by iv.id desc');
			$data['invoices'] = $invoices_data;
		}else{
			$data['invoices'] = $this->warehouse_model->get_invoices();
		}
		$data['goods_code'] = $this->warehouse_model->create_goods_delivery_code();
		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$data['staff'] = $this->Users_model->get_details($options)->getResultArray();
		$data['current_day'] = date('Y-m-d');

		if($id != ''){
			$is_purchase_order = false;
			$goods_delivery = $this->warehouse_model->get_goods_delivery($id);
			if (!$goods_delivery) {
				blank_page('Stock export Not Found', 'danger');
			}
			$data['goods_delivery_detail'] = $this->warehouse_model->get_goods_delivery_detail($id);
			$data['goods_delivery'] = $goods_delivery;

			if(isset($goods_delivery->pr_order_id ) && (float)$goods_delivery->pr_order_id > 0){
				$is_purchase_order = true;
			}

			if (count($data['goods_delivery_detail']) > 0) {
				$index_receipt = 0;
				foreach ($data['goods_delivery_detail'] as $delivery_detail) {
					$index_receipt++;
					$unit_name = wh_get_unit_name($delivery_detail['unit_id']);
					$taxname = '';
					$expiry_date = null;
					$lot_number = null;
					$commodity_name = $delivery_detail['commodity_name'];
					
					if(strlen($commodity_name) == 0){
						$commodity_name = wh_get_item_variatiom($delivery_detail['commodity_code']);
					}

					$goods_delivery_row_template .= $this->warehouse_model->create_goods_delivery_row_template($warehouse_data, 'items[' . $index_receipt . ']', $commodity_name, $delivery_detail['warehouse_id'], $delivery_detail['available_quantity'], $delivery_detail['quantities'], $unit_name, $delivery_detail['unit_price'], $taxname, $delivery_detail['commodity_code'], $delivery_detail['unit_id'] , $delivery_detail['tax_rate'], $delivery_detail['total_money'], $delivery_detail['discount'], $delivery_detail['discount_money'], $delivery_detail['total_after_discount'],$delivery_detail['guarantee_period'], $expiry_date, $lot_number, $delivery_detail['note'], $delivery_detail['sub_total'],$delivery_detail['tax_name'],$delivery_detail['tax_id'], $delivery_detail['id'], true, $is_purchase_order);
					
				}
			}
		}

		//edit note after approval
		$data['edit_approval'] = $edit_approval;
		$data['goods_delivery_row_template'] = $goods_delivery_row_template;

		return $this->template->rander("Warehouse\Views\manage_goods_delivery\delivery", $data);


	}

	/**
	 * commodity goods delivery change
	 * @param  integer $val
	 * @return json
	 */
	public function commodity_goods_delivery_change($val='') {

			$data = $this->request->getPost();
			if($data['switch_barcode_scanners'] == 'true'){
				$value = $this->warehouse_model->get_commodity_delivery_hansometable_by_barcode($data['oldValue']);
			}else{
				$value = $this->warehouse_model->commodity_goods_delivery_change($data['oldValue']);
			}


			echo json_encode([
				'value' => $value['commodity_value'],
				'warehouse_inventory' => $value['warehouse_inventory'],
				'guarantee_new' => $value['guarantee_new'],
			]);
			die;
		
	}

	/**
	 * table manage delivery
	 * @return array
	 */
	public function table_manage_delivery() {
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'manage_goods_delivery/table_manage_delivery'), $dataPost);
	}

	/**
	 * edit delivery
	 * @param  integer $id
	 * @return view
	 */
	public function edit_delivery($id) {
		//check exist
		$goods_delivery = $this->warehouse_model->get_goods_delivery($id);
		if (!$goods_delivery) {
			blank_page('Stock export Not Found', 'danger');
		}

		//approval
		$session = \Config\Services::session();
		$send_mail_approve = $session->has("send_mail_approve");

		if (($send_mail_approve) && $session->get("send_mail_approve") != '') {
			$data['send_mail_approve'] = $session->get("send_mail_approve");
			$session->remove("send_mail_approve");
		}

		$data['get_staff_sign'] = $this->warehouse_model->get_staff_sign($id, 2);

		$data['check_approve_status'] = $this->warehouse_model->check_approval_details($id, 2);
		$data['list_approve_status'] = $this->warehouse_model->get_list_approval_details($id, 2);
		$data['payslip_log'] = $this->warehouse_model->get_activity_log($id, 2);

		//get vaule render dropdown select
		$data['commodity_code_name'] = $this->warehouse_model->get_commodity_code_name();
		$data['units_code_name'] = $this->warehouse_model->get_units_code_name();
		$data['units_warehouse_name'] = $this->warehouse_model->get_warehouse_code_name();

		$data['goods_delivery_detail'] = json_encode($this->warehouse_model->get_goods_delivery_detail($id));

		$data['goods_delivery'] = $goods_delivery;

		$tax_options = array(
			"deleted" => 0,
		);
		$data['taxes'] = $this->Taxes_model->get_details($tax_options)->getResultArray();
		$data['tax_data'] = $this->warehouse_model->get_html_tax_delivery($id);

		$data['title'] = _l('stock_export_info');
		$check_appr = $this->warehouse_model->get_approve_setting('2');
		$data['check_appr'] = $check_appr;
		$this->load->model('currencies_model');
		$base_currency = $this->currencies_model->get_base_currency();
		$data['base_currency'] = $base_currency;

		$this->load->view('manage_goods_delivery/edit_delivery', $data);

	}

	/**
	 * stock export pdf
	 * @param  integer $id
	 * @return pdf file view
	 */
	public function stock_export_pdf($id) {
		if (!$id) {
			redirect(admin_url('warehouse/manage_goods_delivery/manage_delivery'));
		}

		$stock_export = $this->warehouse_model->get_stock_export_pdf_html($id);

		try {
			$pdf = $this->warehouse_model->stock_export_pdf($stock_export);

		} catch (Exception $e) {
			echo html_entity_decode($e->getMessage());
			die;
		}

		$type = 'D';
		ob_end_clean();

		if ($this->request->getGet('output_type')) {
			$type = $this->request->getGet('output_type');
		}

		if ($this->request->getGet('print')) {
			$type = 'I';
		}

		$pdf->Output('goods_delivery_'.strtotime(date('Y-m-d H:i:s')).'.pdf', $type);
	}

	/**
	 * manage report
	 * @return view
	 */
	public function manage_report() {
		$data['group'] = $this->request->getGet('group');

		$data['title'] = _l('als_report');
		$data['tab'][] = 'stock_summary_report';
		$data['tab'][] = 'inventory_inside';
		$data['tab'][] = 'inventory_valuation_report';
		$data['tab'][] = 'warranty_period_report';

		switch ($data['group']) {
			case 'stock_summary_report':
			$data['title'] = _l('stock_summary_report');

			break;
			case 'inventory_valuation_report':
			$data['title'] = _l('inventory_valuation_report');

			break;
			case 'inventory_inside':
			$data['title'] = _l('inventory_inside');

			break;

			case 'warranty_period_report':
			$data['title'] = _l('wh_warranty_period_report');

			break;


			default:
			$data['title'] = _l('stock_summary_report');
			$data['group'] = 'stock_summary_report';
			break;
		}
		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('', true);
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}
		$data['warehouse_filter'] = $this->warehouse_model->get_warehouse();

		$data['tabs']['view'] = 'report/' . $data['group'];
		$data['period_to_date'] = '';
		$data['period_status_id'] = [1,2];
		$data['clients'] = $this->clients_model->get();

		$this->load->view('report/manage_report', $data);
	}

	/**
	 * get data stock summary report
	 * @return json
	 */
	public function get_data_stock_summary_report() {
		if ($this->request->getPost()) {
			$data = $this->request->getPost();

			$stock_summary_report = $this->warehouse_model->get_stock_summary_report_view($data);
		}

		echo json_encode([
			'value' => $stock_summary_report,
		]);
		die();
	}

	/**
	 * stock summary report pdf
	 * @return pdf view file
	 */
	public function stock_summary_report_pdf() {
		$data = $this->request->getPost();
		if (!$data) {
			redirect(admin_url('warehouse/report/manage_report'));
		}

		$stock_summary_report = $this->warehouse_model->get_stock_summary_report($data);

		try {
			$pdf = $this->warehouse_model->stock_summary_report_pdf($stock_summary_report);

		} catch (Exception $e) {
			echo html_entity_decode($e->getMessage());
			die;
		}

		$type = 'D';
		ob_end_clean();
		
		if ($this->request->getGet('output_type')) {
			$type = $this->request->getGet('output_type');
		}

		if ($this->request->getGet('print')) {
			$type = 'I';
		}

		$pdf->Output('stock_summary_report.pdf', $type);
	}

	/**
	 * view delivery
	 * @param  integer $id
	 * @return view
	 */
	public function view_delivery($id) {
		//approval
		$session = \Config\Services::session();
		$send_mail_approve = $session->has("send_mail_approve");

		if (($send_mail_approve) && $session->get("send_mail_approve") != '') {
			$data['send_mail_approve'] = $session->get("send_mail_approve");
			$session->remove("send_mail_approve");
		}

		$data['get_staff_sign'] = $this->warehouse_model->get_staff_sign($id, 2);

		$data['check_approve_status'] = $this->warehouse_model->check_approval_details($id, 2);
		$data['list_approve_status'] = $this->warehouse_model->get_list_approval_details($id, 2);
		$data['payslip_log'] = $this->warehouse_model->get_activity_log($id, 2);

		$data['goods_delivery_detail'] = $this->warehouse_model->get_goods_delivery_detail($id);

		$data['goods_delivery'] = $this->warehouse_model->get_goods_delivery($id);
		$data['activity_log'] = $this->warehouse_model->wh_get_activity_log($id,'delivery');
		$data['packing_lists'] = $this->warehouse_model->get_packing_list_by_deivery_note($id);

		$data['title'] = _l('stock_export_info');
		$check_appr = $this->warehouse_model->get_approve_setting('2');
		$data['check_appr'] = $check_appr;
		$data['tax_data'] = $this->warehouse_model->get_html_tax_delivery($id);
		
		return $this->template->rander("Warehouse\Views\manage_goods_delivery/delivery_note_detail", $data);

	}

	/**
	 * check quantity inventory
	 * @return json
	 */
	public function check_quantity_inventory() {
		$data = $this->request->getPost();
		if ($data != 'null') {

			//switch_barcode_scanners
			if($data['switch_barcode_scanners'] == 'true'){
				$data['commodity_id'] = $this->warehouse_model->get_commodity_id_from_barcode($data['commodity_id']);
			}

			/*check without checking warehouse*/
			if($this->warehouse_model->check_item_without_checking_warehouse($data['commodity_id']) == true){
				//checking

				$value = $this->warehouse_model->get_quantity_inventory($data['warehouse_id'], $data['commodity_id']);

				$quantity = 0;
				if ($value != null) {

					if ((float) get_object_vars($value)['inventory_number'] < (float) $data['quantity']) {
						$message = _l('in_stock');
						$quantity = (float)get_object_vars($value)['inventory_number'];
					} else {
						$message = true;
						$quantity = (float)get_object_vars($value)['inventory_number'];
					}

				} else {
					$message = _l('Product_does_not_exist_in_stock');
				}

			}else{
				//without checking
				$message = true;
				$quantity = 0;

			}

			echo json_encode([
				'message' => $message,
				'value' => $quantity,
			]);
			die;
		}
	}

	/**
	 *  quantity inventory
	 * @return json
	 */
	public function quantity_inventory() {
		$data = $this->request->getPost();
		if ($data != 'null') {
			if(strlen($data['expiry_date']) > 0){
				$data['expiry_date'] = to_sql_date1($data['expiry_date']);
			}
			$value = $this->warehouse_model->get_adjustment_stock_quantity($data['warehouse_id'], $data['commodity_id'], $data['lot_number'], $data['expiry_date']);

			$quantity = 0;
			if ($value != null) {

				$message = _l('in_stock');
				$quantity = get_object_vars($value)['inventory_number'];

			} else {
				$message = _l('Product_does_not_exist_in_stock');
			}

			echo json_encode([
				'message' => $message,
				'value' => (float)$quantity,
				'unit' => 0,
			]);
			die;
		}
	}

	/**
	 * check quantity inventory onsubmit
	 * @return json
	 */
	public function check_quantity_inventory_onsubmit() {
		$data = $this->request->getPost();
		$flag = 0;
		$message = true;

		$str_error='';

		$arr_available_quantity=[];

		
		if ($data['hot_delivery'] != 'null') {
			foreach ($data['hot_delivery'] as $delivery_value) {
				
				//switch_barcode_scanners
				if($data['switch_barcode_scanners'] == 'true'){
					$delivery_value[0] = $this->warehouse_model->get_commodity_id_from_barcode($delivery_value[0]);
				}

				if ( $delivery_value[0] != '' ) {
					if($delivery_value[1] != '' || $data['warehouse_id'] != ''){
						//check without checking warehouse
						
						if($data['warehouse_id'] != ''){
							$delivery_value[1] = $data['warehouse_id'];
						}

						$commodity_name='';
						$item_value = $this->warehouse_model->get_commodity($delivery_value[0]);

						if($item_value){
							$commodity_name .= $item_value->commodity_code.'_'.$item_value->description;
						}

						if($this->warehouse_model->check_item_without_checking_warehouse($delivery_value[0]) == true){

							$value = $this->warehouse_model->get_quantity_inventory($delivery_value[1], $delivery_value[0]);

							if ($value != null) {
								array_push($arr_available_quantity, (float) get_object_vars($value)['inventory_number']);
								if ((float) get_object_vars($value)['inventory_number'] < (float) $delivery_value[4]) {
									$flag = 1;
									$str_error .= $commodity_name._l('not_enough_inventory').', '._l('available_quantity').': '.(float) get_object_vars($value)['inventory_number'].'<br/>';
								}
							} else {
								$flag = 1;
								$str_error .=$commodity_name. _l('Product_does_not_exist_in_stock').'<br/>';
							}
						}

					}else{
						$flag = 1;
						$str_error .= _l('please_choose_from_stock_name').'<br/>';
					}
				}

			}
			
			if ($flag == 1) {
				$message = false;

			} else {
				$message = true;
			}

			echo json_encode([
				'message' => $message,
				'str_error' => $str_error,
				'arr_available_quantity' => $arr_available_quantity,

			]);
			die;
		}
	}

	/**
	 * manage stock take
	 * @param  integer $id
	 * @return view
	 */
	public function manage_stock_take($id = '') {
		$data['stock_take_id'] = $id;
		$data['title'] = _l('stock_take');
		$this->load->view('manage_stock_take/manage', $data);
	}

	/**
	 * table manage stock table
	 * @return array
	 */
	public function table_manage_stock_take() {
		$this->app->get_table_data(module_views_path('Warehouse', 'manage_stock_take/table_manage_stock_take'));
	}

	/**
	 * stock take
	 * @param  integer $id
	 * @return view
	 */
	public function stock_take() {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!$this->request->getPost('id')) {

				$mess = $this->warehouse_model->add_goods_receipt($data);
				if ($mess) {
					set_alert('success', _l('added_successfully') . _l('stock_take'));

				} else {
					set_alert('warning', _l('Add_stock_take_false'));
				}
				redirect(admin_url('warehouse/manage_stock_take'));

			}
		}
		//get vaule render dropdown select
		$data['commodity_code_name'] = $this->warehouse_model->get_commodity_code_name();
		$data['units_code_name'] = $this->warehouse_model->get_units_code_name();
		$data['units_warehouse_name'] = $this->warehouse_model->get_warehouse_code_name();

		$data['title'] = _l('inventory_goods_materials');

		$data['commodity_codes'] = $this->warehouse_model->get_commodity();

		$data['warehouses'] = $this->warehouse_model->get_warehouse();
		if (get_status_modules_wh('purchase')) {
			$data['pr_orders'] = get_pr_order();
		} else {
			$data['pr_orders'] = [];
		}

		$data['vendors'] = $this->warehouse_model->get_vendor();

		$data['goods_code'] = $this->warehouse_model->create_goods_code();
		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$data['staff'] = $this->Users_model->get_details($options)->getResultArray();

		$this->load->view('manage_stock_take/stock_take', $data);

	}

	/**
	 * commodity list add edit
	 * @param  integer $id
	 * @return json
	 */
	public function commodity_list_add_edit($id = '') {
		$data = $this->request->getPost();
		if ($data) {
			 $id = $this->request->getPost('id');

			$target_path = get_setting("timeline_file_path");
			$files_data = move_files_from_temp_dir_to_permanent_dir($target_path, "item");
			$new_files = unserialize($files_data);

			if ($id) {
				$item_info = $this->Items_model->get_one($id);
				$timeline_file_path = get_setting("timeline_file_path");

				$new_files = update_saved_files($timeline_file_path, $item_info->files, $new_files);
			}
			$data["files"] = serialize($new_files);

			if (!$id) {

				$result = $this->warehouse_model->add_commodity_one_item($data);
				if ($result) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("add_failed"));
				}
				app_redirect("warehouse/commodity_list");

			} else {

				$id = $data['id'];
				if(isset($data['id'])){
					unset($data['id']);
				}
				$result = $this->warehouse_model->update_commodity_one_item($data, $id);

				if ($result) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				}
				app_redirect("warehouse/commodity_list");
			}
		}

	}

	/**
	 * get commodity file url
	 * @param  integer $commodity_id
	 * @return json
	 */
	public function get_commodity_file_url($commodity_id) {
		$arr_commodity_file = $this->warehouse_model->get_warehourse_attachments($commodity_id);
		/*get images old*/
		$images_old_value = '';

		if (count($arr_commodity_file) > 0) {
			foreach ($arr_commodity_file as $key => $value) {
				$images_old_value .= '<div class="dz-preview dz-image-preview image_old' . $value["id"] . '">';
				$rel_type = '';

				$images_old_value .= '<div class="dz-image">';
				if (file_exists(WAREHOUSE_ITEM_UPLOAD . $value["rel_id"] . '/' . $value["file_name"])) {
					$images_old_value .= '<img class="image-w-h" data-dz-thumbnail alt="' . $value["file_name"] . '" src="' . site_url('modules/warehouse/uploads/item_img/' . $value["rel_id"] . '/' . $value["file_name"]) . '">';

					$rel_type = 'warehouse' ;
				} elseif(file_exists('modules/purchase/uploads/item_img/'. $value["rel_id"] . '/' . $value["file_name"])) {
					$images_old_value .= '<img class="image-w-h" data-dz-thumbnail alt="' . $value["file_name"] . '" src="' . site_url('modules/purchase/uploads/item_img/' . $value["rel_id"] . '/' . $value["file_name"]) . '">';

					$rel_type = 'purchase' ;
				}elseif(file_exists('modules/manufacturing/uploads/products/'. $value["rel_id"] . '/' . $value["file_name"])) {
					$images_old_value .= '<img class="image-w-h" data-dz-thumbnail alt="' . $value["file_name"] . '" src="' . site_url('modules/manufacturing/uploads/products/' . $value["rel_id"] . '/' . $value["file_name"]) . '">';

					$rel_type = 'manufacturing' ;
				}

				if ($rel_type != '') {
					$images_old_value .= '</div>';

					$images_old_value .= '<div class="dz-error-mark">';
					$images_old_value .= '<a class="dz-remove" data-dz-remove>Remove file';
					$images_old_value .= '</a>';
					$images_old_value .= '</div>';


					$images_old_value .= '<div class="remove_file">';
					$images_old_value .= '<a href="#" class="text-danger" onclick="delete_product_attachment(this,' . $value["id"] . ','.'\''.$rel_type.'\'); return false;"><i class="fa fa fa-times"></i></a>';
					$images_old_value .= '</div>';

					$images_old_value .= '</div>';
				}
			}
		}

		echo json_encode([
			'arr_images' => $images_old_value,
		]);
		die();

	}

	/**
	 * sub group
	 * @param  integer $id
	 * @return redirect
	 */
	public function sub_group($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!$this->request->getPost('id')) {

				$mess = $this->warehouse_model->add_sub_group($data);
				if ($mess) {
					set_alert('success', _l('added_successfully') . ' ' . _l('sub_group'));

				} else {
					set_alert('warning', _l('Add_sub_group_false'));
				}
				redirect(admin_url('warehouse/setting?group=sub_group'));

			} else {
				$id = $data['id'];
				unset($data['id']);
				$success = $this->warehouse_model->add_sub_group($data, $id);
				if ($success) {
					set_alert('success', _l('updated_successfully') . ' ' . _l('sub_group'));
				} else {
					set_alert('warning', _l('updated_sub_group_false'));
				}

				redirect(admin_url('warehouse/setting?group=sub_group'));
			}
		}
	}

	/**
	 * delete sub group
	 * @param  integer $id
	 * @return redirect
	 */
	public function delete_sub_group($id) {
		if (!$id) {
			redirect(admin_url('warehouse/setting?group=sub_group'));
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}


		$response = $this->warehouse_model->delete_sub_group($id);
		if (is_array($response) && isset($response['referenced'])) {
			set_alert('warning', _l('is_referenced', _l('sub_group')));
		} elseif ($response == true) {
			set_alert('success', _l('deleted', _l('sub_group')));
		} else {
			set_alert('warning', _l('problem_deleting', _l('sub_group')));
		}
		redirect(admin_url('warehouse/setting?group=sub_group'));
	}

	/**
	 * add commodity attachment
	 * @param  integer $id
	 * @return json
	 */
	public function add_commodity_attachment($id, $add_variant='') {

		handle_commodity_attachments($id);
		echo json_encode([

			'url' => admin_url('warehouse/commodity_list'),
			'add_variant' => $add_variant,
			'id' => $id,
		]);
	}

	/**
	 * import xlsx commodity
	 * @param  integer $id
	 * @return view
	 */
	public function import_xlsx_commodity() {
		if (!$this->login_user->is_admin && !has_permission('warehouse', '', 'create')) {
			app_redirect("forbidden");
		}

		$user_id = $this->login_user->id;

		$_personal_language = get_setting('user_' . $user_id . '_personal_language');
		if(strlen($_personal_language) == 0){
			$_personal_language = get_setting("language");
		}

		$data['active_language'] = $_personal_language;
		$data['title'] = _l('import_excel');
		$data['site_url'] = base_url();


		return $this->template->rander("Warehouse\Views\items\import_excel", $data);
	}

	/**
	 * import file xlsx commodity
	 * @return json
	 */
	public function import_file_xlsx_commodity() {
		if (!is_admin() && !has_permission('warehouse', '', 'create')) {
			app_redirect("forbidden");
		}
		$user_id = $this->login_user->id;

		if(!class_exists('XLSXReader_fin')){
			require_once(module_dir_path(WAREHOUSE_MODULE_NAME).'/assets/plugins/XLSXReader/XLSXReader.php');
		}
		require_once(module_dir_path(WAREHOUSE_MODULE_NAME).'/assets/plugins/XLSXWriter/xlsxwriter.class.php');

		$total_row_false = 0;
		$total_rows_data = 0;
		$dataerror = 0;
		$total_row_success = 0;
		$total_rows_data_error = 0;
		$filename='';

		if ($this->request->getPost()) {

			/*delete file old before export file*/
			$path_before = COMMODITY_ERROR.'FILE_ERROR_COMMODITY'.$user_id.'.xlsx';
			if(file_exists($path_before)){
				unlink(COMMODITY_ERROR.'FILE_ERROR_COMMODITY'.$user_id.'.xlsx');
			}

			if (isset($_FILES['file_csv']['name']) && $_FILES['file_csv']['name'] != '') {

				// Get the temp file path
				$tmpFilePath = $_FILES['file_csv']['tmp_name'];
				// Make sure we have a filepath
				if (!empty($tmpFilePath) && $tmpFilePath != '') {

					$temp_file_path = get_setting("temp_file_path");
					$tmpDir = getcwd() . '/' . $temp_file_path;
					if (!is_dir($tmpDir)) {
						if (!mkdir($tmpDir, 0777, true)) {
							die('Failed to create file folders.');
						}
					}

					// Setup our new file path
					$newFilePath = $tmpDir . $_FILES['file_csv']['name'];

					if (move_uploaded_file($tmpFilePath, $newFilePath)) {
						$import_result = true;
						$rows = [];

						//Writer file
						$writer_header = array(
							"(*)" ._l('commodity_code')          =>'string',
							"(*)" ._l('commodity_name')          =>'string',
							_l('commodity_barcode')          =>'string',
							_l('sku_code')          =>'string',
							_l('sku_name')          =>'string',
							_l('description')          =>'string',
							_l('commodity_type')          =>'string',
							_l('unit_id')          =>'string',
							"(*)" ._l('commodity_group')          =>'string',
							_l('_profit_rate'). "(%)"          =>'string',
							_l('purchase_price')          =>'string',
							"(*)" ._l('rate')          =>'string',
							_l('tax')          =>'string',
							_l('origin')          =>'string',
							_l('style_id')          =>'string',
							_l('model_id')          =>'string',
							_l('size_id')          =>'string',
							_l('_color')          =>'string',
							_l('guarantee_month')          =>'string',
							_l('minimum_inventory')          =>'string',
							_l('error')                     =>'string',
						);

						$widths_arr = array();
						for($i = 1; $i <= count($writer_header); $i++ ){
							$widths_arr[] = 40;
						}

						$writer = new \XLSXWriter();

						$col_style1 =[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];
						$style1 = ['widths'=> $widths_arr, 'fill' => '#ff9800',  'font-style'=>'bold', 'color' => '#0a0a0a', 'border'=>'left,right,top,bottom', 'border-color' => '#0a0a0a', 'font-size' => 13 ];

						$writer->writeSheetHeader_v2('Sheet1', $writer_header,  $col_options = ['widths'=> $widths_arr, 'fill' => '#f44336',  'font-style'=>'bold', 'color' => '#0a0a0a', 'border'=>'left,right,top,bottom', 'border-color' => '#0a0a0a', 'font-size' => 13 ], $col_style1, $style1);

						//init file error end

						//Reader file
						$xlsx = new \XLSXReader_fin($newFilePath);
						$sheetNames = $xlsx->getSheetNames();
						$data = $xlsx->getSheetData($sheetNames[1]);

						// start row write 2
						$numRow = 2;
						$total_rows = 0;

						$total_rows_actualy = 0;

						$flag_insert_id = 0;
						
						//get data for compare

						for ($row = 1; $row < count($data); $row++) {

								$rd = array();
								$flag = 0;
								$flag2 = 0;
								$flag_mail = 0;
								$string_error = '';
								$flag_contract_form = 0;

								$flag_id_commodity_type;
								$flag_id_unit_id = 0;
								$flag_id_commodity_group;
								$flag_id_sub_group;
								$flag_id_warehouse_id;
								$flag_id_tax;
								$flag_id_style_id;
								$flag_id_model_id;
								$flag_id_size_id;


								$value_cell_commodity_code = isset($data[$row][0]) ? $data[$row][0] : null; //A
								$value_cell_description = isset($data[$row][1]) ? $data[$row][1] : null; //B
								$value_cell_commodity_barcode = isset($data[$row][2]) ? $data[$row][2] : ''; //A
								$value_cell_sku_code = isset($data[$row][3]) ? $data[$row][3] : ''; //A
								$value_cell_sku_name = isset($data[$row][4]) ? $data[$row][4] : ''; //A

								$value_cell_long_description = isset($data[$row][5]) ? $data[$row][5] : ''; //A
								$value_cell_commodity_type = isset($data[$row][6]) ? $data[$row][6] : '';
								$value_cell_unit_id = isset($data[$row][7]) ? $data[$row][7] : '';
								$value_cell_commodity_group = isset($data[$row][8]) ? $data[$row][8] : null;

								$value_cell_profit_rate = isset($data[$row][9]) ? $data[$row][9] : '';
								$value_cell_purchase_price = isset($data[$row][10]) ? $data[$row][10] : '';
								$value_cell_rate = isset($data[$row][11]) ? $data[$row][11] : '';
								$value_cell_tax = isset($data[$row][12]) ? $data[$row][12] : '';
								$value_cell_origin = isset($data[$row][13]) ? $data[$row][13] : '';
								$value_cell_style_id = isset($data[$row][14]) ? $data[$row][14] : '';
								$value_cell_model_id = isset($data[$row][15]) ? $data[$row][15] : '';
								$value_cell_size_id = isset($data[$row][16]) ? $data[$row][16] : '';
								$value_cell_color_id = isset($data[$row][17]) ? $data[$row][17] : '';
								$value_cell_warranty = isset($data[$row][18]) ? $data[$row][18] : null;
								$value_cell_minimum_inventory = isset($data[$row][19]) ? $data[$row][19] : '';


								$pattern = '#^[a-z][a-z0-9\._]{2,31}@[a-z0-9\-]{3,}(\.[a-z]{2,4}){1,2}$#';

								$reg_day = '#^(((1)[0-2]))(\/)\d{4}-(3)[0-1])(\/)(((0)[0-9])-[0-2][0-9]$#'; /*yyyy-mm-dd*/

								/*check null*/
								if (is_null($value_cell_commodity_code) == true) {
									$string_error .= _l('commodity_code') . _l('not_yet_entered');
									$flag = 1;
								}

								if (is_null($value_cell_commodity_group) == true) {
									$string_error .= _l('commodity_group') . _l('not_yet_entered');
									$flag = 1;
								}


								if (is_null($value_cell_description) == true) {
									$string_error .= _l('commodity_name') . _l('not_yet_entered');
									$flag = 1;
								}

								//check commodity_type exist  (input: id or name contract)
								if (is_null($value_cell_commodity_type) != true && $value_cell_commodity_type != '0' && $value_cell_commodity_type != '') {
									/*case input  id*/
									if (is_numeric($value_cell_commodity_type)) {
										$builder = db_connect('default');
										$builder = $builder->table(get_db_prefix().'ware_commodity_type');
										$builder->where('commodity_type_id', $value_cell_commodity_type);
										$commodity_type_value = $builder->get()->getResultArray();

										if (count($commodity_type_value) == 0) {
											$string_error .= _l('commodity_type') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id commodity_type*/
											$flag_id_commodity_type = $value_cell_commodity_type;
										}

									} else {
										/*case input name*/
										$builder = db_connect('default');
										$builder = $builder->table(get_db_prefix().'ware_commodity_type');
										$builder->like('commondity_code', $value_cell_commodity_type);
										$commodity_type_value = $builder->get()->getResultArray();
										if (count($commodity_type_value) == 0) {
											$string_error .= _l('commodity_type') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id commodity_type*/

											$flag_id_commodity_type = $commodity_type_value[0]['commodity_type_id'];
										}
									}

								}

								//check unit_code exist  (input: id or name contract)
								if (is_null($value_cell_unit_id) != true && ( $value_cell_unit_id != '0')  && $value_cell_unit_id != '') {
									/*case input id*/
									if (is_numeric($value_cell_unit_id)) {
										
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'ware_unit_type');
										$builder->where('unit_type_id', $value_cell_unit_id);
										$unit_id_value = $builder->get()->getResultArray();

										if (count($unit_id_value) == 0) {
											$string_error .= _l('unit_id') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id unit_id*/
											$flag_id_unit_id = $value_cell_unit_id;
										}

									} else {
										/*case input name*/
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'ware_unit_type');
										$builder->like('unit_code', $value_cell_unit_id);

										$unit_id_value = $builder->get()->getResultArray();
										if (count($unit_id_value) == 0) {
											$string_error .= _l('unit_id') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get unit_id*/
											$flag_id_unit_id = $unit_id_value[0]['unit_type_id'];
										}
									}

								}

								//check commodity_group exist  (input: id or name contract)
								if (is_null($value_cell_commodity_group) != true && ($value_cell_commodity_group != '0') && $value_cell_commodity_group != '') {
									/*case input id*/
									if (is_numeric($value_cell_commodity_group)) {
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'item_categories');
										$builder->where('id', $value_cell_commodity_group);
										$commodity_group_value = $builder->get()->getResultArray();

										if (count($commodity_group_value) == 0) {
											$string_error .= _l('commodity_group') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id commodity_group*/
											$flag_id_commodity_group = $value_cell_commodity_group;
										}

									} else {
										/*case input name*/
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'item_categories');
										$builder->like('commodity_group_code', $value_cell_commodity_group);

										$commodity_group_value = $builder->get()->getResultArray();
										if (count($commodity_group_value) == 0) {
											$string_error .= _l('commodity_group') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id commodity_group*/

											$flag_id_commodity_group = $commodity_group_value[0]['id'];
										}
									}

								}

								//check commodity_group exist  (input: id or name contract)
								if (is_null($value_cell_warranty) != true) {
									/*case input id*/
									if (!is_numeric($value_cell_warranty)) {
										/*case input name*/
										$string_error .= _l('guarantee_month') . _l('_check_invalid');
										$flag2 = 1;
										
									}

								}


								//check taxes exist  (input: id or name contract)
								if (is_null($value_cell_tax) != true && ($value_cell_tax!= '0')  && $value_cell_tax != '') {
									/*case input id*/
									if (is_numeric($value_cell_tax)) {
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'taxes');
										$builder->where('id', $value_cell_tax);
										$cell_tax_value = $builder->get()->getResultArray();

										if (count($cell_tax_value) == 0) {
											$string_error .= _l('tax') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id cell_tax*/
											$flag_id_tax = $value_cell_tax;
										}

									} else {
										/*case input name*/
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'taxes');
										$builder->like('title', $value_cell_tax);

										$cell_tax_value = $builder->get()->getResultArray();
										if (count($cell_tax_value) == 0) {
											$string_error .= _l('tax') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id warehouse_id*/

											$flag_id_tax = $cell_tax_value[0]['id'];
										}
									}

								}

								//check commodity_group exist  (input: id or name contract)
								if (is_null($value_cell_style_id) != true && ($value_cell_style_id != '0')  && $value_cell_style_id != '' ) {
									/*case input id*/
									if (is_numeric($value_cell_style_id)) {
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'ware_style_type');

										$builder->where('style_type_id', $value_cell_style_id);
										$style_id_value = $builder->get()->getResultArray();

										if (count($style_id_value) == 0) {
											$string_error .= _l('style_id') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id style_id*/
											$flag_id_style_id = $value_cell_style_id;
										}

									} else {
										/*case input  name*/
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'ware_style_type');

										$builder->like(get_db_prefix() . 'ware_style_type.style_code', $value_cell_style_id);

										$style_id_value = $builder->get()->getResultArray();
										if (count($style_id_value) == 0) {
											$string_error .= _l('style_id') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id style_id*/

											$flag_id_style_id = $style_id_value[0]['style_type_id'];
										}
									}

								}

								//check body_code exist  (input: id or name contract)
								if (is_null($value_cell_model_id) != true && ($value_cell_model_id != '0') && $value_cell_model_id != '' ) {
									/*case input id*/
									if (is_numeric($value_cell_model_id)) {
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'ware_body_type');

										$builder->where('body_type_id', $value_cell_model_id);
										$model_id_value = $builder->get()->getResultArray();

										if (count($model_id_value) == 0) {
											$string_error .= _l('model_id') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id model_id*/
											$flag_id_model_id = $value_cell_model_id;
										}

									} else {
										/*case input name*/
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'ware_body_type');
										$builder->like(get_db_prefix() . 'ware_body_type.body_code', $value_cell_model_id);

										$model_id_value = $builder->get()->getResultArray();
										if (count($model_id_value) == 0) {
											$string_error .= _l('model_id') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id model_id*/

											$flag_id_model_id = $model_id_value[0]['body_type_id'];
										}
									}

								}

								//check size_code exist  (input: id or name contract)
								if (is_null($value_cell_size_id) != true && ($value_cell_size_id != '0') && $value_cell_size_id != '') {
									/*case input id*/
									if (is_numeric($value_cell_size_id)) {
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'ware_size_type');
										$builder->where('size_type_id', $value_cell_size_id);
										$size_id_value = $builder->get()->getResultArray();

										if ($size_id_value == 0) {
											$string_error .= _l('size_id') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id size_id*/
											$flag_id_size_id = $value_cell_size_id;
										}

									} else {
										/*case input name*/
										$builder = db_connect('default');

										$builder = $builder->table(get_db_prefix().'ware_size_type');
										$builder->like(get_db_prefix() . 'ware_size_type.size_code', $value_cell_size_id);

										$size_id_value = $builder->get()->getResultArray();
										if (count($size_id_value) == 0) {
											$string_error .= _l('size_id') . _l('does_not_exist');
											$flag2 = 1;
										} else {
											/*get id size_id*/

											$flag_id_size_id = $size_id_value[0]['size_type_id'];
										}
									}

								}

								//check value_cell_rate input
								if (is_null($value_cell_rate) != true && $value_cell_rate != '') {
									if (!is_numeric($value_cell_rate)) {
										$string_error .= _l('cell_rate') . _l('_check_invalid');
										$flag = 1;

									}

								}

								//check value_cell_rate input
								if (is_null($value_cell_purchase_price) != true && $value_cell_purchase_price != '') {
									if (!is_numeric($value_cell_purchase_price)) {
										$string_error .= _l('purchase_price') . _l('_check_invalid');
										$flag = 1;

									}

								}

								//check commodity min input
								if (is_null($value_cell_minimum_inventory) != true && $value_cell_minimum_inventory != '') {
									if (!is_numeric($value_cell_minimum_inventory)) {
										$string_error .= _l('inventory_min') . _l('_check_invalid');
										$flag = 1;

									}

								}
								

								if (($flag == 0) && ($flag2 == 0)) {

									/*staff id is HR_code, input is HR_CODE, insert => staffid*/
									$rd['commodity_code'] = isset($data[$row][0]) ? $data[$row][0] : '';
									$rd['commodity_barcode'] = isset($data[$row][2]) ? $data[$row][2] : '';
									$rd['sku_code'] = isset($data[$row][3]) ? $data[$row][3] : '';
									$rd['sku_name'] = isset($data[$row][4]) ? $data[$row][4] : '';
									$rd['title'] = isset($data[$row][1]) ? $data[$row][1] : '';

									$rd['description'] = isset($data[$row][5]) ? $data[$row][5] : '';

									$rd['commodity_type'] = isset($flag_id_commodity_type) ? $flag_id_commodity_type : '';
									$rd['unit_id'] = isset($flag_id_unit_id) ? $flag_id_unit_id : '';
									$rd['category_id'] = isset($flag_id_commodity_group) ? $flag_id_commodity_group : '';

									$rd['guarantee'] = isset($data[$row][18]) ? $data[$row][18] : '';
									$rd['tax'] = isset($flag_id_tax) ? $flag_id_tax : '';

									$rd['origin'] = isset($data[$row][13]) ? $data[$row][13] : '';

									$rd['style_id'] = isset($flag_id_style_id) ? $flag_id_style_id : '';
									$rd['model_id'] = isset($flag_id_model_id) ? $flag_id_model_id : '';
									$rd['size_id'] = isset($flag_id_size_id) ? $flag_id_size_id : '';
									$rd['color_id'] = 0;
									$rd['warehouse_id'] = 0;

									$rd['profif_ratio'] = isset($data[$row][9]) ? $data[$row][9] : null;

									$rd['rate'] = isset($data[$row][11]) ? $data[$row][11] : null;
									$rd['purchase_price'] = isset($data[$row][10]) ? $data[$row][10] : null;
									$rd['minimum_inventory'] = isset($value_cell_minimum_inventory) ? $value_cell_minimum_inventory : 0;
									$rd['without_checking_warehouse'] =  0;

								}

								$flag_insert = false;

								if ($user_id != '' && $flag == 0 && $flag2 == 0) {
									$rows[] = $rd;
									$result_value = $this->warehouse_model->import_xlsx_commodity($rd, $flag_insert_id);
									if ($result_value['status']) {
										$total_rows_actualy++;
										$flag_insert = true;

										if(isset($result_value['insert_id'])){
											$flag_insert_id = $result_value['insert_id'];
										}else{
											$flag_insert_id = 0;
										}
									}else{
										$flag_insert_id = 0;
										$string_error .= $result_value['message'];
									}
								}

								if (($flag == 1) || ($flag2 == 1) || ($flag_insert == false)) {
									//write error file
									$writer->writeSheetRow('Sheet1', [
										$value_cell_commodity_code,
										$value_cell_description,
										$value_cell_commodity_barcode,
										$value_cell_sku_code,
										$value_cell_sku_name,

										$value_cell_long_description,
										$value_cell_commodity_type,
										$value_cell_unit_id,
										$value_cell_commodity_group,

										$value_cell_profit_rate,
										$value_cell_purchase_price,
										$value_cell_rate,
										$value_cell_tax,
										$value_cell_origin,
										$value_cell_style_id,
										$value_cell_model_id,
										$value_cell_size_id,
										$value_cell_color_id,
										$value_cell_warranty,
										$value_cell_minimum_inventory,
										$string_error,
									]);

									$numRow++;
									$total_rows_data_error++;
								}

								$total_rows++;
								$total_rows_data++;

						}

						if ($total_rows_actualy != $total_rows) {
							$total_rows = $total_rows_actualy;
						}


						$total_rows = $total_rows;
						$data['total_rows_post'] = count($rows);
						$total_row_success = $total_rows_actualy;
						$total_row_false = $total_rows - (int)$total_rows_actualy;
						$message = 'Not enought rows for importing';

						if(($total_rows_data_error > 0) || ($total_row_false != 0)){

							$filename = 'FILE_ERROR_COMMODITY' .$user_id.strtotime(date('Y-m-d H:i:s')). '.xlsx';
							$writer->writeToFile(str_replace($filename, WAREHOUSE_IMPORT_ITEM_ERROR.$filename, $filename));

							$filename = WAREHOUSE_IMPORT_ITEM_ERROR.$filename;
						}
						
						$import_result = true;
						delete_file_from_directory($newFilePath); //delete temp file

					}
					
				} else {
					set_alert('warning', _l('import_upload_failed'));
				}
			}

		}
		echo json_encode([
			'message' =>'Not enought rows for importing',
			'total_row_success' => $total_row_success,
			'total_row_false' => $total_rows_data_error,
			'total_rows' => $total_rows_data,
			'site_url' => base_url(),
			'staff_id' => $user_id,
			'total_rows_data_error' => $total_rows_data_error,
			'filename' => $filename,
		]);

	}

	/**
	 * delete commodity file
	 * @param  integer $attachment_id
	 * @return json
	 */
	public function delete_commodity_file($attachment_id) {
		if (!has_permission('warehouse', '', 'delete') && !is_admin()) {
			app_redirect("forbidden");
		}

		$file = $this->misc_model->get_file($attachment_id);
		echo json_encode([
			'success' => $this->warehouse_model->delete_commodity_file($attachment_id),
		]);
	}

	/**
	 * colors
	 * @return [type] 
	 */
	public function colors() {
		$data['colors'] = $this->warehouse_model->get_color();
		return $this->template->rander("Warehouse\Views\includes\colors", $data);
	}
		
	/**
	 * list commodity type data
	 * @return [type] 
	 */
	public function list_color_data() {
		$this->access_only_team_members();

		$list_data = $this->warehouse_model->get_color();

		$result = array();
		foreach ($list_data as $data) {
			$result[] = $this->_make_color_row($data);
		}
		echo json_encode(array("data" => $result));
	}

	/**
	 * _make commodity type row
	 * @param  [type] $data 
	 * @return [type]       
	 */
	private function _make_color_row($data) {

		return array(
			$data['color_id'],
			nl2br($data['color_code']),
			nl2br($data['color_name']),
			nl2br($data['color_hex']),
			$data['display'] == 1 ? app_lang("display_yes") : app_lang("display_no"),
			$data['note'],
			modal_anchor(get_uri("warehouse/color_modal_form"), "<i data-feather='edit' class='icon-16'></i>", array("class" => "edit", "title" => app_lang('edit_commodity_type'), "data-post-id" => $data['color_id']))
			. js_anchor("<i data-feather='x' class='icon-16'></i>", array('title' => app_lang('delete'), "class" => "delete", "data-id" => $data['color_id'], "data-action-url" => get_uri("warehouse/delete_color/".$data['color_id']), "data-action" => "delete-confirmation"))
		);
	}

	/**
	 * commodity type modal form
	 * @return [type] 
	 */
	public function color_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));
		$data = [];
		$color_data = [];

		$id = $this->request->getPost('id');
		if($id && is_numeric($id)){
			$color = $this->warehouse_model->get_color($id);
			$data['color'] = $color;
		}else{
			$id = '';
		}
		$data['id'] = $id;

		return $this->template->view('Warehouse\Views\includes\modal_forms\color_modal', $data);
	}


	/**
	 * [colors_setting description]
	 * @param  string $id [description]
	 * @return [type]     [description]
	 */
	public function colors_setting($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!is_numeric($id)) {

				$mess = $this->warehouse_model->add_color($data);
				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("add_failed"));
				}
				app_redirect("warehouse/colors");

			} else {
				$success = $this->warehouse_model->update_color($data, $id);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				}
				app_redirect("warehouse/colors");
			}
		}
	}

	/**
	 * [delete_color description]
	 * @param  [type] $id [description]
	 * @return [type]     [description]
	 */
	public function delete_color($id) {
		if (!$id) {
			app_redirect('warehouse/colors');
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$response = $this->warehouse_model->delete_color($id);
		if ($response) {
			echo json_encode(array("success" => true, "message" => app_lang('deleted')));
		} else {
			 echo json_encode(array("success" => false, "message" => app_lang('problem_deleting')));
		}

	}

	/**
	 * { loss adjustment }
	 */
	public function loss_adjustment() {
		$data['title'] = _l('loss_adjustment');
		return $this->template->rander("Warehouse\Views\loss_adjustment/manage", $data);
	}

	/**
	 * { loss adjustment table }
	 */
	public function loss_adjustment_table() {
		if ($this->input->is_ajax_request()) {
			if ($this->request->getPost()) {

				$time_filter = $this->request->getPost('time_filter');
				$date_create = $this->request->getPost('date_create');
				$type_filter = $this->request->getPost('type_filter');
				$status_filter = $this->request->getPost('status_filter');

				$query = '';
				if ($time_filter != '') {
					$query .= 'month(time) = month(\'' . $time_filter . '\') and day(time) = day(\'' . $time_filter . '\') and year(time) = year(\'' . $time_filter . '\') and ';
				}
				if ($date_create != '') {
					$query .= 'month(date_create) = month(\'' . $date_create . '\') and day(date_create) = day(\'' . $date_create . '\') and year(date_create) = year(\'' . $date_create . '\') and ';
				}
				if ($status_filter != '') {
					$query .= 'status = \'' . $status_filter . '\' and ';
				}
				$select = [

					'id',
					'id',
					'id',
					'id',
					'id',
					'id',
					'id',

				];
				$where = [(($query != '') ? ' where ' . rtrim($query, ' and ') : '')];

				$aColumns = $select;
				$sIndexColumn = 'id';
				$sTable = db_prefix() . 'wh_loss_adjustment';
				$join = [];

				$result = data_tables_init1($aColumns, $sIndexColumn, $sTable, $join, $where, [

					'time',
					'type',
					'reason',
					'addfrom',
					'status',
					'date_create',
				]);

				$output = $result['output'];
				$rResult = $result['rResult'];
				foreach ($rResult as $aRow) {
					$row = [];
					$allow_add = 0;
					if ($type_filter != '') {
						if ($type_filter == 'loss') {
							if ($aRow['type'] == 'loss') {
								$allow_add = 1;
							}
						}
						if ($type_filter == 'adjustment') {
							if ($aRow['type'] == 'adjustment') {
								$allow_add = 1;
							}
						}
						if ($type_filter == 'return') {
							if ($aRow['type'] == 'return') {
								$allow_add = 1;
							}
						}
					} else {
						$allow_add = 1;
					}

					$row[] = _l($aRow['type']);
					$row[] = _dt($aRow['time']);
					$row[] = format_to_date($aRow['date_create'], false);

					$status = '';
					if ((int) $aRow['status'] == 0) {
						$status = '<div class="btn btn-warning" >' . _l('draft') . '</div>';
					} elseif ((int) $aRow['status'] == 1) {
						$status = '<div class="btn btn-success" >' . _l('Adjusted') . '</div>';
					} elseif((int) $aRow['status'] == -1){

						$status = '<div class="btn btn-danger" >' . _l('reject') . '</div>';

					}

					$row[] = $status;

					$row[] = $aRow['reason'];
					$row[] = get_staff_full_name($aRow['addfrom']);

					$option = '';

					if (is_admin() || has_permission('warehouse', '', 'view')) {

						$option .= '<a href="' . admin_url('warehouse/view_lost_adjustment/' . $aRow['id']) . '" class="btn btn-default btn-icon" >';
						$option .= '<i class="fa fa-eye"></i>';
						$option .= '</a>';
					}

					if (is_admin() || has_permission('warehouse', '', 'edit')) { 

						if ((int) $aRow['status'] == 0) {
							$option .= '<a href="' . admin_url('warehouse/add_loss_adjustment/' . $aRow['id']) . '" class="btn btn-default btn-icon" >';
							$option .= '<i class="fa fa-pencil-square-o"></i>';
							$option .= '</a>';
						}
					}

					if (is_admin() || has_permission('warehouse', '', 'delete')) { 
						if ((int) $aRow['status'] == 0 || is_admin()) {
							$option .= '<a href="' . admin_url('warehouse/delete_loss_adjustment/' . $aRow['id']) . '" class="btn btn-danger btn-icon _delete">';
							$option .= '<i class="fa fa-remove"></i>';
							$option .= '</a>';
						}
					}

					$row[] = $option;
					if ($allow_add == 1) {
						$output['aaData'][] = $row;
					}
				}

				echo json_encode($output);
				die();
			}
		}
	}

	/**
	 * add loss adjustment
	 * @param string $id
	 * @return view 
	 */
	public function add_loss_adjustment($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();
			$data['date_create'] = to_sql_date1(get_my_local_time("Y-m-d H:i:s"), true);
			$data['addfrom'] = get_staff_user_id1();
			$id = $this->request->getPost('id');

			if (!$this->request->getPost('id')) {
				unset($data['id']);
				$id = $this->warehouse_model->add_loss_adjustment($data);
				if ($id) {
					$success = true;
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				}
				app_redirect("warehouse/loss_adjustment");
			} else {
				$success = $this->warehouse_model->update_loss_adjustment($data);
				if ($success) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				}
				app_redirect("warehouse/loss_adjustment");
			}
		}

		$data['warehouses'] = $this->warehouse_model->get_warehouse_code_name();
		$data['title'] = _l('loss_adjustment');
		$data['ajaxItems'] = false;

		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('can_be_inventory');
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}
		$warehouse_data = $this->warehouse_model->get_warehouse();
		//sample
		$loss_adjustment_row_template = $this->warehouse_model->create_loss_adjustment_row_template();
		$data['internal_delivery_name_ex'] = 'LOSS_ADJUSTMENT' . date('YmdHi');

		if ($id != '') {
			$data['loss_adjustment'] = $this->warehouse_model->get_loss_adjustment($id);
			$loss_adjustments = $this->warehouse_model->get_loss_adjustment_detailt_by_masterid($id);

			if (count($loss_adjustments) > 0) {
				$index_internal_delivery = 0;
				foreach ($loss_adjustments as $loss_adjustment) {
					$index_internal_delivery++;
					$unit_name = wh_get_unit_name($loss_adjustment['unit']);
					$commodity_name = $loss_adjustment['commodity_name'];
					$expiry_date = null;
					
					if(strlen($commodity_name) == 0){
						$commodity_name = wh_get_item_variatiom($loss_adjustment['items']);
					}
					if($loss_adjustment['expiry_date'] != null && $loss_adjustment['expiry_date'] != ''){
						$expiry_date = format_to_date($loss_adjustment['expiry_date'], false);
					}
					
					$loss_adjustment_row_template .= $this->warehouse_model->create_loss_adjustment_row_template('items[' . $index_internal_delivery . ']', $commodity_name, $loss_adjustment['current_number'],$loss_adjustment['updates_number'], $unit_name, $expiry_date, $loss_adjustment['lot_number'],  $loss_adjustment['items'], $loss_adjustment['unit'] , $loss_adjustment['id'], true, $loss_adjustment['serial_number']);
				}
			}

			$data['title'] = _l('update_loss_adjustment');
		}

		$data['current_day'] = date('Y-m-d');
		$data['loss_adjustment_row_template'] = $loss_adjustment_row_template;

		return $this->template->rander("Warehouse\Views\loss_adjustment\add_loss_adjustment", $data);
	}

	/**
	 * adjust
	 * @param  [integer] $id 
	 * @return json     
	 */
	public function adjust($id) {
		$success = $this->warehouse_model->change_adjust($id);
		echo json_encode([
			'success' => $success,
		]);
		die;
	}

	/**
	 * { delete loss adjustment }
	 *
	 * @param      <type>  $id     The identifier
	 */
	public function delete_loss_adjustment() {

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}
		$id = $this->request->getPost('id');
		$response = $this->warehouse_model->delete_loss_adjustment($id);
		if ($response == true) {
			$this->session->setFlashdata("success_message", app_lang("wh_deleted"));
		} else {
			$this->session->setFlashdata("error_message", app_lang("problem_deleting"));
		}
		app_redirect('warehouse/loss_adjustment');

	}

	/**
	 * { get data inventory valuation report }
	 *
	 * @return json
	 */
	public function get_data_inventory_valuation_report() {
		if ($this->request->getPost()) {
			$data = $this->request->getPost();

			$inventory_valuation_report = $this->warehouse_model->get_inventory_valuation_report_view($data);
		}

		echo json_encode([
			'value' => $inventory_valuation_report,
		]);
		die();
	}

	/**
	 * table out of stock
	 * @return [type]
	 */
	public function table_out_of_stock() {

		$this->app->get_table_data(module_views_path('Warehouse', 'table_out_of_stock'));
	}

	/**
	 * table expired
	 * @return [type]
	 */
	public function table_expired() {

		$this->app->get_table_data(module_views_path('Warehouse', 'table_expired'));
	}

	/**
	 * view commodity detail
	 * @param  [integer] $commodity_id
	 * @return [type]
	 */
	public function view_commodity_detail($commodity_id) {
		$commodity_item = get_commodity_name($commodity_id);

		if (!$commodity_item) {
			blank_page('commodity item Not Found', 'danger');
		}

		//user for sub
		$data['units'] = $this->warehouse_model->get_unit_add_commodity();
		$data['commodity_types'] = $this->warehouse_model->get_commodity_type_add_commodity();
		$data['commodity_groups'] = $this->warehouse_model->get_commodity_group_add_commodity();
		$data['warehouses'] = $this->warehouse_model->get_warehouse_add_commodity();
		$tax_options = array(
			"deleted" => 0,
		);
		$data['taxes'] = $this->Taxes_model->get_details($tax_options)->getResultArray();
		$data['styles'] = $this->warehouse_model->get_style_add_commodity();
		$data['models'] = $this->warehouse_model->get_body_add_commodity();
		$data['sizes'] = $this->warehouse_model->get_size_add_commodity();
		$data['sub_groups'] = [];
		$data['colors'] = $this->warehouse_model->get_color_add_commodity();
		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('', true);
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}
		$data['title'] = _l("item_detail");


		$data['commodity_item'] = $commodity_item;
		$data['commodity_file'] = [];

		$model_info = $this->Items_model->get_details(array("id" => $commodity_id, "login_user_id" => $this->login_user->id))->getRow();
        $data['model_info'] = $model_info;

		return $this->template->rander("Warehouse\Views\items\commodity_detail", $data);
	}

	/**
	 * table view commodity detail
	 * @return [type]
	 */
	public function table_view_commodity_detail() {
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'items/item_details/table_view_commodity_detail'), $dataPost);
	}

	/**
	 * delete goods receipt
	 * @param  [integer] $id
	 * @return redirect
	 */
	public function delete_goods_receipt() {

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}
		$id = $this->request->getPost('id');
		$response = $this->warehouse_model->delete_goods_receipt($id);
		if ($response == true) {
			$this->session->setFlashdata("success_message", app_lang("wh_deleted"));
		} else {
			$this->session->setFlashdata("error_message", app_lang("problem_deleting"));
		}
		app_redirect('warehouse/manage_purchase');
	}

	/**
	 * delete_goods_delivery
	 * @param  [integer] $id
	 * @return [redirect]
	 */
	public function delete_goods_delivery() {

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}
		$id = $this->request->getPost('id');
		$response = $this->warehouse_model->delete_goods_delivery($id);
		if ($response == true) {
			$this->session->setFlashdata("success_message", app_lang("wh_deleted"));
		} else {
			$this->session->setFlashdata("error_message", app_lang("problem_deleting"));
		}
		app_redirect('warehouse/manage_delivery');
	}

	/**
	 * Gets the commodity barcode.
	 */
	public function get_commodity_barcode() {
		$commodity_barcode = $this->warehouse_model->generate_commodity_barcode();

		echo json_encode([
			$commodity_barcode,
		]);
		die();
	}

	/**
	 * table inventory stock
	 * @return [type]
	 */
	public function table_inventory_stock() {
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'items/item_details/table_inventory_stock'), $dataPost);
	}

	 /**
	 * { tax change event }
	 *
	 * @param      <type>  $tax    The tax
	 * @return   json
	 */
	 public function tax_change($tax){
		$total_tax = $this->warehouse_model->get_taxe_value($tax);
		$tax_rate = 0;
		if($total_tax){
			$tax_rate = get_object_vars($total_tax)['taxrate'] + 0;
		}

		echo json_encode([
			'tax_rate' => $tax_rate,
		]);
	 }


	 /**
	  * tax change v2
	  * @param  [type] $tax 
	  * @return [type]
	  * this funtion used when $tax like 4|3      
	  */
	 public function tax_change_v2(){
		$tax_rate = 0;

		$tax = $this->request->getPost('tax_id');
		$tax = str_replace('|', ',', $tax);

		$total_tax = $this->warehouse_model->get_taxe_value_by_ids($tax);
		foreach ($total_tax as $tax_value) {
			$tax_rate += (float)$tax_value['taxrate'];
		}

		echo json_encode([
			'tax_rate' => $tax_rate,
		]);
	 }




	/**
	 * get invoices fill data
	 * @return json 
	 */
	public function get_invoices_fill_data()
	{
		$this->load->model('clients_model');
		$address='';

		$data = $this->request->getPost();
		$customer_value = $this->clients_model->get($data['customer_id']);

		if(isset($customer_value) && !is_array($customer_value)){
			$address .= $customer_value->shipping_street.', '.$customer_value->shipping_city.', '.$customer_value->shipping_state.', '.get_country_name($customer_value->shipping_country);
		}

		$invoices = $this->warehouse_model->get_invoices_by_customer($data['customer_id']);

		echo json_encode([
			'invoices' => $invoices,
			'address' => $address,

		]);

	}

	/**
	 * manage delivery filter
	 * @param  integer $id
	 * @return view
	 */
	public function manage_delivery_filter($id = '') {


		$data['invoice_id'] = $id;
		$data['delivery_id'] = '';

		$data['title'] = _l('stock_delivery_manage');
		$this->load->view('manage_goods_delivery/manage_delivery', $data);
	}


	/**
	 * warehouse delete bulk action
	 * @return
	 */
	public function warehouse_delete_bulk_action()
	{
		$this->access_only_team_members();

		$total_deleted = 0;
		$total_updated = 0;
		$total_cloned = 0;
		if ($this->request->getPost()) {

			$ids                   = $this->request->getPost('ids');
			$rel_type                   = $this->request->getPost('rel_type');

			/*check permission*/
			switch ($rel_type) {
				case 'commodity_list':
				if (!has_permission('warehouse', '', 'delete') && !$this->login_user->is_admin) {
					app_redirect("forbidden");
				}
				break;

				case 'change_item_selling_price':
				if (!has_permission('warehouse', '', 'edit') && !$this->login_user->is_admin) {
					app_redirect("forbidden");
				}
				break;

				case 'change_item_purchase_price':
				if (!has_permission('warehouse', '', 'edit') && !$this->login_user->is_admin) {
					app_redirect("forbidden");
				}
				break;

				


				default:
				break;
			}

			/*delete data*/
			if ( $this->request->getPost('mass_delete') && $this->request->getPost('mass_delete') == 'true' ) {
				if (is_array($ids)) {
					foreach ($ids as $id) {

						switch ($rel_type) {
							case 'commodity_list':
							if ($this->warehouse_model->delete_commodity($id)) {
								$total_deleted++;
								break;
							}else{
								break;
							}

							default:

							break;
						}


					}
				}

				/*return result*/
				switch ($rel_type) {
					case 'commodity_list':
					$this->session->setFlashdata("success_message", app_lang("total_commodity_list"). ": " .$total_deleted);

					break;

					default:
					break;

				}


			}

			// Clone items
			if ($this->request->getPost('clone_items') && $this->request->getPost('clone_items') == 'true') {
				if (is_array($ids)) {
					foreach ($ids as $id) {

							switch ($rel_type) {
								case 'commodity_list':
									if ($this->warehouse_model->clone_item($id)) {
										$total_cloned++;
										break;
									}else{
										break;
									}
								
								default:
								   
									break;
							}
						}
					}
				/*return result*/
				switch ($rel_type) {
					case 'commodity_list':
						$this->session->setFlashdata("success_message", app_lang("total_commodity_list"). ": " .$total_cloned);

						break;

					default:
						break;

				}
			}

			// update selling price, purchase price
			if ( ($this->request->getPost('change_item_selling_price') ) || ($this->request->getPost('change_item_purchase_price') )  )  {

				if (is_array($ids)) {
					foreach ($ids as $id) {

						switch ($rel_type) {
							case 'change_item_selling_price':
							if ($this->warehouse_model->commodity_udpate_profit_rate($id, $this->request->getPost('selling_price'), 'selling_percent' )) {
								$total_updated++;
								break;
							}else{
								break;
							}

							case 'change_item_purchase_price':
							if ($this->warehouse_model->commodity_udpate_profit_rate($id, $this->request->getPost('purchase_price'), 'purchase_percent' )) {
								$total_updated++;
								break;
							}else{
								break;
							}
							

							default:

							break;
						}


					}
				}

				/*return result*/
				switch ($rel_type) {
					case 'change_item_selling_price':
					$this->session->setFlashdata("success_message", app_lang("total_commodity_list"). ": " .$total_updated);
					break;

					case 'change_item_purchase_price':
					$this->session->setFlashdata("success_message", app_lang("total_commodity_list"). ": " .$total_updated);
					break;

					default:
					break;

				}

			}


		}


	}


	/**
	 * get subgroup fill data
	 * @return html 
	 */
	public function get_subgroup_fill_data()
	{
		$data = $this->request->getPost();

		$subgroup = $this->warehouse_model->list_subgroup_by_group($data['group_id']);

		echo json_encode([
			'subgroup' => $subgroup
		]);

	}

	/**
	 * warehouse selling price profif ratio
	 * @return boolean 
	 */
	public function warehouse_selling_price_profif_ratio(){
		$data = $this->request->getPost();

		if (!has_permission('warehouse', '', 'edit') && !is_admin()) {
			$success = false;
			$message = _l('Not permission edit');

			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}

		if($data != 'null'){
			$value = $this->warehouse_model->update_warehouse_selling_price_profif_ratio($data);
			if($value){
				$success = true;
				$message = _l('updated_successfully');
			}else{
				$success = false;
				$message = _l('updated_false');
			}
			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}
	}

	/**
	 * warehouse the fractional part
	 * @return boolean 
	 */
	public function warehouse_the_fractional_part(){
		$data = $this->request->getPost();
		if($data != 'null'){
			$value = $this->warehouse_model->update_warehouse_the_fractional_part($data);
			if($value){
				$success = true;
				$message = _l('updated_successfully');
			}else{
				$success = false;
				$message = _l('updated_false');
			}
			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}
	}
	
	/**
	 * warehouse integer part
	 * @return boolean 
	 */
	public function warehouse_integer_part(){
		$data = $this->request->getPost();
		if($data != 'null'){
			$value = $this->warehouse_model->update_warehouse_integer_part($data);
			if($value){
				$success = true;
				$message = _l('updated_successfully');
			}else{
				$success = false;
				$message = _l('updated_false');
			}
			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}
	}

	/**
	 * warehouse profit rate by purchase price sale
	 * @return boolean 
	 */
	public function warehouse_profit_rate_by_purchase_price_sale(){
		$data = $this->request->getPost();

		if (!has_permission('warehouse', '', 'edit') && !is_admin()) {
			$success = false;
			$message = _l('Not permission edit');

			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}

		if($data != 'null'){
			$value = $this->warehouse_model->update_profit_rate_by_purchase_price_sale($data);
			if($value){
				$success = true;
				$message = _l('updated_successfully');
			}else{
				$success = false;
				$message = _l('updated_false');
			}
			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}
	}

	/**
	 * setting rules for rounding prices
	 * @return boolean 
	 */
	public function setting_rules_for_rounding_prices(){
		$data = $this->request->getPost();

		if (!has_permission('warehouse', '', 'edit') && !is_admin()) {
			$success = false;
			$message = _l('Not permission edit');

			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}

		if($data != 'null'){
			$value = $this->warehouse_model->update_rules_for_rounding_prices($data);
			if($value){
				$success = true;
				$message = _l('updated_successfully');
			}else{
				$success = false;
				$message = _l('updated_false');
			}
			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}
	}

	/**
	 * caculator sale price
	 * @return float 
	 */
	public function caculator_sale_price()
	{
		$data = $this->request->getPost();
		$sale_price = 0;

		/*type : 0 purchase price, 1: sale price*/
		$profit_type = get_setting('profit_rate_by_purchase_price_sale');
		$the_fractional_part = get_setting('warehouse_the_fractional_part');
		$integer_part = get_setting('warehouse_integer_part');

		$profit_rate = $data['profit_rate'];
		$purchase_price = $data['purchase_price'];

		switch ($profit_type) {
			case '0':
				# Calculate the selling price based on the purchase price rate of profit
				# sale price = purchase price * ( 1 + profit rate)
			if( ($profit_rate =='') || ($profit_rate == '0')|| ($profit_rate == 'null') ){

				$sale_price = (float)$purchase_price;
			}else{
				$sale_price = (float)$purchase_price*(1+((float)$profit_rate/100));

			}
			break;

			case '1':
				# Calculate the selling price based on the selling price rate of profit
				# sale price = purchase price / ( 1 - profit rate)
			if( ($profit_rate =='') || ($profit_rate == '0')|| ($profit_rate == 'null') ){

				$sale_price = (float)$purchase_price;
			}else{
				$sale_price = (float)$purchase_price/(1-((float)$profit_rate/100));

			}
			break;
			
		}

		//round sale_price
		$sale_price = round($sale_price, (int)$the_fractional_part);

		if($integer_part != '0'){
			$integer_part = 0 - (int)($integer_part);
			$sale_price = round($sale_price, $integer_part);
		}

		echo json_encode([
			'sale_price' => $sale_price,
		]);
		die;

	}

	/**
	 * table inventory inside
	 *
	 * @return array
	 */
	public function table_inventory_inside() {
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'reports/inventory_analytics/table_inventory_inside'), $dataPost);
	}
	
	 /**
	 * { purchase order setting }
	 * @return  json
	 */
	 public function auto_create_goods_received_delivery_setting(){
		$data = $this->request->getPost();

		if (!has_permission('warehouse', '', 'edit') && !is_admin()) {
			$success = false;
			$message = _l('Not permission edit');

			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}

		if($data != 'null'){
			$value = $this->warehouse_model->update_auto_create_received_delivery_setting($data);
			if($value){
				$success = true;
				$message = _l('updated_successfully');
			}else{
				$success = false;
				$message = _l('updated_false');
			}
			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}
	 }


	/**
	 * update goods receipt warehouse
	 * @return json 
	 */
	public function update_goods_receipt_warehouse(){
		$data = $this->request->getPost();

		if (!has_permission('warehouse', '', 'edit') && !is_admin()) {
			$success = false;
			$message = _l('Not permission edit');

			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}

		if($data != 'null'){
			$value = $this->warehouse_model->update_goods_receipt_warehouse($data);
			if($value){
				$success = true;
				$message = _l('updated_successfully');
			}else{
				$success = false;
				$message = _l('updated_false');
			}
			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}
	}


	/**
	 * coppy invoices
	 * @param  integer $invoice_id 
	 * @return json              
	 */
	public function copy_invoices($invoice_id = '') {

		$invoices_detail = $this->warehouse_model->copy_invoice($invoice_id);
		if($invoice_id != ''){
			$invoice_no = format_invoice_number($invoice_id);
		}else{
			$invoice_no = '';
		}
		echo json_encode([

			'result' => $invoices_detail['goods_delivery_detail'],
			'goods_delivery' => $invoices_detail['goods_delivery'],
			'status' => $invoices_detail['status'],
			'invoice_no' => $invoice_no,
		]);
	}

	/**
	 * caculator purchase price
	 * @return json 
	 */
	public function caculator_profit_rate()
	{
		$data = $this->request->getPost();
		$profit_rate = 0;

		/*type : 0 purchase price, 1: sale price*/
		$profit_type = get_setting('profit_rate_by_purchase_price_sale');
		$the_fractional_part = get_setting('warehouse_the_fractional_part');
		$integer_part = get_setting('warehouse_integer_part');

		$purchase_price = $data['purchase_price'];
		$sale_price = $data['sale_price'];


		switch ($profit_type) {
			case '0':
				# Calculate the selling price based on the purchase price rate of profit
				# sale price = purchase price * ( 1 + profit rate)

			if( ($purchase_price =='') || ($purchase_price == '0')|| ($purchase_price == 'null') ){
				$profit_rate = 0;

			}else{
				$profit_rate = (((float)$sale_price/(float)$purchase_price)-1)*100;

			}
			break;

			case '1':
				# Calculate the selling price based on the selling price rate of profit
				# sale price = purchase price / ( 1 - profit rate)

			$profit_rate = (1-((float)$purchase_price/(float)$sale_price))*100;

			break;

		}


		echo json_encode([
			'profit_rate' => $profit_rate,
		]);
		die;

	}

	/**
	 * warehouse delete bulk action
	 * @return
	 */
	public function warehouse_export_item_checked()
	{
		$this->access_only_team_members();
		$user_id = $this->login_user->id;

		if(!class_exists('XLSXReader_fin')){
			require_once(module_dir_path(WAREHOUSE_MODULE_NAME).'/assets/plugins/XLSXReader/XLSXReader.php');
		}
		require_once(module_dir_path(WAREHOUSE_MODULE_NAME).'/assets/plugins/XLSXWriter/xlsxwriter.class.php');

		if ($this->request->getPost()) {

			/*delete export file before export file*/
			$path_before = COMMODITY_EXPORT.'export_excel_'.$user_id.'.xlsx';
			if(file_exists($path_before)){
				unlink(COMMODITY_EXPORT.'export_excel_'.$user_id.'.xlsx');
			}

			$ids                   = $this->request->getPost('ids');

			//Writer file
			$writer_header = array(
				"(*)" ._l('commodity_code')          =>'string',
				"(*)" ._l('commodity_name')          =>'string',
				_l('commodity_barcode')          =>'string',
				_l('sku_code')          =>'string',
				_l('sku_name')          =>'string',

				_l('description')          =>'string',
				_l('commodity_type')          =>'string',
				_l('unit_id')          =>'string',
				"(*)" ._l('category_id')          =>'string',

				_l('_profit_rate'). "(%)"          =>'string',
				_l('purchase_price')          =>'string',
				"(*)" ._l('rate')          =>'string',
				_l('tax')          =>'string',
				_l('origin')          =>'string',
				_l('style_id')          =>'string',
				_l('model_id')          =>'string',
				_l('size_id')          =>'string',
				_l('_color')          =>'string',
				_l('guarantee_month')          =>'string',
				_l('minimum_inventory')          =>'string',
			);

			$widths_arr = array();
			for($i = 1; $i <= count($writer_header); $i++ ){
				$widths_arr[] = 40;
			}

			$writer = new \XLSXWriter();

			$col_style1 =[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];
			$style1 = ['widths'=> $widths_arr, 'fill' => '#ff9800',  'font-style'=>'bold', 'color' => '#0a0a0a', 'border'=>'left,right,top,bottom', 'border-color' => '#0a0a0a', 'font-size' => 13 ];

			$writer->writeSheetHeader_v2('Inventory Items Import Excel', $writer_header,  $col_options = ['widths'=> $widths_arr, 'fill' => '#f44336',  'font-style'=>'bold', 'color' => '#0a0a0a', 'border'=>'left,right,top,bottom', 'border-color' => '#0a0a0a', 'font-size' => 13 ], $col_style1, $style1);


			// Add some data
			$x= 2;
			if(isset($ids)){
				if(count($ids) > 0){
					foreach ($ids as $value) {
						$inventory_min=0;

						$item = $this->warehouse_model->get_commodity($value);

						/*get inventory min*/
						$builder = db_connect('default');
						$builder = $builder->table(get_db_prefix().'inventory_commodity_min');
						$builder->where('commodity_id', $value);
						$inventory_value = $builder->get()->getRow();
						if($inventory_value){
							$inventory_min =  $inventory_value->inventory_number_min;
						}


						if($item){
							$writer->writeSheetRow('Inventory Items Import Excel', [
								$item->commodity_code,
								$item->title,
								$item->commodity_barcode,
								$item->sku_code,
								$item->sku_name,

								$item->description,
								$item->commodity_type,
								$item->unit_id,
								$item->category_id,
								$item->profif_ratio,
								$item->purchase_price,
								$item->rate,
								$item->tax,
								$item->origin,
								$item->style_id,
								$item->model_id,
								$item->size_id,
								$item->color,
								$item->guarantee,
								$inventory_min,
							]);
						}
					}

				}

			}

			// Rename worksheet

			// Redirect output to a client’s web browser (Excel2007)
			header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
			header('Content-Disposition: attachment;filename="inventory_items_sheet.xlsx"');
			header('Cache-Control: max-age=0');

			// If you're serving to IE 9, then the following may be needed
			header('Cache-Control: max-age=1');

			// If you're serving to IE over SSL, then the following may be needed
			header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
			header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
			header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
			header('Pragma: public'); // HTTP/1.0

			$filename = 'export_excel_'.$user_id.strtotime(date('Y-m-d H:i:s')).'.xlsx';
			$writer->writeToFile(str_replace($filename, WAREHOUSE_EXPORT_ITEM.$filename, $filename));

			echo json_encode(['success' => true,
				'filename' => WAREHOUSE_EXPORT_ITEM.$filename,
				'base_url'          => base_url(),
			]);

			exit;
		}
	}

	/**
	 * get list job position training
	 * @param  integer $id 
	 * @return json     
	 */
	public function get_item_longdescriptions($id){
		$variation_html = $this->warehouse_model->get_variation_html($id);
		$list = $this->warehouse_model->get_item_longdescriptions($id);

		$custom_fields_html = render_custom_fields('items', $id, [], ['items_pr' => true]);
		$item_tags = $this->warehouse_model->get_list_item_tags($id);

		if((get_tags_in($id,'item_tags') != null)){
			$item_value = implode(',', get_tags_in($id,'item_tags')) ;
		}else{

			$item_value = '';
		}

		if(isset($list)){
			$long_descriptions = $list->long_descriptions;
			$description = $list->long_description;
		}else{
			$long_descriptions = '';
			$description = '';

		}

		//check have child item
		$flag_is_parent = false;    	
		$this->db->where('parent_id', $id);
		$array_child_value = $this->db->get(get_db_prefix().'items')->getResultArray();

		if(count($array_child_value) > 0){
			$flag_is_parent = true;
		}

		$this->db->where('id', $id);
		$item_value = $this->db->get(get_db_prefix().'items')->row();

		if($item_value){
			$parent_id = $item_value->parent_id;
		}else{
			$parent_id = '';
		}

		$data['ajaxItems'] = false;
		if (total_rows(get_db_prefix() . 'items', 'parent_id is null or parent_id = ""') <= ajax_on_total_items()) {
			if(is_numeric($parent_id) && $parent_id != 0 ){
				$data['items'] = $this->warehouse_model->get_parent_item_grouped($parent_id);
			}else{
				$data['items'] = $this->warehouse_model->get_parent_item_grouped();
			}
		} else {
			if(is_numeric($parent_id) && $parent_id != 0 ){
				$data['items']     = $this->warehouse_model->get_parent_item_grouped($parent_id);
			}else{
				$data['items']     = [];
				$data['ajaxItems'] = true;
			}
		}

		$parent_data = $this->load->view('item_include/item_select', ['ajaxItems' => $data['ajaxItems'], 'items' => $data['items'] , 'select_name' => 'parent_id', 'id_name' => 'parent_id', 'data_none_selected_text' => '', 'label_name' => 'parent_item', 'item_id' => $parent_id ], true);

		echo json_encode([ 
			'long_descriptions' => $long_descriptions,
			'description' => $description,
			'custom_fields_html' => $custom_fields_html,
			'item_tags' => $item_tags['htmltag'],
			'item_value' => $item_value,
			'variation_html' => $variation_html['html'],
			'variation_index' => $variation_html['index'],
			'item_html' => $parent_data,
			'flag_is_parent' => $flag_is_parent,

		]);
	}


	/**
	 * revert goods receipt
	 * @param  integer $id 
	 * @return redirect        
	 */
	public function revert_goods_receipt($id)
	{	
		$response = $this->warehouse_model->revert_goods_receipt($id);

		if ($response == true) {
			$this->session->setFlashdata("success_message", app_lang("deleted"));
		} else {
			$this->session->setFlashdata("error_message", app_lang("problem_deleting"));
		}
		app_redirect("warehouse/manage_purchase");
	}

	/**
	 * revert goods delivery
	 * @param  integer $id 
	 * @return redirect    
	 */
	public function revert_goods_delivery($id)
	{	
		$response = $this->warehouse_model->revert_goods_delivery($id);

		if ($response == true) {
			$this->session->setFlashdata("success_message", app_lang("deleted"));
		} else {
			$this->session->setFlashdata("error_message", app_lang("problem_deleting"));
		}
		app_redirect("warehouse/manage_delivery");

	}

	/**
	 * import xlsx opening stock
	 * @param  integer $id
	 * @return view
	 */
	public function import_opening_stock() {
		if (!is_admin() && !has_permission('warehouse', '', 'create')) {
			app_redirect("forbidden");
		}
		
		$user_id = $this->login_user->id;

		$_personal_language = get_setting('user_' . $user_id . '_personal_language');
		if(strlen($_personal_language) == 0){
			$_personal_language = get_setting("language");
		}

		$data['active_language'] = $_personal_language;
		$data['title'] = _l('import_opening_stock');
		$data['site_url'] = base_url();

		return $this->template->rander("Warehouse\Views\items\import_excel_opening_stock", $data);
	}


	/**
	 * import file xlsx opening stock
	 * @return json 
	 */
	public function import_file_xlsx_opening_stock() {
		if (!is_admin() && !has_permission('warehouse', '', 'create')) {
			app_redirect("forbidden");
		}

		$user_id = $this->login_user->id;

		if(!class_exists('XLSXReader_fin')){
			require_once(module_dir_path(WAREHOUSE_MODULE_NAME).'/assets/plugins/XLSXReader/XLSXReader.php');
		}
		require_once(module_dir_path(WAREHOUSE_MODULE_NAME).'/assets/plugins/XLSXWriter/xlsxwriter.class.php');

		$total_row_false = 0;
		$total_rows_data = 0;
		$dataerror = 0;
		$total_row_success = 0;
		$total_rows_data_error = 0;
		$filename='';

		if ($this->request->getPost()) {

			if (isset($_FILES['file_csv']['name']) && $_FILES['file_csv']['name'] != '') {

				// Get the temp file path
				$tmpFilePath = $_FILES['file_csv']['tmp_name'];
				// Make sure we have a filepath
				if (!empty($tmpFilePath) && $tmpFilePath != '') {
					$temp_file_path = get_setting("temp_file_path");
					$tmpDir = getcwd() . '/' . $temp_file_path;
					if (!is_dir($tmpDir)) {
						if (!mkdir($tmpDir, 0777, true)) {
							die('Failed to create file folders.');
						}
					}

					// Setup our new file path
					$newFilePath = $tmpDir . $_FILES['file_csv']['name'];

					if (move_uploaded_file($tmpFilePath, $newFilePath)) {
						$import_result = true;
						$rows = [];

						//Writer file
						$writer_header = array(
							"(*)" ._l('commodity_code')          =>'string',
							"(*)" ._l('warehouse_code')          =>'string',
							_l('lot_number')          =>'string',
							_l('expiry_date').'(yyyy-mm-dd)'          =>'string',
							"(*)" ._l('inventory_number')          =>'string',
							_l('error')                     =>'string',
						);

						$widths_arr = array();
						for($i = 1; $i <= count($writer_header); $i++ ){
							$widths_arr[] = 40;
						}

						$writer = new \XLSXWriter();

						$col_style1 =[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21];
						$style1 = ['widths'=> $widths_arr, 'fill' => '#ff9800',  'font-style'=>'bold', 'color' => '#0a0a0a', 'border'=>'left,right,top,bottom', 'border-color' => '#0a0a0a', 'font-size' => 13 ];

						$writer->writeSheetHeader_v2('Sheet1', $writer_header,  $col_options = ['widths'=> $widths_arr, 'fill' => '#f44336',  'font-style'=>'bold', 'color' => '#0a0a0a', 'border'=>'left,right,top,bottom', 'border-color' => '#0a0a0a', 'font-size' => 13 ], $col_style1, $style1);

						//init file error end

						//Reader file
						$xlsx = new \XLSXReader_fin($newFilePath);
						$sheetNames = $xlsx->getSheetNames();
						$data = $xlsx->getSheetData($sheetNames[1]);

						// start row write 2
						$numRow = 2;
						$total_rows = 0;

						$total_rows_actualy = 0;
						
						//get data for compare

						for ($row = 1; $row < count($data); $row++) {
								$rd = array();
								$flag = 0;
								$flag2 = 0;
								$flag_mail = 0;
								$string_error = '';
								$flag_contract_form = 0;

								$flag_id_commodity_code;
								$flag_id_warehouse_code;

								$value_cell_commodity_code = isset($data[$row][0]) ? $data[$row][0] : null ;
								$value_cell_warehouse_code = isset($data[$row][1]) ? $data[$row][1] : null ;
								$value_cell_lot_number = isset($data[$row][2]) ? $data[$row][2] : '' ;
								$value_cell_expiry_date = isset($data[$row][3]) ? $data[$row][3] : '' ;
								$value_cell_inventory_number = isset($data[$row][4]) ? $data[$row][4] : null ;

								$pattern = '#^[a-z][a-z0-9\._]{2,31}@[a-z0-9\-]{3,}(\.[a-z]{2,4}){1,2}$#';

								$reg_day = '#^(((1)[0-2]))(\/)\d{4}-(3)[0-1])(\/)(((0)[0-9])-[0-2][0-9]$#'; /*yyyy-mm-dd*/

								/*check null*/
								if (is_null($value_cell_commodity_code) == true) {
									$string_error .= _l('commodity_code') . _l('not_yet_entered');
									$flag = 1;
								}

								if (is_null($value_cell_warehouse_code) == true) {
									$string_error .= _l('warehouse_code') . _l('not_yet_entered');
									$flag = 1;
								}

								if (is_null($value_cell_inventory_number) == true) {
									$string_error .= _l('inventory_number') . _l('not_yet_entered');
									$flag = 1;
								}
								

								//check commodity_code exist  (input: code or name item)
								if (is_null($value_cell_commodity_code) != true && $value_cell_commodity_code != '0' ) {
									/*case input  id*/
									$builder = db_connect('default');
									$builder = $builder->table(get_db_prefix().'items');
									$builder->where('commodity_code', trim($value_cell_commodity_code, " "));
									$builder->orWhere('description', trim($value_cell_commodity_code, " "));
									$item_value =  $builder->get()->getRow();

									if ($item_value) {
										/*get id commodity_type*/
										$flag_id_commodity_code = $item_value->id;
									} else {
										$string_error .= _l('commodity_code') . _l('does_not_exist');
										$flag2 = 1;
									}


								}

								//check warehouse exist  (input: id or name warehouse)
								if (is_null($value_cell_warehouse_code) != true && ( $value_cell_warehouse_code != '0')) {
									/*case input id*/
									$builder = db_connect('default');
									$builder = $builder->table(get_db_prefix().'warehouse');
									$builder->where('warehouse_code', trim($value_cell_warehouse_code, " "));
									$builder->orWhere('warehouse_name', trim($value_cell_warehouse_code, " "));
									$warehouse_value = $builder->get()->getRow();

									if ($warehouse_value) {
										/*get id unit_id*/
										$flag_id_warehouse_code = $warehouse_value->warehouse_id;

									} else {
										$string_error .= _l('_warehouse') . _l('does_not_exist');
										$flag2 = 1;
									}

								}

								if (is_null($value_cell_expiry_date) != true && $value_cell_expiry_date != '') {

									if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", trim($value_cell_expiry_date, " "))) {
										$test = true;

									} else {
										$flag2 = 1;
										$string_error .= _l('expiry_date') . _l('invalid');

									}
								}


								// check inventory number
								if (!is_numeric(trim($value_cell_inventory_number, " "))) {

									$string_error .=_l('inventory_number'). _l('_not_a_number');
									$flag2 = 1; 	

								} 


								

								if (($flag == 1) || ($flag2 == 1)) {
									//write error file
									$writer->writeSheetRow('Sheet1', [
										$value_cell_commodity_code,
										$value_cell_warehouse_code,
										$value_cell_lot_number,
										$value_cell_expiry_date,
										$value_cell_inventory_number,
										$string_error,
									]);

									$numRow++;
									$total_rows_data_error++;
								}

								if (($flag == 0) && ($flag2 == 0)) {

									/*staff id is HR_code, input is HR_CODE, insert => staffid*/
									$rd['commodity_code'] = $flag_id_commodity_code;
									$rd['warehouse_id'] = $flag_id_warehouse_code;
									$rd['lot_number'] 	  = isset($data[$row][2]) ? $data[$row][2] : '' ;

									$rd['expiry_date'] = (trim($value_cell_expiry_date, " "));
									if(isset($rd['expiry_date']) && $rd['expiry_date'] !=''){
										$rd['expiry_date'] = $rd['expiry_date'];
									}else{
										$rd['expiry_date'] = null;
									}

									$rd['quantities'] = isset($data[$row][4]) ? $data[$row][4] : '' ;
									$rd['date_manufacture'] = null;

								}

								if ($user_id != '' && $flag == 0 && $flag2 == 0) {
									$rows[] = $rd;
									$result_value = $this->warehouse_model->add_inventory_manage($rd, 1);
									if ($result_value) {
										//add transaction log
										$transaction_data=[];
										$purchase_price = $this->warehouse_model->get_purchase_price_from_commodity_code($rd['commodity_code']);
										$transaction_data['goods_receipt_id'] = 0;
										$transaction_data['purchase_price'] = (float)$purchase_price;
										$transaction_data['expiry_date'] = $rd['expiry_date'];
										$transaction_data['lot_number'] = $rd['lot_number'];
										/*get old quantity by item, warehouse*/
										$inventory_value = $this->warehouse_model->get_quantity_inventory($rd['warehouse_id'], $rd['commodity_code']);
										$old_quantity =  null;
										if($inventory_value){
											$old_quantity = $inventory_value->inventory_number;
										}

										$transaction_data['goods_id'] = 0;
										$transaction_data['old_quantity'] = (float)$old_quantity - (float)$rd['quantities'];
										$transaction_data['commodity_id'] = $rd['commodity_code'];
										$transaction_data['quantity'] = (float)$rd['quantities'];
										$transaction_data['date_add'] = date('Y-m-d H:i:s');
										$transaction_data['warehouse_id'] = $rd['warehouse_id'];
										$transaction_data['note'] = _l('import_opening_stock');
										$transaction_data['status'] = 1;
										
										$builder = db_connect('default');
										$builder = $builder->table(get_db_prefix().'goods_transaction_detail');
										$builder->insert($transaction_data);


										$total_rows_actualy++;
									}
								}

								$total_rows++;
								$total_rows_data++;

						}

						if ($total_rows_actualy != $total_rows) {
							$total_rows = $total_rows_actualy;
						}


						$total_rows = $total_rows;
						$data['total_rows_post'] = count($rows);
						$total_row_success = count($rows);
						$total_row_false = $total_rows - (int) count($rows);
						$message = 'Not enought rows for importing';

						if(($total_rows_data_error > 0) || ($total_row_false != 0)){

							$filename = 'FILE_ERROR_IMPORT_OPENING_STOCK' .$user_id.strtotime(date('Y-m-d H:i:s')). '.xlsx';
							$writer->writeToFile(str_replace($filename, WAREHOUSE_IMPORT_OPENING_STOCK.$filename, $filename));

							$filename = WAREHOUSE_IMPORT_OPENING_STOCK.$filename;


						}
						
						$import_result = true;
						delete_file_from_directory($newFilePath); //delete temp file
					}
					
				} else {
					set_alert('warning', _l('import_opening_stock_failed'));
				}
			}

		}
		echo json_encode([
			'message' =>'Not enought rows for importing',
			'total_row_success' => $total_row_success,
			'total_row_false' => $total_rows_data_error,
			'total_rows' => $total_rows_data,
			'site_url' => base_url(),
			'staff_id' => $user_id,
			'total_rows_data_error' => $total_rows_data_error,
			'filename' => $filename,
		]);

	}

	/**
	 * unserializeForm
	 * @param  [type] $str 
	 * @return [type]      
	 */
	public	function unserializeForm($str) {
		$strArray = explode("&", $str);
		foreach($strArray as $item) {
			$array = explode("=", $item);
			$returndata[] = $array;
		}
		return $returndata;
	}

	/**
	 * delete item tags
	 * @param  integer $tag_id 
	 * @return [type]         
	 */
	public function delete_item_tags($tag_id){

		$result = $this->warehouse_model->delete_tag_item($tag_id);
		if($result == 'true'){
			$message = _l('deleted');
			$status = 'true';
		}else{
			$message = _l('problem_deleting');
			$status = 'fasle';
		}

		echo json_encode([ 
			'message' => $message,
			'status' => $status,
		]);
	}

	/**
	 * check warehouse onsubmit
	 *  
	 */
	public function check_warehouse_onsubmit() {
		$data = $this->request->getPost();
		$flag = 0;
		$message = true;

		if ($data['hot_delivery'] != 'null') {
			foreach ($data['hot_delivery'] as $delivery_value) {
				if ( $delivery_value[0] != '' ) {

					/*case select warehouse handsome table*/
					if($data['warehouse_id'] == ''){
						if ( $delivery_value[1] == '' ) {
							$flag = 1;
						}
					}
				}

			}
			if ($flag == 1) {
				$message = false;

			} else {
				$message = true;
			}
			echo json_encode([
				'message' => $message,

			]);
			die;
		}
	}

	/**
	 * view lost adjustment
	 * @param  integer $id 
	 * @return view
	 */
	public function view_lost_adjustment($id) {

		$data['loss_adjustment'] = $this->warehouse_model->get_loss_adjustment($id);

		if(!$data['loss_adjustment']){
			blank_page('Not Found', 'danger');
		}
		//approval
		$session = \Config\Services::session();
		$send_mail_approve = $session->has("send_mail_approve");
		if (($send_mail_approve) && $session->get("send_mail_approve") != '') {

			$data['send_mail_approve'] = $session->get("send_mail_approve");
			$session->remove("send_mail_approve");
		}

		$data['get_staff_sign'] = $this->warehouse_model->get_staff_sign($id, 3);

		$data['check_approve_status'] = $this->warehouse_model->check_approval_details($id, 3);
		$data['list_approve_status'] = $this->warehouse_model->get_list_approval_details($id, 3);
		$data['payslip_log'] = $this->warehouse_model->get_activity_log($id, 3);

		//get vaule render dropdown select

		$data['loss_adjustment_detail']= $this->warehouse_model->get_loss_adjustment_detailt_by_masterid($id);

		$data['title'] = _l('loss_adjustment');


		$check_appr = $this->warehouse_model->get_approve_setting('3');
		$data['check_appr'] = $check_appr;

		return $this->template->rander("Warehouse\Views\loss_adjustment\loss_adjustment_detail", $data);

	}


	/**
	 * check lost adjustment before save
	 * @return json 
	 */
	public function check_lost_adjustment_before_save() {
		$data = $this->request->getPost();

		$result = $this->warehouse_model->check_lost_adjustment_before_save($data);
		if($result['flag_check'] == 1){
			$success = false;
			$message = $result['str_error'];
		}else{
			$success = true;
			$message = $result['str_error'];

		}

		echo json_encode([
			'success' => $success,
			'message' => $message,
		]);
		die;
	}

	/**
	 * [inventory_setting
	 * @return redirect 
	 */
	public function inventory_setting()
	{
		$data = $this->request->getPost();
		if ($data) {
			$success = $this->warehouse_model->update_inventory_setting($data);

			if ($success == true) {
				$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
			}
			app_redirect("warehouse/inventory_settings");

			redirect(admin_url('warehouse/setting?group=inventory_setting'));
		}
	}

	/**
	 * manage internal delivery
	 * @param  string $id 
	 * @return view     
	 */
	public function manage_internal_delivery($id = '')
	{
		$data['internal_id'] = $id;
		$data['title'] = _l('internal_delivery_note');
		return $this->template->rander("Warehouse\Views\manage_internal_delivery\manage", $data);
	}


	/**
	 * table internal delivery
	 * @return table 
	 */
	public function table_internal_delivery()
	{
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'manage_internal_delivery/table_internal_delivery_note'), $dataPost);
	}


	/**
	 * add update internal delivery
	 * @param string $id 
	 */
	public function add_update_internal_delivery($id ='') {
		
		$user_id = $this->login_user->id;
		if ($this->request->getPost()) {

			$data = $this->request->getPost();
			if (!$this->request->getPost('id')) {

				$mess = $this->warehouse_model->add_internal_delivery($data);
				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("add_internal_delivery_note_false"));
				}
				app_redirect("warehouse/manage_internal_delivery");
			}else{
				$id = $data['id'];
				unset($data['id']);

				$mess = $this->warehouse_model->update_internal_delivery($data,$id);
				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("update_internal_delivery_note_false"));
				}
				app_redirect("warehouse/manage_internal_delivery");
			}

		}

		//get vaule render dropdown select
		$data['title'] = _l('internal_delivery_note');
		$data['internal_delivery_name_ex'] = 'INTERNAL_DELIVERY' . date('YmdHi');
		$data['goods_code'] = $this->warehouse_model->create_goods_delivery_code();
		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$data['staff'] = $this->Users_model->get_details($options)->getResultArray();

		$data['current_day'] = date('Y-m-d');
		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('can_be_inventory');
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}
		$warehouse_data = $this->warehouse_model->get_warehouse();
		//sample
		$internal_delivery_row_template = $this->warehouse_model->create_internal_delivery_row_template();

		if($id != ''){
			$internal_delivery = $this->warehouse_model->get_internal_delivery($id);
			if (!$internal_delivery) {
				blank_page('Internal delivery note Not Found', 'danger');
			}

			$internal_delivery_details = $this->warehouse_model->get_internal_delivery_detail($id);
			if (count($internal_delivery_details) > 0) {
				$index_internal_delivery = 0;
				foreach ($internal_delivery_details as $internal_delivery_detail) {
					$index_internal_delivery++;
					$unit_name = wh_get_unit_name($internal_delivery_detail['unit_id']);
					$commodity_name = $internal_delivery_detail['commodity_name'];
					
					if(strlen($commodity_name) == 0){
						$commodity_name = wh_get_item_variatiom($internal_delivery_detail['commodity_code']);
					}

					$internal_delivery_row_template .= $this->warehouse_model->create_internal_delivery_row_template($warehouse_data, 'items[' . $index_internal_delivery . ']', $commodity_name, $internal_delivery_detail['from_stock_name'],$internal_delivery_detail['to_stock_name'], $internal_delivery_detail['available_quantity'], $internal_delivery_detail['quantities'], $unit_name, $internal_delivery_detail['unit_price'], $internal_delivery_detail['commodity_code'], $internal_delivery_detail['unit_id'] , $internal_delivery_detail['into_money'],  $internal_delivery_detail['note'], $internal_delivery_detail['id'], true, $internal_delivery_detail['serial_number']);
				}
			}

			$data['internal_delivery'] = $internal_delivery;
		}
		$data['internal_delivery_row_template'] = $internal_delivery_row_template;
		return $this->template->rander("Warehouse\Views\manage_internal_delivery\add_internal_delivery", $data);
	}


	/**
	 * get quantity inventory
	 * @return [type] 
	 */
	public function get_quantity_inventory() {
		$data = $this->request->getPost();
		if ($data != 'null') {

			$value = $this->warehouse_model->get_quantity_inventory($data['warehouse_id'], $data['commodity_id']);

			$quantity = 0;
			if ($value != null) {
				$message = true;
				$quantity = get_object_vars($value)['inventory_number'];
			} else {
				$message = app_lang('Product_does_not_exist_in_stock');
			}
			
			echo json_encode([
				'message' => $message,
				'value' => $quantity,
			]);
			die;
		}
	}

	public function get_quantity_inventory_t() {
		$data = $this->request->getPost();
		if ($data != 'null') {

			$value = $this->warehouse_model->get_quantity_inventory($data['warehouse_id'], $data['commodity_id']);

			$quantity = 0;
			if ($value != null) {

				if ((float) get_object_vars($value)['inventory_number'] < (float) $data['quantity_export']) {
					$message = _l('not_enough_inventory');
					$quantity = get_object_vars($value)['inventory_number'];

				} else {
					$message = true;
					$quantity = get_object_vars($value)['inventory_number'];
				}

			} else {
				$message = _l('Product_does_not_exist_in_stock');
			}

			
			echo json_encode([
				'message' => $message,
				'value' => $quantity,
			]);
			die;
		}
	}


	/**
	 * delete internal delivery
	 * @param  interger $id 
	 * @return redirect    
	 */
	public function delete_internal_delivery() {
		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$id = $this->request->getPost('id');
		$response = $this->warehouse_model->delete_internal_delivery($id);
		if ($response == true) {
			$this->session->setFlashdata("success_message", app_lang("wh_deleted"));
		} else {
			$this->session->setFlashdata("error_message", app_lang("problem_deleting"));
		}
		app_redirect('warehouse/manage_internal_delivery');

	}

	/**
	 * view internal delivery
	 * @param  integer $id 
	 * @return view     
	 */
	public function view_internal_delivery($id) {
		validate_numeric_value($id);
		
		//approval
		$session = \Config\Services::session();
		$send_mail_approve = $session->has("send_mail_approve");
		if (($send_mail_approve) && $session->get("send_mail_approve") != '') {

			$data['send_mail_approve'] = $session->get("send_mail_approve");
			$session->remove("send_mail_approve");
		}

		$data['get_staff_sign'] = $this->warehouse_model->get_staff_sign($id, 4);

		$data['check_approve_status'] = $this->warehouse_model->check_approval_details($id, 4);
		$data['list_approve_status'] = $this->warehouse_model->get_list_approval_details($id, 4);
		$data['payslip_log'] = $this->warehouse_model->get_activity_log($id, 4);

		$data['internal_delivery'] = $this->warehouse_model->get_internal_delivery($id);
		$data['internal_delivery_detail'] = $this->warehouse_model->get_internal_delivery_detail($id);

		$data['title'] = _l('internal_delivery_note');
		$check_appr = $this->warehouse_model->get_approve_setting('4');
		$data['check_appr'] = $check_appr;

		return $this->template->rander("Warehouse\Views\manage_internal_delivery\internal_delivery_detail", $data);
	}


	/**
	 * check internal delivery onsubmit
	 * 
	 * @return view     
	 */
	public function check_internal_delivery_onsubmit() {
		$data = $this->request->getPost();
		$flag = 0;
		$message = true;
		$str_error = '';

		if ($data['intenal_delivery'] != 'null') {
			foreach ($data['intenal_delivery'] as $intenal_delivery_value) {

				if ( $intenal_delivery_value[0] != '' ) {
					if($intenal_delivery_value[1] != ''){
						//check without checking warehouse
						$commodity_name='';
						$item_value = $this->warehouse_model->get_commodity($intenal_delivery_value['0']);

						if($item_value){
							$commodity_name .= $item_value->commodity_code.'_'.$item_value->description;
						}

						$value = $this->warehouse_model->get_quantity_inventory($intenal_delivery_value['1'], $intenal_delivery_value['0']);


						$quantity = 0;
						if ($value != null) {

							if ((float) get_object_vars($value)['inventory_number'] < (float) $intenal_delivery_value['5']) {
								$flag = 1;
								$str_error .= $commodity_name._l('not_enough_inventory').'<br/>';

							}

						} else {
							$flag = 1;
							$str_error .=$commodity_name. _l('Product_does_not_exist_in_stock').'<br/>';
						}

					}else{
						$flag = 1;
						$str_error .= _l('please_choose_from_stock_name').'<br/>';
					}

					if($intenal_delivery_value[2] == ''){
						$flag = 1;
						$str_error .= _l('please_choose_to_stock_name').'<br/>';
					}

					if($intenal_delivery_value[5] == '' || $intenal_delivery_value[5] == '0'){
						$flag = 1;
						$str_error .= _l('please_choose_quantity_export').'<br/>';
					}

				}

			}
			
			if ($flag == 1) {
				$message = false;

			} else {
				$message = true;
			}

			echo json_encode([
				'message' => $message,
				'str_error' => $str_error,

			]);
			die;
		}
	}

	/**
	 * check approval sign
	 * @return json 
	 */
	public function check_approval_sign() 
	{
		$data = $this->request->getPost();

		$success = true;
		$message = '';

		if($data['rel_type'] == '2'){
			/*check send request with type =2 , inventory delivery voucher*/
			$check_r = $this->warehouse_model->check_inventory_delivery_voucher($data);

			if($check_r['flag_export_warehouse'] == 1){
				$message = 'approval success';

			}else{
				$message = $check_r['str_error'];
				$success = false;

			}
		}elseif($data['rel_type'] == '4'){
			/*check send request with type = 4 , internal delivery note*/
			$check_r = $this->warehouse_model->check_internal_delivery_note_send_request($data);

			if($check_r['flag_internal_delivery_warehouse'] == 1){
				$message = 'approval success';

			}else{
				$message = $check_r['str_error'];
				$success = false;

			}

		}


		echo json_encode([
			'success' => $success,
			'message' => $message,
		]);
		die;
	}


	/**
	 * manage warehouse
	 * @param  string $id 
	 * @return [type]     
	 */
	public function warehouse_mange($id = '') {

		$data['title'] = _l('warehouse_manage');
		$data['warehouse_types'] = $this->warehouse_model->get_warehouse();

		$this->db->where('fieldto', 'warehouse_name');
		$data['wh_custom_fields_display'] = $this->db->get(get_db_prefix().'customfields')->getResultArray();


		$data['proposal_id'] = $id;

		$this->load->view('includes/warehouse', $data);
	}

	/**
	 * table warehouse name
	 *
	 * @return array
	 */
	public function table_warehouse_name() {
		$this->app->get_table_data(module_views_path('Warehouse', 'manage_warehouse/table_warehouse_name'));
	}


	/**
	 * warehouse setting
	 * @param  string $id 
	 * @return [type]     
	 */
	public function add_warehouse($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!$this->request->getPost('id')) {

				$mess = $this->warehouse_model->add_one_warehouse($data);
				if ($mess) {
					set_alert('success', _l('added_successfully') .' '. _l('warehouse'));

				} else {
					set_alert('warning', _l('Add_warehouse_false'));
				}
				redirect(admin_url('warehouse/warehouse_mange'));

			} else {
				$id = $data['id'];
				unset($data['id']);
				$success = $this->warehouse_model->update_one_warehouse($data, $id);
				if ($success) {
					set_alert('success', _l('updated_successfully') .' '. _l('warehouse'));
				} else {
					set_alert('warning', _l('updated_warehouse_false'));
				}

				redirect(admin_url('warehouse/warehouse_mange'));
			}
		}
	}


	/**
	 * get item by id ajax
	 * @param  integer $id 
	 * @return [type]     
	 */
	public function get_warehouse_by_id($id)
	{
		if ($this->input->is_ajax_request()) {

			$warehouse_value                     = $this->warehouse_model->get_warehouse($id);

			$warehouse_value->warehouse_code   	= $warehouse_value->warehouse_code;
			$warehouse_value->warehouse_name   	= $warehouse_value->warehouse_name;
			$warehouse_value->warehouse_address   = nl2br($warehouse_value->warehouse_address);
			$warehouse_value->note   = nl2br($warehouse_value->note);

			$warehouse_value->custom_fields      = [];

			$warehouse_value->custom_fields_html = wh_render_custom_fields('warehouse_name', $id, []);

			$cf = get_custom_fields('warehouse_name');

			foreach ($cf as $custom_field) {
				$val = get_custom_field_value($id, $custom_field['id'], 'warehouse_name');
				if ($custom_field['type'] == 'textarea') {
					$val = clear_textarea_breaks($val);
				}
				$custom_field['value'] = $val;
				$warehouse_value->custom_fields[] = $custom_field;
			}

			echo json_encode($warehouse_value);
		}
	}

	/**
	 * get warehouse custom fields html
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function get_warehouse_custom_fields_html($id)
	{
		if ($this->input->is_ajax_request()) {

			$warehouse_value =[];
			$warehouse_value['custom_fields_html'] = wh_render_custom_fields('warehouse_name', $id, []);

			echo json_encode($warehouse_value);
		}
	}


	/**
	 * view warehouse detail
	 * @param  integer $warehouse_id 
	 * @return view               
	 */
	public function view_warehouse_detail($warehouse_id) {
		$warehouse_item = get_warehouse_name($warehouse_id);

		if (!$warehouse_item) {
			blank_page('Warehouse Not Found', 'danger');
		}

		$data['warehouse_item'] = $warehouse_item;
		$data['warehouse_inventory'] = $this->warehouse_model->get_inventory_by_warehouse($warehouse_id);

		$this->load->view('manage_warehouse/warehouse_view_detail', $data);

	}

	/**
	 * goods delivery copy pur order
	 * @param  integer $pur request
	 * @return json encode
	 */
	public function goods_delivery_copy_pur_order($pur_order = '') {

		$pur_request_detail = $this->warehouse_model->goods_delivery_get_pur_order($pur_order);

		echo json_encode([
			'result' => $pur_request_detail['result'] ? $pur_request_detail['result'] : '',
			'additional_discount' => $pur_request_detail['additional_discount'] ? $pur_request_detail['additional_discount'] : '',
		]);
	}

	 /**
	 * Uploads a proposal attachment.
	 *
	 * @param      string  $id  The purchase order
	 * @return redirect
	 */
	 public function wh_proposal_attachment($id){

		wh_handle_propsal_file($id);

		redirect(admin_url('proposals/list_proposals/'.$id));
	 }

	/**
	 * { preview obgy partograph file }
	 *
	 * @param      <type>  $id      The identifier
	 * @param      <type>  $rel_id  The relative identifier
	 * @return  view
	 */
	public function file_proposal($id, $rel_id)
	{
		$data['discussion_user_profile_image_url'] = staff_profile_image_url(get_staff_user_id1());
		$data['current_user_is_admin']             = is_admin();
		$data['file'] = $this->warehouse_model->get_file($id, $rel_id);
		if (!$data['file']) {
			header('HTTP/1.0 404 Not Found');
			die;
		}

		$this->load->view('proposal/_file', $data);
	}

	/**
	 * { delete proposal attachment }
	 *
	 * @param      <type>  $id     The identifier
	 */
	public function delete_proposal_attachment($id)
	{
		$this->load->model('misc_model');
		$file = $this->misc_model->get_file($id);
		if ($file->staffid == get_staff_user_id1() || is_admin()) {
			echo html_entity_decode($this->warehouse_model->delete_wh_proposal_attachment($id));
		} else {
			header('HTTP/1.0 400 Bad error');
			echo _l('access_denied');
			die;
		}
	}

	/**
	 * brands setting
	 * @param  string $id 
	 * @return [type]     
	 */
	public function brands_setting($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!$this->request->getPost('id')) {

				$mess = $this->warehouse_model->add_brand($data);
				if ($mess) {
					set_alert('success', _l('added_successfully'));

				} else {
					set_alert('warning', _l('Add_brand_name_false'));
				}
				redirect(admin_url('warehouse/setting?group=brand'));

			} else {
				$id = $data['id'];
				unset($data['id']);
				$success = $this->warehouse_model->update_brand($data, $id);
				if ($success) {
					set_alert('success', _l('updated_successfully'));
				} else {
					set_alert('warning', _l('updated_brand_name_false'));
				}

				redirect(admin_url('warehouse/setting?group=brand'));
			}
		}
	}

	/**
	 * [delete_color
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function delete_brand($id) {
		if (!$id) {
			redirect(admin_url('warehouse/setting?group=brand'));
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$response = $this->warehouse_model->delete_brand($id);
		if ($response) {
			set_alert('success', _l('deleted'));
			redirect(admin_url('warehouse/setting?group=brand'));
		} else {
			set_alert('warning', _l('problem_deleting'));
			redirect(admin_url('warehouse/setting?group=brand'));
		}

	}

		/**
	 * brands setting
	 * @param  string $id 
	 * @return [type]     
	 */
		public function models_setting($id = '') {
			if ($this->request->getPost()) {
				$message = '';
				$data = $this->request->getPost();

				if (!$this->request->getPost('id')) {

					$mess = $this->warehouse_model->add_model($data);
					if ($mess) {
						set_alert('success', _l('added_successfully'));

					} else {
						set_alert('warning', _l('Add_model_name_false'));
					}
					redirect(admin_url('warehouse/setting?group=model'));

				} else {
					$id = $data['id'];
					unset($data['id']);
					$success = $this->warehouse_model->update_model($data, $id);
					if ($success) {
						set_alert('success', _l('updated_successfully'));
					} else {
						set_alert('warning', _l('updated_model_name_false'));
					}

					redirect(admin_url('warehouse/setting?group=model'));
				}
			}
		}

	/**
	 * [delete_color
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function delete_model($id) {
		if (!$id) {
			redirect(admin_url('warehouse/setting?group=model'));
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$response = $this->warehouse_model->delete_model($id);
		if ($response) {
			set_alert('success', _l('deleted'));
			redirect(admin_url('warehouse/setting?group=model'));
		} else {
			set_alert('warning', _l('problem_deleting'));
			redirect(admin_url('warehouse/setting?group=model'));
		}

	}

	public function custom_fields_setting($id = '') {
		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();

			if (!$this->request->getPost('id')) {

				$mess = $this->warehouse_model->add_custom_fields_warehouse($data);
				if ($mess) {
					set_alert('success', _l('added_successfully'));

				} else {
					set_alert('warning', _l('Add_commodity_type_false'));
				}
				redirect(admin_url('warehouse/setting?group=warehouse_custom_fields'));

			} else {
				$id = $data['id'];
				unset($data['id']);
				$success = $this->warehouse_model->update_custom_fields_warehouse($data, $id);
				if ($success) {
					set_alert('success', _l('updated_successfully'));
				} else {
					set_alert('warning', _l('updated_commodity_type_false'));
				}

				redirect(admin_url('warehouse/setting?group=warehouse_custom_fields'));
			}
		}
	}

	/**
	 * [delete_color description]
	 * @param  [type] $id  
	 * @return [type]      
	 */
	public function delete_custom_fields_warehouse($id) {
		if (!$id) {
			redirect(admin_url('warehouse/setting?group=warehouse_custom_fields'));
		}

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$response = $this->warehouse_model->delete_custom_fields_warehouse($id);
		if ($response) {
			set_alert('success', _l('deleted'));
			redirect(admin_url('warehouse/setting?group=warehouse_custom_fields'));
		} else {
			set_alert('warning', _l('problem_deleting'));
			redirect(admin_url('warehouse/setting?group=warehouse_custom_fields'));
		}

	}


	/**
	 * check warehouse custom fields
	 * @param  [type] $id
	 * @return [type]    
	 */
	public function check_warehouse_custom_fields() {
		$data = $this->request->getPost();

		$success = $this->warehouse_model->check_warehouse_custom_fields($data);
		if($success){

			$message = _l('custom_fields');
		}else{
			$message = _l('custom_fields_have_been_created');
		}
		echo json_encode([
			'success' => $success,
			'message' => $message,
		]);
		die;
	}

	/**
	 * send goods delivery
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function get_delivery_ajax() {

		if(!has_permission('warehouse', '', 'create')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$id = $this->request->getPost('id');
		$data_result = $this->warehouse_model->delivery_note_get_data_send_mail($id);

		echo json_encode([
			'options' => $data_result['options'],
			'primary_email' => $data_result['primary_email'],
		]);
		die;

	}

	/**
	 * get primary contact
	 * @return [type] 
	 */
	public function get_primary_contact()
	{	
		$primary_email ='';

		$userid = $this->request->getPost('userid');

		$options = array(
			"client_id" => $userid,
			"is_primary_contact" => 1,
			"user_type" => "client",
		);
		$contact_value = $this->Users_model->get_details($options)->getRow();
		if($contact_value){
			$primary_email 	= $contact_value->email;
		}

		echo json_encode([
			'primary_email' => $primary_email,
		]);
		die;

	}

	/**
	 * send_goods_delivery
	 * @return [type] 
	 */
	public function send_goods_delivery(){
		if($this->request->getPost()){
			$data = $this->request->getPost();

			if(isset($_FILES['attachment']['name']) && $_FILES['attachment']['name'] != ''){

				if(file_exists(WAREHOUSE_MODULE_UPLOAD_FOLDER .'/send_delivery_note/'. $data['goods_delivery'])){
					$delete_old = delete_dir(WAREHOUSE_MODULE_UPLOAD_FOLDER .'/send_delivery_note/'. $data['goods_delivery']);
				}else{
					$delete_old = true;
				}

				if($delete_old == true){
					handle_send_delivery_note($data['goods_delivery']);
				}   
			}

			$send = $this->warehouse_model->send_delivery_note($data);
			if($send){
				set_alert('success',_l('send_delivery_note_by_email_successfully'));

			}else{
				set_alert('warning',_l('send_delivery_note_by_email_fail'));
			}
			redirect(admin_url('warehouse/manage_delivery/'.$data['goods_delivery']));

		}
	}


	/**
	 * check sku duplicate
	 * @return [type] 
	 */
	public function check_sku_duplicate()
	{
		$data = $this->request->getPost();
		$result = $this->warehouse_model->check_sku_duplicate($data);

		echo json_encode([
			'message' => $result
		]);
		die;	
	}

	/**
	 * stock internal delivery pdf
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function stock_internal_delivery_pdf($id) {
		if (!$id) {
			redirect(admin_url('warehouse/manage_goods_delivery/manage_delivery'));
		}

		$stock_export = $this->warehouse_model->get_stock_internal_delivery_pdf_html($id);

		try {
			$pdf = $this->warehouse_model->stock_internal_delivery_pdf($stock_export);

		} catch (Exception $e) {
			echo html_entity_decode($e->getMessage());
			die;
		}

		$type = 'D';
		ob_end_clean();

		if ($this->request->getGet('output_type')) {
			$type = $this->request->getGet('output_type');
		}

		if ($this->request->getGet('print')) {
			$type = 'I';
		}

		$pdf->Output('goods_delivery_'.strtotime(date('Y-m-d H:i:s')).'.pdf', $type);
	}


	/**
	 * item print barcode
	 * @return [type] 
	 */
	public function item_print_barcode()
	{
		$data = $this->request->getPost();

		$stock_export = $this->warehouse_model->get_print_barcode_pdf_html($data);

		try {
			$pdf = $this->warehouse_model->print_barcode_pdf($stock_export);

		} catch (Exception $e) {
			echo html_entity_decode($e->getMessage());
			die;
		}

		$type = 'I';
		ob_end_clean();

		if ($this->request->getGet('output_type')) {
			$type = $this->request->getGet('output_type');
		}

		if ($this->request->getGet('print')) {
			$type = 'I';
		}


		$pdf->Output('print_barcode_'.strtotime(date('Y-m-d H:i:s')).'.pdf', $type);

	}

	/**
	 * save and send request send mail
	 * @return [type] 
	 */
	public function save_and_send_request_send_mail($data ='') {
		if ((isset($data)) && $data != '') {
			$this->warehouse_model->send_mail($data);

			$success = 'success';
			echo json_encode([
				'success' => $success,
			]);
		}
	}

	public function reset_datas() {
		$data = [];
		return $this->template->rander("Warehouse\Views\includes/reset_data", $data);
	}
	
	/**
	 * reset data
	 * @return [type] 
	 */
	public function reset_data()
	{

		if ( !is_admin()) {
			app_redirect("forbidden");
		}
		$builder = db_connect('default');

			$inventory_manage = $builder->table(get_db_prefix().'inventory_manage');
			//delete inventory_manage
			$inventory_manage->truncate();
			//delete goods_receipt
			
			$goods_receipt = $builder->table(get_db_prefix().'goods_receipt');
			$goods_receipt->truncate();
			//delete goods_receipt_detail
			
			$goods_receipt_detail = $builder->table(get_db_prefix().'goods_receipt_detail');
			$goods_receipt_detail->truncate();

			//delete goods_delivery
			$goods_delivery = $builder->table(get_db_prefix().'goods_delivery');
			$goods_delivery->truncate();
			//delete goods_delivery_detail
			$goods_delivery_detail = $builder->table(get_db_prefix().'goods_delivery_detail');
			$goods_delivery_detail->truncate();
			//delete goods_delivery_invoices_pr_orders
			$goods_delivery_invoices_pr_orders = $builder->table(get_db_prefix().'goods_delivery_invoices_pr_orders');
			$goods_delivery_invoices_pr_orders->truncate();
			//delete goods_transaction_detail
			$goods_transaction_detail = $builder->table(get_db_prefix().'goods_transaction_detail');
			$goods_transaction_detail->truncate();
			//delete internal_delivery_note
			$internal_delivery_note = $builder->table(get_db_prefix().'internal_delivery_note');
			$internal_delivery_note->truncate();
			//delete internal_delivery_note_detail
			$internal_delivery_note_detail = $builder->table(get_db_prefix().'internal_delivery_note_detail');
			$internal_delivery_note_detail->truncate();
			//delete wh_loss_adjustment
			$wh_loss_adjustment = $builder->table(get_db_prefix().'wh_loss_adjustment');
			$wh_loss_adjustment->truncate();
			//delete wh_loss_adjustment_detail
			$wh_loss_adjustment_detail = $builder->table(get_db_prefix().'wh_loss_adjustment_detail');
			$wh_loss_adjustment_detail->truncate();
			//delete wh_approval_details
			$wh_approval_details = $builder->table(get_db_prefix().'wh_approval_details');
			$wh_approval_details->truncate();
			//delete wh_activity_log
			$wh_activity_log = $builder->table(get_db_prefix().'wh_activity_log');
			$wh_activity_log->truncate();
			//delete wh_inventory_serial_numbers
			$wh_inventory_serial_numbers = $builder->table(get_db_prefix().'wh_inventory_serial_numbers');
			$wh_inventory_serial_numbers->truncate();
			//delete wh_omni_shipments
			$wh_omni_shipments = $builder->table(get_db_prefix().'wh_omni_shipments');
			$wh_omni_shipments->truncate();
			//delete wh_packing_lists
			$wh_packing_lists = $builder->table(get_db_prefix().'wh_packing_lists');
			$wh_packing_lists->truncate();
			//delete wh_packing_list_details
			$wh_packing_list_details = $builder->table(get_db_prefix().'wh_packing_list_details');
			$wh_packing_list_details->truncate();
			//delete wh_goods_delivery_activity_log
			$wh_goods_delivery_activity_log = $builder->table(get_db_prefix().'wh_goods_delivery_activity_log');
			$wh_goods_delivery_activity_log->truncate();

			$wh_order_returns = $builder->table(get_db_prefix().'wh_order_returns');
			$wh_order_returns->where('rel_type', 'manual');
			$wh_order_returns->groupStart();
			$wh_order_returns->where('receipt_delivery_type', 'inventory_receipt_voucher_returned_goods');
			$wh_order_returns->orwhere('receipt_delivery_type', 'inventory_delivery_voucher_returned_purchasing_goods');
			$wh_order_returns->groupEnd();
			$wh_order_returns->delete();


			//delete sub folder STOCK_EXPORT
			foreach(glob(WAREHOUSE_STOCK_EXPORT_MODULE_UPLOAD_FOLDER . '*') as $file) { 
				$file_arr = explode("/",$file);
				$filename = array_pop($file_arr);

				if(is_dir($file)) {
					delete_dir(WAREHOUSE_STOCK_EXPORT_MODULE_UPLOAD_FOLDER.$filename);
				}
			}

			//delete sub folder STOCK_IMPORT
			foreach(glob(WAREHOUSE_STOCK_IMPORT_MODULE_UPLOAD_FOLDER . '*') as $file) { 
				$file_arr = explode("/",$file);
				$filename = array_pop($file_arr);

				if(is_dir($file)) {
					delete_dir(WAREHOUSE_STOCK_IMPORT_MODULE_UPLOAD_FOLDER.$filename);
				}
			}

			//delete sub folder LOSS
			foreach(glob(WAREHOUSE_LOST_ADJUSTMENT_MODULE_UPLOAD_FOLDER . '*') as $file) { 
				$file_arr = explode("/",$file);
				$filename = array_pop($file_arr);

				if(is_dir($file)) {
					delete_dir(WAREHOUSE_LOST_ADJUSTMENT_MODULE_UPLOAD_FOLDER.$filename);
				}
			}
			
			//delete sub folder INTERNAL
			foreach(glob(WAREHOUSE_INTERNAL_DELIVERY_MODULE_UPLOAD_FOLDER . '*') as $file) { 
				$file_arr = explode("/",$file);
				$filename = array_pop($file_arr);

				if(is_dir($file)) {
					delete_dir(WAREHOUSE_INTERNAL_DELIVERY_MODULE_UPLOAD_FOLDER.$filename);
				}
			}
			
			//delete sub folder send delivery note
			foreach(glob('modules/warehouse/uploads/send_delivery_note/' . '*') as $file) { 
				$file_arr = explode("/",$file);
				$filename = array_pop($file_arr);

				if(is_dir($file)) {
					delete_dir('modules/warehouse/uploads/send_delivery_note/'.$filename);
				}
			}
			
			echo json_encode(array("success" => true, "message" => app_lang('reset_data_successful')));
		}

	/**
	 * get variation html add
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function get_variation_html_add(){
		$variation_html = $this->warehouse_model->get_variation_html('');

		$data['ajaxItems'] = false;
		if (total_rows(get_db_prefix() . 'items', 'parent_id is null or parent_id = ""') <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->get_parent_item_grouped();
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}

		$parent_data = $this->load->view('item_include/item_select', ['ajaxItems' => $data['ajaxItems'], 'items' => $data['items'] , 'select_name' => 'parent_id', 'id_name' => 'parent_id', 'data_none_selected_text' => '', 'label_name' => 'parent_item'], true);

		echo json_encode([ 
			'variation_html' => $variation_html['html'],
			'variation_index' => $variation_html['index'],
			'item_html' => $parent_data,

		]);
	}

	/**
	 * get variation from parent item
	 * @return [type] 
	 */
	public function get_variation_from_parent_item()
	{
		$data = $this->request->getPost();
		$variation_html = $this->warehouse_model->get_variation_from_parent_item($data);

		$parent_value = '';
		$custom_fields_html = '';
		
		if($data['item_id'] == '' && $data['parent_id'] != ''){
			$parent_value = $this->warehouse_model->get_commodity($data['parent_id']);
		}

		echo json_encode([ 
			'variation_html' => $variation_html['html'],
			'variation_index' => $variation_html['index'],
			'check_is_parent' => $variation_html['check_is_parent'],
			'parent_value' => $parent_value,

		]);
	}


	/**
	 * update unchecked inventory numbers
	 * @return [type] 
	 */
	public function update_unchecked_inventory_numbers()
	{
		if ( !is_admin()) {
			app_redirect("forbidden");
		}

		$data = array(
			'without_checking_warehouse' => 0
		);
		$builder = db_connect('default');
		$builder = $builder->table(get_db_prefix().'items');
		$builder->where('id != ', 0);
		$builder->update($data); 

		$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
		app_redirect('warehouse/general');
	}

	/**
	 * maximum minimum inventory filter
	 * @param  [type] $data 
	 * @return [type]       
	 */
	public function maximum_minimum_inventory_filter()
	{
		$data = $this->request->getPost();

		if(strlen($data['inventory_filter']) > 0){
			$sql = "SELECT *, im.id as inventory_min_id FROM ".get_db_prefix()."inventory_commodity_min as im
			left join ".get_db_prefix()."items as i on im.commodity_id = i.id 
			where  i.commodity_code like  '%".$data['inventory_filter']."%'  OR  i.description like  '%".$data['inventory_filter']."%'  OR i.sku_code like  '%".$data['inventory_filter']."%'  
			";
		}else{
			$sql = "SELECT *, im.id as inventory_min_id FROM ".get_db_prefix()."inventory_commodity_min as im
			left join ".get_db_prefix()."items as i on im.commodity_id = i.id  
			";
		}

		$items = $this->warehouse_model->warehouse_run_query($sql);

		$data_filter=[];
		foreach ($items as $key => $value) {
			array_push($data_filter, [
				'id' => $value['inventory_min_id'],
				'commodity_id' => $value['commodity_id'],
				'commodity_code' => $value['commodity_code'],
				'commodity_name' => $value['title'],
				'inventory_number_min' => $value['inventory_number_min'],
				'inventory_number_max' => $value['inventory_number_max'],
				'sku_code' => $value['sku_code'],
			]);
		}

		echo json_encode([ 
			'data_object' => $data_filter,
		]);
	}

	/**
	 * { warehouse setting }
	 * @return  json
	 */
	public function show_item_cf_on_pdf(){
		$data = $this->request->getPost();
		if($data != 'null'){
			$value = $this->warehouse_model->update_pc_options_setting($data);
			if($value){
				$success = true;
				$message = _l('updated_successfully');
			}else{
				$success = false;
				$message = _l('updated_false');
			}
			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}
	}

	/*ADD opening stock*/
	/**
	 * add opening stock modal
	 */
	public function add_opening_stock_modal()
	{
		if (!$this->input->is_ajax_request()) {
			show_404();
		}
		$id = $this->request->getPost('id');

		$data=[];
		


		$item_name='';
		$item = $this->warehouse_model->get_commodity($id);
		if($item){
			$item_name = $item->description;
		}

		$data['title'] = _l('add_opening_stock').' ( '.$item_name.' )';
		$data['item_name'] =  $item_name;
		$data['opening_stock_data'] = $this->warehouse_model->get_inventory_quantity_by_warehouse_variant($id);
		$data['min_row'] =  count($data['opening_stock_data']);
		$data['commodity_code_name'] = $this->warehouse_model->get_commodity_code_name();
		$data['units_warehouse_name'] = $this->warehouse_model->get_warehouse_code_name();
		
		$this->load->view('item_add_opening_stock', $data);
	}

	/**
	 * add opening stock
	 */
	public function add_opening_stock()
	{
		if ($this->request->getPost()) {
			$data = $this->request->getPost();

			$result = $this->warehouse_model->add_opening_stock($data);
			if ($result) {
				set_alert('success', _l('updated_successfully'));
			}

			redirect(admin_url('warehouse/commodity_list'));
		}

	}

	/**
	 * add activity
	 */
	public function wh_add_activity()
	{
		$goods_delivery_id = $this->request->getPost('goods_delivery_id');
		if (!has_permission('warehouse', '', 'edit') && !is_admin() && !has_permission('warehouse', '', 'create')) {
			app_redirect("forbidden");
		}

		if ($this->request->getPost()) {
			$description = $this->request->getPost('activity');
			$rel_type = $this->request->getPost('rel_type');
			$aId     = $this->warehouse_model->log_wh_activity($goods_delivery_id, $rel_type, $description);

			$activity_log_html = '';
			$activity_log_html .='<div class="feed-item">
			<div class="date">
			<span class="text-has-action" data-toggle="tooltip" data-title="'.format_to_datetime(get_my_local_time("Y-m-d H:i:s"), false).'">
			'.format_to_datetime(get_my_local_time("Y-m-d H:i:s"), false).'															</span>
			<a href="#" class="pull-right text-danger" onclick="delete_wh_activitylog(this,6);return false;"><i class="fa fa fa-times"></i></a>
			</div>
			<div class="text">'.get_staff_full_name1().' - '.$description.'</div>
			</div>';
			
			if($aId){
				$status = true;
				$message = _l('added_successfully');
			}else{
				$status = false;
				$message = _l('added_failed');
			}

			echo json_encode([
				'status' => $status,
				'message' => $message,
				'activity_log_html' => $activity_log_html,
			]);
		}
	}

	/**
	 * delete activitylog
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function delete_activitylog($id)
	{
		if (!$this->input->is_ajax_request()) {
			show_404();
		}
		
		$delete = $this->warehouse_model->delete_activitylog($id);
		if($delete){
			$status = true;
		}else{
			$status = false;
		}

		echo json_encode([
			'success' => $status,
		]);
	}

	/**
	 * copy product image
	 * @param  [type] $id       
	 * @param  [type] $rel_type 
	 * @return [type]           
	 */
	public function copy_product_image($id)
	{

		$this->warehouse_model->copy_product_image($id);
		
		$url = admin_url('warehouse/commodity_list');

		echo json_encode([
			'url' => $url,
		]);
	}

	/**
	 * delete product attachment
	 * @param  [type] $attachment_id 
	 * @param  [type] $rel_type      
	 * @return [type]                
	 */
	public function delete_product_attachment($attachment_id, $rel_type)
	{
		if (!has_permission('warehouse', '', 'delete') && !is_admin()) {
			app_redirect("forbidden");
		}

		$folder_name = '';

		switch ($rel_type) {
			case 'manufacturing':
				$folder_name = module_dir_path('manufacturing', 'uploads/products/');
				break;
			case 'warehouse':
				$folder_name = module_dir_path('warehouse', 'uploads/item_img/');
				break;
			case 'purchase':
				$folder_name = module_dir_path('purchase', 'uploads/item_img/');
				break;
		}

		echo json_encode([
			'success' => $this->warehouse_model->delete_attachment_file($attachment_id, $folder_name),
		]);
	}

	/**
	 * caculator purchase price
	 * @return [type] 
	 */
	public function caculator_purchase_price()
	{
		$data = $this->request->getPost();

		$purchase_price = $this->warehouse_model->caculator_purchase_price_model($data['profit_rate'], $data['sale_price']);

		echo json_encode([
			'purchase_price' => $purchase_price,
		]);
		die;

	}

	/**
	 * wh parent item search
	 * @return [type] 
	 */
	public function wh_parent_item_search()
	{
		if ($this->request->getPost() && $this->input->is_ajax_request()) {
			echo json_encode($this->warehouse_model->wh_parent_item_search($this->request->getPost('q')));
		}
	}

	/**
	 * wh commodity code search
	 * @return [type] 
	 */
	public function wh_commodity_code_search($type = 'purchase_price', $can_be = 'can_be_inventory')
	{
		if ($this->request->getPost() && $this->input->is_ajax_request()) {
			echo json_encode($this->warehouse_model->wh_commodity_code_search($this->request->getPost('q'), $type, $can_be));
		}
	}

	/* Get item by id / ajax */
	public function get_item_by_id($id, $get_warehouse = false, $warehouse_id = false)
	{
			$item                     = $this->warehouse_model->get_item_v2($id);
			$item->description   = nl2br($item->description);
			$guarantee_new = '';
			if(($item->guarantee != '') && (($item->guarantee != null))){
				$guarantee_new = date('Y-m-d', strtotime(date('Y-m-d'). ' + '.$item->guarantee.' months'));
			}
			$item->guarantee_new = $guarantee_new;
			$html = '<option value=""></option>';
			if((int)$get_warehouse ==  1){
				$get_available_quantity = $this->warehouse_model->get_adjustment_stock_quantity($warehouse_id, $id, null, null);
				if($get_available_quantity){
					$item->available_quantity = (float)$get_available_quantity->inventory_number;
				}else{
					$item->available_quantity = 0;
				}
			}elseif($get_warehouse){
				$arr_warehouse_id = [];
				$warehouses = $this->warehouse_model->get_commodity_warehouse($id);
				if (count($warehouses) > 0) {
					foreach ($warehouses as $warehouse) {
						if(!in_array($warehouse['warehouse_id'], $arr_warehouse_id)){
							$arr_warehouse_id[] = $warehouse['warehouse_id'];
							if((float)$warehouse['inventory_number'] > 0){
								$html .= '<option value="' . $warehouse['warehouse_id'] . '">' . $warehouse['warehouse_name'] . '</option>';
							}
						}
					}
				}
			}
			$item->warehouses_html = $html;

			echo json_encode($item);
	}

	/**
	 * get receipt note row template
	 * @return [type] 
	 */
	public function get_good_receipt_row_template()
	{
		$name = $this->request->getPost('name');
		$commodity_name = $this->request->getPost('commodity_name');
		$warehouse_id = $this->request->getPost('warehouse_id');
		$quantities = $this->request->getPost('quantities');
		$unit_name = $this->request->getPost('unit_name');
		$unit_price = $this->request->getPost('unit_price');
		$taxname = $this->request->getPost('taxname');
		$lot_number = $this->request->getPost('lot_number');
		$date_manufacture = format_to_date($this->request->getPost('date_manufacture'));
		$expiry_date = $this->request->getPost('expiry_date');
		$commodity_code = $this->request->getPost('commodity_code');
		$unit_id = $this->request->getPost('unit_id');
		$tax_rate = $this->request->getPost('tax_rate');
		$tax_money = $this->request->getPost('tax_money');
		$goods_money = $this->request->getPost('goods_money');
		$note = $this->request->getPost('note');
		$item_key = $this->request->getPost('item_key');

		echo       $this->warehouse_model->create_goods_receipt_row_template([], $name, $commodity_name, $warehouse_id, $quantities, $unit_name, $unit_price, $taxname, $lot_number, $date_manufacture, $expiry_date, $commodity_code, $unit_id, $tax_rate, $tax_money, $goods_money, $note, $item_key);

	}

	/**
	 * get internal delivery row template
	 * @return [type] 
	 */
	public function get_internal_delivery_row_template()
	{
		$name = $this->request->getPost('name');
		$commodity_name = $this->request->getPost('commodity_name');
		$from_stock_name = $this->request->getPost('from_stock_name');
		$to_stock_name = $this->request->getPost('to_stock_name');
		$available_quantity = $this->request->getPost('available_quantity');
		$quantities = $this->request->getPost('quantities');
		$unit_name = $this->request->getPost('unit_name');
		$unit_price = $this->request->getPost('unit_price');
		$commodity_code = $this->request->getPost('commodity_code');
		$unit_id = $this->request->getPost('unit_id');
		$into_money = $this->request->getPost('into_money');
		$note = $this->request->getPost('note');
		$item_key = $this->request->getPost('item_key');
		$item_index = $this->request->getPost('item_index');

		$internal_delivery_row_template = '';
		$temporaty_quantity = $quantities;
		$temporaty_available_quantity = $available_quantity;
		$list_temporaty_serial_numbers = $this->warehouse_model->get_list_temporaty_serial_numbers($commodity_code, $from_stock_name, $quantities);

		foreach ($list_temporaty_serial_numbers as $value) {
			$temporaty_commodity_name = $commodity_name.' SN: '.$value['serial_number'];
			$quantities = 1;
			$name = 'newitems['.$item_index.']';

			$internal_delivery_row_template .= $this->warehouse_model->create_internal_delivery_row_template([], $name, $temporaty_commodity_name, $from_stock_name, $to_stock_name, $temporaty_available_quantity, $quantities, $unit_name, $unit_price, $commodity_code, $unit_id, $into_money, $note, $item_key, false,  $value['serial_number']);

			$temporaty_quantity--;
			$temporaty_available_quantity--;
			$item_index ++;
		}

		if($temporaty_quantity > 0){
			$quantities = $temporaty_quantity;
			$available_quantity = $temporaty_available_quantity;
			$name = 'newitems['.$item_index.']';

			$internal_delivery_row_template .= $this->warehouse_model->create_internal_delivery_row_template([], $name, $commodity_name, $from_stock_name, $to_stock_name, $available_quantity, $quantities, $unit_name, $unit_price, $commodity_code, $unit_id, $into_money, $note, $item_key );
		}

		echo $internal_delivery_row_template;

	}

	/**
	 * get loss adjustment row template
	 * @return [type] 
	 */
	public function get_loss_adjustment_row_template()
	{
		$name = $this->request->getPost('name');
		$commodity_name = $this->request->getPost('commodity_name');
		$expiry_date = $this->request->getPost('expiry_date');
		$lot_number = $this->request->getPost('lot_number');
		$available_quantity = $this->request->getPost('available_quantity');
		$quantities = $this->request->getPost('quantities');
		$unit_name = $this->request->getPost('unit_name');
		$commodity_code = $this->request->getPost('commodity_code');
		$unit_id = $this->request->getPost('unit_id');
		$item_key = $this->request->getPost('item_key');

		echo $this->warehouse_model->create_loss_adjustment_row_template( $name, $commodity_name, $available_quantity, $quantities, $unit_name, $expiry_date, $lot_number, $commodity_code, $unit_id, $item_key);

	}

	/**
	 * get good delivery row template
	 * @return [type] 
	 */
	public function get_good_delivery_row_template()
	{
		$name = $this->request->getPost('name');
		$commodity_name = $this->request->getPost('commodity_name');
		$warehouse_id = $this->request->getPost('warehouse_id');
		$available_quantity = $this->request->getPost('available_quantity');
		$quantities = $this->request->getPost('quantities');
		$unit_name = $this->request->getPost('unit_name');
		$unit_price = $this->request->getPost('unit_price');
		$taxname = $this->request->getPost('taxname');
		$lot_number = $this->request->getPost('lot_number');
		$expiry_date = $this->request->getPost('expiry_date');
		$commodity_code = $this->request->getPost('commodity_code');
		$unit_id = $this->request->getPost('unit_id');
		$tax_rate = $this->request->getPost('tax_rate');
		$discount = $this->request->getPost('discount');
		$note = $this->request->getPost('note');
		$guarantee_period = $this->request->getPost('guarantee_period');
		$item_key = $this->request->getPost('item_key');
		$item_index = $this->request->getPost('item_index');

		$goods_delivery_row_template = '';
		$temporaty_quantity = $quantities;
		$temporaty_available_quantity = $available_quantity;
		$list_temporaty_serial_numbers = $this->warehouse_model->get_list_temporaty_serial_numbers($commodity_code, $warehouse_id, $quantities);

		foreach ($list_temporaty_serial_numbers as $value) {
			$temporaty_commodity_name = $commodity_name.' SN: '.$value['serial_number'];
			$quantities = 1;
			$name = 'newitems['.$item_index.']';

			$goods_delivery_row_template .= $this->warehouse_model->create_goods_delivery_row_template([], $name, $temporaty_commodity_name, $warehouse_id, $temporaty_available_quantity, $quantities, $unit_name, $unit_price, $taxname, $commodity_code, $unit_id, $tax_rate, '', $discount, '', '', $guarantee_period, $expiry_date, $lot_number, $note, '', '', '', $item_key, false, false, $value['serial_number'] );
			$temporaty_quantity--;
			$temporaty_available_quantity--;
			$item_index ++;
		}

		if($temporaty_quantity > 0){
			$quantities = $temporaty_quantity;
			$available_quantity = $temporaty_available_quantity;
			$name = 'newitems['.$item_index.']';

			$goods_delivery_row_template .= $this->warehouse_model->create_goods_delivery_row_template([], $name, $commodity_name, $warehouse_id, $available_quantity, $quantities, $unit_name, $unit_price, $taxname, $commodity_code, $unit_id, $tax_rate, '', $discount, '', '', $guarantee_period, $expiry_date, $lot_number, $note, '', '', '', $item_key);
		}

		echo $goods_delivery_row_template;
	}

	/**
	 * manage packing list
	 * @param  string $id 
	 * @return [type]     
	 */
	public function manage_packing_list($id = '')
	{
		$data['delivery_id'] = $id;
		$data['title'] = _l('wh_packing_list_management');

		$data['from_date'] = format_to_date(date('Y-m-d', strtotime( date('Y-m-d') . "-15 day")), false);
		$data['to_date'] = format_to_date(get_my_local_time("Y-m-d"));
		$data['get_goods_delivery'] = $this->warehouse_model->get_goods_delivery(false);

		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$data['staffs'] = $this->Users_model->get_details($options)->getResultArray();
		//display packing list not yet approval
		$data['status_id'] = [1,5,-1];

		return $this->template->rander("Warehouse\Views\packing_lists\manage_packing_list", $data);
	}

	/**
	 * packing list
	 * @return view
	 */
	public function packing_list($id ='', $edit_approval = false) {

		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();
			$id = $this->request->getPost('id');

			if (!$this->request->getPost('id')) {
				$mess = $this->warehouse_model->add_packing_list($data);
				if ($mess) {
					if($data['save_and_send_request'] == 'true'){
						$this->save_and_send_request_send_mail(['rel_id' => $mess, 'rel_type' => '5', 'addedfrom' => get_staff_user_id1()]);
					}
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("wh_add_packing_list_failed"));
				}
				app_redirect("warehouse/manage_packing_list");

			}else{
				$id = $this->request->getPost('id');
				$mess = $this->warehouse_model->update_packing_list($data);

				if($data['save_and_send_request'] == 'true'){
					$this->save_and_send_request_send_mail(['rel_id' => $id, 'rel_type' => '5', 'addedfrom' => get_staff_user_id1()]);
				}

				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				}
				app_redirect("warehouse/manage_packing_list");
			}

		}
		//get vaule render dropdown select
		$data['packing_list_name_ex'] = 'PACKING_LIST' . date('YmdHi');
		$data['title'] = _l('wh_add_packing_list');

		$tax_options = array(
			"deleted" => 0,
		);
		$data['taxes'] = $this->Taxes_model->get_details($tax_options)->getResultArray();

		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('can_be_inventory');
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}

		//sample
		$packing_list_row_template = $this->warehouse_model->create_packing_list_row_template();

		$data['goods_deliveries'] = $this->warehouse_model->packing_list_get_goods_delivery();
		$tax_options = array(
			"deleted" => 0,
		);
		$data['clients'] = $this->Clients_model->get_details($tax_options)->getResultArray();
		
		$data['goods_code'] = $this->warehouse_model->create_packing_list_code();
		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$data['staffs'] = $this->Users_model->get_details($options)->getResultArray();
		$data['current_day'] = date('Y-m-d');

		if($id != ''){
			$data['title'] = _l('wh_edit_packing_list');

			$packing_list = $this->warehouse_model->get_packing_list($id);
			if (!$packing_list) {
				blank_page('Packing list Not Found', 'danger');
			}
			$data['packing_list_detail'] = $this->warehouse_model->get_packing_list_detail($id);
			$data['packing_list'] = $packing_list;

			$client_options = [
				'id' => $data['packing_list']->clientid,
			];
			$client = $this->Clients_model->get_details($client_options)->getRow();
			if($client){
				$data['billing_shipping'] = $this->template->view('invoices/invoice_parts/bill_to', ['client_info' => $client]);
			}


			if (count($data['packing_list_detail']) > 0) {
				$index_receipt = 0;
				foreach ($data['packing_list_detail'] as $packing_list_detail) {
					$index_receipt++;
					$unit_name = wh_get_unit_name($packing_list_detail['unit_id']);
					$taxname = '';
					$expiry_date = null;
					$lot_number = null;
					$commodity_name = $packing_list_detail['commodity_name'];
					
					if(strlen($commodity_name) == 0){
						$commodity_name = wh_get_item_variatiom($packing_list_detail['commodity_code']);
					}

					$packing_list_row_template .= $this->warehouse_model->create_packing_list_row_template($packing_list_detail['delivery_detail_id'], 'items[' . $index_receipt . ']', $commodity_name, $packing_list_detail['quantity'], $unit_name, $packing_list_detail['unit_price'], $taxname, $packing_list_detail['commodity_code'], $packing_list_detail['unit_id'] , $packing_list_detail['tax_rate'], $packing_list_detail['total_amount'], $packing_list_detail['discount'], $packing_list_detail['discount_total'], $packing_list_detail['total_after_discount'], $packing_list_detail['sub_total'],$packing_list_detail['tax_name'],$packing_list_detail['tax_id'], $packing_list_detail['id'], true, $packing_list_detail['serial_number']);
					
				}
			}
		}

		//edit note after approval
		$data['edit_approval'] = $edit_approval;
		$data['packing_list_row_template'] = $packing_list_row_template;

		return $this->template->rander("Warehouse\Views\packing_lists\add_edit_packing_list", $data);

	}

	/**
	 * table manage packing list
	 * @return [type] 
	 */
	public function table_manage_packing_list()
	{
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'packing_lists/table_packing_list'), $dataPost);
	}

	/**
	 * get packing list row template
	 * @return [type] 
	 */
	public function get_packing_list_row_template()
	{
		$name = $this->request->getPost('name');
		$commodity_name = $this->request->getPost('commodity_name');
		$quantity = $this->request->getPost('quantity');
		$unit_name = $this->request->getPost('unit_name');
		$unit_price = $this->request->getPost('unit_price');
		$taxname = $this->request->getPost('taxname');
		$commodity_code = $this->request->getPost('commodity_code');
		$unit_id = $this->request->getPost('unit_id');
		$tax_rate = $this->request->getPost('tax_rate');
		$discount = $this->request->getPost('discount');
		$item_key = $this->request->getPost('item_key');

		echo $this->warehouse_model->create_packing_list_row_template('', $name, $commodity_name, $quantity, $unit_name, $unit_price, $taxname, $commodity_code, $unit_id, $tax_rate, '', $discount, '', '', '', '', '', $item_key );
	}

	/**
	 * packing list copy delivery note
	 * @param  string $delivery_id 
	 * @return [type]              
	 */
	public function packing_list_copy_delivery_note($delivery_id = 0)
	{
		$delivery_note_detail = $this->warehouse_model->packing_list_get_delivery_note($delivery_id);
		echo json_encode([
			'result' => $delivery_note_detail['result'] ? $delivery_note_detail['result'] : '',
			'additional_discount' => $delivery_note_detail['additional_discount'] ? $delivery_note_detail['additional_discount'] : '',
			'billing_shipping' => $delivery_note_detail['billing_shipping'],
			'customer_id' => $delivery_note_detail['customer_id'],
			'shipping_fee' => $delivery_note_detail['shipping_fee'],
		]);
	}

	/**
	 * wh client change data
	 * @param  [type] $customer_id     
	 * @param  string $current_invoice 
	 * @return [type]                  
	 */
	public function wh_client_change_data($customer_id = '', $current_invoice = '')
	{

		$data                     = [];
		$data['billing_shipping'] = '';

		if(is_numeric($customer_id)){
			$client_options = [
				'id' => $customer_id,
			];
			$client = $this->Clients_model->get_details($client_options)->getRow();
			if($client){
				$data['billing_shipping'] = $this->template->view('invoices/invoice_parts/bill_to', ['client_info' => $client]);
			}
		}

		echo json_encode($data);
	}

	/**
	 * delete packing list
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function delete_packing_list() {

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$id = $this->request->getPost('id');
		$response = $this->warehouse_model->delete_packing_list($id);
		if ($response == true) {
			$this->session->setFlashdata("success_message", app_lang("wh_deleted"));
		} else {
			$this->session->setFlashdata("error_message", app_lang("problem_deleting"));
		}
		app_redirect('warehouse/manage_packing_list');
	}

	/**
	 * view packing list
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function view_packing_list($id)
	{
		//approval
		$session = \Config\Services::session();
		$send_mail_approve = $session->has("send_mail_approve");
		if (($send_mail_approve) && $session->get("send_mail_approve") != '') {

			$data['send_mail_approve'] = $session->get("send_mail_approve");
			$session->remove("send_mail_approve");
		}


		$data['get_staff_sign'] = $this->warehouse_model->get_staff_sign($id, 5);
		$data['check_approve_status'] = $this->warehouse_model->check_approval_details($id, 5);
		$data['list_approve_status'] = $this->warehouse_model->get_list_approval_details($id, 5);
		$data['payslip_log'] = $this->warehouse_model->get_activity_log($id, 5);

		//get vaule render dropdown select
		$data['packing_list_detail'] = $this->warehouse_model->get_packing_list_detail($id);
		$data['packing_list'] = $this->warehouse_model->get_packing_list($id);

		$client_options = array(
			'id' => $data['packing_list']->clientid,
			"deleted" => 0,
		);
		$client = $this->Clients_model->get_details($client_options)->getRow();
		$data['packing_list']->client = $client;
		$data['activity_log'] = $this->warehouse_model->wh_get_activity_log($id,'packing_list');
		if($client){
			$data['billing_shipping'] = $this->template->view('invoices/invoice_parts/bill_to', ['client_info' => $client]);
		}

		$data['title'] = _l('wh_packing_list');
		$check_appr = $this->warehouse_model->get_approve_setting('5');
		$data['check_appr'] = $check_appr;
		$data['tax_data'] = $this->warehouse_model->get_html_tax_packing_list($id);

		return $this->template->rander("Warehouse\Views\packing_lists\packing_list_detail", $data);
	}

	/**
	 * packing list check before approval
	 * @return [type] 
	 */
	public function packing_list_check_before_approval()
	{
		$data = $this->request->getPost();
			// packing list
			//check before send request approval
		$check_packing_list_send_request = $this->warehouse_model->check_packing_list_send_request($data);
		if($check_packing_list_send_request['flag_update_status']){
			echo json_encode([
				'success' => true,
				'message' => '',
			]);
			die;
		}else{
			$message = $check_packing_list_send_request['str_error'];
			$success = false;
			echo json_encode([
				'success' => $success,
				'message' => $message,
			]);
			die;
		}
	}

	/**
	 * packing list pdf
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function packing_list_pdf($id)
	{
		if (!$id) {
			redirect(admin_url('warehouse/packing_lists/manage_packing_list'));
		}
		$this->load->model('clients_model');
		$this->load->model('currencies_model');

		$packing_list_number = '';
		$packing_list = $this->warehouse_model->get_packing_list($id);
		$packing_list->client = $this->clients_model->get($packing_list->clientid);
		$packing_list->packing_list_detail = $this->warehouse_model->get_packing_list_detail($id);
		$packing_list->base_currency = $this->currencies_model->get_base_currency();
		$packing_list->tax_data = $this->warehouse_model->get_html_tax_packing_list($id);


		if($packing_list){
			$packing_list_number .= $packing_list->packing_list_number.' - '.$packing_list->packing_list_name;
		}
		try {
			$pdf = $this->warehouse_model->packing_list_pdf($packing_list);

		} catch (Exception $e) {
			echo html_entity_decode($e->getMessage());
			die;
		}

		$type = 'D';
		ob_end_clean();

		if ($this->request->getGet('output_type')) {
			$type = $this->request->getGet('output_type');
		}

		if ($this->request->getGet('print')) {
			$type = 'I';
		}

		$pdf->Output(mb_strtoupper(slug_it($packing_list_number)).'.pdf', $type);
	}

	/**
	 * delivery status mark as
	 * @param  [type] $status 
	 * @param  [type] $id     
	 * @param  [type] $type   
	 * @return [type]         
	 */
	public function delivery_status_mark_as($status, $id, $type)
	{
		$success = $this->warehouse_model->delivery_status_mark_as($status, $id, $type);
		$message = '';

		if ($success) {
			$message = _l('wh_change_delivery_status_successfully');
		}
		echo json_encode([
			'success'  => $success,
			'message'  => $message
		]);
	}

	/**
	 * shipment detail
	 * @param  string $id 
	 * @return [type]     
	 */
	public function shipment_detail($id = '')
	{

		$this->load->model('omni_sales/omni_sales_model');
		$cart = $this->omni_sales_model->get_cart($id);
		$cart_detailts = $this->omni_sales_model->get_cart_detailt_by_master($id);
		if (!$cart) {
			blank_page(_l('shipment_not_found'));
		}
		$shipment = $this->warehouse_model->get_shipment_by_order($id);
		if (!$shipment) {
			blank_page(_l('shipment_not_found'));
		}
		$data = [];
		$data['cart'] = $cart;
		$data['cart_detailts'] = $cart_detailts;
		$data['title']          = $data['cart']->order_number;
		$data['shipment']          = $shipment;
		$data['order_id']          = $id;

		if($data['cart']->number_invoice != ''){
			$data['invoice'] = $this->omni_sales_model->get_invoice($data['cart']->number_invoice);
		}
		 
		//get activity log
		$data['arr_activity_logs'] = $this->warehouse_model->wh_get_shipment_activity_log($shipment->id);
		$wh_shipment_status = wh_shipment_status();
		$shipment_staus_order='';
		foreach ($wh_shipment_status as $shipment_status) {
			if($shipment_status['name'] ==  $data['shipment']->shipment_status){
				$shipment_staus_order = $shipment_status['order'];
			}
		}

		foreach ($wh_shipment_status as $shipment_status) {
			if((int)$shipment_status['order'] <= (int)$shipment_staus_order){
				$data[$shipment_status['name']] = ' completed';
			}else{
				$data[$shipment_status['name']] = '';
			}
		}
		$data['shipment_staus_order'] = $shipment_staus_order;

		//get delivery note
		if(is_numeric($data['cart']->stock_export_number)){
			$this->db->where('id', $data['cart']->stock_export_number);
			$data['goods_delivery'] = $this->db->get(get_db_prefix() . 'goods_delivery')->getResultArray();
			$data['packing_lists'] = $this->warehouse_model->get_packing_list_by_deivery_note($data['cart']->stock_export_number);

			//update goods delivery id
			$this->db->where('cart_id', $data['cart']->id);
			$this->db->update(get_db_prefix().'wh_omni_shipments', ['goods_delivery_id' => $data['cart']->stock_export_number]);
		}

		$this->load->view('shipments/shipment_detail', $data);
	}

	/**
	 * shipment activity log modal
	 * @return [type] 
	 */
	public function shipment_activity_log_modal()
	{
		if ($this->input->is_ajax_request()) {
			$request_data = $this->request->getGet();

			$data=[];
			$data['shipment_id'] = $request_data['shipment_id'];
			$data['id'] = $request_data['id'];
			$data['cart_id'] = $request_data['cart_id'];

			if($request_data['id'] != ''){
				$data['activity_log'] = $this->warehouse_model->wh_get_activity_log_by_id($request_data['id']);
			}

			$response = $this->load->view('shipments/modals/add_edit_activity_log_modal', $data, true);
			echo json_encode([
				'data' => $response,
			]);
		}
	}

	/**
	 * shipment add edit activity log
	 * @return [type] 
	 */
	public function shipment_add_edit_activity_log()
	{
		if($this->request->getPost()){
			$data = $this->request->getPost();
			if (!has_permission('warehouse', '', 'edit') && !is_admin() && !has_permission('warehouse', '', 'create')) {
				app_redirect("forbidden");
			}

			$cart_id = '';
			if($data['id'] == ''){
				unset($data['id']);
				$cart_id = $data['cart_id'];
				unset($data['cart_id']);
				$date = to_sql_date($data['date'], true);
				$result =  $this->warehouse_model->log_wh_activity($data['rel_id'], 'shipment', $data['description'], $date);
				if($result){
					set_alert('success', _l('added_successfully'));
				}else{
					set_alert('danger', _l('wh_add_shipment_log_failed'));					
				}
				redirect(admin_url('warehouse/shipment_detail/'.$cart_id));
			}
			else{
				$cart_id = $data['cart_id'];
				unset($data['cart_id']);
				$data['date'] = to_sql_date($data['date'], true);
				$result =  $this->warehouse_model->update_activity_log($data['id'], $data);
				if($result){
					set_alert('success', _l('updated_successfully'));
				}
				redirect(admin_url('warehouse/shipment_detail/'.$cart_id));
			}
		}
	}

	/**
	 * update shipment status
	 * @param  [type] $status      
	 * @param  [type] $shipment_id 
	 * @param  [type] $cart_id     
	 * @return [type]              
	 */
	public function update_shipment_status($status, $shipment_id, $cart_id)
	{	
		$this->db->where('id', $shipment_id);
		$this->db->update(get_db_prefix().'wh_omni_shipments', ['shipment_status' => $status]);

		//update delivery note
		$this->load->model('omni_sales/omni_sales_model');
		$cart = $this->omni_sales_model->get_cart($cart_id);
		if($cart){
			if(is_numeric($cart->stock_export_number)){
				$arr_packing_list_id = [];
				$new_status = 'delivery_in_progress';
				//get packing list
				$packing_lists = $this->warehouse_model->get_packing_list_by_deivery_note($cart->stock_export_number);
				if(count($packing_lists) > 0){
					foreach ($packing_lists as $value) {
						$arr_packing_list_id[] = $value['id'];
					}
				}

				if($status == 'product_dispatched'){
					$new_status = 'delivery_in_progress';
				}elseif($status == 'product_delivered'){
					$new_status = 'delivered';
				}

				$this->db->where('id', $cart->stock_export_number);
				$this->db->update(get_db_prefix().'goods_delivery', ['delivery_status' => $new_status]);

				if(count($arr_packing_list_id) > 0){
					$this->db->where('id IN ('.implode(',', $arr_packing_list_id).')');
					$this->db->update(get_db_prefix().'wh_packing_lists', ['delivery_status' => $new_status]);
				}
			}
		}

		//create activity log for shipment
		$shipment_log = _l($status);
		$this->warehouse_model->log_wh_activity($shipment_id, 'shipment', $shipment_log);

		set_alert('success', _l('updated_successfully'));
		redirect(admin_url('warehouse/shipment_detail/'.$cart_id));
	}

	/**
	 * update return policies information
	 * @return [type] 
	 */
	public function update_return_policies_information()
	{
		$data = $this->request->getGet();

		if ((isset($data)) && $data != '') {
			$myContent = $this->request->getGet('myContent');
			$status = $this->warehouse_model->update_warehouse_return_polices(['wh_return_policies_information' => $myContent]);

			if($status){
				$message = _l('updated_successfully');
			}else{
				$message = _l('updated_failed');
			}

			echo json_encode([
				'message' => $message,
				'status' =>$status,
			]);
		}
	}

	/**
	 * manage order return
	 * @param  string $id 
	 * @return [type]     
	 */
	public function manage_order_return($id = '')
	{
		$data['delivery_id'] = $id;
		$data['title'] = _l('management_receiving_exporting_goods_returning_goods');

		$data['from_date'] = format_to_date(date('Y-m-d', strtotime( date('Y-m-d') . "-15 day")), false);
		$data['to_date'] = format_to_date(get_my_local_time("Y-m-d"));
		$data['get_goods_delivery'] = $this->warehouse_model->get_goods_delivery(false);
		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$data['staffs'] = $this->Users_model->get_details($options)->getResultArray();
		//display packing list not yet approval
		$data['rel_type'] = 'all';

		return $this->template->rander("Warehouse\Views\order_returns\manage_order_return", $data);
	}

	/**
	 * sales order manage order return
	 * @param  string $id 
	 * @return [type]     
	 */
	public function sales_order_manage_order_return($id = '')
	{
		$data['delivery_id'] = $id;
		$data['title'] = _l('wh_order_return_management');

		$data['from_date'] = format_to_date(date('Y-m-d', strtotime( date('Y-m-d') . "-15 day")), false);
		$data['to_date'] = format_to_date(date('Y-m-d'), false);
		$data['get_goods_delivery'] = $this->warehouse_model->get_goods_delivery(false);
		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$data['staffs'] = $this->Users_model->get_details($options)->getResultArray();
		//display packing list not yet approval
		$data['rel_type'] = 'sales_return_order';
		return $this->template->rander("Warehouse\Views\order_returns\manage_order_return", $data);
	}

	/**
	 * purchasing manage order return
	 * @param  string $id 
	 * @return [type]     
	 */
	public function purchasing_manage_order_return($id = '')
	{
		$data['delivery_id'] = $id;
		$data['title'] = _l('wh_order_return_management');

		$data['from_date'] = format_to_date(date('Y-m-d', strtotime( date('Y-m-d') . "-15 day")), false);
		$data['to_date'] = format_to_date(date('Y-m-d'), false);
		$data['get_goods_delivery'] = $this->warehouse_model->get_goods_delivery(false);
		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$data['staffs'] = $this->Users_model->get_details($options)->getResultArray();
		//display packing list not yet approval
		$data['rel_type'] = 'purchasing_return_order';

		return $this->template->rander("Warehouse\Views\order_returns\manage_order_return", $data);
	}

	/**
	 * order return
	 * @param  string $id                
	 * @param  string $order_retrun_type : have 3 type "manual"; "sales_return_order"; "purchasing_return_order"
	 * @return [type]                    
	 */
	public function order_return($receipt_delivery_type = 'manual', $id ='') {
		$order_return_type = 'manual';

		if ($this->request->getPost()) {
			$message = '';
			$data = $this->request->getPost();
			$id = $this->request->getPost('id');

			if (!$this->request->getPost('id')) {
				if($order_return_type == 'manual'){
					$mess = $this->warehouse_model->add_order_return($data, $data['rel_type']);
				}elseif($order_return_type == 'sales_return_order'){
					$mess = $this->warehouse_model->add_order_return($data, $data['rel_type']);
				}elseif($order_return_type == 'purchasing_return_order'){
					$mess = $this->warehouse_model->add_order_return($data, $data['rel_type']);
				}

				if ($mess) {
					if($data['save_and_send_request'] == 'true'){
						$this->save_and_send_request_send_mail(['rel_id' => $mess, 'rel_type' => '6', 'addedfrom' => get_staff_user_id1()]);
					}
					$this->session->setFlashdata("success_message", app_lang("added_successfully"));
				} else {
					$this->session->setFlashdata("error_message", app_lang("wh_add_order_return_failed"));
				}
				app_redirect("warehouse/manage_order_return");

			}else{
				$id = $this->request->getPost('id');

				if($order_return_type == 'manual'){
					$mess = $this->warehouse_model->update_order_return($data, $data['rel_type'], $id);
				}elseif($order_return_type == 'sales_return_order'){
					$mess = $this->warehouse_model->update_order_return($data, $data['rel_type'], $id);
				}elseif($order_return_type == 'purchasing_return_order'){
					$mess = $this->warehouse_model->update_order_return($data, $data['rel_type'], $id);
				}

				if($data['save_and_send_request'] == 'true'){
					$this->save_and_send_request_send_mail(['rel_id' => $id, 'rel_type' => '6', 'addedfrom' => get_staff_user_id1()]);
				}

				if ($mess) {
					$this->session->setFlashdata("success_message", app_lang("updated_successfully"));
				}
				app_redirect("warehouse/manage_order_return");

			}

		}
		//get value render dropdown select
		if($receipt_delivery_type == 'inventory_receipt'){

			$data['order_return_name_ex'] = 'RECEIPT_RETURN' . date('YmdHi');
			$data['goods_code'] = $this->warehouse_model->create_order_return_code();
		}else{
			$data['order_return_name_ex'] = 'DELIVERY_RETURN' . date('YmdHi');
			$data['goods_code'] = $this->warehouse_model->create_delivery_order_return_code();
			if(get_status_modules_wh('purchase')){
				$data['vendor_data'] = $this->warehouse_model->get_vendor();
			}else{
				$data['vendor_data'] = [];
			}
		}

		$tax_options = array(
			"deleted" => 0,
		);
		$data['taxes'] = $this->Taxes_model->get_details($tax_options)->getResultArray();
		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('can_be_inventory');
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}

		//sample
		$order_return_row_template = $this->warehouse_model->create_order_return_row_template($receipt_delivery_type);
		$data['goods_deliveries'] = $this->warehouse_model->packing_list_get_goods_delivery();
		$tax_options = array(
			"deleted" => 0,
		);
		$data['clients'] = $this->Clients_model->get_details($tax_options)->getResultArray();

		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$data['staffs'] = $this->Users_model->get_details($options)->getResultArray();
		$data['current_day'] = date('Y-m-d');

		if($id != ''){
			$order_return = $this->warehouse_model->get_order_return($id);

			if($order_return->receipt_delivery_type == 'inventory_receipt_voucher_returned_goods'){
				$receipt_delivery_type = 'inventory_receipt_voucher_returned_goods';
				$data['title'] = _l('wh_edit_inventory_receipt_voucher_returned_goods');

				//get related data

				$data['order_return_get_inventory_delivery'] = $this->warehouse_model->order_return_get_inventory_delivery(); 
				$data['order_return_get_sale_order'] = $this->warehouse_model->order_return_get_sale_order(); 

			}else{
				$receipt_delivery_type = 'inventory_delivery_voucher_returned_purchasing_goods';
				$data['title'] = _l('wh_edit_inventory_delivery_voucher_returned_purchasing_goods');

				//get related data
				$data['order_return_get_inventory_receipt'] = $this->warehouse_model->order_return_get_inventory_receipt(); 
				$data['order_return_get_purchasing_order'] = $this->warehouse_model->order_return_get_purchasing_order(); 
			}


			if (!$order_return) {
				blank_page('Order Return Not Found', 'danger');
			}
			$data['order_return_detail'] = $this->warehouse_model->get_order_return_detail($id);
			$data['order_return'] = $order_return;

			if (count($data['order_return_detail']) > 0) {
				$index_receipt = 0;
				foreach ($data['order_return_detail'] as $order_return_detail) {
					$index_receipt++;
					$unit_name = wh_get_unit_name($order_return_detail['unit_id']);
					$taxname = '';
					$expiry_date = null;
					$lot_number = null;
					$commodity_name = $order_return_detail['commodity_name'];
					
					if(strlen($commodity_name) == 0){
						$commodity_name = wh_get_item_variatiom($order_return_detail['commodity_code']);
					}

					$order_return_row_template .= $this->warehouse_model->create_order_return_row_template($order_return->rel_type, $order_return_detail['rel_type_detail_id'], 'items[' . $index_receipt . ']', $commodity_name, $order_return_detail['quantity'], $unit_name, $order_return_detail['unit_price'], $taxname, $order_return_detail['commodity_code'], $order_return_detail['unit_id'] , $order_return_detail['tax_rate'], $order_return_detail['total_amount'], $order_return_detail['discount'], $order_return_detail['discount_total'], $order_return_detail['total_after_discount'], $order_return_detail['reason_return'], $order_return_detail['sub_total'],$order_return_detail['tax_name'],$order_return_detail['tax_id'], $order_return_detail['id'], true);
					
				}
			}
		}else{
			if($receipt_delivery_type == 'inventory_receipt'){
				$receipt_delivery_type = 'inventory_receipt_voucher_returned_goods';
				$data['title'] = _l('wh_add_inventory_receipt_voucher_returned_goods');

				//get related data

				$data['order_return_get_inventory_delivery'] = $this->warehouse_model->order_return_get_inventory_delivery(); 

				$data['order_return_get_sale_order'] = $this->warehouse_model->order_return_get_sale_order(); 
				
			}else{
				$receipt_delivery_type = 'inventory_delivery_voucher_returned_purchasing_goods';
				$data['title'] = _l('wh_add_inventory_delivery_voucher_returned_purchasing_goods');

				//get related data
				$data['order_return_get_inventory_receipt'] = $this->warehouse_model->order_return_get_inventory_receipt(); 
				$data['order_return_get_purchasing_order'] = $this->warehouse_model->order_return_get_purchasing_order(); 
			}
		}

		//edit note after approval
		$data['order_return_row_template'] = $order_return_row_template;
		$data['order_return_type'] = $order_return_type;
		$data['receipt_delivery_type'] = $receipt_delivery_type;

		return $this->template->rander("Warehouse\Views\order_returns\add_edit_order_return", $data);

	}

	/**
	 * table manage packing list
	 * @return [type] 
	 */
	public function table_manage_order_return()
	{
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'order_returns/table_order_return'), $dataPost);
	}

	/**
	 * get order return row template
	 * @return [type] 
	 */
	public function get_order_return_row_template()
	{
		$name = $this->request->getPost('name');
		$commodity_name = $this->request->getPost('commodity_name');
		$quantity = $this->request->getPost('quantity');
		$unit_name = $this->request->getPost('unit_name');
		$unit_price = $this->request->getPost('unit_price');
		$taxname = $this->request->getPost('taxname');
		$commodity_code = $this->request->getPost('commodity_code');
		$unit_id = $this->request->getPost('unit_id');
		$tax_rate = $this->request->getPost('tax_rate');
		$discount = $this->request->getPost('discount');
		$item_key = $this->request->getPost('item_key');

		echo $this->warehouse_model->create_order_return_row_template('manual', '', $name, $commodity_name, $quantity, $unit_name, $unit_price, $taxname, $commodity_code, $unit_id, $tax_rate, '', $discount, '', '','', '', '', '', $item_key );

	}

	/**
	 * wh client data
	 * @param  [type] $customer_id 
	 * @return [type]              
	 */
	public function wh_client_data($customer_id, $rel_type)
	{

		$phonenumber = '';
		$email = '';
		if($rel_type == 'inventory_delivery_voucher_returned_purchasing_goods'){
			if(get_status_modules_wh('purchase')){
				$this->load->model('purchase/purchase_model');
				$vendor = $this->purchase_model->get_vendor($customer_id);
				if($vendor){
					$phonenumber = $vendor->phonenumber;
					$contacts = $this->purchase_model->get_contacts($customer_id);
					if(count($contacts) > 0){
						$email = $contacts[0]['email'];
					}
				}
			}
		}else{

			$contact_options = array(
				"id" => $customer_id,
			);
			$client = $this->Clients_model->get_details($contact_options)->getRow();

			if($client){
				$phonenumber = $client->phone;
				$options = array(
					"user_type" => "client",
					"client_id" => $customer_id,
					"is_primary_contact" => 1,
				);
				$contact = $this->Users_model->get_details($options)->getRow();

				if($contact){
					$email = $contact->email;
				}
			}
		}

		echo json_encode([
			'phonenumber' => $phonenumber,
			'email' => $email,
		]);
	}


	/**
	 * order return get item data
	 * @param  string $delivery_id 
	 * @return [type]              
	 */
	public function order_return_get_item_data()
	{
		$data = $this->request->getPost();
		$results = $this->warehouse_model->order_return_get_related_data_detail($data);
		
		echo json_encode($results);
	}

	/**
	 * delete order return
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function delete_order_return() {

		if(!has_permission('warehouse', '', 'delete')  &&  !is_admin()) {
			app_redirect("forbidden");
		}

		$id = $this->request->getPost('id');
		$response = $this->warehouse_model->delete_order_return($id);
		if ($response == true) {
			$this->session->setFlashdata("success_message", app_lang("wh_deleted"));
		} else {
			$this->session->setFlashdata("error_message", app_lang("problem_deleting"));
		}
		app_redirect('warehouse/manage_order_return');
	}

	/**
	 * view order return
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function view_order_return($id)
	{
		//approval
		$session = \Config\Services::session();
		$send_mail_approve = $session->has("send_mail_approve");
		if (($send_mail_approve) && $session->get("send_mail_approve") != '') {

			$data['send_mail_approve'] = $session->get("send_mail_approve");
			$session->remove("send_mail_approve");
		}

		$data['get_staff_sign'] = $this->warehouse_model->get_staff_sign($id, 6);
		$data['check_approve_status'] = $this->warehouse_model->check_approval_details($id, 6);
		$data['list_approve_status'] = $this->warehouse_model->get_list_approval_details($id, 6);
		$data['payslip_log'] = $this->warehouse_model->get_activity_log($id, 6);

		$data['order_return_detail'] = $this->warehouse_model->get_order_return_detail($id);
		$data['order_return'] = $this->warehouse_model->get_order_return($id);
		$data['activity_log'] = $this->warehouse_model->wh_get_activity_log($id,'order_return');

		$data['title'] = _l('wh_order_return');
		$check_appr = $this->warehouse_model->get_approve_setting('6');
		$data['check_appr'] = $check_appr;
		$data['tax_data'] = $this->warehouse_model->get_html_tax_order_return($id);

		return $this->template->rander("Warehouse\Views\order_returns/order_return_detail", $data);
	}

	/**
	 * order return check before approval
	 * @return [type] 
	 */
	public function order_return_check_before_approval()
	{
		$data = $this->request->getPost();
			// packing list
			//check before send request approval
		if( $data['order_rel_type'] == 'manual'){
			echo json_encode([
				'success' => true,
				'message' => '',
			]);
			die;
		}

	}

	/**
	 * order return pdf
	 * @param  [type] $id 
	 * @return [type]     
	 */
	public function order_return_pdf($id)
	{
		if (!$id) {
			redirect(admin_url('warehouse/order_returns/manage_order_return'));
		}
		$this->load->model('clients_model');
		$this->load->model('currencies_model');

		$order_return_number = '';
		$order_return = $this->warehouse_model->get_order_return($id);
		$order_return->client = $this->clients_model->get($order_return->company_id);
		$order_return->order_return_detail = $this->warehouse_model->get_order_return_detail($id);
		$order_return->base_currency = $this->currencies_model->get_base_currency();
		$order_return->tax_data = $this->warehouse_model->get_html_tax_order_return($id);
		$order_return->clientid = $order_return->company_id;


		if($order_return){
			$order_return_number .= $order_return->order_return_number.' - '.$order_return->order_return_name;
		}
		try {
			$pdf = $this->warehouse_model->order_return_pdf($order_return);

		} catch (Exception $e) {
			echo html_entity_decode($e->getMessage());
			die;
		}

		$type = 'D';
		ob_end_clean();

		if ($this->request->getGet('output_type')) {
			$type = $this->request->getGet('output_type');
		}

		if ($this->request->getGet('print')) {
			$type = 'I';
		}

		$pdf->Output(mb_strtoupper(slug_it($order_return_number)).'.pdf', $type);
	}

	/**
	 * wh get item by barcode
	 * @param  [type] $barcode 
	 * @return [type]          
	 */
	public function wh_get_item_by_barcode($barcode)
	{
		$id = 0;
		$status = false;
		$message = '';
		$value = $this->warehouse_model->get_commodity_hansometable_by_barcode($barcode);
		if(isset($value)){
			$id = $value->id;
			$status = true;
			$message = $value->commodity_barcode.': '.$value->commodity_code.' - '.$value->description;
		}
		echo json_encode([
			"id" => $id,
			"status" => $status,
			"message" => $message,
		]);
	}

	/**
	 * order return create import stock
	 * @param  [type] $order_return_id 
	 * @return [type]                  
	 */
	public function order_return_create_stock_import_export($order_return_id)
	{
		if (!has_permission('warehouse', '', 'edit') && !is_admin() && !has_permission('warehouse', '', 'create')) {
			app_redirect("forbidden");
		}
		$order_return = $this->warehouse_model->get_order_return($order_return_id);
		if (!$order_return) {
			blank_page('Order Return Not Found', 'danger');
		}

		//check warehouse receive return order, if not set => create new warehouse, set default receive return order
		if(!get_option('warehouse_receive_return_order')){
			$warehouse = [];
			$warehouse = [
				'warehouse_code' => 'WH_RECEIVE',
				'warehouse_name' => 'Warehouse receive return order',
				'order' => 10,
				'warehouse_address' => '',
				'city' => '',
				'state' => '',
				'zip_code' => '',
				'country' => '',
				'note' => '',
				'display' => 'on',
			];
			$warehouse_id = $this->warehouse_model->add_one_warehouse($warehouse);
			$this->warehouse_model->update_goods_receipt_warehouse(['input_name' => 'warehouse_receive_return_order', 'input_name_status' => $warehouse_id]);
		}

		if($order_return->rel_type == 'manual'){
			$receipt_id = $this->warehouse_model->order_return_create_stock_import($order_return_id);
			redirect(admin_url('warehouse/manage_purchase/'.$receipt_id));

		}elseif($order_return->rel_type == 'sales_return_order'){
			$receipt_id = $this->warehouse_model->sales_return_order_create_stock_import($order_return_id);
			redirect(admin_url('warehouse/manage_purchase/'.$receipt_id));

		}elseif($order_return->rel_type == 'purchasing_return_order'){
			$data = $this->request->getPost();
			$warehouse_id = $data['warehouse_id'];
			
			$delivery_id = $this->warehouse_model->purchasing_return_order_create_stock_export($order_return_id, $warehouse_id);
			redirect(admin_url('warehouse/manage_delivery/'.$delivery_id));
		}
	}
	
	/**
	 * order return get related data
	 * @return [type] 
	 */
	public function order_return_get_related_data()
	{
		if ($this->input->is_ajax_request()) {
			$related_data = '';
			$data = $this->request->getGet();
			if ((isset($data)) && $data != '') {
				$related_data = $this->warehouse_model->order_return_get_related_data($data);

				echo json_encode([
					'related_data' => $related_data,
				]);
			}
		}
	}

	/**
	 * open warehouse modal
	 * @return [type] 
	 */
	public function open_warehouse_modal()
	{

		$id = $this->request->getPost('order_return_id');

		$data = [];
		$data['title'] = _l('select_warehouse_to_create_inventory_delivery');
		$data['id'] = $id;
		$data['warehouses'] = $this->warehouse_model->get_warehouse();
		$data['html'] = $this->warehouse_model->order_return_render_warehouse_modal($id);

		return $this->template->view('Warehouse\Views\order_returns\select_warehouse_modal', $data);

	}

	/**
	 * order return create stock export
	 * @param  [type] $order_return_id 
	 * @return [type]                  
	 */
	public function order_return_create_stock_export()
	{
		if (!has_permission('warehouse', '', 'edit') && !is_admin() && !has_permission('warehouse', '', 'create')) {
			app_redirect("forbidden");
		}

		$order_return_id = $this->request->getPost('id');
		$order_return = $this->warehouse_model->get_order_return($order_return_id);
		if (!$order_return) {
			app_redirect('inventory_receipt_inventory_delivery_returns_goods');
		}

		$data = $this->request->getPost();
		if(!isset($data['newitems'])){
			app_redirect("warehouse/view_order_return/".$order_return_id);
		}

		$delivery_id = $this->warehouse_model->purchasing_return_order_create_stock_export($order_return_id, $data);

		app_redirect("warehouse/view_delivery/".$delivery_id);
	}

	/**
	 * fill multiple serial number modal
	 * @return [type] 
	 */
	public function fill_multiple_serial_number_modal()
	{
		
		$data = [];
		$data['title'] = _l('wh_enter_the_serial_number');
		$slug = $this->request->getPost('slug');

		if($slug == 'add'){
			$quantity = $this->request->getPost('quantity');
			$prefix_name = $this->request->getPost('prefix_name');

		}else{
			$serial_data = [];
			$serial_input_value = $this->request->getPost('serial_input_value');
			$serial_input_value = explode(',', $serial_input_value);

			if(count($serial_input_value) > 0){
				foreach ($serial_input_value as $value) {
					if($value != 'null'){
						$serial_data[] = ['serial_number' => $value];
					}else{
						$serial_data[] = ['serial_number' => ''];
					}
				}
			}
			$prefix_name = $this->request->getPost('prefix_name');
			$data['edit_serial_number_data'] = $serial_data;
			$quantity = count($serial_input_value);
		}


		$data['min_row'] = $quantity;
		$data['max_row'] = $quantity;
		$data['prefix_name'] = $prefix_name;

		return $this->template->view('Warehouse\Views\manage_goods_receipt\serial_modal', $data);
	}

	/**
	 * loss fill multiple serial number modal
	 * @return [type] 
	 */
	public function loss_fill_multiple_serial_number_modal()
	{
		
		$data = [];
		$data['title'] = _l('Enter_the_serial_number_of_the_damaged_or_lost_product_otherwise_the_system_will_automatically_get_a_random_serial_number');
		$slug = $this->request->getPost('slug');

		if($slug == 'add'){
			$quantity = $this->request->getPost('quantity');
			$prefix_name = $this->request->getPost('prefix_name');

		}else{
			$serial_data = [];
			$serial_input_value = $this->request->getPost('serial_input_value');
			$serial_input_value = explode(',', $serial_input_value);

			if(count($serial_input_value) > 0){
				foreach ($serial_input_value as $value) {
					if($value != 'null'){
						$serial_data[] = ['serial_number' => $value];
					}else{
						$serial_data[] = ['serial_number' => ''];
					}
				}
			}
			$prefix_name = $this->request->getPost('prefix_name');
			$data['edit_serial_number_data'] = $serial_data;
			$quantity = count($serial_input_value);
		}


		$data['min_row'] = $quantity;
		$data['max_row'] = $quantity;
		$data['prefix_name'] = $prefix_name;

		return $this->template->view('Warehouse\Views\loss_adjustment\delete_serial_modal', $data);

	}


	/**
	 * adjustment fill multiple serial number modal
	 * @return [type] 
	 */
	public function adjustment_fill_multiple_serial_number_modal()
	{
		
		$data = [];
		$data['title'] = _l('wh_enter_the_serial_number');
		$slug = $this->request->getPost('slug');

		if($slug == 'add'){
			$quantity = $this->request->getPost('quantity');
			$prefix_name = $this->request->getPost('prefix_name');

		}else{
			$serial_data = [];
			$serial_input_value = $this->request->getPost('serial_input_value');
			$serial_input_value = explode(',', $serial_input_value);

			if(count($serial_input_value) > 0){
				foreach ($serial_input_value as $value) {
					if($value != 'null'){
						$serial_data[] = ['serial_number' => $value];
					}else{
						$serial_data[] = ['serial_number' => ''];
					}
				}
			}
			$prefix_name = $this->request->getPost('prefix_name');
			$data['edit_serial_number_data'] = $serial_data;
			$quantity = count($serial_input_value);
		}


		$data['min_row'] = $quantity;
		$data['max_row'] = $quantity;
		$data['prefix_name'] = $prefix_name;

		return $this->template->view('Warehouse\Views\loss_adjustment\add_serial_modal', $data);
	}

	/**
	 * import_serial_number
	 * @return [type] 
	 */
	public function import_serial_number()
	{

		//filter
		$data['title'] = _l('wh_serial_numbers');
		$data['warehouse_filter'] = $this->warehouse_model->get_warehouse();

		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('', true);
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}

		return $this->template->rander("Warehouse\Views\serial_numbers/manage_commodity", $data);
	}

	/**
	 * serial number table commodity list
	 * @return [type] 
	 */
	public function serial_number_table_commodity_list()
	{
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'serial_numbers/table_commodity_list'), $dataPost);
	}

	/**
	 * warehouse export item serial number checked
	 * @return [type] 
	 */
	public function warehouse_export_item_serial_number_checked()
	{
		$this->access_only_team_members();
		$user_id = $this->login_user->id;

		if(!class_exists('XLSXReader_fin')){
			require_once(module_dir_path(WAREHOUSE_MODULE_NAME).'/assets/plugins/XLSXReader/XLSXReader.php');
		}
		require_once(module_dir_path(WAREHOUSE_MODULE_NAME).'/assets/plugins/XLSXWriter/xlsxwriter.class.php');

		if ($this->request->getPost()) {

			/*delete export file before export file*/
			$path_before = COMMODITY_EXPORT.'item_serial_numbers'.$user_id.'.xlsx';
			if(file_exists($path_before)){
				unlink(COMMODITY_EXPORT.'item_serial_numbers'.$user_id.'.xlsx');
			}

			$ids                   = $this->request->getPost('ids');

			//Writer file
			$writer_header = array(
				"(*)" .app_lang('id')         =>'string',
				"(*)" .app_lang('commodity_id')          =>'string',
				"(*)" .app_lang('warehouse_id')          =>'string',
				"(*)" .app_lang('inventory_manage_id')          =>'string',
				"(*)" .app_lang('commodity_name')          =>'string',
				"(*)" .app_lang('wh_serial_number')          =>'string',
			);

			$widths_arr = array();
			for($i = 1; $i <= count($writer_header); $i++ ){
				$widths_arr[] = 40;
			}

			$writer = new \XLSXWriter();

			$col_style1 =[0,1,2,3,4];
			$style1 = ['widths'=> $widths_arr, 'fill' => '#ff9800',  'font-style'=>'bold', 'color' => '#0a0a0a', 'border'=>'left,right,top,bottom', 'border-color' => '#0a0a0a', 'font-size' => 13 ];

			$writer->writeSheetHeader_v2('Item Serial Numbers', $writer_header,  $col_options = ['widths'=> $widths_arr, 'fill' => '#03a9f46b',  'font-style'=>'bold', 'color' => '#0a0a0a', 'border'=>'left,right,top,bottom', 'border-color' => '#0a0a0a', 'font-size' => 13 ], $col_style1, $style1);


			// Add some data
			$x= 2;
			if(isset($ids)){
				if(count($ids) > 0){
					//get item serial number by parent id
					$arr_serial_numbers = [];
					$arr_items = [];
					$list_inventory = get_list_inventory_by_ids($ids);
					$list_serial_numbers = get_list_serial_number_by_ids($ids);
					$list_items = get_list_items_by_parent_ids($ids);
					foreach ($list_items as $value) {
						$arr_items[$value['id']] = $value['title'];
					}

					foreach ($list_serial_numbers as $value) {
						$arr_serial_numbers[$value['inventory_manage_id']][$value['commodity_id']][$value['warehouse_id']][] = [
							'serial_number' => $value['serial_number'],
							'id' => $value['id'],
						];
					}

					foreach ($list_inventory as $value) {
						for ($i=0; $i < (int)$value['inventory_number'] ; $i++) { 
							if(isset($arr_serial_numbers[$value['id']][$value['commodity_id']][$value['warehouse_id']]) && count($arr_serial_numbers[$value['id']][$value['commodity_id']][$value['warehouse_id']]) > 0){

								$first_key = array_key_first($arr_serial_numbers[$value['id']][$value['commodity_id']][$value['warehouse_id']]);
								$first_value = $arr_serial_numbers[$value['id']][$value['commodity_id']][$value['warehouse_id']][$first_key];
								$serial_number = $first_value['serial_number'];
								$id = $first_value['id'];
								unset($arr_serial_numbers[$value['id']][$value['commodity_id']][$value['warehouse_id']][$first_key]);

							}else{
								$serial_number = '';
								$id = 0;
							}

							$writer->writeSheetRow('Item Serial Numbers', [
								$id,
								$value['commodity_id'],
								$value['warehouse_id'],
								$value['id'],
								isset($arr_items[$value['commodity_id']]) ? $arr_items[$value['commodity_id']] : get_item_description($value['commodity_id']),
								$serial_number,
							]);
						}
					}
				}

			}

			// Rename worksheet

			// Redirect output to a client’s web browser (Excel2007)
			header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
			header('Content-Disposition: attachment;filename="inventory_items_sheet.xlsx"');
			header('Cache-Control: max-age=0');

			// If you're serving to IE 9, then the following may be needed
			header('Cache-Control: max-age=1');

			// If you're serving to IE over SSL, then the following may be needed
			header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
			header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
			header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
			header('Pragma: public'); // HTTP/1.0

			$filename = 'item_serial_numbers'.$user_id.strtotime(date('Y-m-d H:i:s')).'.xlsx';
			$writer->writeToFile(str_replace($filename, WAREHOUSE_EXPORT_ITEM.$filename, $filename));

			echo json_encode(['success' => true,
				'filename' => WAREHOUSE_EXPORT_ITEM.$filename,
				'base_url'          => base_url(),
			]);

			exit;
		}
	}

	/**
	 * import_serial_number
	 * @return [type] 
	 */
	public function import_serial_number_excel() {
		if (!is_admin() && !has_permission('warehouse', '', 'create')) {
			app_redirect("forbidden");
		}

		$user_id = $this->login_user->id;

		if(!class_exists('XLSXReader_fin')){
			require_once(module_dir_path(WAREHOUSE_MODULE_NAME).'/assets/plugins/XLSXReader/XLSXReader.php');
		}
		require_once(module_dir_path(WAREHOUSE_MODULE_NAME).'/assets/plugins/XLSXWriter/xlsxwriter.class.php');

		$total_row_false = 0;
		$total_rows_data = 0;
		$dataerror = 0;
		$total_row_success = 0;
		$total_rows_data_error = 0;
		$filename='';

		if ($this->request->getPost()) {

			if (isset($_FILES['file_csv']['name']) && $_FILES['file_csv']['name'] != '') {

				// Get the temp file path
				$tmpFilePath = $_FILES['file_csv']['tmp_name'];
				// Make sure we have a filepath
				if (!empty($tmpFilePath) && $tmpFilePath != '') {
					$temp_file_path = get_setting("temp_file_path");
					$tmpDir = getcwd() . '/' . $temp_file_path;
					if (!is_dir($tmpDir)) {
						if (!mkdir($tmpDir, 0777, true)) {
							die('Failed to create file folders.');
						}
					}

					// Setup our new file path
					$newFilePath = $tmpDir . $_FILES['file_csv']['name'];

					if (move_uploaded_file($tmpFilePath, $newFilePath)) {
						$import_result = true;
						$row_inserts = [];
						$row_updates = [];

						//Writer file
						$writer_header = array(
							"(*)" .app_lang('id')          =>'string',
							"(*)" .app_lang('commodity_id')          =>'string',
							"(*)" .app_lang('warehouse_id')          =>'string',
							"(*)" .app_lang('inventory_manage_id')          =>'string',
							"(*)" .app_lang('commodity_name')          =>'string',
							"(*)" .app_lang('wh_serial_number')          =>'string',
							app_lang('error')                     =>'string',
						);

						$widths_arr = array();
						for($i = 1; $i <= count($writer_header); $i++ ){
							$widths_arr[] = 40;
						}

						$writer = new \XLSXWriter();

						$col_style1 =[0,1,2,3,4,5,6];
						$style1 = ['widths'=> $widths_arr, 'fill' => '#ff9800',  'font-style'=>'bold', 'color' => '#0a0a0a', 'border'=>'left,right,top,bottom', 'border-color' => '#0a0a0a', 'font-size' => 13 ];

						$writer->writeSheetHeader_v2('Item Serial Numbers', $writer_header,  $col_options = ['widths'=> $widths_arr, 'fill' => '#03a9f46b',  'font-style'=>'bold', 'color' => '#0a0a0a', 'border'=>'left,right,top,bottom', 'border-color' => '#0a0a0a', 'font-size' => 13 ], $col_style1, $style1);

						//init file error end

						//Reader file
						$xlsx = new \XLSXReader_fin($newFilePath);
						$sheetNames = $xlsx->getSheetNames();
						$data = $xlsx->getSheetData($sheetNames[1]);

						// start row write 2
						$numRow = 2;
						$total_rows = 0;

						$total_rows_actualy = 0;
						
						//get data for compare

						for ($row = 1; $row < count($data); $row++) {
							$rd = array();
							$flag = 0;
							$flag2 = 0;
							$flag_mail = 0;
							$string_error = '';
							$flag_contract_form = 0;

							$flag_id_commodity_code;
							$flag_id_warehouse_code;

							$value_cell_id = isset($data[$row][0]) ? $data[$row][0] : null ;
							$value_cell_commodity_id = isset($data[$row][1]) ? $data[$row][1] : null ;
							$value_cell_warehouse_id = isset($data[$row][2]) ? $data[$row][2] : '' ;
							$value_cell_inventory_manage_id = isset($data[$row][3]) ? $data[$row][3] : '' ;
							$value_cell_commodity_name = isset($data[$row][4]) ? $data[$row][4] : null ;
							$value_cell_serial_number = isset($data[$row][5]) ? $data[$row][5] : null ;

							$pattern = '#^[a-z][a-z0-9\._]{2,31}@[a-z0-9\-]{3,}(\.[a-z]{2,4}){1,2}$#';

							$reg_day = '#^(((1)[0-2]))(\/)\d{4}-(3)[0-1])(\/)(((0)[0-9])-[0-2][0-9]$#'; /*yyyy-mm-dd*/

							/*check null*/
							if (is_null($value_cell_commodity_id) == true) {
								$string_error .= app_lang('commodity_code') . app_lang('not_yet_entered');
								$flag = 1;
							}

							if (is_null($value_cell_warehouse_id) == true) {
								$string_error .= app_lang('warehouse_code') . app_lang('not_yet_entered');
								$flag = 1;
							}

							if (is_null($value_cell_serial_number) == true) {
								$string_error .= app_lang('wh_serial_number') . app_lang('not_yet_entered');
								$flag = 1;
							}


								//check commodity_code exist  (input: code or name item)
							if (is_null($value_cell_commodity_id) != true && $value_cell_commodity_id != '0' ) {
								/*case input  id*/
								$builder = db_connect('default');
								$builder = $builder->table(get_db_prefix().'items');
								$builder->where('id', trim($value_cell_commodity_id, " "));
								$item_value =  $builder->get()->getRow();

								if ($item_value) {
									/*get id commodity_type*/
									$flag_id_commodity_code = $item_value->id;
								} else {
									$string_error .= app_lang('commodity_code') . app_lang('does_not_exist');
									$flag2 = 1;
								}
							}

								//check warehouse exist  (input: id or name warehouse)
							if (is_null($value_cell_warehouse_id) != true && ( $value_cell_warehouse_id != '0')) {
								/*case input id*/
								$builder = db_connect('default');
								$builder = $builder->table(get_db_prefix().'warehouse');
								$builder->where('warehouse_id', trim($value_cell_warehouse_id, " "));
								$warehouse_value = $builder->get()->getRow();

								if ($warehouse_value) {
									/*get id unit_id*/
									$flag_id_warehouse_code = $warehouse_value->warehouse_id;

								} else {
									$string_error .= app_lang('_warehouse') . app_lang('does_not_exist');
									$flag2 = 1;
								}

							}

							if (($flag == 1) || ($flag2 == 1)) {
									//write error file
								$writer->writeSheetRow('Item Serial Numbers', [
									$value_cell_id,
									$value_cell_commodity_id,
									$value_cell_warehouse_id,
									$value_cell_inventory_manage_id,
									$value_cell_commodity_name,
									$value_cell_serial_number,
									$string_error,
								]);

								$numRow++;
								$total_rows_data_error++;
							}

							if (($flag == 0) && ($flag2 == 0)) {

								if((int)$value_cell_id == 0){
									$row_inserts[] = [
										'commodity_id' => $value_cell_commodity_id,
										'warehouse_id' => $value_cell_warehouse_id,
										'inventory_manage_id' => $value_cell_inventory_manage_id,
										'serial_number' => $value_cell_serial_number,
									];

								}else{
									$row_updates[] = [
										'id' => $value_cell_id,
										'commodity_id' => $value_cell_commodity_id,
										'warehouse_id' => $value_cell_warehouse_id,
										'inventory_manage_id' => $value_cell_inventory_manage_id,
										'serial_number' => $value_cell_serial_number,
									];
								}
								
							}

							$total_rows++;
							$total_rows_data++;

						}

						if(count($row_inserts) != 0){
							$builder = db_connect('default');
							$builder = $builder->table(get_db_prefix().'wh_inventory_serial_numbers');
							$affected_rows = $builder->insertBatch($row_inserts);
							if($affected_rows > 0){
								$total_rows_actualy += $affected_rows;
							}
						}

						if(count($row_updates) != 0){
							$builder = db_connect('default');
							$builder = $builder->table(get_db_prefix().'wh_inventory_serial_numbers');
							$affected_rows = $builder->updateBatch($row_updates, 'id');
							if($affected_rows > 0){
								$total_rows_actualy += $affected_rows;
							}
						}


						if ($total_rows_actualy != $total_rows) {
							$total_rows = $total_rows_actualy;
						}

						$rows = count($row_inserts) + count($row_updates);
						$total_rows = $total_rows;
						$data['total_rows_post'] = $rows;
						$total_row_success = $rows;
						$total_row_false = $total_rows - (int)$rows;
						$message = 'Not enought Serial number for importing';

						if(($total_rows_data_error > 0) || ($total_row_false != 0)){

							$filename = 'FILE_ERROR_IMPORT_SERIAL_NUMBERS' .$user_id.strtotime(date('Y-m-d H:i:s')). '.xlsx';
							$writer->writeToFile(str_replace($filename, WAREHOUSE_IMPORT_OPENING_STOCK.$filename, $filename));

							$filename = WAREHOUSE_IMPORT_OPENING_STOCK.$filename;
						}
						
						$import_result = true;
						delete_file_from_directory($newFilePath); //delete temp file
					}
					
				} else {
					$this->session->setFlashdata("error_message", app_lang("import_serial_number_failed"));
				}
			}

		}
		echo json_encode([
			'message' =>'Not enought Serial number for importing',
			'total_row_success' => $total_row_success,
			'total_row_false' => $total_rows_data_error,
			'total_rows' => $total_rows_data,
			'site_url' => base_url(),
			'staff_id' => $user_id,
			'total_rows_data_error' => $total_rows_data_error,
			'filename' => $filename,
		]);

	}

	/**
	 * table warranty period
	 * @return [type] 
	 */
	public function table_warranty_period()
	{
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'reports/warranty_period_reports/table_warranty_period'), $dataPost);
	}

	/**
	 * warranty period pdf
	 * @return [type] 
	 */
	public function warranty_period_pdf()
	{
		$data = $this->request->getPost();
		if (!$data) {
			redirect(admin_url('warehouse/report/manage_report?group=warranty_period_report'));
		}

		$this->load->model('clients_model');
		$this->load->model('currencies_model');

		$warranty_period = $this->warehouse_model->get_warranty_period_data($data);

		try {
			$pdf = $this->warehouse_model->warranty_period_pdf($warranty_period);

		} catch (Exception $e) {
			echo html_entity_decode($e->getMessage());
			die;
		}

		$type = 'D';
		ob_end_clean();

		if ($this->request->getGet('output_type')) {
			$type = $this->request->getGet('output_type');
		}

		if ($this->request->getGet('print')) {
			$type = 'I';
		}

		$pdf->Output(mb_strtoupper(slug_it('warranty_period_report').'_'.date('YmdHi')).'.pdf', $type);
	}

	/**
	 * inventory
	 * @return [type] 
	 */
	public function inventory()
	{
		$data['inventory_min_data'] = $this->warehouse_model->setting_get_inventory_min();
		return $this->template->rander("Warehouse\Views\includes\inventory", $data);

	}

	/**
	 * inventory_settings
	 * @return [type] 
	 */
	public function inventory_settings()
	{
		$data = [];
		return $this->template->rander("Warehouse\Views\includes\inventory_setting", $data);
	}

	/**
	 * colors
	 * @return [type] 
	 */
	public function approval_settings() {
		$data  = [];
		return $this->template->rander("Warehouse\Views\includes\approval_setting", $data);
	}
		
	/**
	 * list commodity type data
	 * @return [type] 
	 */
	public function list_approval_setting_data() {
		$this->access_only_team_members();

		$list_data = $this->warehouse_model->get_approval_setting();

		$result = array();
		foreach ($list_data as $data) {
			$result[] = $this->_make_approval_setting_row($data);
		}
		echo json_encode(array("data" => $result));
	}

	/**
	 * _make commodity type row
	 * @param  [type] $data 
	 * @return [type]       
	 */
	private function _make_approval_setting_row($data) {
		$related ='';
		if($data['related'] == 1){
			$related = app_lang('stock_import');
		}elseif($data['related'] == 2){
			$related = app_lang('stock_export');

		}elseif($data['related'] == 3){
			$related = app_lang('loss_adjustment');
		}elseif($data['related'] == 4){
			$related = app_lang('internal_delivery_note');
		}elseif($data['related'] == 5){
			$related = app_lang('wh_packing_list');
		}elseif($data['related'] == 6){
			$related = app_lang('inventory_receipt_inventory_delivery_returns_goods');
		}
		return array(
			$data['id'],
			nl2br($data['name']),
			$related,
			modal_anchor(get_uri("warehouse/approval_setting_modal_form"), "<i data-feather='edit' class='icon-16'></i>", array("class" => "edit", "title" => app_lang('edit_approval_setting'), "data-post-id" => $data['id']))
			. js_anchor("<i data-feather='x' class='icon-16'></i>", array('title' => app_lang('delete'), "class" => "delete", "data-id" => $data['id'], "data-action-url" => get_uri("warehouse/delete_approval_setting/".$data['id']), "data-action" => "delete-confirmation"))
		);
	}

	/**
	 * commodity type modal form
	 * @return [type] 
	 */
	public function approval_setting_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));
		$data = [];
		$color_data = [];

		$id = $this->request->getPost('id');

		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$staffs = $this->Users_model->get_details($options)->getResultArray();
		$create_approval_setting_row_template = '';
		$create_approval_setting_row_template .= $this->warehouse_model->create_approval_setting_row_template($staffs);
		$data['key_number'] = 0;

		if($id && is_numeric($id)){
			$approval_setting = $this->warehouse_model->get_approval_setting($id);
			$data['approval_setting'] = $approval_setting;
			if($approval_setting && strlen($approval_setting->setting) > 0){
				$setting = json_decode($approval_setting->setting);
				$data['key_number'] = count($setting);
				$item_index = 1;
				foreach ($setting as $index => $value) {
					$name = 'newitems['.$item_index.']';
					$item_key  = $item_index;
					$approver = $value->approver;
					$staff = $value->staff;
					$action = $value->action;
					$create_approval_setting_row_template .= $this->warehouse_model->create_approval_setting_row_template($staffs, $name, $approver, $staff, $action, $item_key);
					$item_index++;
					
				}
			}
			// $create_approval_setting_row_template
		}else{
			$id = '';
		}
		$data['id'] = $id;

		$data['create_approval_setting_row_template'] = $create_approval_setting_row_template;

		return $this->template->view('Warehouse\Views\includes\modal_forms\approval_setting_modal', $data);
	}

	public function get_approval_setting_row_template()
	{
		$name = $this->request->getPost('name');
		$approver = $this->request->getPost('approver');
		$staff = $this->request->getPost('staff');
		$action = $this->request->getPost('action');
		$item_key = $this->request->getPost('item_key');
		$options = array(
			"status" => "active",
			"user_type" => "staff",
		);
		$staffs = $this->Users_model->get_details($options)->getResultArray();

		echo $this->warehouse_model->create_approval_setting_row_template($staffs, $name, $approver, $staff, $action, $item_key );
	}

	/**
	 * delete modal form
	 * @return [type] 
	 */
	public function delete_modal_form() {
		$this->access_only_team_members();
		// $this->validate_access_to_items();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));

		if($this->request->getPost('id')){
			$data['function'] = 'delete_commodity';
			$data['id'] = $this->request->getPost('id');
			return $this->template->view('Warehouse\Views\items\delete_modal_form', $data);
		}
	}

	/**
	 * delete goods receipt modal form
	 * @return [type] 
	 */
	public function delete_goods_receipt_modal_form() {
		$this->access_only_team_members();
		// $this->validate_access_to_items();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));

		if($this->request->getPost('id')){
			$data['function'] = 'delete_goods_receipt';
			$data['id'] = $this->request->getPost('id');
			return $this->template->view('Warehouse\Views\manage_goods_receipt\delete_modal_form', $data);
		}
	}

	/**
	 * wh_create_notification
	 * @param  array  $data 
	 * @return [type]       
	 */
	public function wh_create_notification($data = array()) {

		ini_set('max_execution_time', 300); //300 seconds 
		//validate notification request

		$event = '';
		$event = get_array_value($data, "event");

		$user_id = get_array_value($data, "user_id");
		$activity_log_id = get_array_value($data, "activity_log_id");

		$options = array(
			"project_id" => get_array_value($data, "project_id"),
			"task_id" => get_array_value($data, "task_id"),
			"project_comment_id" => get_array_value($data, "project_comment_id"),
			"ticket_id" => get_array_value($data, "ticket_id"),
			"ticket_comment_id" => get_array_value($data, "ticket_comment_id"),
			"project_file_id" => get_array_value($data, "project_file_id"),
			"leave_id" => get_array_value($data, "leave_id"),
			"post_id" => get_array_value($data, "post_id"),
			"to_user_id" => get_array_value($data, "to_user_id"),
			"activity_log_id" => get_array_value($data, "activity_log_id"),
			"client_id" => get_array_value($data, "client_id"),
			"invoice_payment_id" => get_array_value($data, "invoice_payment_id"),
			"invoice_id" => get_array_value($data, "invoice_id"),
			"estimate_id" => get_array_value($data, "estimate_id"),
			"order_id" => get_array_value($data, "order_id"),
			"estimate_request_id" => get_array_value($data, "estimate_request_id"),
			"actual_message_id" => get_array_value($data, "actual_message_id"),
			"parent_message_id" => get_array_value($data, "parent_message_id"),
			"event_id" => get_array_value($data, "event_id"),
			"announcement_id" => get_array_value($data, "announcement_id"),
			"exclude_ticket_creator" => get_array_value($data, "exclude_ticket_creator"),
			"notification_multiple_tasks" => get_array_value($data, "notification_multiple_tasks"),
			"contract_id" => get_array_value($data, "contract_id"),
			"lead_id" => get_array_value($data, "lead_id"),
			"proposal_id" => get_array_value($data, "proposal_id"),
			"estimate_comment_id" => get_array_value($data, "estimate_comment_id"),

			"inventory_goods_receiving_id" => get_array_value($data, "inventory_goods_receiving_id"),
			"inventory_goods_delivery_id" => get_array_value($data, "inventory_goods_delivery_id"),
			"packing_list_id" => get_array_value($data, "packing_list_id"),
			"internal_delivery_note_id" => get_array_value($data, "internal_delivery_note_id"),
			"loss_adjustment_is" => get_array_value($data, "loss_adjustment_is"),
			"receiving_exporting_return_order_id" => get_array_value($data, "receiving_exporting_return_order_id"),

		);

		//get data from plugin by persing 'plugin_'
		foreach ($data as $key => $value) {
			if (strpos($key, 'plugin_') !== false) {
				$options[$key] = $value;
			}
		}

		$this->warehouse_model->wh_create_notification($event, $user_id, $options, $data['to_user_id']);
	}

	/**
	 * print goods receipt
	 * @param  integer $goods_receipt_id 
	 * @return [type]                    
	 */
	function print_goods_receipt($goods_receipt_id = 0) {
		if ($goods_receipt_id) {
			validate_numeric_value($goods_receipt_id);
			/*Making data*/
			$view_data = [];
			$view_data['goods_receipt'] = $this->warehouse_model->get_goods_receipt($goods_receipt_id);
			$view_data['goods_receipt_details'] = $this->warehouse_model->get_goods_receipt_detail($goods_receipt_id);
			$view_data['tax_data'] = $this->warehouse_model->get_html_tax_receip($goods_receipt_id);

			$view_data['goods_receipt_preview'] = prepare_goods_receipt_pdf($view_data, "html");

			echo json_encode(array("success" => true, "print_view" => $this->template->view("Warehouse\Views\manage_goods_receipt\print_goods_receipt", $view_data)));
		} else {
			echo json_encode(array("success" => false, app_lang('error_occurred')));
		}
	}

	/**
	 * download pdf
	 * @param  integer $goods_receipt_id 
	 * @param  string  $mode             
	 * @return [type]                    
	 */
	function download_goods_receipt_pdf($goods_receipt_id = 0, $mode = "download") {
		if ($goods_receipt_id) {
			validate_numeric_value($goods_receipt_id);

			/*Making data*/
			$goods_receipt_data = [];
			$goods_receipt_data['goods_receipt'] = $this->warehouse_model->get_goods_receipt($goods_receipt_id);
			$goods_receipt_data['goods_receipt_details'] = $this->warehouse_model->get_goods_receipt_detail($goods_receipt_id);
			$goods_receipt_data['tax_data'] = $this->warehouse_model->get_html_tax_receip($goods_receipt_id);
			
			prepare_goods_receipt_pdf($goods_receipt_data, $mode);
		} else {
			show_404();
		}
	}
	
		/**
	 * print goods receipt
	 * @param  integer $goods_receipt_id 
	 * @return [type]                    
	 */
	function print_internal_delivery($internal_delivery_id = 0) {
		if ($internal_delivery_id) {
			validate_numeric_value($internal_delivery_id);
			/*Making data*/
			$view_data = [];
			$view_data['internal_delivery'] = $this->warehouse_model->get_internal_delivery($internal_delivery_id);
			$view_data['internal_delivery_details'] = $this->warehouse_model->get_internal_delivery_detail($internal_delivery_id);

			$view_data['internal_delivery_preview'] = prepare_internal_delivery_pdf($view_data, "html");

			echo json_encode(array("success" => true, "print_view" => $this->template->view("Warehouse\Views\manage_internal_delivery\print_internal_delivery", $view_data)));
		} else {
			echo json_encode(array("success" => false, app_lang('error_occurred')));
		}
	}

	/**
	 * download pdf
	 * @param  integer $internal_delivery_id 
	 * @param  string  $mode             
	 * @return [type]                    
	 */
	function download_internal_delivery_pdf($internal_delivery_id = 0, $mode = "download") {
		if ($internal_delivery_id) {
			validate_numeric_value($internal_delivery_id);

			/*Making data*/
			$internal_delivery_data = [];
			$internal_delivery_data['internal_delivery'] = $this->warehouse_model->get_internal_delivery($internal_delivery_id);
			$internal_delivery_data['internal_delivery_details'] = $this->warehouse_model->get_internal_delivery_detail($internal_delivery_id);
			
			prepare_internal_delivery_pdf($internal_delivery_data, $mode);
		} else {
			show_404();
		}
	}

	/**
	 * table_loss_adjustment
	 * @return [type] 
	 */
	public function table_loss_adjustment() {
		$dataPost = $this->request->getPost();
		$this->warehouse_model->get_table_data(module_views_path('Warehouse', 'loss_adjustment/table_loss_adjustment'), $dataPost);
	}

	/**
	 * delete loss adjustment modal form
	 * @return [type] 
	 */
	public function delete_loss_adjustment_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));

		if($this->request->getPost('id')){
			$data['function'] = 'delete_loss_adjustment';
			$data['id'] = $this->request->getPost('id');
			return $this->template->view('Warehouse\Views\manage_goods_receipt\delete_modal_form', $data);
		}
	}

	/**
	 * get serial number
	 * @return [type] 
	 */
	public function get_serial_number()
	{
		$table_serial_number = '';
		$data = $this->request->getPost();
		$commodity_name = $data['commodity_name'];

		$arr_serial_numbers = [];
		$arr_list_temporaty_serial_number = [];

		$list_serial_numbers = $this->warehouse_model->get_list_temporaty_serial_numbers($data['commodity_id'], $data['warehouse_id']);

		$list_temporaty_serial_numbers = $this->warehouse_model->get_list_temporaty_serial_numbers($data['commodity_id'], $data['warehouse_id'], $data['quantity']);

		foreach ($list_temporaty_serial_numbers as $list_temporaty_serial_number) {
			$arr_list_temporaty_serial_number[$list_temporaty_serial_number['serial_number']] = $list_temporaty_serial_number['serial_number'];
		}

		foreach ($list_serial_numbers as $list_serial_number) {
			if(!isset($arr_list_temporaty_serial_number[$list_serial_number['serial_number']])){
				$arr_serial_numbers[$list_serial_number['serial_number']] = [
					'name' => $list_serial_number['serial_number'],
				];
			}
		}

		foreach ($list_temporaty_serial_numbers as $index => $serial_number) {

			$arr_serial_numbers = array_merge(array($serial_number['serial_number'] => array('name' => $serial_number['serial_number']) ), $arr_serial_numbers);

			$table_serial_number .= '<tr class="sortable serial_number_item">';
			$table_serial_number .= '<td class="">' . $commodity_name . '</td>';
			$table_serial_number .= '<td class="serial_number">' . render_select1('serial_number['.$index.']', $arr_serial_numbers,array('name','name'),'',$serial_number['serial_number'],[], ["data-none-selected-text" => _l('wh_serial_number')], 'no-margin', '', false) . '</td>';
			$table_serial_number .= '</tr>';


			if(isset($arr_serial_numbers[$serial_number['serial_number']])){
				unset($arr_serial_numbers[$serial_number['serial_number']]);
			}
		}

		echo json_encode([
			'table_serial_number' => $table_serial_number,
			'status' => strlen($table_serial_number) > 0 ? true : false,
		]);
	}

	/**
	 * load serial number modal
	 * @return [type] 
	 */
	public function load_serial_number_modal()
	{
		
		$table_serial_number = $this->request->getPost('table_serial_number');
		$data = [];
		$data['title'] = _l('wh_select_the_serial_number');
		$data['table_serial_number'] = $table_serial_number;

		return $this->template->view('Warehouse\Views\manage_goods_delivery\serial_modal', $data);

	}

	/**
	 * load change serial number modal
	 * @return [type] 
	 */
	public function load_change_serial_number_modal()
	{
		
		$table_serial_number = $this->request->getPost('table_serial_number');
		$data = [];
		$data['title'] = _l('wh_select_the_serial_number');
		$data['table_serial_number'] = $table_serial_number;
		$data['name_commodity_name'] = $this->request->getPost('name_commodity_name');
		$data['name_serial_number'] = $this->request->getPost('name_serial_number');

		return $this->template->view('Warehouse\Views\manage_goods_delivery\change_serial_modal', $data);
	}

	public function get_serial_number_for_change_modal()
	{
		$table_serial_number = '';
		$data = $this->request->getPost();
		$commodity_name = $data['commodity_name'];
		$_serial_number = $data['serial_number'];
		if(isset($data['serial_number_array'])){
			$serial_number_array  = $data['serial_number_array'];
		}else{
			$serial_number_array  = [];
		}


		$arr_serial_numbers = [];
		$list_serial_numbers = $this->warehouse_model->get_list_temporaty_serial_numbers($data['commodity_id'], $data['warehouse_id'], '', $serial_number_array);


		foreach ($list_serial_numbers as $list_serial_number) {
			$arr_serial_numbers[$list_serial_number['serial_number']] = [
				'name' => $list_serial_number['serial_number'],
			];
		}

		$arr_serial_numbers = array_merge(array($_serial_number => array('name' => $_serial_number) ), $arr_serial_numbers);

		$table_serial_number .= '<tr class="sortable serial_number_item">';
		$table_serial_number .= '<td class="">' . $commodity_name . '</td>';
		$table_serial_number .= '<td class="serial_number">' . render_select('change_serial_number', $arr_serial_numbers,array('name','name'),'',$_serial_number,[], ["data-none-selected-text" => _l('wh_serial_number')], 'no-margin', '', false) . '</td>';
		$table_serial_number .= '</tr>';


		if(isset($arr_serial_numbers[$_serial_number])){
			unset($arr_serial_numbers[$_serial_number]);
		}

		echo json_encode([
			'table_serial_number' => $table_serial_number,
			'status' => strlen($table_serial_number) > 0 ? true : false,
		]);
	}

	/**
	 * delete goods receipt modal form
	 * @return [type] 
	 */
	public function delete_goods_delivery_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));

		if($this->request->getPost('id')){
			$data['function'] = 'delete_goods_delivery';
			$data['id'] = $this->request->getPost('id');
			return $this->template->view('Warehouse\Views\manage_goods_receipt\delete_modal_form', $data);
		}
	}

	/**
	 * print goods receipt
	 * @param  integer $goods_receipt_id 
	 * @return [type]                    
	 */
	function print_goods_delivery($goods_delivery_id = 0) {
		if ($goods_delivery_id) {
			validate_numeric_value($goods_delivery_id);
			/*Making data*/
			$view_data = [];
			$view_data['goods_delivery'] = $this->warehouse_model->get_goods_delivery($goods_delivery_id);
			$view_data['goods_delivery_details'] = $this->warehouse_model->get_goods_delivery_detail($goods_delivery_id);
			$view_data['tax_data'] = $this->warehouse_model->get_html_tax_delivery($goods_delivery_id);
			$client_options = [
				'id' => $view_data['goods_delivery']->customer_code,
			];
			$view_data['client_info'] = $this->Clients_model->get_details($client_options)->getRow();

			$view_data['goods_delivery_preview'] = prepare_goods_delivery_pdf($view_data, "html");

			echo json_encode(array("success" => true, "print_view" => $this->template->view("Warehouse\Views\manage_goods_delivery\print_goods_delivery", $view_data)));
		} else {
			echo json_encode(array("success" => false, app_lang('error_occurred')));
		}
	}

	/**
	 * download pdf
	 * @param  integer $goods_delivery_id 
	 * @param  string  $mode             
	 * @return [type]                    
	 */
	function download_goods_delivery_pdf($goods_delivery_id = 0, $mode = "download") {
		if ($goods_delivery_id) {
			validate_numeric_value($goods_delivery_id);

			/*Making data*/
			$goods_delivery_data = [];
			$goods_delivery_data['goods_delivery'] = $this->warehouse_model->get_goods_delivery($goods_delivery_id);
			$goods_delivery_data['goods_delivery_details'] = $this->warehouse_model->get_goods_delivery_detail($goods_delivery_id);
			$goods_delivery_data['tax_data'] = $this->warehouse_model->get_html_tax_delivery($goods_delivery_id);
			$client_options = [
				'id' => $goods_delivery_data['goods_delivery']->customer_code,
			];

			$goods_delivery_data['client_info'] = $this->Clients_model->get_details($client_options)->getRow();

			prepare_goods_delivery_pdf($goods_delivery_data, $mode);
		} else {
			show_404();
		}
	}

	/**
	 * delete packing list modal form
	 * @return [type] 
	 */
	public function delete_packing_list_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));

		if($this->request->getPost('id')){
			$data['function'] = 'delete_packing_list';
			$data['id'] = $this->request->getPost('id');
			return $this->template->view('Warehouse\Views\manage_goods_receipt\delete_modal_form', $data);
		}
	}

	/**
	 * print goods receipt
	 * @param  integer $goods_receipt_id 
	 * @return [type]                    
	 */
	function print_packing_list($packing_list_id = 0) {
		if ($packing_list_id) {
			validate_numeric_value($packing_list_id);
			/*Making data*/
			$view_data = [];
			$view_data['packing_list'] = $this->warehouse_model->get_packing_list($packing_list_id);
			$view_data['packing_list_details'] = $this->warehouse_model->get_packing_list_detail($packing_list_id);
			$view_data['tax_data'] = $this->warehouse_model->get_html_tax_packing_list($packing_list_id);
			$client_options = [
				'id' => $view_data['packing_list']->clientid,
			];
			$view_data['client_info'] = $this->Clients_model->get_details($client_options)->getRow();

			$view_data['packing_list_preview'] = prepare_packing_list_pdf($view_data, "html");

			echo json_encode(array("success" => true, "print_view" => $this->template->view("Warehouse\Views\packing_lists\print_packing_list", $view_data)));
		} else {
			echo json_encode(array("success" => false, app_lang('error_occurred')));
		}
	}

	/**
	 * download pdf
	 * @param  integer $packing_list_id 
	 * @param  string  $mode             
	 * @return [type]                    
	 */
	function download_packing_list_pdf($packing_list_id = 0, $mode = "download") {
		if ($packing_list_id) {
			validate_numeric_value($packing_list_id);

			/*Making data*/
			$packing_list_data = [];
			$packing_list_data['packing_list'] = $this->warehouse_model->get_packing_list($packing_list_id);
			$packing_list_data['packing_list_details'] = $this->warehouse_model->get_packing_list_detail($packing_list_id);
			$packing_list_data['tax_data'] = $this->warehouse_model->get_html_tax_packing_list($packing_list_id);
			$client_options = [
				'id' => $packing_list_data['packing_list']->clientid,
			];

			$packing_list_data['client_info'] = $this->Clients_model->get_details($client_options)->getRow();

			prepare_packing_list_pdf($packing_list_data, $mode);
		} else {
			show_404();
		}
	}

		/**
	 * print goods receipt
	 * @param  integer $goods_receipt_id 
	 * @return [type]                    
	 */
	function print_order_return($order_return_id = 0) {
		if ($order_return_id) {
			validate_numeric_value($order_return_id);
			/*Making data*/
			$view_data = [];
			$view_data['order_return'] = $this->warehouse_model->get_order_return($order_return_id);
			$view_data['order_return_details'] = $this->warehouse_model->get_order_return_detail($order_return_id);
			$view_data['tax_data'] = $this->warehouse_model->get_html_tax_order_return($order_return_id);

			if($view_data['order_return']->company_id != null && is_numeric($view_data['order_return']->company_id) && $view_data['order_return']->company_id != 0){
				$client_options = [
					'id' => $view_data['order_return']->company_id,
				];
				$view_data['client_info'] = $this->Clients_model->get_details($client_options)->getRow();
			}

			$view_data['order_return_preview'] = prepare_order_return_pdf($view_data, "html");

			echo json_encode(array("success" => true, "print_view" => $this->template->view("Warehouse\Views\order_returns\print_order_return", $view_data)));
		} else {
			echo json_encode(array("success" => false, app_lang('error_occurred')));
		}
	}

	/**
	 * download pdf
	 * @param  integer $order_return_id 
	 * @param  string  $mode             
	 * @return [type]                    
	 */
	function download_order_return_pdf($order_return_id = 0, $mode = "download") {
		if ($order_return_id) {
			validate_numeric_value($order_return_id);

			/*Making data*/
			$order_return_data = [];
			$order_return_data['order_return'] = $this->warehouse_model->get_order_return($order_return_id);
			$order_return_data['order_return_details'] = $this->warehouse_model->get_order_return_detail($order_return_id);
			$order_return_data['tax_data'] = $this->warehouse_model->get_html_tax_order_return($order_return_id);

			if($order_return_data['order_return']->company_id != null && is_numeric($order_return_data['order_return']->company_id) && $order_return_data['order_return']->company_id != 0){
				$client_options = [
					'id' => $order_return_data['order_return']->company_id,
				];
				$order_return_data['client_info'] = $this->Clients_model->get_details($client_options)->getRow();
			}

			prepare_order_return_pdf($order_return_data, $mode);
		} else {
			show_404();
		}
	}

	/**
	 * delete order return modal form
	 * @return [type] 
	 */
	public function delete_order_return_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));

		if($this->request->getPost('id')){
			$data['function'] = 'delete_order_return';
			$data['id'] = $this->request->getPost('id');
			return $this->template->view('Warehouse\Views\manage_goods_receipt\delete_modal_form', $data);
		}
	}

	/**
	 * download_barcode
	 * @return [type] 
	 */
	function download_barcode() {
		$mode = "download";
		$select_item = $this->request->getPost('select_item');
		$item_select_print_barcode = $this->request->getPost('item_select_print_barcode');

		/*Making data*/
		$goods_receipt_data = [];
		$goods_receipt_data['select_item'] = (int)$select_item;
		$goods_receipt_data['item_select_print_barcode'] = $item_select_print_barcode;

		prepare_barcode_pdf($goods_receipt_data, $mode);
	}

	/**
	 * print_barcode
	 * @return [type] 
	 */
	function print_barcode() {
		$select_item = $this->request->getPost('select_item');
		$item_select_print_barcode = $this->request->getPost('item_select_print_barcode');

		/*Making data*/
		$view_data = [];
		$view_data['select_item'] = (int)$select_item;
		$view_data['item_select_print_barcode'] = $item_select_print_barcode;

		$view_data['barcode_preview'] = prepare_barcode_pdf($view_data, "html");

		echo json_encode(array("success" => true, "print_view" => $this->template->view("Warehouse\Views\items\print_barcode", $view_data)));
		
	}

	/**
	 * stock summary report
	 * @return [type] 
	 */
	public function stock_summary_report() {
		$data['title'] = app_lang('stock_summary_report');
		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('', true);
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}
		$data['warehouse_filter'] = $this->warehouse_model->get_warehouse();
		$data['period_to_date'] = '';
		$data['period_status_id'] = [1,2];
		$client_options = array(
			"deleted" => 0,
		);
		$data['clients'] = $this->Clients_model->get_details($client_options)->getResultArray();

		return $this->template->rander("Warehouse\Views\\reports\stock_summary_reports\stock_summary_report", $data);
	}

	/**
	 * delete internal delivery modal form
	 * @return [type] 
	 */
	public function delete_internal_delivery_modal_form() {
		$this->access_only_team_members();

		$this->validate_submitted_data(array(
			"id" => "numeric"
		));

		if($this->request->getPost('id')){
			$data['function'] = 'delete_internal_delivery';
			$data['id'] = $this->request->getPost('id');
			return $this->template->view('Warehouse\Views\manage_goods_receipt\delete_modal_form', $data);
		}
	}

	/**
	 * warehouse fee return order
	 * @return [type] 
	 */
	public function warehouse_fee_return_order(){
		$data = $this->request->getPost();

		if (!has_permission('warehouse', '', 'edit') && !is_admin()) {
			$success = false;
			$message = _l('Not permission edit');

			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}

		if($data != 'null'){
			$value = $this->warehouse_model->update_fee_return_order($data);
			if($value){
				$success = true;
				$message = _l('updated_successfully');
			}else{
				$success = false;
				$message = _l('updated_false');
			}
			echo json_encode([
				'message' => $message,
				'success' => $success,
			]);
			die;
		}
	}

	/**
	* stock summary report
	* @return [type] 
	*/
	public function inventory_analytics() {
		$data['title'] = app_lang('stock_summary_report');
		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('', true);
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}
		$data['warehouse_filter'] = $this->warehouse_model->get_warehouse();
		$data['period_to_date'] = '';
		$data['period_status_id'] = [1,2];
		$client_options = array(
			"deleted" => 0,
		);
		$data['clients'] = $this->Clients_model->get_details($client_options)->getResultArray();

		return $this->template->rander("Warehouse\Views\\reports\inventory_analytics\manage", $data);
	}

	/**
	 * warranty period reports
	 * @return [type] 
	 */
	public function warranty_period_reports() {
		$data['title'] = app_lang('warranty_period_report');
		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('', true);
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}
		$data['warehouse_filter'] = $this->warehouse_model->get_warehouse();
		$data['period_to_date'] = '';
		$data['period_status_id'] = [1,2];
		$client_options = array(
			"deleted" => 0,
		);
		$data['clients'] = $this->Clients_model->get_details($client_options)->getResultArray();

		return $this->template->rander("Warehouse\Views\\reports\warranty_period_reports\warranty_period_report", $data);
	}

	/**
	 * download warranty period pdf
	 * @param  string $mode 
	 * @return [type]       
	 */
	public function download_warranty_period_pdf($mode = "view") {
		$data = $this->request->getPost();

		$warranty_period = $this->warehouse_model->get_warranty_period_data($data);

		/*Making data*/
		$warranty_period_data = [];
		$warranty_period_data['warranty_period'] = $warranty_period;

		prepare_warranty_period_pdf($warranty_period_data, $mode);
	}

	/**
	 * inventory valuation reports
	 * @return [type] 
	 */
	public function inventory_valuation_reports() {
		$data['title'] = app_lang('warranty_period_report');
		$data['ajaxItems'] = false;
		if ($this->warehouse_model->count_all_items() <= ajax_on_total_items()) {
			$data['items'] = $this->warehouse_model->wh_get_grouped('', true);
		} else {
			$data['items']     = [];
			$data['ajaxItems'] = true;
		}
		$data['warehouse_filter'] = $this->warehouse_model->get_warehouse();
		$data['period_to_date'] = '';
		$data['period_status_id'] = [1,2];
		$client_options = array(
			"deleted" => 0,
		);
		$data['clients'] = $this->Clients_model->get_details($client_options)->getResultArray();

		return $this->template->rander("Warehouse\Views\\reports\inventory_valuation_reports\inventory_valuation_report", $data);
	}

/*end*/
}