<?php

class PartnerController extends BaseController {

	/**
	 * Constructor
	 */
	public function __construct() {
		// Establish Filters
		$this->beforeFilter('auth');

		if (Auth::check()) {
			$this->user			 = Auth::user();
			$this->projects	 = $this->user->projects()->whereUsecrm(1)->get();
		}
		parent::__construct();

		if ($this->user && !$this->user->hasAnyRole(array(Role::ROLE_CRM, Role::ROLE_LOGISTICS, Role::ROLE_CALL_CHECKER))) {
			$this->beforeFilter('hasRole:' . Role::ROLE_CRM);
			$this->beforeFilter('hasRole:' . Role::ROLE_LOGISTICS);
			$this->beforeFilter('hasRole:' . Role::ROLE_CALL_CHECKER);
		}
	}

	public function index($partnerId) {
		$partner = Partner::find($partnerId);
		if ($partner == null || !is_numeric($partnerId)) {
			return Redirect::to('/');
		}
		if ($partner->project->id != 20 && $partner->project->id != 91 && in_array($partner->status, array(Partner::STATUS_NOANSWER, Partner::STATUS_REJECT))) {
			if ($partner->user_id != $this->user->id) {
				$partner->user()->associate($this->user);
				$partner->salenextdatetime = DB::raw('DATE_ADD(NOW(), INTERVAL 30 MINUTE)');
				$partner->save();
//				$partner->saveHistory("Клиент перешел к другому менеджеру: {$this->user->first_name} {$this->user->last_name}");
			}
		}
		elseif (($partner->project->id == 20 || $partner->project->id == 91) && in_array($partner->status, array(Partner::STATUS_WORK, Partner::STATUS_NOANSWER, Partner::STATUS_REJECT))) {
			if ($partner->user_id != $this->user->id) {
				$partner->user()->associate($this->user);
				$partner->save();
//				$partner->saveHistory("Клиент перешел к другому менеджеру: {$this->user->first_name} {$this->user->last_name}");
			}
		}

		$managers = array();
		foreach (User::whereRaw('id IN (SELECT user_id FROM users_projects WHERE project_id=?)', array($partner->project->id))->get() as $manager) {
			if ($manager->hasRole(Role::ROLE_CRM)) {
				$managers[$manager->id] = "{$manager->first_name} {$manager->last_name}";
			}
		}

		$oldPartners = Partner::where('project_id', '=', $partner->project_id)->where('id', '!=', $partner->id)->wherePhone($partner->phone)->orderBy('id', 'DESC')->get();

		$shedule = array ();
		$interviewPartners = DB::table('partners')->select(DB::raw('salenextdatetime, count(*) as quant'))
                     ->where('status', '=', Partner::STATUS_HR_INTERVIEW_WAIT)
			               ->orderBy('salenextdatetime', 'asc')
                     ->groupBy('salenextdatetime')
                     ->get();
			foreach ($interviewPartners as $interviewPartner) { // 2014-10-30 15:30:00
			  $datetime = explode(' ', $interviewPartner->salenextdatetime);
				$date	= explode('-', $datetime[0]);
				$time = explode(':', $datetime[1]);
				$day = $this->days[date("w", mktime(0, 0, 0, $date[1], $date[2], $date[0]))];
				$key = "$day, {$date[2]} {$this->months[$date[1]]}";
				$shedule[$key][$time[0].':'.$time[1]] = $interviewPartner->quant;
			}

            $sdekcitylist = CdekCity::getCityList();

		return $this->setupLayout('partner.index')
										->with('managers', $managers)
										->with('partner', $partner)
                                        ->with('shedule', $shedule)
										->with('oldPartners', $oldPartners)
                                        ->with('sdekcitylist', $sdekcitylist);
	}

	// список менеджеров в проекте
	public function getManagersList(){
		$input = Input::all();

		$partner = Partner::find($input['id']);
		if ($partner == null || !is_numeric($input['id'])) {
			$response = array(
				'status'	 => 'fail',
				'message'  => 'Заявка с таким номером не найдена'
		  );
		  return Response::json($response);
		}

		$managers = User::select(DB::raw('users.*'))
										->leftJoin('users_roles as ur', 'users.id', '=', 'ur.user_id')
										->leftJoin('users_projects as up', 'users.id', '=', 'up.user_id')
										->whereIn('ur.role_id', array(Role::ROLE_CRM, Role::ROLE_LOGISTICS))
										->where('up.project_id', '=', $partner->project_id)
										->groupBy('users.id')
										->orderBy('users.last_name')
										->get();

		$response = array(
				'status'	 => 'success',
				'managers' => $managers
		);
		return Response::json($response);
	}

	// кнопка в заявке - Передать клиента
	public function setNewManager(){
		$input = Input::all();

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

		$manager = User::find($input['userId']);
		if ($partner == null || !is_numeric($input['userId'])) {
			$response = array(
				'status'	 => 'fail',
				'message'  => 'Менеджер с таким id не найден'
		  );
		  return Response::json($response);
		}

		if($partner->created_user_id == null){
		  $partner->created_user_id = $partner->user_id;
		}
		$partner->user_id = $manager->id;
		$partner->save();
		$partner->saveHistory('Клиент передан новому менеджеру - '.$manager->last_name.' '.$manager->first_name);

		$response = array(
				'status'	=> 'success'
		);
		return Response::json($response);
	}

	public function trashPhone() {
		$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_TRASH_PHONE) || !is_numeric($input['partnerId']) || $partner->user_id != Auth::user()->id) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}
		$partner->salenextdatetime = DB::raw('NOW()');
		$partner->status					 = Partner::STATUS_TRASH_PHONE;
		$partner->recall					 = 0;
		$partner->save();

		$refrence	 = $partner->saveHistory("Не корректный номер телефона");
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function call() {
		$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_CALL) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}

		$this->user	 = Auth::user();
		$mlsitcall	 = Mlsitcall::create(array('phone' => $partner->phone));
		$mlsitcall->user()->associate($this->user);
		$mlsitcall->partner()->associate($partner);
		$mlsitcall->save();
		$mlsitcall->call();

		$refrence					 = $partner->saveHistory("Звонок клиенту");
		$refrence->mlsitcall()->associate($mlsitcall);
		$refrence->useful	 = 1;
		$refrence->save();
		$partner					 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function getCallFile($id) {
		$mlsitcall = Mlsitcall::find($id);
		if ($mlsitcall == null || !is_numeric($id)) {
			return \App::abort(404);
		}

		$file			 = $mlsitcall->getCallFile();
		$response	 = Response::make($file, 206);
		$response->header('Content-Type', 'audio/x-wav');
		$response->header('Accept-Ranges', 'bytes');
		$response->header('Content-Length', strlen($file));
		$response->header('Content-Range', 'bytes 0-' . (strlen($file) - 1) . '/' . strlen($file));

		return $response;
	}

	public function downloadCallFile($id, $name) {
		$mlsitcall = Mlsitcall::find($id);
		if ($mlsitcall == null || !is_numeric($id)) {
			return \App::abort(404);
		}

		$file			 = $mlsitcall->getCallFile();
		$response	 = Response::make($file, 206);
		$response->header('Content-Type', 'audio/x-wav');
		$response->header('Accept-Ranges', 'bytes');
		$response->header('Content-Length', strlen($file));
		$response->header('Content-Range', 'bytes 0-' . (strlen($file) - 1) . '/' . strlen($file));

		return $response;
	}

	public function repeated() {
		$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_REPEATED) || !is_numeric($input['partnerId']) || $partner->user_id != Auth::user()->id) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}
		$partner->salenextdatetime = DB::raw('NOW()');
		$partner->status					 = Partner::STATUS_REPEATED;
		$partner->recall					 = 0;
		$partner->save();

		$refrence	 = $partner->saveHistory("Повторный клиент");
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

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

		if (!isset($input['partnerId'])) {
			$response = array(
					'status' => 'fail'
			);
			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_WORK) {
			if ($partner->recall < 2) {
				$partner->salenextdatetime = DB::raw('DATE_ADD(NOW(), INTERVAL 90 MINUTE)');
				$partner->status					 = Partner::STATUS_WORK;
				$partner->recall++;
				$partner->save();

				$refrence = $partner->saveHistory("Не дозвонился до клиента, перезвонить через 1,5 часа");
			}
			elseif ($partner->recall < 4) {
				$partner->salenextdatetime = DB::raw('DATE_ADD(NOW(), INTERVAL 23 HOUR)');
				$partner->status					 = Partner::STATUS_WORK;
				$partner->recall++;
				$partner->save();

				$refrence = $partner->saveHistory("Не дозвонился до клиента, перезвонить завтра");
			}
			else {
				$partner->recall++;
				$partner->status = Partner::STATUS_NOANSWER;
				$partner->save();

				if ($partner->recall == 4) {
					$refrence = $partner->saveHistory("Не дозвонился до клиента, отправлен в архив недозвонившихся");
				}
				else {
					$refrence = $partner->saveHistory("Не дозвонился до клиента, оставлен в архиве недозвонившихся");
				}
			}
		}
		else {
			$partner->salenextdatetime = DB::raw('DATE_ADD(NOW(), INTERVAL 30 MINUTE)');
			$partner->save();

			$refrence = $partner->saveHistory("Не дозвонился до клиента, перезвонить через 30 минут");
		}

		$partner = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

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

		if (!isset($input['partnerId'])) {
			$response = array(
					'status' => 'fail'
			);
			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);
		}
		$partner->salenextdatetime = DB::raw('DATE_ADD(NOW(), INTERVAL 15 MINUTE)');
		$partner->save();
		$refrence									 = $partner->saveHistory("Клиент занят, перезвонить через 15 минут");

		$partner = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function reject() {
		$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_REJECT) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status' => 'fail'
			);
			return Response::json($response);
		}

		if (!isset($input['reject_type']) || !$input['reject_type']) {
			if (!isset($input['comment']) || $input['comment'] == '') {
				$message		 = 'Необходимо указать причину отказа';
				$error_field = 'reject_comment';
				$response		 = array(
						'status'				 => 'fail',
						'error_message'	 => $message,
						'error_field'		 => $error_field
				);
				return Response::json($response);
			}
			$partner->reject_id = 0;
		}
		else {
			$reject = Reject::find($input['reject_type']);
			if ($reject == null || !is_numeric($input['reject_type']) || $reject->project_id != $partner->project_id) {
				$response = array(
						'status' => 'fail'
				);
				return Response::json($response);
			}
			$partner->reject_id = $reject->id;
			if (isset($input['comment']) && $input['comment']) {
				$input['comment'] = "{$reject->name}. {$input['comment']}";
			}
			else {
				$input['comment'] = $reject->name;
			}
		}

		$partner->recall = 0;

		if ($partner->statusIsAllow(Partner::ALLOW_DELETE_CDEK)) {
			$result = $partner->deleteCdek();
		}
		DB::table('shipments_partners')->where('partner_id', '=', $partner->id)->delete();

		if ($partner->status == Partner::STATUS_DELIVERY_BEFORE_DELIVERING) {
			$partner->status = Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL;
			$message				 = "Клиент отказался от покупки: ";
		}
		elseif ($partner->status == Partner::STATUS_DELIVERY_AFTER_WAIT_PAY || $partner->status == Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM) {
			$partner->status = Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL;
			$message				 = "Клиент отказался платить: ";
		}
		else {
			$partner->status = Partner::STATUS_REJECT;
			$message				 = "Клиент отказался покупать: ";
		}
		$partner->save();

		$refrence	 = $partner->saveHistory($message . $input['comment']);
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	//переносим клиента на нужную дату и время
	public function setDateTime() {
		$input		 = Input::all();
		$partnerId = $input['partner_id'];

		if (!$partnerId || !is_numeric($partnerId)) {
			$response = array(
					'status' => 'fail'
			);
			return Response::json($response);
		}

		if (!isset($input['comment']) || $input['comment'] == '') {
			$message		 = 'Необходимо указать текст';
			$error_field = 'refrence_comment';

			$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
			return Response::json($response);
		}
//		if (isset($input['comment'])) {
//			if (strlen($input['comment']) < 50) {
//				$message		 = 'Слишком короткий комментарий';
//				$error_field = 'refrence_comment';
//				$response		 = array(
//						'status'				 => 'fail',
//						'error_message'	 => $message,
//						'error_field'		 => $error_field
//				);
//				return Response::json($response);
//			}
//		}

		$partner = Partner::find($partnerId);
		if ($partner == null || !is_numeric($partnerId) || $partner->user_id != Auth::user()->id) {
			$message		 = 'Эта не ваш клиент, вы не можете обработать его';
			$error_field = 'refrence_comment';

			$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
			return Response::json($response);
		}

		$validator = Validator::make(
										$input, array(
								'nextdate' => 'required|date_format:d.m.Y',
								'nexttime' => 'required|date_format:H:i'
										)
		);
		if ($validator->fails()) {
			$message		 = 'Не правильная дата или время';
			$error_field = 'refrence_nextdatetime';

			$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
			return Response::json($response);
		}

		$validator = Validator::make(
										$input, array(
								'nextdate' => 'after:' . date("Y-m-d", time() - 60 * 60 * 24)
										)
		);
		if ($validator->fails()) {
			$message		 = 'На эту дату нельзя перенести клиента';
			$error_field = 'refrence_nextdatetime';

			$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
			return Response::json($response);
		}

		if ($input['nextdate'] && $input['nexttime']) {
			$nextdate = explode('.', $input['nextdate']);
			if (checkdate($nextdate[1], $nextdate[0], $nextdate[2])) {
//				if (preg_match("/^([0-1][0-9]|[2][0-3]):([0-5][0-9])$/", $input['nexttime'])) {
				$partner->salenextdatetime = "{$nextdate[2]}-{$nextdate[1]}-{$nextdate[0]} {$input['nexttime']}";
//				}
			}
		}
		$partner->recall = 0;
		if (in_array($partner->status, array(Partner::STATUS_REJECT, Partner::STATUS_NOANSWER))) {
			$partner->status = Partner::STATUS_WORK;
		}
		$partner->save();

		if ($input['refrence_user_id'] != $partner->user->id) {
			$manager = User::whereRaw('id=? AND id IN (SELECT user_id FROM users_projects WHERE project_id=?)', array($input['refrence_user_id'], $partner->project->id))->first();
			if ($manager) {
				$partner->user()->associate($manager);
				$partner->save();
				$refrence = $partner->saveHistory("Передал клиента, новый менеджер {$manager->first_name} {$manager->last_name}");
			}
		}

		$nextdate[0] = (int)$nextdate[0];
		$refrence = $partner->saveHistory("Перенес клиента на {$nextdate[0]} {$this->months[$nextdate[1]]} {$input['nexttime']}. {$input['comment']}");

		if (isset($input['importantcall']) && $input['importantcall']) {
			$partner->importantcall = 1;
		}
		else {
			$partner->importantcall = 0;
		}
		$partner->save();

		$partner = Partner::find($partnerId);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);

		return Response::json($response);
	}

	//клиент согласился
	public function agree() {
		$input		 = Input::all();
		$partnerId = $input['agreePartnerId'];

		if (!$partnerId || !is_numeric($partnerId)) {
			$response = array(
					'status' => 'fail'
			);
			return Response::json($response);
		}

		$partner = Partner::find($partnerId);
		if ($partner == null || !is_numeric($partnerId)) {
			$message		 = 'Эта не ваш клиент, вы не можете обработать его';
			$error_field = 'agree_comment';

			$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
			return Response::json($response);
		}

		if ($partner->project->type == Project::TYPE_HR) {
//			if (!isset($input['agree_hr_worktime'])) {
//				$message		 = 'Укажите время работы';
//				$error_field = 'agree_hr_worktime';
//
//				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
//				return Response::json($response);
//			}
//			if (!isset($input['agree_city'])) {
//				$message		 = 'Укажите город';
//				$error_field = 'agree_city';
//
//				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
//				return Response::json($response);
//			}
//			if (!isset($input['agree_hr_causejobsearch'])) {
//				$message		 = 'Укажите причину';
//				$error_field = 'agree_hr_causejobsearch';
//
//				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
//				return Response::json($response);
//			}
//			if (!isset($input['agree_hr_previouspost'])) {
//				$message		 = 'Укажите должности';
//				$error_field = 'agree_hr_previouspost';
//
//				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
//				return Response::json($response);
//			}
//			if (!isset($input['agree_hr_want'])) {
//				$message		 = 'Укажите желаемую зарплату';
//				$error_field = 'agree_hr_want';
//
//				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
//				return Response::json($response);
//			}
			if (!isset($input['agree_hr_wantpost'])) {
				$message		 = 'Укажите желаемую должность';
				$error_field = 'agree_hr_wantpost';

				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
				return Response::json($response);
			}

			$validator = Validator::make(
											$input, array(
									'interview_nextdate' => 'required|date_format:d.m.Y',
									'interview_nexttime' => 'required|date_format:H:i'
											)
			);
			if ($validator->fails()) {
				$message		 = 'Не правильная дата или время';
				$error_field = 'interview_nextdatetime';

				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
				return Response::json($response);
			}

			$validator = Validator::make(
											$input, array(
									'interview_nextdate' => 'after:' . date("Y-m-d", time() - 60 * 60 * 24)
											)
			);
//			if ($validator->fails()) {
//				$message		 = 'На эту дату нельзя перенести клиента';
//				$error_field = 'interview_nextdatetime';
//
//				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
//				return Response::json($response);
//			}

			if ($input['interview_nextdate'] && $input['interview_nexttime']) {
				$nextdate = explode('.', $input['interview_nextdate']);
				if (checkdate($nextdate[1], $nextdate[0], $nextdate[2])) {
					$partner->salenextdatetime = "{$nextdate[2]}-{$nextdate[1]}-{$nextdate[0]} {$input['interview_nexttime']}";
				}
			}

			$partner->name							 = e($input['agree_name']);
			$partner->phone							 = e($this->preparePhone($input['agree_phone']));
//			$partner->email							 = e($input['agree_email']);
//			$partner->city							 = e($input['agree_city']);
			$partner->comment						 = e($input['agree_info']);
//			$partner->hr_skype					 = e($input['agree_hr_skype']);
//			$partner->hr_worktime				 = e($input['agree_hr_worktime']);
//			$partner->hr_causejobsearch	 = e($input['agree_hr_causejobsearch']);
//			$partner->hr_previouspost		 = e($input['agree_hr_previouspost']);
//			$partner->hr_want						 = e($input['agree_hr_want']);
			$partner->hr_wantpost				 = e($input['agree_hr_wantpost']);
//			$partner->hr_havingcomputer	 = isset($input['agree_hr_havingcomputer']) ? 1 : 0;
//			$partner->hr_havingcomputer	 = isset($input['agree_hr_havingcomputer']) ? 1 : 0;
//			$partner->hr_havinginternet	 = isset($input['agree_hr_havinginternet']) ? 1 : 0;
//			$partner->hr_havingheadset	 = isset($input['agree_hr_havingheadset']) ? 1 : 0;
			$partner->status						 = Partner::STATUS_HR_INTERVIEW_WAIT;
			$partner->datetime_of_agree	 = DB::raw('NOW()');
			$partner->save();

			$nextdate[0] = (int)$nextdate[0];
			$message	 = "Претендент придет на собеседование {$nextdate[0]} {$this->months[$nextdate[1]]} в {$input['interview_nexttime']}.";
			$refrence	 = $partner->saveHistory($message);
			$partner	 = Partner::find($partnerId);

			$refrence->load('sender');
			$comment						 = $refrence->toArray();
			$comment['comment']	 = nl2br($comment['comment']);
		}
		else {
			if (!isset($input['agree_city'])) {
				$message		 = 'Укажите город доставки';
				$error_field = 'agree_city';

				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
				return Response::json($response);
			}
			if (!isset($input['agree_city'])) {
				$message		 = 'Укажите улицу';
				$error_field = 'agree_street';

				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
				return Response::json($response);
			}
			if (!isset($input['agree_city'])) {
				$message		 = 'Укажите номер дома';
				$error_field = 'agree_building';

				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
				return Response::json($response);
			}
//			if (!isset($input['agree_address'])) {
//				$message		 = 'Укажите адрес доставки';
//				$error_field = 'agree_address';
//
//				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
//				return Response::json($response);
//			}

			if (!isset($input['agree_product']) || !is_array($input['agree_product'])) {
				$message		 = 'Необходимо выбрать продукт';
				$error_field = 'agree_pay_error_container';

				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
				return Response::json($response);
			}
			$count = 0;
			foreach ($input['agree_product'] as $key => $value) {
				$count += $value;
			}
			if (!$count) {
				$message		 = 'Необходимо выбрать продукт';
				$error_field = 'agree_pay_error_container';

				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
				return Response::json($response);
			}
			if (!isset($input['agree_transport_type']) || !in_array($input['agree_transport_type'], array(Partner::TRANSPORT_TYPE_DPD, Partner::TRANSPORT_TYPE_POST, Partner::TRANSPORT_TYPE_CDEK))) {
				$message		 = 'Необходимо выбрать тип доставки';
				$error_field = 'agree_pay_error_container';

				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
				return Response::json($response);
			}
			if (!isset($input['agree_pay_type']) || !in_array($input['agree_pay_type'], array(1, 2))) {
				$message		 = 'Необходимо выбрать тип оплаты';
				$error_field = 'agree_pay_error_container';

				$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
				return Response::json($response);
			}
			if ($input['agree_transport_type'] == Partner::TRANSPORT_TYPE_CDEK) {
				if (!isset($input['receiverCityId']) || !$input['cdek_city']) {
					$message		 = 'Необходимо указать город доставки из СДЭК';
					$error_field = 'agree_pay_error_container';

					$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
					return Response::json($response);
				}
				if (!$input['cdekCacheOnDelivery'] && $input['agree_pay_type'] == 2) {
					$message		 = 'В выбранном городе нет наложенного платежа';
					$error_field = 'agree_pay_error_container';

					$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
					return Response::json($response);
				}
			}
			if (!isset($input['agree_delivery_pay_free_post']) || !$input['agree_delivery_pay_free_post']) {
				if (!isset($input['agree_delivery_pay']) || !$input['agree_delivery_pay']) {
					$message		 = 'Необходимо указать стоимость доставки';
					$error_field = 'agree_pay_error_container';

					$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
					return Response::json($response);
				}
			}

			if ($input['agree_pay_type'] == 1) {
				$validator = Validator::make($input, array('agree_nextdate' => 'required|date_format:d.m.Y'));
				if ($validator->fails()) {
					$message		 = 'Не правильная дата';
					$error_field = 'agree_pay_error_container';

					$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
					return Response::json($response);
				}
				$validator = Validator::make($input, array('agree_nextdate' => 'after:' . date("Y-m-d", time() - 60 * 60 * 24)));
				if ($validator->fails()) {
					$message		 = 'На эту дату нельзя перенести клиента';
					$error_field = 'agree_pay_error_container';

					$response = array('status' => 'fail', 'error_message' => $message, 'error_field' => $error_field);
					return Response::json($response);
				}
			}

			$partner->name									 = e($input['agree_name']);
			$partner->phone									 = e($this->preparePhone($input['agree_phone']));
			$partner->email									 = e($input['agree_email']);
			$partner->paytype								 = e($input['agree_pay_type']);
			$partner->zip										 = e($input['agree_zip']);
			$partner->state									 = e($input['agree_state']);
			$partner->region								 = e($input['agree_region']);
			$partner->city									 = e($input['agree_city']);
			$partner->street								 = e($input['agree_street']);
			$partner->building							 = e($input['agree_building']);
			$partner->room									 = e($input['agree_room']);
			$partner->address								 = e($input['agree_address']);
			$partner->address_short					 = e($input['agree_address_short']);
			$partner->comment								 = e($input['agree_info']);
			$partner->transport_type				 = e($input['agree_transport_type']);
			$partner->cdek_senderCityId			 = e($input['senderCityId']);
			$partner->cdek_receiverCityId		 = e($input['receiverCityId']);
			$partner->cdek_receiverCity			 = e($input['cdek_city']);
			$partner->cdek_tariffId					 = e($input['tariffId']);
			$partner->cdek_cacheOnDelivery	 = e($input['cdekCacheOnDelivery']);
			$partner->clarification_address	 = 0;

			if (!isset($input['agree_discount_type'])) {
				$input['agree_discount_type'] = 0;
			}
			if ($input['agree_discount_type'] == 1) {
				$input['agree_discount'] = -$input['agree_discount'];
			}
			$discount					 = $input['agree_discount'];
			$sum							 = 0;
			$purchase_sum			 = 0;
			$cache_on_delivery = $partner->project->cache_on_delivery;
			$cart							 = array();
			$discountUsed			 = false;
			foreach ($input['agree_product'] as $key => $value) {
				$productId = explode('-', $key);
				$key			 = $productId[0];
				$product	 = Product::find($key);
				if ($product != null && $value > 0) {
					$purchase_sum += $product->price_purchase * $value;
					$price = $product->price;
					if ($productId[1] == 1) {
						$price = $product->action_price1;
					}
					elseif ($productId[1] == 2) {
						$price = $product->action_price2;
					}
					elseif ($productId[1] == 3) {
						$price = $product->action_price3;
					}
					$sum += $price * $value;
					if ($discount && !$discountUsed) {
						if ($discount > 0) {
							$discountUsed = true;
							$sum += $discount;
							$price += $discount / $value;
						}
						elseif ($discount < 0 && abs($discount / $value) <= $price) {
							$discountUsed	 = true;
							$sum += $discount;
							$price += $discount / $value;
							$discount			 = 0;
						}
						elseif ($discount < 0 && abs($discount / $value) > $price) {
							$sum -= $product->price * $value;
							$discount	 = -(abs($discount / $value) - $price);
							$price		 = 0;
						}
					}
					$cart[$product->id . '-' . $productId[1]] = array(
							'id'			 => $product->id,
							'article'	 => $product->article,
							'name'		 => $product->name,
							'price'		 => $price,
							'quant'		 => $value,
					);
				}
				unset($product);
			}
			$needSendBonusSMS = false;
			if ($input['agree_pay_type'] == 1) {
				$partner->status = Partner::STATUS_DELIVERY_AFTER_WAIT_PAY;
			}
			else {
				$sum += $cache_on_delivery;
				if (!$partner->datetime_of_agree) {
//				if ($partner->status != Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING) {
					$partner->datetime_of_agree = DB::raw('NOW()');

					$needSendBonusSMS = true;
				}
				$partner->status					 = Partner::STATUS_DELIVERY_BEFORE_REGISTRATION;
				$partner->salenextdatetime = DB::raw('NOW()');
			}

			if ($discount && $discount < 0) {
				if (abs($discount) >= $input['agree_delivery_pay']) {
					$input['agree_delivery_pay'] = 0;
				}
				else {
					$input['agree_delivery_pay'] += $discount;
				}
			}
			$partner->deliveryprice	 = e($input['agree_delivery_pay']);
			$partner->discount			 = e($input['agree_discount']);
			$partner->cartprice			 = e($sum);
			$partner->purchaseprice	 = e($purchase_sum);
			$partner->cart					 = json_encode($cart);
			$partner->recall				 = 0;

			if ($input['agree_pay_type'] == 1) {
				if ($input['agree_nextdate'] && $input['agree_pay_type'] == 1) {
					$nextdate = explode('.', $input['agree_nextdate']);
					if (checkdate($nextdate[1], $nextdate[0], $nextdate[2])) {
						$partner->salenextdatetime = "{$nextdate[2]}-{$nextdate[1]}-{$nextdate[0]} 16:00";
					}
				}
			}
			$partner->save();
			DB::table('shipments_partners')->where('partner_id', '=', $partner->id)->delete();

			if ($needSendBonusSMS) {
				$partner->sendBonusSms();
			}

			if ($input['agree_pay_type'] == 1) {
				$message = "100% предоплата, к оплате {$sum} руб, стоимость доставки {$partner->deliveryprice} руб Связаться {$nextdate[0]} {$this->months[$nextdate[1]]} для уточнения сроков оплаты.";
			}
			else {
				$message = "Доставка наложенным платежом, к оплате {$sum} руб, стоимость доставки {$partner->deliveryprice} руб";
			}

			$refrence	 = $partner->saveHistory($message);
			$partner	 = Partner::find($partnerId);

			$refrence->load('sender');
			$comment						 = $refrence->toArray();
			$comment['comment']	 = nl2br($comment['comment']);
		}

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);

		return Response::json($response);
	}

	public function paymentConfirm() {
		$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_PAYMENT_CONFIRM) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}
		$partner->paidsum					 = e($input['paidsum']);
		$partner->salenextdatetime = DB::raw('DATE_ADD(NOW(), INTERVAL 1 DAY)');
		$partner->status					 = Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM;
		$partner->recall					 = 0;
		$partner->save();

		$refrence	 = $partner->saveHistory("Клиент сказал что оплатил {$input['paidsum']} руб");
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function paymentRecive() {
		$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_PAYMENT_RECEPTION) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}
		if ($partner->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY) {
			$partner->status = Partner::STATUS_DELIVERY_BEFORE_SUCCESS;
		}
		else {
			$partner->paidsum						 = e($input['paidsum']);
			$partner->status						 = Partner::STATUS_DELIVERY_AFTER_REGISTRATION;
			$partner->datetime_of_agree	 = DB::raw('NOW()');
			$partner->salenextdatetime	 = DB::raw('NOW()');
		}
		$partner->salenextdatetime = DB::raw('DATE_ADD(NOW(), INTERVAL 1 DAY)');
		$partner->recall					 = 0;
		$partner->save();

		$partner->sendBonusSms();

		$refrence	 = $partner->saveHistory("Оплата получена. Сумма {$input['paidsum']} руб");
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function recivedAndPaymentRecive() {
		$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_RECIVED_AND_PAYMENT_RECIVED) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}
		$partner->status					 = Partner::STATUS_DELIVERY_BEFORE_SUCCESS;
		$partner->salenextdatetime = DB::raw('DATE_ADD(NOW(), INTERVAL 1 DAY)');
		$partner->recall					 = 0;
		$partner->save();

		$partner->sendBonusSms();

		$refrence	 = $partner->saveHistory("Товар успешно получен клиентом");
		$refrence	 = $partner->saveHistory("Оплата получена. Сумма {$input['paidsum']} руб");
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function clarificationAddress() {
		$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_CLARIFICATION_ADDRESS) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}
		$partner->clarification_address = 1;
		$partner->save();

		$refrence	 = $partner->saveHistory("Необходимо уточнить адрес");
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function sendToShoplogistics() {
		set_time_limit(0);

		$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_SEND_TO_SHOPLOGISTICS) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}

		$result = $partner->addToShopLogistics();

		$partner->recall = 0;
		$partner->save();

		if ($result['status'] == 'fail') {
			$response = array(
					'status'	 => 'fail',
					'btns'		 => View::make('partner.btns')->with('partner', $partner)->render(),
					'message'	 => $result['message']
			);
			return Response::json($response);
		}

		$refrence	 = $partner->saveHistory($result['message']);
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function sendToShoplogisticsAll() {
		set_time_limit(0);

		$date			 = Session::get('crm_date');
		$projectId = Session::get('work_projectId');
		if (!$date || !$projectId) {
			$response = array(
					'status' => 'false'
			);
			return Response::json($response);
		}

		foreach (Partner::with('user')
						->checkStatus(array('statusType' => 'agreed', 'type' => 'registration'))
						->whereProjectId($projectId)
						->whereTransportType(Partner::TRANSPORT_TYPE_POST)
						->whereClarificationAddress(0)
						->whereRaw('(DATE(datetime_of_agree)<? OR (DATE(datetime_of_agree)=? AND TIME(datetime_of_agree)<TIME(?)))', array($date, $date, '16:00:00'))
						->get() as $partner) {
			if ($partner && $partner->statusIsAllow(Partner::ALLOW_SEND_TO_SHOPLOGISTICS)) {
				$result					 = $partner->addToShopLogistics();
				$partner->recall = 0;
				$partner->save();

				if ($result['status'] == 'success') {
					$partner->saveHistory($result['message']);
					$partner->save();
				}
			}
		}

		$response = array(
				'status' => 'success'
		);
		return Response::json($response);
	}

	public function checkShoplogistics() {
		$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_CHECK_SHOPLOGISTICS) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}

		$result					 = $partner->checkShopLogistics();
		$partner->recall = 0;
		$partner->save();

		$refrence	 = $partner->saveHistory($result['message']);
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function sendToCdek() {
		set_time_limit(0);

		$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_SEND_TO_SHOPLOGISTICS) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}

//		$result = $partner->addToCdek();
//		$partner->recall = 0;
//		$partner->save();
//
//		if ($result['status'] == 'fail') {
//			$response = array(
//					'status'	 => 'fail',
//					'btns'		 => View::make('partner.btns')->with('partner', $partner)->render(),
//					'message'	 => $result['message']
//			);
//			return Response::json($response);
//		}
//
//		$refrence	 = $partner->saveHistory($result['message']);
//		$partner	 = Partner::find($input['partnerId']);
//
//		$refrence->load('sender');
//		$comment						 = $refrence->toArray();
//		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function sendToCdekAll() {
		set_time_limit(0);

		$date			 = Session::get('crm_date');
		$projectId = Session::get('work_projectId');
		if (!$date || !$projectId) {
			$response = array(
					'status' => 'false'
			);
			return Response::json($response);
		}

		$partnersQuant = Partner::with('user')
						->checkStatus(array('statusType' => 'agreed', 'type' => 'registration'))
						->whereProjectId($projectId)
						->whereTransportType(Partner::TRANSPORT_TYPE_CDEK)
						->whereClarificationAddress(0)
						->whereRaw('(DATE(datetime_of_agree)<? OR (DATE(datetime_of_agree)=? AND TIME(datetime_of_agree)<TIME(?)))', array($date, $date, '16:00:00'))
						->count();
		if ($partnersQuant) {
			$cdekDeliveryRequest = CdekDeliveryRequest::create(array(
									'date'		 => date('Y-m-d'),
									'user_id'	 => Auth::user()->id,
			));
			$cdek								 = new CdekIntegrator();
			$res								 = $cdek->addDeliveries(Partner::with('user')
											->checkStatus(array('statusType' => 'agreed', 'type' => 'registration'))
											->whereProjectId($projectId)
											->whereTransportType(Partner::TRANSPORT_TYPE_CDEK)
											->whereClarificationAddress(0)
											->whereRaw('(DATE(datetime_of_agree)<? OR (DATE(datetime_of_agree)=? AND TIME(datetime_of_agree)<TIME(?)))', array($date, $date, '16:00:00'))
											->get(), $cdekDeliveryRequest);
			foreach ($res['Order'] as $item) {
				if (isset($item['@attributes']['DispatchNumber'])) {
					$partner = Partner::find($item['@attributes']['Number']);
					$partner->update(array('cdek_dispatchNumber' => $item['@attributes']['DispatchNumber'], 'cdek_deliveryRequestNumber' => $cdekDeliveryRequest->id));
					if ($partner->status == Partner::STATUS_DELIVERY_AFTER_REGISTRATION) {
						$partner->status = Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING;
					}
					elseif ($partner->status == Partner::STATUS_DELIVERY_BEFORE_REGISTRATION) {
						$partner->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING;
					}
					$message = "Заявка отправлена в СДЭК. Номер отправления СДЭК - {$partner->cdek_dispatchNumber}.";
					$partner->saveHistory($message);
					$partner->save();
				}
			}
		}

		$response = array(
				'status' => 'success'
		);
		return Response::json($response);
	}

	public function checkCdek() {
		$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_CHECK_CDEK) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}

		$result					 = $partner->checkCdek();
		$partner->recall = 0;
		$partner->save();

		$refrence	 = $partner->saveHistory($result['message']);
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function deleteCdek() {
		$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_DELETE_CDEK) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}

		$result					 = $partner->deleteCdek();
		$partner->recall = 0;
		$partner->save();
		DB::table('shipments_partners')->where('partner_id', '=', $partner->id)->delete();

		$refrence	 = $partner->saveHistory($result['message']);
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function registrationOk() {
		$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_REGISTRATION_OK) && !$partner->statusIsAllow(Partner::ALLOW_REGISTRATION_OK_POST) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}
		$partner->salenextdatetime = DB::raw('NOW()');
		if ($partner->transport_type == Partner::TRANSPORT_TYPE_POST) {
			if ($partner->status == Partner::STATUS_DELIVERY_AFTER_REGISTRATION) {
				$partner->status = Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING;
			}
			elseif ($partner->status == Partner::STATUS_DELIVERY_BEFORE_REGISTRATION) {
				$partner->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING;
			}
			$message = "Документы на доставку оформлены. Ждем отправки на почту.";
		}
		else {
			if ($partner->status == Partner::STATUS_DELIVERY_AFTER_REGISTRATION) {
				$partner->status = Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING;
			}
			elseif ($partner->status == Partner::STATUS_DELIVERY_BEFORE_REGISTRATION) {
				$partner->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING;
			}
			$message = "Документы на доставку оформлены. Ждем передачи в транспортную компанию.";
		}
		$partner->recall = 0;
		$partner->save();

		$refrence	 = $partner->saveHistory($message);
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function toDelivering() {
		$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_TO_DELIVERING) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}
		$partner->salenextdatetime = DB::raw('NOW()');
		if ($partner->status == Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING) {
			$partner->status = Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING;
		}
		elseif ($partner->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING) {
			$partner->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING;
		}
		$partner->recall = 0;
		$partner->save();

		$refrence	 = $partner->saveHistory("Товар передан в транспортную компанию");
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function sended() {
		$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_SENDED) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}
		$partner->salenextdatetime = DB::raw('NOW()');
		if ($partner->status == Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING) {
			$partner->status = Partner::STATUS_DELIVERY_AFTER_DELIVERING;
		}
		elseif ($partner->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING) {
			$partner->status = Partner::STATUS_DELIVERY_BEFORE_DELIVERING;
		}
		$partner->recall = 0;
		$partner->save();

		$refrence	 = $partner->saveHistory("Товар отправлен клиенту");
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

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

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

		foreach ($input['partners'] as $key => $value) {
			$partner = Partner::find($key);
			if ($partner->statusIsAllow(Partner::ALLOW_TO_DELIVERING) && $partner != null && is_numeric($key)) {
				$partner->salenextdatetime = DB::raw('NOW()');
				if ($partner->status == Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING) {
					$partner->status = Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING;
				}
				elseif ($partner->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING) {
					$partner->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING;
				}
				$partner->recall = 0;
				$partner->save();
				$refrence				 = $partner->saveHistory("Товар передан в транспортную компанию");
			}
		}

		$response = array(
				'status' => 'success'
		);
		return Response::json($response);
	}

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

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

		foreach ($input['partners'] as $key => $value) {
			$partner = Partner::find($key);
			if ($partner->statusIsAllow(Partner::ALLOW_SENDED) && $partner != null && is_numeric($key)) {
				$partner->salenextdatetime = DB::raw('NOW()');
				if ($partner->status == Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING) {
					$partner->status = Partner::STATUS_DELIVERY_AFTER_DELIVERING;
				}
				elseif ($partner->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING) {
					$partner->status = Partner::STATUS_DELIVERY_BEFORE_DELIVERING;
				}
				$partner->recall = 0;
				$partner->save();
				$refrence				 = $partner->saveHistory("Товар отправлен клиенту");
			}
		}

		$response = array(
				'status' => 'success'
		);
		return Response::json($response);
	}

	public function recived() {
		$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_RECIVED) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}
		$partner->salenextdatetime = DB::raw('NOW()');
		if ($partner->status == Partner::STATUS_DELIVERY_AFTER_DELIVERING) {
			$partner->status = Partner::STATUS_DELIVERY_AFTER_SUCCESS;
		}
		elseif ($partner->status == Partner::STATUS_DELIVERY_BEFORE_DELIVERING) {
			$partner->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY;
		}
		$partner->recall = 0;
		$partner->save();

		$refrence	 = $partner->saveHistory("Товар успешно получен клиентом");
		$partner	 = Partner::find($input['partnerId']);

		$refrence->load('sender');
		$comment						 = $refrence->toArray();
		$comment['comment']	 = nl2br($comment['comment']);

		$response = array(
				'status'									 => 'success',
				'noredirect'							 => 1,
				'btns'										 => View::make('partner.btns')->with('partner', $partner)->render(),
				'comment'									 => $comment,
				'partnerIsStatusToWork'		 => $partner->isStatusToWork(),
				'partnerSaleNextDateTime'	 => $partner->salenextdatetime,
				'partnerStatusName'				 => $partner->getStatusName(),
				'partner'									 => $partner->toArray()
		);
		return Response::json($response);
	}

	public function uploadFile() {
		$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_UPLOAD_FILE) || !is_numeric($input['partnerId'])) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}

		$valid_exts	 = array('xls', 'xlsx', 'doc', 'docx', 'pdf');
		$max_size		 = 5 * 1024 * 1024;
		$path				 = public_path() . '/userfiles/' . $partner->id . '/';
		$file				 = Input::file('file');
		$ext				 = ($file->getClientOriginalExtension()) ? $file->getClientOriginalExtension() : 'xls';
		$size				 = $file->getClientSize();
//		$name				 = $file->getClientOriginalName();
		$name				 = "DPD{$partner->id}." . $ext;

		if (in_array($ext, $valid_exts) AND $size < $max_size) {
			$fileObj = new Partnerfile(
							array(
					'name'		 => e($name),
					'user_id'	 => Auth::user()->id
							)
			);
			$fileObj = $partner->partnerfiles()->save($fileObj);
			if ($file->move($path . $fileObj->id . '/', iconv("UTF-8", "Windows-1251", $name))) {
				$response = array(
						'status'	 => 'success',
						'file'		 => $fileObj->toArray(),
						'filePath' => urlencode('/userfiles/' . $partner->id . '/' . $fileObj->id . '/' . iconv("UTF-8", "Windows-1251", $name)),
						'btns'		 => View::make('partner.btns')->with('partner', $partner)->render()
				);
				return Response::json($response);
			}
		}

		$response = array(
				'status' => 'fail'
		);
		return Response::json($response);
	}

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

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

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

		$file = Partnerfile::find($input['fileId']);
		if ($file == null || !is_numeric($input['fileId']) || $file->partner_id != $partner->id) {
			$response = array(
					'status'	 => 'fail',
					'message'	 => 'Клиент не найден'
			);
			return Response::json($response);
		}
		$file->delete();

		$response = array(
				'status' => 'success',
				'btns'	 => View::make('partner.btns')->with('partner', $partner)->render()
		);
		return Response::json($response);
	}

	public function getSource($id) {
		$partner = Partner::find($id);
		$sources = array('00' => 'Нет информации'); // '00' нужно т.к c '0' в value подставит не 0, а "Нет информации", если в массив больше ничего не добавляется
		foreach (InfoSource::where('project_id', '=', $partner->project_id)->get() as $source) {
			$sources[$source->id] = $source->source;
		}
		return Response::json($sources);
	}

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

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

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

		switch ($input['name']) {
			case 'partnerInfoName':
				$partner->name							 = e($input['value']);
				$partner->save();
				break;
			case 'partnerInfoPhone':
				$partner->phone							 = e($this->preparePhone($input['value']));
				$partner->save();
				break;
			case 'partnerInfoEmail':
				$partner->email							 = e($input['value']);
				$partner->save();
				break;
			case 'partnerInfoCity':
				$partner->city							 = e($input['value']);
				$partner->save();
				break;
			case 'partnerInfoAddress':
				$partner->address						 = e($input['value']);
				$partner->save();
				break;
			case 'partnerInfoComment':
				$partner->comment						 = e($input['value']);
				$partner->save();
				break;
			case 'partnerInfoSource':
				$partner->info_source_id	   = e($input['value']);
				$partner->save();
				break;
			case 'partnerHrWorktime':
				$partner->hr_worktime				 = e($input['value']);
				$partner->save();
				break;
			case 'partnerHrSkype':
				$partner->hr_skype					 = e($input['value']);
				$partner->save();
				break;
			case 'partnerHrCausejobsearch':
				$partner->hr_causejobsearch	 = e($input['value']);
				$partner->save();
				break;
			case 'partnerHrPreviouspost':
				$partner->hr_previouspost		 = e($input['value']);
				$partner->save();
				break;
			case 'partnerHrWant':
				$partner->hr_want						 = e($input['value']);
				$partner->save();
				break;
			case 'sms_delivery':
				$partner->sms_delivery			 = e($input['value']);
				$partner->sms_datetime			 = DB::raw('NOW()');
				$partner->save();
				if ($input['value'] == 1) {
					$message = "Дал согласие на смс-рассылку";
				}
				else {
					$message = "Отказался от смс-рассылки";
				}
				$partner->saveHistory($message);
				break;
		}

		$response = array(
				'status' => 'success',
				'value'	 => $input['value']
		);
		return Response::json($response);
	}

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

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

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

		if (isset($input['q'])) {
			$products = $partner->project->products()->where('name', 'LIKE', "%{$input['q']}%")->get()->toArray();
		}
		else {
			$products = $partner->project->products->toArray();
		}

		return Response::json($products);
	}

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

		$res = null;
		try {
			//создаём экземпляр объекта CalculatePriceDeliveryCdek
			$calc = new CalculatePriceDeliveryCdek();

			//Авторизация. Для получения логина/пароля (в т.ч. тестового) обратитесь к разработчикам СДЭК -->
			//$calc->setAuth('authLoginString', 'passwordString');
			//устанавливаем город-отправитель
			$calc->setSenderCityId($input['senderCityId']);
			//устанавливаем город-получатель
			$calc->setReceiverCityId($input['receiverCityId']);
			//устанавливаем дату планируемой отправки
			$calc->setDateExecute($input['dateExecute']);

			//устанавливаем тариф по-умолчанию
//			$calc->setTariffId('137');
			//задаём список тарифов с приоритетами
			$calc->addTariffPriority(137);
			$calc->addTariffPriority(11);
			// $calc->addTariffPriority($input['tariffList2']);
			//устанавливаем режим доставки
			$calc->setModeDeliveryId($input['modeId']);
			//добавляем места в отправление
			foreach ($input['goods'] as $item) {
				$calc->addGoodsItemBySize($item['weight'], $item['length'], $item['width'], $item['height']);
			}

			if ($calc->calculate() === true) {
				$res															 = $calc->getResult();
				$res['result']['deliveryPeriodMin'] += 2;
				$res['result']['deliveryPeriodMax'] += 2;
				$res['result']['deliveryDateMin']	 = date('d.m.Y', strtotime("+{$res['result']['deliveryPeriodMin']} day", strtotime($res['result']['deliveryDateMin'])));
				$res['result']['deliveryDateMax']	 = date('d.m.Y', strtotime("+{$res['result']['deliveryPeriodMax']} day", strtotime($res['result']['deliveryDateMax'])));
//				$res['result']['deliveryDateMin']	 = explode('-', $res['result']['deliveryDateMin']);
//				$res['result']['deliveryDateMin']	 = "{$res['result']['deliveryDateMin'][2]}.{$res['result']['deliveryDateMin'][1]}.{$res['result']['deliveryDateMin'][0]}";
//				$res['result']['deliveryDateMax']	 = explode('-', $res['result']['deliveryDateMax']);
//				$res['result']['deliveryDateMax']	 = "{$res['result']['deliveryDateMax'][2]}.{$res['result']['deliveryDateMax'][1]}.{$res['result']['deliveryDateMax'][0]}";
				if (isset($res['result']['cacheOnDelivery'])) {
					$res['result']['cacheOnDeliveryMax'] = (int) $res['result']['cacheOnDelivery'];
				}
				if (CdekCacheondelivery::whereName($input['cdek_city'])->count()) {
					$res['result']['cacheOnDelivery']				 = 1;
					$res['result']['cacheOnDeliveryMessage'] = 'Есть наложенный платеж';
				}
				else {
					$res['result']['cacheOnDelivery']				 = 0;
					$res['result']['cacheOnDeliveryMessage'] = 'Нет наложенного платежа';
				}
			}
			else {
				$res = $calc->getError();
			}
		}
		catch (Exception $e) {

		}

		return Response::json($res);
	}

}
