<?php

class ProductionController extends BaseController {

	/**
	 * Constructor
	 */
	public function __construct() {
		// Establish Filters
		$this->beforeFilter('auth');
		$this->beforeFilter('hasRole:' . Role::ROLE_PRODUCTION, array('only' => array('index', 'process', 'success')));
		$this->beforeFilter('hasRole:' . Role::ROLE_PACKING, array('only' => array('packing', 'packingProcess', 'packingSuccess', 'packingPrintSuccess')));
	}

	public function index() {
		$user = User::find(Sentry::getUser()->id);

		$productions1	 = Production::whereNull('production_start_at')->orderBy('id', 'ASC')->get();
		$productions2	 = Production::whereNotNull('production_start_at')->whereNull('production_end_at')->orderBy('id', 'ASC')->get();

		return View::make('production.index')
										->with('user', $user)
										->with('productions1', $productions1)
										->with('productions2', $productions2)
										->with('months', $this->months);
	}

	public function productionPrint($id) {
		return View::make('production.print')
										->with('production', Production::find($id));
	}

	public function productionPrintSuccess($id) {
		$input['success'] = 1;
		return View::make('production.print')
										->with('input', $input)
										->with('production', Production::find($id));
	}
	
	public function productionPrintInWork() {
		$productions = Production::whereNull('production_end_at')
						                 ->where('production_start_at', '>', DB::raw('CURDATE()'))
						                 ->get();
		$today = date('d.m.Y');
		return View::make('production.printinwork')
						        ->with('today', $today)
										->with('productions', $productions);
	}

	public function sizing() {
		$input = Input::all();

		if (!isset($input['partnerId'])) { // || !isset($input['productionMasterId'])
			$response = array(
					'status' => 'fail'
			);
			return Response::json($response);
		}

		$production = Production::whereId($input['partnerId'])->first();
		if ($production == null || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Заказ не найден'
			);
			return Response::json($response);
		}

		$comment = '';
		foreach (Production::wherePartnerId($production->partner_id)->whereNotNull('production_start_at')->whereNull('production_end_at')->get() as $item) {
			$comment .= " ШТОРКА В ПРОИЗВОДСТВЕ: №{$item->order_id}, {$item->name}\n";
			
			$productStorageType	 = ProductQuant::where('product_id', $item->product_id)->where('product_type_id', $item->product_type_id)->first();
			if ($productStorageType != null && $item->production_master_id == 0) { // если было взято со склада
				$oldQuant          = $productStorageType->quant;
				$oldQuantBlocked   = $productStorageType->quant_blocked;
				$productStorageType->decrement('quant_blocked');
				$productStorageType->saveProductQuantHistory($item->product_id, 0, $item->product_type_id, 0, $oldQuant, -1, $oldQuantBlocked, '№'.$item->partner_id.'. Откат увеличения заблокированного по нажатию Нет размера на производстве (продукт)');
			}
		}
		foreach (Production::wherePartnerId($production->partner_id)->whereNotNull('production_start_at')->whereNotNull('production_end_at')->get() as $item) {
			$comment .= "ШТОРКА УЖЕ ГОТОВА: №{$item->order_id}, {$item->name}\n";
			
			$productStorageType	 = ProductQuant::where('product_id', $item->product_id)->where('product_type_id', $item->product_type_id)->first();
			if ($productStorageType != null && $item->production_master_id == 0) { // если было взято со склада
				$oldQuant          = $productStorageType->quant;
				$oldQuantBlocked   = $productStorageType->quant_blocked;
				$productStorageType->increment('quant');
				$productStorageType->saveProductQuantHistory($item->product_id, 0, $item->product_type_id, 1, $oldQuant, 0, $oldQuantBlocked, '№'.$item->partner_id.'. Откат списания кол-ва со склада по нажатию Нет размера на производстве (продукт)');
			}
		}
		if ($comment != '') {
			$production->partner->comment = $comment . $production->partner->comment;
		}
		$production->partner->status						 = Partner::STATUS_SIZING;
		$production->partner->status_next   		 = Partner::STATUS_PRODUCTION_WAIT;
		$production->partner->salenextdatetime	 = DB::raw('NOW()');
		$production->partner->need_size_message	 = $production->name;
		$production->partner->save();

		$production->partner->saveHistory('Возврат с производства - нет размеров.');
		$production->partner->productions()->delete();

		$response = array(
				'status' => 'success'
		);

		return Response::json($response);
	}

	public function process() {
		$input = Input::all();

		if (!isset($input['partnerId'])) {
			$response = array(
					'status' => 'fail1'
			);
			return Response::json($response);
		}

		$production = Production::whereId($input['partnerId'])->whereNull('production_start_at')->first();
		if ($production == null || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Заказ не найден'
			);
			return Response::json($response);
		}

		$production->production_start_at	 = DB::raw('NOW()');
		$production->production_master_id	 = 1;
		$production->save();

		$message											 = "Началось производство комплекта: №{$production->order_id}, {$production->name}";
		$partner											 = $production->partner;
		$partner->production_master_id = 1;
		if ($partner->status == Partner::STATUS_PRODUCTION_WAIT) { // в производство берут первый комплект заказа
			$partner->status = Partner::STATUS_PRODUCTION_PROCESS;
			$partner->save();
			$partner->saveHistory($message);
		}
		else if ($partner->status == Partner::STATUS_PRODUCTION_PROCESS) { // последующие
			$partner->saveHistory($message);
		}

		$response = array(
				'status' => 'success'
		);

		return Response::json($response);
	}

	public function success() {
		$input = Input::all();

		if (!isset($input['partnerId'])) {
			$response = array(
					'status' => 'fail'
			);
			return Response::json($response);
		}

//		$production = Production::whereId($input['partnerId'])->whereNotNull('production_start_at')->whereNull('production_end_at')->first();
		$production = Production::whereId($input['partnerId'])->first();
		if ($production == null || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Заказ не найден'
			);
			return Response::json($response);
		}
		if (!$production->production_start_at) {
			$production->production_start_at = DB::raw('NOW()');
		}
		$production->production_end_at = DB::raw('NOW()');
		$production->save();

		$partner = $production->partner;

		//--> готов очередной комплект
		if ($production->production_master_id == '1') { // производился
			$message = "Закончилось производство комплекта: №{$production->order_id}, {$production->name}";
		}
		else { // взят со склада
			$message = "Взят со склада комплект: №{$production->order_id}, {$production->name}";
		}
		$partner->saveHistory($message);
		//<--
		// все комплекты готовы
		if (!$partner->productions()->whereNull('production_end_at')->count()) {
//			if ($partner->status == Partner::STATUS_PRODUCTION_PROCESS) {
				$partner->status = Partner::STATUS_PRODUCTION_SUCCESS;
//				$partner->status = Partner::STATUS_REGISTRATION;
				$partner->save();
				$message				 = "Заказ №{$production->partner_id}, " . Partner::find($production->partner_id)->name . " - все комплекты готовы";
//			}
				
				$orderContent1 = '';
					foreach ($partner->getCart() as $item) {
						foreach ($item as $item2) {
							if ($item2['quant'] > 0) {
								$orderContent1 .= $item2['name'] . ',' . $item2['quant'] . 'компл. <br>';
							}
						}
					}
				
			$partner->user->changeMoney(-$partner->franchisees_cost, "Списание за производство штор, {$orderContent1}");
			if ($partner->user->hasRole(Role::ROLE_FRANCHISEES)) {
				// состав заказа
				try {
					$orderContent = '';
					foreach ($partner->getCart() as $item) {
						foreach ($item as $item2) {
							if ($item2['quant'] > 0) {
								$orderContent .= $item2['name'] . ',' . $item2['quant'] . 'компл. <br>';
							}
						}
					}
					$partner->user->createNews('Закончилось производство заказа №' . $production->partner_id, '<br>' . Partner::find($production->partner_id)->name . '.<br><b> Состав заказа:</b><br> ' . $orderContent);
				}
				catch (Exception $e) {

				}
			}
			$partner->saveHistory($message);
		}

		$response						 = array(
				'status' => 'success'
		);
		$productStorageType	 = ProductQuant::where('product_id', $production->product_id)->where('product_type_id', $production->product_type_id)->first();
		if ($productStorageType != null && $production->production_master_id == 0) { // если было взято со склада
			$oldQuant          = $productStorageType->quant;
			$oldQuantBlocked   = $productStorageType->quant_blocked;
			$productStorageType->decrement('quant_blocked');
			$productStorageType->decrement('quant');
			$productStorageType->saveProductQuantHistory($production->product_id, 0, $production->product_type_id, -1, $oldQuant, -1, $oldQuantBlocked, '№'.$production->partner_id.', производство №'.$production->id.' Списание из заблокированного и кол-ва на складе по окончанию производства (продукт)');
		}
		return Response::json($response);
	}

	public function noStorage() {
		$input = Input::all();

		if (!isset($input['partnerId'])) {
			$response = array(
					'status' => 'fail'
			);
			return Response::json($response);
		}

		$production = Production::whereId($input['partnerId'])->whereNotNull('production_start_at')->whereNull('production_end_at')->first();
		if ($production == null || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Заказ не найден'
			);
			return Response::json($response);
		}
		$partner													 = $production->partner;
		$production->production_start_at	 = DB::raw('NULL');
		$production->production_master_id	 = DB::raw('NULL');
		$production->save();

		$response	 = array(
				'status' => 'success'
		);
		$message	 = "Нет на складе комплекта: №{$production->order_id}, {$production->name}";
		$partner->saveHistory($message);

		$productStorageType = ProductQuant::where('product_id', $production->product_id)->where('product_type_id', $production->product_type_id)->first();
		if ($productStorageType != null) {
			$oldQuant          = $productStorageType->quant;
			$oldQuantBlocked   = $productStorageType->quant_blocked;
			$productStorageType->decrement('quant_blocked');
			$productStorageType->decrement('quant');
			$productStorageType->saveProductQuantHistory($production->product_id, 0, $production->product_type_id, -1, $oldQuant, -1, $oldQuantBlocked, '№'.$production->partner_id.', производство №'.$production->id.' Откат заблокированного по нажатию Нет на складе (продукт)');
		}
		return Response::json($response);
	}

	public function stat() {
		$user = User::find(Sentry::getUser()->id);

		return View::make('production.stat')
										->with('user', $user)
										->with('masters', ProductionMaster::orderBy('name', 'ASC')->get());
	}

	public function storage() {
		$input = Input::all();
		
		if (Input::has('startDate')) {
			Session::put('stat_startDate', $input['startDate']);
		}
		else {
			$input['startDate'] = Session::get('stat_startDate');
			if (!$input['startDate']) {
				$input['startDate'] = date("d.m.Y");
			}
		}
		if (Input::has('endDate')) {
			Session::put('stat_endDate', $input['endDate']);
		}
		else {
			$input['endDate'] = Session::get('stat_endDate');
			if (!$input['endDate']) {
				$input['endDate'] = date('d.m.Y');
			}
		}

		$startDate = explode('.', $input['startDate']);
		if (checkdate($startDate[1], $startDate[0], $startDate[2])) {
			$startDate = "{$startDate[2]}-{$startDate[1]}-{$startDate[0]}";
		}
		$endDate = explode('.', $input['endDate']);
		if (checkdate($endDate[1], $endDate[0], $endDate[2])) {
			$endDate = "{$endDate[2]}-{$endDate[1]}-{$endDate[0]}";
		}
		
		$productions = Production::where('production_end_at', '>=', $startDate)
															->where('production_end_at', '<=', $endDate.' 23:59:59')
															->where('production_master_id', '=', 0)
															->select(DB::raw('count(product_id) as count, name, production_end_at'))
															->groupBy('product_id')
															->orderBy('production_end_at', 'DESC')
															->get();

		return View::make('production.storage')
										->with('productions', $productions)
										->with('startDate', $startDate)
										->with('endDate', $endDate)
										->with('input', $input);
	}
	
	//----------------------------------- Упаковка -----------------------------------------------------//
	
	public function packing() {
		$user = User::find(Sentry::getUser()->id);

		// обшиваются или ждут упаковки
		$packing1	 = Partner::whereStatus(Partner::STATUS_PRODUCTION_SUCCESS)->orderBy('id', 'ASC')->get();
		// взято в работу упаковщиком
		$packing2	 = Partner::whereStatus(Partner::STATUS_PRODUCTION_PACKING)->orderBy('id', 'ASC')->get();

		return View::make('packing.index')
										->with('user', $user)
										->with('packing1', $packing1)
										->with('packing2', $packing2)
										->with('months', $this->months);
	}
	
	public function packingProcess() {
		$input = Input::all();

		if (!isset($input['partnerId'])) {
			$response = array(
					'status'  => 'fail',
					'message' => 'Нет id'
			);
			return Response::json($response);
		}

		$partner = Partner::find($input['partnerId']);
		if ($partner == null || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Заказ не найден'
			);
			return Response::json($response);
		}

		if ($partner->status == Partner::STATUS_PRODUCTION_SUCCESS) { 
			$message = 'Взят на упаковку заказ №'.$partner->id;
			$partner->status = Partner::STATUS_PRODUCTION_PACKING;
			$partner->save();
			$partner->saveHistory($message);
		}
		else {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Неверный статус заказа'
			);
			return Response::json($response);
		}

		$response = array(
				'status' => 'success'
		);

		return Response::json($response);
	}
	
	public function packingSuccess() {
		$input = Input::all();

		if (!isset($input['partnerId'])) {
			$response = array(
					'status' => 'fail'
			);
			return Response::json($response);
		}

		$partner = Partner::find($input['partnerId']);
		if ($partner == null || !$partner->statusIsAllow(Partner::ALLOW_PRODUCTION_PACKED) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}

		$partner->status = Partner::STATUS_REGISTRATION;
		$partner->salenextdatetime = DB::raw('NOW()');
		$partner->packed_at = DB::raw('NOW()');
		$partner->save();
		$partner->saveHistory("Заказ №".$partner->id." - упакован и готов к отправке");

		$response = array(
				'status' => 'success'
		);

		return Response::json($response);
	}
	
	//печать одиночного заказа
	public function packingPrintSuccess($partnerId) {
		$input['success'] = 1;
		return View::make('packing.print')
										->with('input', $input)
										->with('partner', Partner::find($partnerId));
	}

	//печать заказов упакованных сегодня
	public function packedToday() {
    $today = date('d.m.Y');
		$partners = Partner::where('packed_at', '>', DB::raw('CURDATE()'))
						            ->whereStatus(Partner::STATUS_REGISTRATION)
						            ->get();

		return View::make('packing.printlist')
							       ->with('today', $today)
										 ->with('partners', $partners);
	}
	
	// Вкладка в производстве - упакованные заказы
	public function packed() {
		$user = User::find(Sentry::getUser()->id);

		$partners	 = Partner::whereStatus(Partner::STATUS_REGISTRATION)->orderBy('transport_type', 'ASC')->orderBy('id', 'ASC')->get();
		
		return View::make('packing.packedlist')
										->with('user', $user)
										->with('partners', $partners);
	}
	
	//печать упакованных заказов - ПОЧТА
	public function packedPost() {
		$today = date('d.m.Y');
		$partners = Partner::whereStatus(Partner::STATUS_REGISTRATION)
												->whereTransportType(Partner::TRANSPORT_TYPE_POST)
						            ->get();
    $type = 'Почта';
		
		return View::make('packing.printbytype')
										 ->with('today', $today)
										 ->with('partners', $partners)
										 ->with('type', $type);
	}
	
	//печать упакованных заказов - СДЭК
	public function packedCdek() {
		$today = date('d.m.Y');
		$partners = Partner::whereStatus(Partner::STATUS_REGISTRATION)
												->whereTransportType(Partner::TRANSPORT_TYPE_CDEK)
						            ->get();
    $type = 'СДЭК';
		
		return View::make('packing.printbytype')
										 ->with('today', $today)
										 ->with('partners', $partners)
										 ->with('type', $type);
	}
	
	//печать упакованных заказов - DPD
	public function packedDpd() {
		$today = date('d.m.Y');
		$partners = Partner::whereStatus(Partner::STATUS_REGISTRATION)
												->whereTransportType(Partner::TRANSPORT_TYPE_DPD)
						            ->get();
    $type = 'DPD';
		
		return View::make('packing.printbytype')
						         ->with('today', $today)
										 ->with('partners', $partners)
										 ->with('type', $type);
	}
	
	//печать упакованных заказов - Все
	public function packedAll() {
		$today = date('d.m.Y');
		$partners = Partner::whereStatus(Partner::STATUS_REGISTRATION)
						            ->get();
    $type = 'Все';
		
		return View::make('packing.printbytype')
						         ->with('today', $today)
										 ->with('partners', $partners)
										 ->with('type', $type);
	}
	//--------------------------------------------------------------------------------------------------//
}