<?php

class Partner extends \Eloquent {

	protected $softDelete	 = true;
	protected $guarded		 = array();

	const STATUS_WORK												 = 1;
	const STATUS_REJECT											 = 2;
	const STATUS_NOANSWER										 = 3;
	const STATUS_TRASH_PHONE								 = 4;
	const STATUS_REPEATED										 = 5;
	const STATUS_SIZING											 = 6;
	const STATUS_SIZING_END									 = 8;
	const STATUS_WAIT_FRANCHISEES_PAY				 = 7;
	const STATUS_REGISTRATION								 = 10;
	const STATUS_WAIT_DELIVERING						 = 11;
	const STATUS_WAIT_SENDING								 = 12;
	const STATUS_DELIVERING									 = 13;
	const STATUS_DELIVERING_FAIL						 = 14;
	const STATUS_WAIT_CLIENT_PAY						 = 15;
	const STATUS_WAIT_TRANSPORT_COMPANY_PAY	 = 16;
	const STATUS_WAIT_CLIENT_PAY_CONFIRM		 = 17;
	const STATUS_WAIT_CLIENT_PAY_FAIL				 = 18;
	const STATUS_FRANCHISEES_WAIT_CLIENT		 = 19;
	const STATUS_SUCCESS										 = 20;
	const STATUS_PRODUCTION_WAIT						 = 30;
	const STATUS_PRODUCTION_PROCESS					 = 31;
	const STATUS_PRODUCTION_SUCCESS					 = 32;
	const STATUS_CHECK_PATTERNS							 = 40;
	const ALLOW_TRASH_PHONE									 = 1;
	const ALLOW_REPEATED										 = 2;
	const ALLOW_REJECT											 = 3;
	const ALLOW_AGREE												 = 4;
	const ALLOW_AGREE_EDIT									 = 5;
	const ALLOW_PAYMENT_CONFIRM							 = 6;
	const ALLOW_PAYMENT_RECEPTION						 = 7;
	const ALLOW_TO_DELIVERING								 = 8;
	const ALLOW_SENDED											 = 9;
	const ALLOW_RECIVED											 = 10;
	const ALLOW_REGISTRATION_OK							 = 11;
	const ALLOW_UPLOAD_FILE									 = 12;
	const ALLOW_PRODUCTION_PACKED						 = 13;
	const ALLOW_OPEN_PARTNER								 = 14;
	const ALLOW_CLIENT_RECEIVED							 = 15;
	const ALLOW_CLARIFICATION_ADDRESS				 = 17;
	const ALLOW_SEND_TO_CDEK								 = 19;
	const ALLOW_CHECK_CDEK									 = 20;
	const ALLOW_DELETE_CDEK									 = 21;
	const ALLOW_TO_PRODUCTION								 = 22;
	const ALLOW_CHECK_PATTERNS							 = 23;
	const TRANSPORT_TYPE_DPD								 = 1;
	const TRANSPORT_TYPE_POST								 = 2;
	const TRANSPORT_TYPE_CDEK								 = 3;

	protected static $allowStatusTypes	 = array(
			'work',
			'noanswer',
			'reject',
			'paywaiting',
			'checkpatterns',
			'agreed',
			'agreedinwork',
			'agreedagent',
			'agreedfranchisees',
			'agreedfranchiseesinwork',
			'agreedagentinwork',
			'production'
	);
	protected static $allowStatus				 = array(
			Partner::STATUS_WORK,
			Partner::STATUS_REJECT,
			Partner::STATUS_NOANSWER,
			Partner::STATUS_TRASH_PHONE,
			Partner::STATUS_REPEATED,
			Partner::STATUS_SIZING,
			Partner::STATUS_WAIT_FRANCHISEES_PAY,
			Partner::STATUS_REGISTRATION,
			Partner::STATUS_WAIT_DELIVERING,
			Partner::STATUS_WAIT_SENDING,
			Partner::STATUS_DELIVERING,
			Partner::STATUS_DELIVERING_FAIL,
			Partner::STATUS_WAIT_CLIENT_PAY,
			Partner::STATUS_WAIT_CLIENT_PAY_CONFIRM,
			Partner::STATUS_WAIT_CLIENT_PAY_FAIL,
			Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY,
			Partner::STATUS_FRANCHISEES_WAIT_CLIENT,
			Partner::STATUS_SUCCESS,
			Partner::STATUS_PRODUCTION_WAIT,
			Partner::STATUS_PRODUCTION_PROCESS,
			Partner::STATUS_PRODUCTION_SUCCESS,
			Partner::STATUS_CHECK_PATTERNS
	);
	protected static $statusNames				 = array(
			Partner::STATUS_WORK											 => 'В работе',
			Partner::STATUS_REJECT										 => 'Отказ',
			Partner::STATUS_NOANSWER									 => 'Недозвон',
			Partner::STATUS_TRASH_PHONE								 => 'Некорректный номер',
			Partner::STATUS_REPEATED									 => 'Повторный клиент',
			Partner::STATUS_SIZING										 => 'снятие размеров',
			Partner::STATUS_WAIT_FRANCHISEES_PAY			 => 'Ожидание пополнения депозита',
			Partner::STATUS_REGISTRATION							 => 'оформление документов на доставку',
			Partner::STATUS_WAIT_DELIVERING						 => 'ожидание забора в доставку',
			Partner::STATUS_WAIT_SENDING							 => 'ожидание отправки',
			Partner::STATUS_DELIVERING								 => 'доставка',
			Partner::STATUS_DELIVERING_FAIL						 => 'отказался забирать',
			Partner::STATUS_WAIT_CLIENT_PAY						 => 'ожидание оплаты',
			Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY => 'ожидание денег от транспортной компании',
			Partner::STATUS_WAIT_CLIENT_PAY_CONFIRM		 => 'клиент говорит что оплатил',
			Partner::STATUS_WAIT_CLIENT_PAY_FAIL			 => 'отказался платить',
			Partner::STATUS_FRANCHISEES_WAIT_CLIENT		 => 'ожидание клиента',
			Partner::STATUS_SUCCESS										 => 'доставлено',
			Partner::STATUS_PRODUCTION_WAIT						 => 'Производство: в очереди',
			Partner::STATUS_PRODUCTION_PROCESS				 => 'Производство: в работе',
			Partner::STATUS_PRODUCTION_SUCCESS				 => 'Производство: упаковка',
			Partner::STATUS_CHECK_PATTERNS						 => 'Проверка лекал',
	);
	protected static $transportTypeNames = array(
			Partner::TRANSPORT_TYPE_DPD	 => 'DPD',
			Partner::TRANSPORT_TYPE_POST => 'Почта',
			Partner::TRANSPORT_TYPE_CDEK => 'СДЭК',
	);

	public function user() {
		return $this->belongsTo('User')->withTrashed();
	}

	public function agent() {
		return $this->belongsTo('User', 'agent_id');
	}

	public function project() {
		return $this->belongsTo('Project');
	}

	public function reject() {
		return $this->belongsTo('Reject');
	}

	public function lead() {
		return $this->belongsTo('Lead')->withTrashed();
	}

	public function refrences() {
		return $this->hasMany('Refrence');
	}

	public function partnerfiles() {
		return $this->hasMany('Partnerfile')->orderBy('created_at', 'DESC');
	}

	public function productions() {
		return $this->hasMany('Production')->orderBy('created_at', 'ASC');
	}

	public function productionMaster() {
		return $this->BelongsTo('ProductionMaster')->withTrashed();
	}

	public function promoter() {
		return $this->BelongsTo('Promoters')->withTrashed();
	}

	public function shipment() {
		return $this->belongsToMany('Shipment', 'shipments_partners')->whereStatus(Shipment::STATUS_NEW)->orderBy('id', 'DESC');
	}

	public function cdekDeliveryRequest() {
		$cdekDeliveryRequest = CdekDeliveryRequest::find($this->cdek_deliveryRequestNumber);
		return $cdekDeliveryRequest;
	}

	public function getCdekDeliveryRequest() {
		$cdekDeliveryRequest = CdekDeliveryRequest::find($this->cdek_deliveryRequestNumber);
		if (!$cdekDeliveryRequest) {
			$cdekDeliveryRequest = CdekDeliveryRequest::create(array(
									'date'		 => date('Y-m-d'),
									'user_id'	 => Auth::user()->id,
			));
		}
		return $cdekDeliveryRequest;
	}

	public static function getStatusList() {
		return self::$statusNames;
	}

	public function scopeMy($query, $input = false) {
		if (!isset($input) || !isset($input['statusType'])) {
			if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS) && !User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_CRM) && !User::find(Sentry::getUser()->id)->hasAccess('admin')) {
				$input['statusType'] = 'agreed';
				if (!isset($input['type'])) {
					$input['type'] = 'registration';
				}
			}
		}
		if (!User::find(Sentry::getUser()->id)->hasAccess('admin')) {
			if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_FRANCHISEES)) {
				$query->where('user_id', Sentry::getUser()->id);
			}
			elseif (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_AGENT)) {
				$query->where('agent_id', Sentry::getUser()->id);
			}
			elseif (!in_array($input['statusType'], array('noanswer', 'reject'))) {
				if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_CRM) && !User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS)) {
					$query->where('user_id', Sentry::getUser()->id);
				}
				elseif (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_CRM) && User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS)) {
					if (!isset($input) || !in_array($input['statusType'], array('agreed', 'agreedinwork', 'agreedfranchisees', 'agreedfranchiseesinwork', 'paywaiting', 'production'))) {
						$query->where('user_id', Sentry::getUser()->id);
					}
				}
			}
		}
	}

	public function scopeCheckStatus($query, $input = false) {
		if (!isset($input) || !isset($input['statusType'])) {
			if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS) && !User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_CRM) && !User::find(Sentry::getUser()->id)->hasAccess('admin')) {
				$input['statusType'] = 'agreed';
				if (!isset($input['type'])) {
					$input['type'] = 'registration';
				}
			}
		}
		if (isset($input) && isset($input['statusType']) && in_array($input['statusType'], self::$allowStatusTypes)) {
			switch ($input['statusType']) {
				case 'work':
					$query->whereStatus(Partner::STATUS_WORK);
					break;
				case 'noanswer':
					$query->whereStatus(Partner::STATUS_NOANSWER);
					break;
				case 'reject':
					if (isset($input['status']) && in_array($input['status'], array(Partner::STATUS_WAIT_CLIENT_PAY_FAIL, Partner::STATUS_DELIVERING_FAIL))) {
						if ($input['status'] == Partner::STATUS_WAIT_CLIENT_PAY_FAIL) {
							$query->where('status', Partner::STATUS_WAIT_CLIENT_PAY_FAIL);
						}
						else {
							$query->where('status', Partner::STATUS_DELIVERING_FAIL);
						}
					}
					else {
						$query->whereIn('status', array(Partner::STATUS_REJECT, Partner::STATUS_WAIT_CLIENT_PAY_FAIL, Partner::STATUS_DELIVERING_FAIL));
					}
					break;
				case 'paywaiting':
					$allowStatusList = array();
					if (isset($input['status']) && $input['status'] == Partner::STATUS_WAIT_CLIENT_PAY) {
						array_push($allowStatusList, Partner::STATUS_WAIT_CLIENT_PAY);
					}
					elseif (isset($input['status']) && $input['status'] == Partner::STATUS_WAIT_CLIENT_PAY_CONFIRM) {
						array_push($allowStatusList, Partner::STATUS_WAIT_CLIENT_PAY_CONFIRM);
					}
					elseif (isset($input['status']) && $input['status'] == Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY) {
						array_push($allowStatusList, Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY);
					}
					if (!isset($input['status']) || !$input['status']) {
						if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS)) {
							array_push($allowStatusList, Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY);
						}
						if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_CRM)) {
							array_push($allowStatusList, Partner::STATUS_WAIT_CLIENT_PAY);
							array_push($allowStatusList, Partner::STATUS_WAIT_CLIENT_PAY_CONFIRM);
						}
						if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_CRM) && !User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS)) {
							$query->whereIsFranchiseesOrder(0);
						}
					}
					if (count($allowStatusList)) {
						$query->whereIn('status', $allowStatusList);
					}
					break;
				case 'agreedinwork':
					$query->wherePickup(0);
					$query->whereIn('status', array(
							Partner::STATUS_REGISTRATION,
							Partner::STATUS_WAIT_DELIVERING,
							Partner::STATUS_WAIT_SENDING,
							Partner::STATUS_DELIVERING
					));
					break;
				case 'agreedfranchiseesinwork':
					$query->whereIsFranchiseesOrder(1);
					$query->whereIn('status', array(
							Partner::STATUS_SIZING,
							Partner::STATUS_WAIT_FRANCHISEES_PAY,
							Partner::STATUS_PRODUCTION_WAIT,
							Partner::STATUS_PRODUCTION_PROCESS,
							Partner::STATUS_PRODUCTION_SUCCESS,
							Partner::STATUS_REGISTRATION,
							Partner::STATUS_WAIT_DELIVERING,
							Partner::STATUS_WAIT_SENDING,
							Partner::STATUS_DELIVERING
					));
					break;
				case 'agreedagentinwork':
					$query->whereIn('status', array(
							Partner::STATUS_REGISTRATION,
							Partner::STATUS_WAIT_DELIVERING,
							Partner::STATUS_WAIT_SENDING,
							Partner::STATUS_DELIVERING,
							Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY
					));
					break;
				case 'production':
					if (isset($input['type'])) {
						switch ($input['type']) {
							case 'sizing':
								$query->whereStatus(Partner::STATUS_SIZING);
								break;
							case 'wait':
								$query->whereStatus(Partner::STATUS_PRODUCTION_WAIT);
								break;
							case 'process':
								$query->whereStatus(Partner::STATUS_PRODUCTION_PROCESS);
								break;
							case 'success':
								$query->whereStatus(Partner::STATUS_PRODUCTION_SUCCESS);
								break;
							default:
								$query->whereIn('status', array(
										Partner::STATUS_SIZING,
										Partner::STATUS_PRODUCTION_WAIT,
										Partner::STATUS_PRODUCTION_PROCESS,
										Partner::STATUS_PRODUCTION_SUCCESS
								));
								break;
						}
					}
					else {
						$query->whereIn('status', array(
								Partner::STATUS_SIZING,
								Partner::STATUS_PRODUCTION_WAIT,
								Partner::STATUS_PRODUCTION_PROCESS,
								Partner::STATUS_PRODUCTION_SUCCESS
						));
						break;
					}
					break;
				case 'checkpatterns':
					$query->whereStatus(Partner::STATUS_CHECK_PATTERNS);
					break;
				case 'agreed':
					$query->whereIsFranchiseesOrder(0);
					if (isset($input['type'])) {
						switch ($input['type']) {
							case 'registration':
								$query->whereStatus(Partner::STATUS_REGISTRATION);
								break;
							case 'waitdelivery':
								$query->whereStatus(Partner::STATUS_WAIT_DELIVERING);
								break;
							case 'waitsend':
								$query->whereStatus(Partner::STATUS_WAIT_SENDING);
								break;
							case 'delivery':
								$query->whereStatus(Partner::STATUS_DELIVERING);
								break;
							case 'success':
								$query->whereIn('status', array(Partner::STATUS_SUCCESS, Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY));
								break;
						}
					}
					else {
						$query->whereIn('status', array(
								Partner::STATUS_PRODUCTION_WAIT,
								Partner::STATUS_PRODUCTION_PROCESS,
								Partner::STATUS_PRODUCTION_SUCCESS,
								Partner::STATUS_REGISTRATION,
								Partner::STATUS_WAIT_DELIVERING,
								Partner::STATUS_WAIT_SENDING,
								Partner::STATUS_DELIVERING,
								Partner::STATUS_SUCCESS,
								Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY
						));
						break;
					}
					break;
				case 'agreedfranchisees':
					$query->whereIsFranchiseesOrder(1);
					switch ($input['type']) {
						case 'sizing':
							$query->whereStatus(Partner::STATUS_SIZING);
							break;
						case 'depositadd':
							$query->whereStatus(Partner::STATUS_WAIT_FRANCHISEES_PAY);
							break;
						case 'production':
							$query->whereIn('status', array(Partner::STATUS_PRODUCTION_WAIT, Partner::STATUS_PRODUCTION_PROCESS, Partner::STATUS_PRODUCTION_SUCCESS));
							break;
						case 'commondelivery':
							$query->whereIn('status', array(
									Partner::STATUS_REGISTRATION,
									Partner::STATUS_WAIT_DELIVERING,
									Partner::STATUS_WAIT_SENDING,
									Partner::STATUS_DELIVERING
							));
							break;
						case 'registration':
							$query->whereStatus(Partner::STATUS_REGISTRATION);
							if (isset($input['user_id']) && is_numeric($input['user_id'])) {
								$query->whereUserId($input['user_id']);
							}
							break;
						case 'waitclient':
							$query->whereStatus(Partner::STATUS_FRANCHISEES_WAIT_CLIENT);
							break;
						case 'waitpay':
							$query->whereStatus(Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY);
							break;
						case 'waitdelivery':
							$query->whereStatus(Partner::STATUS_WAIT_DELIVERING);
							break;
						case 'waitsend':
							$query->whereStatus(Partner::STATUS_WAIT_SENDING);
							break;
						case 'delivery':
							$query->whereStatus(Partner::STATUS_DELIVERING);
							break;
						case 'success':
							$query->whereStatus(Partner::STATUS_SUCCESS);
							break;
						default:
							$query->whereIn('status', array(
									Partner::STATUS_REGISTRATION,
									Partner::STATUS_WAIT_DELIVERING,
									Partner::STATUS_WAIT_SENDING,
									Partner::STATUS_DELIVERING
							));
					}
					break;
				case 'agreedagent':
					switch ($input['type']) {
						case 'delivery':
							$query->whereIn('status', array(
									Partner::STATUS_REGISTRATION,
									Partner::STATUS_WAIT_DELIVERING,
									Partner::STATUS_WAIT_SENDING,
									Partner::STATUS_DELIVERING
							));
							break;
						case 'waitpay':
							$query->whereStatus(Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY);
							break;
						case 'success':
							$query->whereStatus(Partner::STATUS_SUCCESS);
							break;
						default:
							$query->whereIn('status', array(
									Partner::STATUS_REGISTRATION,
									Partner::STATUS_WAIT_DELIVERING,
									Partner::STATUS_WAIT_SENDING,
									Partner::STATUS_DELIVERING,
									Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY
							));
					}
					break;
			}
		}
		else {
			$query->whereStatus(Partner::STATUS_WORK);
		}
		if (isset($input) && isset($input['rejectId']) && $input['rejectId']) {
			$query->whereRejectId($input['rejectId']);
		}
	}

	public function saveHistory($message, $sender_id = null, $reciver_id = null) {
		return Refrence::create(array(
								'partner_id'			 => e($this->id),
								'comment'					 => e($message),
								'status'					 => e($this->status),
								'sender_user_id'	 => e($sender_id ? $sender_id : Sentry::getUser()->id),
								'reciver_user_id'	 => e($reciver_id ? $reciver_id : Sentry::getUser()->id),
								'reject_id'				 => e(($this->reject_id && $this->status == Partner::STATUS_REJECT) ? $this->reject_id : 0)
		));
	}

	public function getComments($count = null) {
		if (!$count) {
			return Refrence::with(array('sender' => function($query) {
										$query->withTrashed();
									}))->where('partner_id', $this->id)->orderBy('created_at', 'DESC')->get();
		}
		return Refrence::with(array('sender' => function($query) {
									$query->withTrashed();
								}))->where('partner_id', $this->id)->orderBy('created_at', 'DESC')->take($count)->get();
	}

	public function getRawStatusName() {
		return self::$statusNames[$this->status];
	}

	public function getStatusName() {
		$statusName = self::$statusNames[$this->status];
		if ($this->paytype == 1) {
			$statusName = "100% предоплата: {$statusName}";
		}
		elseif ($this->paytype == 2) {
			$statusName = "Наложенный платеж: {$statusName}";
		}
		elseif ($this->paytype == 3) {
			$statusName = "Франчайзи: {$statusName}";
		}
		if ($this->status == Partner::STATUS_WORK) {
			$statusName = "<span class='label label-default'>{$statusName}</span>";
		}
		elseif (in_array($this->status, array(Partner::STATUS_WAIT_CLIENT_PAY, Partner::STATUS_WAIT_CLIENT_PAY_CONFIRM, Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY))) {
			$statusName = "<span class='label label-warning'>{$statusName}</span>";
		}
		elseif (in_array($this->status, array(Partner::STATUS_REJECT, Partner::STATUS_WAIT_CLIENT_PAY_FAIL, Partner::STATUS_DELIVERING_FAIL))) {
			$statusName = "<span class='label label-danger'>{$statusName}</span>";
		}
		elseif (in_array($this->status, array(Partner::STATUS_REGISTRATION))) {
			$statusName = "<span class='label label-info'>{$statusName}</span>";
		}
		elseif (in_array($this->status, array(Partner::STATUS_WAIT_DELIVERING, Partner::STATUS_WAIT_SENDING, Partner::STATUS_DELIVERING, Partner::STATUS_FRANCHISEES_WAIT_CLIENT))) {
			$statusName = "<span class='label label-primary'>{$statusName}</span>";
		}
		elseif (in_array($this->status, array(Partner::STATUS_SUCCESS))) {
			$statusName = "<span class='label label-success'>{$statusName}</span>";
		}
		return $statusName;
	}

	public function getRawTransportTypeName() {
		return self::$transportTypeNames[$this->transport_type];
	}

	public function getTransportTypeName() {
		$transportTypeName = self::$transportTypeNames[$this->transport_type];
		if ($this->transport_type == Partner::TRANSPORT_TYPE_DPD) {
			$transportTypeName = "<span class='label label-danger'>{$transportTypeName}</span>";
		}
		elseif ($this->transport_type == Partner::TRANSPORT_TYPE_POST) {
			$transportTypeName = "<span class='label label-primary'>{$transportTypeName}</span>";
		}
		elseif ($this->transport_type == Partner::TRANSPORT_TYPE_CDEK) {
			$transportTypeName = "<span class='label label-success'>{$transportTypeName}</span>";
		}
		return $transportTypeName;
	}

	public function getStatusClass() {
		$className = '';
		$time			 = strtotime($this->salenextdatetime) - time();
		if ($time < 0) {
			$className = 'danger';
		}
		elseif ($time < 60 * 5) {
			$className = 'warning';
		}
		return $className;
	}

	public function getCart() {
		if (!$this->cart) {
			return false;
		}
		return json_decode($this->cart, true);
	}

	public function isStatusToWork() {
		return (
						in_array(
										$this->status, array(
								Partner::STATUS_WORK,
								Partner::STATUS_WAIT_CLIENT_PAY,
								Partner::STATUS_WAIT_CLIENT_PAY_CONFIRM
										)
						)) ? true : false;
	}

	public function statusIsAllow($action) {
		switch ($action) {//
			case Partner::ALLOW_TRASH_PHONE:
				if (in_array($this->status, array(Partner::STATUS_WORK))) {
					return true;
				}
				break;
			case Partner::ALLOW_TO_PRODUCTION:
				if (in_array($this->status, array(Partner::STATUS_WAIT_FRANCHISEES_PAY))) {
					return true;
				}
				break;
			case Partner::ALLOW_OPEN_PARTNER:
				if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_FRANCHISEES) && !User::find(Sentry::getUser()->id)->hasAccess('admin')) {
					if (Sentry::getUser()->id != $this->user_id) {
						return false;
					}
					if ((in_array($this->status, array(
											Partner::STATUS_PRODUCTION_WAIT,
											Partner::STATUS_PRODUCTION_PROCESS,
											Partner::STATUS_PRODUCTION_SUCCESS,
											Partner::STATUS_REGISTRATION,
											Partner::STATUS_WAIT_DELIVERING,
											Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY,
											Partner::STATUS_WAIT_SENDING)) && !$this->pickup) || ($this->status == Partner::STATUS_DELIVERING && !$this->pickup)) {
						return false;
					}
				}
				elseif (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_AGENT) && !User::find(Sentry::getUser()->id)->hasAccess('admin')) {
					return false;
				}
				return true;
				break;
			case Partner::ALLOW_REPEATED:
				if (in_array($this->status, array(Partner::STATUS_WORK))) {
					return true;
				}
				break;
			case Partner::ALLOW_REJECT:
				if (in_array($this->status, array(
										Partner::STATUS_WORK,
										Partner::STATUS_NOANSWER,
										Partner::STATUS_SIZING,
										Partner::STATUS_WAIT_FRANCHISEES_PAY,
										Partner::STATUS_PRODUCTION_WAIT,
										Partner::STATUS_REGISTRATION,
										Partner::STATUS_WAIT_DELIVERING,
										Partner::STATUS_DELIVERING,
										Partner::STATUS_WAIT_CLIENT_PAY,
										Partner::STATUS_WAIT_CLIENT_PAY_CONFIRM
								))) {
					//if ($this->user_id == Sentry::getUser()->id || User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS)) {
						return true;
					//}
				} else if ( in_array($this->status, array(Partner::STATUS_PRODUCTION_PROCESS)) && ( User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS) || User::find(Sentry::getUser()->id)->hasAccess('admin') ) ) {
						return true;
				}
				break;
			case Partner::ALLOW_AGREE:
				if (in_array($this->status, array(
										Partner::STATUS_WORK,
										Partner::STATUS_REJECT,
										Partner::STATUS_NOANSWER,
										Partner::STATUS_TRASH_PHONE,
										Partner::STATUS_SIZING,
										Partner::STATUS_DELIVERING_FAIL,
										Partner::STATUS_WAIT_CLIENT_PAY_FAIL
								))) {
					if ($this->user_id == Sentry::getUser()->id) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_AGREE_EDIT:
				if (in_array($this->status, array(
										Partner::STATUS_SIZING,
										Partner::STATUS_REGISTRATION,
										Partner::STATUS_WAIT_CLIENT_PAY,
										Partner::STATUS_WAIT_CLIENT_PAY_CONFIRM,
										Partner::STATUS_PRODUCTION_WAIT
								))) {
					if ($this->status == Partner::STATUS_SIZING || Partner::STATUS_PRODUCTION_WAIT) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_PAYMENT_RECEPTION:
				if (in_array($this->status, array(
										Partner::STATUS_WAIT_CLIENT_PAY,
										Partner::STATUS_WAIT_CLIENT_PAY_CONFIRM,
										Partner::STATUS_WAIT_TRANSPORT_COMPANY_PAY
								))) {
					return true;
				}
				break;
			case Partner::ALLOW_PAYMENT_CONFIRM:
				if ($this->status == Partner::STATUS_WAIT_CLIENT_PAY) {
					return true;
				}
				break;
			case Partner::ALLOW_UPLOAD_FILE:
				if (in_array($this->status, array(
										Partner::STATUS_REGISTRATION,
										Partner::STATUS_WAIT_DELIVERING
								))) {
					if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS)) {
						if ($this->transport_type != Partner::TRANSPORT_TYPE_POST) {
							return true;
						}
					}
				}
				break;
			case Partner::ALLOW_REGISTRATION_OK:
				if ($this->status == Partner::STATUS_REGISTRATION) {
					if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS)) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_TO_DELIVERING:
				if ($this->status == Partner::STATUS_WAIT_DELIVERING) {
					if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS)) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_SENDED:
				if ($this->status == Partner::STATUS_WAIT_SENDING) {
					if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS)) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_RECIVED:
				if ($this->status == Partner::STATUS_DELIVERING) {
					if (!$this->is_franchisees_order) {
						if (User::find(Sentry::getUser()->id)->hasAnyRole(array(Role::ROLE_LOGISTICS, Role::ROLE_CRM))) {
							return true;
						}
					}
					else {
						if (!$this->pickup && User::find(Sentry::getUser()->id)->hasAnyRole(array(Role::ROLE_LOGISTICS, Role::ROLE_CRM))) {
							return true;
						}
						elseif ($this->pickup && User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_FRANCHISEES)) {
							return true;
						}
					}
				}
				break;
			case Partner::ALLOW_CLIENT_RECEIVED:
				if ($this->status == Partner::STATUS_FRANCHISEES_WAIT_CLIENT && $this->pickup) {
					if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_FRANCHISEES)) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_PRODUCTION_PACKED:
//				if (in_array($this->status, array(
//										Partner::STATUS_DELIVERY_AFTER_PRODUCTION_SUCCESS,
//										Partner::STATUS_DELIVERY_BEFORE_PRODUCTION_SUCCESS,
//										Partner::STATUS_DELIVERY_FRANCHISEES_PRODUCTION_SUCCESS
//								))) {
//					if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_PACKING)) {
//						return true;
//					}
//				}
				break;
			case Partner::ALLOW_CLARIFICATION_ADDRESS:
				if ($this->status == Partner::STATUS_REGISTRATION) {
					if (!$this->clarification_address && !$this->shoplogistics_code) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_SEND_TO_CDEK:
				if ($this->status == Partner::STATUS_REGISTRATION) {
					if (!$this->clarification_address) {
						if ($this->transport_type == Partner::TRANSPORT_TYPE_CDEK && !$this->cdek_dispatchNumber) {
							if (User::find(Sentry::getUser()->id)->hasRole(Role::ROLE_LOGISTICS)) {
								return true;
							}
						}
					}
				}
				break;
			case Partner::ALLOW_CHECK_CDEK:
				if ($this->cdek_dispatchNumber) {
					return true;
				}
				break;
			case Partner::ALLOW_DELETE_CDEK:
				if ($this->cdek_dispatchNumber && $this->cdek_statusCode == 1) {
					if (in_array($this->status, array(Partner::STATUS_REGISTRATION, Partner::STATUS_WAIT_DELIVERING))) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_CHECK_PATTERNS:
				if ($this->status == Partner::STATUS_CHECK_PATTERNS) {
					return true;
				}
				break;
		}
		return false;
	}

	public function sendCdekCode($code = null) {
		$code	 = $code ? $code : $this->cdek_dispatchNumber;
		$smsc	 = new SMSCService();
		$smsc->sendSMS($this->phone, "Заказ отправлен в СДЭК. Номер для отслеживания посылки {$code}. Тел. 8 (800) 500-11-25");
	}

	public function checkCdek() {
		$cdek			 = new CdekIntegrator();
		$res			 = $cdek->getStatus($this);
		$message	 = "Проверка статуса отправления в СДЭК.";
		$oldStatus = $this->status;
		if (isset($res['Order']['@attributes']) && isset($res['Order']['Status'])) {
			if (isset($res['Order']['Status']['@attributes'])) {
				$this->cdek_statusCode = $res['Order']['Status']['@attributes']['Code'];
				$this->cdek_status		 = $res['Order']['Status']['@attributes']['Description'];
				if ($res['Order']['Status']['@attributes']['Code'] == 1) {
					if (in_array($this->status, array(Partner::STATUS_REGISTRATION, Partner::STATUS_WAIT_SENDING, Partner::STATUS_DELIVERING))) {
						$this->status = Partner::STATUS_WAIT_DELIVERING;
					}
					$message = "Проверка статуса отправления в СДЭК - отправлена заявка в транспортную, ждем забор товара.";
				}
				elseif ($res['Order']['Status']['@attributes']['Code'] == 3) {
					if (in_array($this->status, array(Partner::STATUS_REGISTRATION, Partner::STATUS_WAIT_SENDING, Partner::STATUS_WAIT_DELIVERING, Partner::STATUS_DELIVERING))) {
						if ($this->status != Partner::STATUS_WAIT_SENDING) {
							$this->sendCdekCode();
						}
						$this->status = Partner::STATUS_WAIT_SENDING;
					}
					$message = "Проверка статуса отправления в СДЭК - товар принят на склад.";
				}
				elseif ($res['Order']['Status']['@attributes']['Code'] == 4) {
					if (in_array($this->status, array(Partner::STATUS_REGISTRATION, Partner::STATUS_WAIT_SENDING, Partner::STATUS_WAIT_DELIVERING, Partner::STATUS_DELIVERING))) {
						$this->status = Partner::STATUS_SUCCESS;
					}
//					elseif (in_array($this->status, array(Partner::STATUS_REGISTRATION, Partner::STATUS_WAIT_SENDING, Partner::STATUS_WAIT_DELIVERING, Partner::STATUS_DELIVERING))) {
//						$this->status = Partner::STATUS_WAIT_PAY;
//					}
					$message = "Проверка статуса отправления в СДЭК - товар получен клиентом.";
				}
				elseif ($res['Order']['Status']['@attributes']['Code'] == 5) {
					if (in_array($this->status, array(Partner::STATUS_REGISTRATION, Partner::STATUS_WAIT_SENDING, Partner::STATUS_WAIT_DELIVERING, Partner::STATUS_DELIVERING))) {
						$this->status = Partner::STATUS_DELIVERING_FAIL;
					}
					$message = "Проверка статуса отправления в СДЭК - клиент отказался забирать.";
					if (isset($res['Order']['Reason']['@attributes']['Description']) && !is_array($res['Order']['Reason']['@attributes']['Description']) && $res['Order']['Reason']['@attributes']['Description']) {
						$message .= " " . $res['Order']['Reason']['@attributes']['Description'];
					}
				}
				elseif ($res['Order']['Status']['@attributes']['Code'] > 5) {
					if (in_array($this->status, array(Partner::STATUS_REGISTRATION, Partner::STATUS_WAIT_SENDING, Partner::STATUS_WAIT_DELIVERING))) {
						$this->status = Partner::STATUS_DELIVERING;
					}
					$message = "Проверка статуса отправления в СДЭК - товар отправлен клиенту.";
				}
				$this->cdek_statusHistory = serialize($res['Order']['Status']);
			}
		}

		$statusChanged = false;
		if ($oldStatus != $this->status) {
			$statusChanged = true;
		}

		$result = array(
				'status'				 => 'success',
				'message'				 => $message,
				'statusChanged'	 => $statusChanged
		);
		return $result;
	}

	public function deleteCdek() {
		$cdek		 = new CdekIntegrator();
		$res		 = $cdek->deleteOrder($this);
		$message = "Проверка статуса отправления в СДЭК.";
		if (isset($res['DeleteRequest']['@attributes']['Msg'])) {
			if ($res['DeleteRequest']['@attributes']['Msg'] == 'Удалено заказов:1') {
				$this->cdek_deliveryRequestNumber	 = DB::raw('NULL');
				$this->cdek_dispatchNumber				 = DB::raw('NULL');
				$this->cdek_statusCode						 = DB::raw('NULL');
				$this->cdek_status								 = DB::raw('NULL');
				$this->cdek_statusHistory					 = DB::raw('NULL');

				if ($this->status == Partner::STATUS_REGISTRATION || $this->status == Partner::STATUS_WAIT_SENDING || $this->status == Partner::STATUS_WAIT_DELIVERING) {
					$this->status = Partner::STATUS_REGISTRATION;
				}
				elseif ($this->status == Partner::STATUS_REGISTRATION || $this->status == Partner::STATUS_WAIT_SENDING || $this->status == Partner::STATUS_WAIT_DELIVERING) {
					$this->status = Partner::STATUS_REGISTRATION;
				}
				$message = "Проверка статуса отправления в СДЭК - заявка отменена.";
			}
		}

		$result = array(
				'status'	 => 'success',
				'message'	 => $message
		);
		return $result;
	}

}
