<?php

class Partner extends \Eloquent {

	use SoftDeletingTrait;

	protected $guarded = array();

	const NO_STATUS														   = 0;
	const STATUS_WORK														 = 1;
	const STATUS_REJECT													 = 2;
	const STATUS_NOANSWER												 = 3;
	const STATUS_TRASH_PHONE										 = 4;
	const STATUS_REPEATED												 = 5;
	const STATUS_DELIVERY_BEFORE_REGISTRATION		 = 10;
	const STATUS_DELIVERY_BEFORE_WAIT_DELIVERING = 11;
	const STATUS_DELIVERY_BEFORE_WAIT_SENDING		 = 16;
	const STATUS_DELIVERY_BEFORE_DELIVERING			 = 12;
	const STATUS_DELIVERY_BEFORE_DELIVERING_FAIL = 13;
	const STATUS_DELIVERY_BEFORE_WAIT_PAY				 = 14;
	const STATUS_DELIVERY_BEFORE_SUCCESS				 = 15;
	const STATUS_DELIVERY_AFTER_WAIT_PAY				 = 20;
	const STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM = 21;
	const STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL		 = 22;
	const STATUS_DELIVERY_AFTER_REGISTRATION		 = 23;
	const STATUS_DELIVERY_AFTER_DELIVERING			 = 24;
	const STATUS_DELIVERY_AFTER_WAIT_DELIVERING	 = 25;
	const STATUS_DELIVERY_AFTER_WAIT_SENDING		 = 27;
	const STATUS_DELIVERY_AFTER_SUCCESS					 = 26;
	const STATUS_HR_INTERVIEW_WAIT							 = 101;
	const STATUS_HR_INTERVIEW										 = 105;
	const STATUS_HR_WAIT_CALL										 = 102;
	const STATUS_HR_TRAINEESHIP_EDU							 = 103;
	const STATUS_HR_TRAINEESHIP_WORK						 = 104;
	const STATUS_HR_EMPLOYED										 = 110;
	const STATUS_HR_RESERVE											 = 106;
	const STATUS_HR_TEST												 = 107;
	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_HR_SUCCESS											 = 13;
	const ALLOW_HR_REJECT												 = 14;
	const ALLOW_HR_RESERVE											 = 23;
	const ALLOW_HR_TEST													 = 24;
	const ALLOW_RECIVED_AND_PAYMENT_RECIVED			 = 15;
	const ALLOW_SEND_TO_SHOPLOGISTICS						 = 16;
	const ALLOW_CLARIFICATION_ADDRESS						 = 17;
	const ALLOW_CHECK_SHOPLOGISTICS							 = 18;
	const ALLOW_SEND_TO_CDEK										 = 19;
	const ALLOW_CHECK_CDEK											 = 20;
	const ALLOW_DELETE_CDEK											 = 21;
	const ALLOW_SETDATETIME											 = 22;
	const ALLOW_REGISTRATION_OK_POST						 = 30;
	const ALLOW_CHANGE_MANAGER      						 = 40;
	const ALLOW_CALL														 = 100;
	const TRANSPORT_TYPE_DPD										 = 1;
	const TRANSPORT_TYPE_POST										 = 2;
	const TRANSPORT_TYPE_CDEK										 = 3;

	protected static $allowStatusTypes	 = array(
			'work',
			'noanswer',
			'reject',
			'paywaiting',
			'agreed',
			'agreedinwork',
			'hr_interviewwait',
			'hr_interview',
			'hr_agreed',
			'hr_traineeship',
			'hr_employed',
			'hr_reserve',
			'hr_test'
	);
	protected static $allowStatus				 = array(
			Partner::STATUS_WORK,
			Partner::STATUS_REJECT,
			Partner::STATUS_NOANSWER,
			Partner::STATUS_TRASH_PHONE,
			Partner::STATUS_REPEATED,
			Partner::STATUS_DELIVERY_BEFORE_REGISTRATION,
			Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING,
			Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING,
			Partner::STATUS_DELIVERY_BEFORE_DELIVERING,
			Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL,
			Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY,
			Partner::STATUS_DELIVERY_BEFORE_SUCCESS,
			Partner::STATUS_DELIVERY_AFTER_WAIT_PAY,
			Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL,
			Partner::STATUS_DELIVERY_AFTER_REGISTRATION,
			Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING,
			Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING,
			Partner::STATUS_DELIVERY_AFTER_DELIVERING,
			Partner::STATUS_DELIVERY_AFTER_SUCCESS,
			Partner::STATUS_HR_INTERVIEW_WAIT,
			Partner::STATUS_HR_INTERVIEW,
			Partner::STATUS_HR_WAIT_CALL,
			Partner::STATUS_HR_TRAINEESHIP_EDU,
			Partner::STATUS_HR_TRAINEESHIP_WORK,
			Partner::STATUS_HR_EMPLOYED,
			Partner::STATUS_HR_RESERVE,
			Partner::STATUS_HR_TEST
	);
	protected static $statusNames				 = array(
			Partner::STATUS_WORK														 => 'В работе',
			Partner::STATUS_REJECT													 => 'Отказ',
			Partner::STATUS_NOANSWER												 => 'Недозвон',
			Partner::STATUS_TRASH_PHONE											 => 'Некорректный номер',
			Partner::STATUS_REPEATED												 => 'Повторный клиент',
			Partner::STATUS_DELIVERY_BEFORE_REGISTRATION		 => 'Наложенный платеж: оформление документов на доставку',
			Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING	 => 'Наложенный платеж: ожидание доставки',
			Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING		 => 'Наложенный платеж: ожидание отправки',
			Partner::STATUS_DELIVERY_BEFORE_DELIVERING			 => 'Наложенный платеж: доставка',
			Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL	 => 'Наложенный платеж: отказался забирать',
			Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY				 => 'Наложенный платеж: ждем деньги от транспортной компании',
			Partner::STATUS_DELIVERY_BEFORE_SUCCESS					 => 'Наложенный платеж: доставлено и оплачено',
			Partner::STATUS_DELIVERY_AFTER_WAIT_PAY					 => '100% предоплата: ожидание оплаты',
			Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM	 => '100% предоплата: клиент говорит что оплатил',
			Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL		 => '100% предоплата: отказался платить',
			Partner::STATUS_DELIVERY_AFTER_REGISTRATION			 => '100% предоплата: оформление документов на доставку',
			Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING	 => '100% предоплата: ожидание доставки',
			Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING			 => '100% предоплата: ожидание отправки',
			Partner::STATUS_DELIVERY_AFTER_DELIVERING				 => '100% предоплата: доставка',
			Partner::STATUS_DELIVERY_AFTER_SUCCESS					 => '100% предоплата: доставлено',
			Partner::STATUS_HR_INTERVIEW_WAIT								 => 'Назначено собеседование',
			Partner::STATUS_HR_INTERVIEW										 => 'Проходит собеседование',
			Partner::STATUS_HR_WAIT_CALL										 => 'Ожидание звонка',
			Partner::STATUS_HR_TRAINEESHIP_EDU							 => 'Стажировка: обучение',
			Partner::STATUS_HR_TRAINEESHIP_WORK							 => 'Стажировка: тестовая работа',
			Partner::STATUS_HR_EMPLOYED											 => 'Работа',
			Partner::STATUS_HR_RESERVE											 => 'Резерв',
			Partner::STATUS_HR_TEST													 => 'На рассмотрении',
	);
	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 project() {
		return $this->belongsTo('Project')->remember(60);
	}

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

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

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

	public function partnerRegistrationInfo() {
		return $this->hasOne('PartnerRegistrationInfo');
	}

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

	public function mlsitcalls() {
		return $this->hasMany('Mlsitcall')->orderBy('call_date', 'DESC');
	}

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

	public function shoplogisticsOrder() {
		$shoplogisticsOrder = ShoplogisticsOrder::wherePartnerId($this->id)->orderBy('created_at', 'DESC')->first();
		return $shoplogisticsOrder;
	}

	public function getShoplogisticsOrder() {
		$shoplogisticsOrder = ShoplogisticsOrder::wherePartnerId($this->id)->orderBy('created_at', 'DESC')->first();
		if (!$shoplogisticsOrder) {
			$shoplogisticsOrder = ShoplogisticsOrder::create(array(
									'partner_id' => $this->id,
									'user_id'		 => Auth::user()->id,
			));
		}
		return $shoplogisticsOrder;
	}

	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['projectId'])) {
			$input['projectId'] = Session::get('crm_work_projectId');
			if (!$input['projectId']) {
				$input['projectId'] = Auth::user()->projects()->first()->id;
			}
		}
		$query->where('project_id', $input['projectId']);

		if (!isset($input) || !isset($input['statusType'])) {
			if (Auth::user()->hasRole(Role::ROLE_LOGISTICS) && !Auth::user()->hasRole(Role::ROLE_CRM) && !Auth::user()->isAdmin()) {
				$input['statusType'] = 'agreed';
				if (!isset($input['type'])) {
					$input['type'] = 'registration';
				}
			}
			else {
				$input['statusType'] = 'work';
			}
		}
		if ($input['projectId'] != 20 && $input['projectId'] != 91 && !in_array($input['statusType'], array('noanswer', 'reject', 'paywaiting'))) {
			if (!Auth::user()->isAdmin()) {
				if (Auth::user()->hasRole(Role::ROLE_CRM) && !Auth::user()->hasRole(Role::ROLE_LOGISTICS)) {
					$query->whereRaw('( user_id = '.Auth::user()->id.' OR created_user_id = '.Auth::user()->id.' )');
				}
//				elseif ((!Auth::user()->hasRole(Role::ROLE_CRM) && Auth::user()->hasRole(Role::ROLE_LOGISTICS)) || Auth::user()->hasRole(Role::ROLE_PROJECT_MANAGER)) {
//					$query->whereRaw('project_id IN (SELECT users_projects.project_id FROM users_projects INNER JOIN projects ON projects.id=users_projects.project_id AND projects.usecrm=1 WHERE users_projects.user_id=' . Auth::user()->id . ')');
//				}
				elseif (Auth::user()->hasRole(Role::ROLE_CRM) && Auth::user()->hasRole(Role::ROLE_LOGISTICS)) {
					if (isset($input) && in_array($input['statusType'], array('agreed', 'agreedinwork', 'paywaiting'))) {
//						$query->whereRaw('project_id IN (SELECT users_projects.project_id FROM users_projects INNER JOIN projects ON projects.id=users_projects.project_id AND projects.usecrm=1 WHERE users_projects.user_id=' . Auth::user()->id . ')');
					}
					else {
						$query->whereRaw('( user_id = '.Auth::user()->id.' OR created_user_id = '.Auth::user()->id.' )');
					}
				}
			}
			else {
				$query->whereRaw('project_id IN (SELECT users_projects.project_id FROM users_projects INNER JOIN projects ON projects.id=users_projects.project_id AND projects.usecrm=1 WHERE users_projects.user_id=' . Auth::user()->id . ')');
			}
		}
	}

	public function scopeCheckStatus($query, $input = false) {
		if (!isset($input) || !isset($input['statusType'])) {
			if (Auth::user()->hasRole(Role::ROLE_LOGISTICS) && !Auth::user()->hasRole(Role::ROLE_CRM) && !Auth::user()->isAdmin()) {
				$input['statusType'] = 'agreed';
				if (!isset($input['type'])) {
					$input['type'] = 'registration';
				}
			}
		}
		if (isset($input) && isset($input['statType'])) {
			switch ($input['statType']) {
				case 'agreed':
					$query
									->where('status', '!=', Partner::STATUS_WORK)
									->where('status', '!=', Partner::STATUS_REJECT)
									->where('status', '!=', Partner::STATUS_NOANSWER)
									->where('status', '!=', Partner::STATUS_TRASH_PHONE)
									->where('status', '!=', Partner::STATUS_REPEATED)
									->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY)
									->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM)
									->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL)
									->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY)
									->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL);
					break;
				case 'registration':
					$query->whereIn('status', array(
							Partner::STATUS_DELIVERY_AFTER_REGISTRATION,
							Partner::STATUS_DELIVERY_BEFORE_REGISTRATION
					));
					break;
				case 'waitMoney':
					$query->whereIn('status', array(
							Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING,
							Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING,
							Partner::STATUS_DELIVERY_BEFORE_DELIVERING,
							Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY
					));
					break;
				case 'getedMoneyAfter':
					$query->whereIn('status', array(
							Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING,
							Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING,
							Partner::STATUS_DELIVERY_AFTER_DELIVERING
					));
					break;
				case 'gettedMoneyBefore':
					$query->whereIn('status', array(
							Partner::STATUS_DELIVERY_BEFORE_SUCCESS
					));
					break;
				case 'deliveryBeforeFail':
					$query->whereIn('status', array(
							Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL
					));
					break;
				case 'deliverySuccess':
					$query->whereIn('status', array(
							Partner::STATUS_DELIVERY_AFTER_SUCCESS,
							Partner::STATUS_DELIVERY_BEFORE_SUCCESS,
					));
					break;
			}
		}
		elseif (isset($input) && isset($input['statusType']) && in_array($input['statusType'], self::$allowStatusTypes)) {
			switch ($input['statusType']) {
				case 'work':
					$query->whereIn('status', array(Partner::STATUS_WORK, Partner::STATUS_DELIVERY_AFTER_WAIT_PAY));
//					$query
//									->where('status', '!=', Partner::STATUS_REJECT)
//									->where('status', '!=', Partner::STATUS_NOANSWER)
//									->where('status', '!=', Partner::STATUS_TRASH_PHONE)
//									->where('status', '!=', Partner::STATUS_REPEATED)
//									->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL)
//									->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_DELIVERING)
//									->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_SUCCESS)
//									->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_DELIVERING)
//									->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL)
//									->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_SUCCESS)
//									->where('salenextdatetime', '<', DB::raw('NOW()'));
					break;
				case 'noanswer':
					$query->where('status', Partner::STATUS_NOANSWER);
					break;
				case 'reject':
					if (isset($input['status']) && in_array($input['status'], array(Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL, Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL))) {
						if ($input['status'] == Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL) {
							$query->where('status', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL);
						}
						else {
							$query->where('status', Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL);
						}
					}
					else {
						$query->whereIn('status', array(Partner::STATUS_REJECT, Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL, Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL));
					}
					break;
				case 'paywaiting':
					$allowStatusList = array(Partner::NO_STATUS);
					if (Auth::user()->hasRole(Role::ROLE_CRM) || Auth::user()->hasRole(Role::ROLE_CRM_STAT)) {
						array_push($allowStatusList, Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM);
						array_push($allowStatusList, Partner::STATUS_DELIVERY_AFTER_WAIT_PAY);
					}
					if (Auth::user()->hasRole(Role::ROLE_LOGISTICS) || Auth::user()->hasRole(Role::ROLE_CRM_STAT)) {
						array_push($allowStatusList, Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY);
					}
					if (isset($input['status']) && in_array($input['status'], $allowStatusList)) {
						if ($input['status'] == Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM) {
							$query->where('status', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM);
						}
						elseif ($input['status'] == Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY) {
							$query->where('status', Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY);
						}
						elseif ($input['status'] == Partner::STATUS_DELIVERY_AFTER_WAIT_PAY) {
							$query->where('status', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY);
						}
						else {
							$query->whereIn('status', $allowStatusList);
						}
					}
					else {
						$query->whereIn('status', $allowStatusList);
					}
					break;
				case 'agreedinwork':
					$query->whereIn('status', array(Partner::STATUS_DELIVERY_AFTER_REGISTRATION, Partner::STATUS_DELIVERY_BEFORE_REGISTRATION, Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING, Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING, Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING, Partner::STATUS_DELIVERY_AFTER_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_DELIVERING));
					break;
				case 'agreed':
					if (isset($input['type'])) {
						switch ($input['type']) {
							case 'clarification_address':
								$query->whereClarificationAddress(1)->whereIn('status', array(Partner::STATUS_DELIVERY_AFTER_REGISTRATION, Partner::STATUS_DELIVERY_BEFORE_REGISTRATION));
								break;
							case 'registration':
								$query->whereClarificationAddress(0)->whereIn('status', array(Partner::STATUS_DELIVERY_AFTER_REGISTRATION, Partner::STATUS_DELIVERY_BEFORE_REGISTRATION));
								break;
							case 'waitdelivery':
								$query->whereIn('status', array(Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING));
								break;
							case 'waitsend':
								$query->whereIn('status', array(Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING, Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING));
								break;
							case 'delivery':
								$query->whereIn('status', array(Partner::STATUS_DELIVERY_AFTER_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_DELIVERING));
								break;
							case 'delivery_post_wait':
								$query->whereIn('status', array(Partner::STATUS_DELIVERY_AFTER_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_DELIVERING));
								$query->where(function($query) {
									$query->where('shoplogistics_post_operation', '=', 'Неудачная попытка вручения')
													->orWhere('shoplogistics_post_operation_attr', '=', 'Прибыло в место вручения');
								});
								break;
							case 'delivery_cdek_wait':
								$query->whereIn('status', array(Partner::STATUS_DELIVERY_AFTER_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_DELIVERING));
								$query->where('cdek_statusCode', '=', 18);
								break;
							case 'success':
								$query->whereIn('status', array(Partner::STATUS_DELIVERY_AFTER_SUCCESS, Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY, Partner::STATUS_DELIVERY_BEFORE_SUCCESS));
								break;
							case 'all':
								$query
												->where('status', '!=', Partner::STATUS_WORK)
												->where('status', '!=', Partner::STATUS_REJECT)
												->where('status', '!=', Partner::STATUS_NOANSWER)
												->where('status', '!=', Partner::STATUS_TRASH_PHONE)
												->where('status', '!=', Partner::STATUS_REPEATED)
												->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY)
												->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM)
												->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL);
								break;
							default:
								$query
												->where('status', '!=', Partner::STATUS_WORK)
												->where('status', '!=', Partner::STATUS_REJECT)
												->where('status', '!=', Partner::STATUS_NOANSWER)
												->where('status', '!=', Partner::STATUS_TRASH_PHONE)
												->where('status', '!=', Partner::STATUS_REPEATED)
												->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY)
												->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM)
												->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL)
												->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY)
												->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL);
								break;
						}
					}
					else {
						$query
										->where('status', '!=', Partner::STATUS_WORK)
										->where('status', '!=', Partner::STATUS_REJECT)
										->where('status', '!=', Partner::STATUS_NOANSWER)
										->where('status', '!=', Partner::STATUS_TRASH_PHONE)
										->where('status', '!=', Partner::STATUS_REPEATED)
										->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY)
										->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM)
										->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL)
										->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY)
										->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL);
					}
					break;
				case 'hr_interviewwait':
					$query->where('status', Partner::STATUS_HR_INTERVIEW_WAIT);
					break;
				case 'hr_interview':
					$query->where('status', Partner::STATUS_HR_INTERVIEW);
					break;
				case 'hr_agreed':
					if (isset($input['type'])) {
						switch ($input['type']) {
							case 'waitcall':
								$query->where('status', Partner::STATUS_HR_WAIT_CALL)->whereRaw(DB::raw('DATE(datetime_of_agree)=DATE(NOW())'));
								break;
							case 'notcall':
								$query->where('status', Partner::STATUS_HR_WAIT_CALL)->whereRaw(DB::raw('DATE(datetime_of_agree)!=DATE(NOW())'));
								break;
							default:
								$query->where('status', Partner::STATUS_HR_WAIT_CALL)->whereRaw(DB::raw('DATE(datetime_of_agree)=DATE(NOW())'));
						}
					}
					else {
						$query->where('status', Partner::STATUS_HR_WAIT_CALL);
					}
					break;
				case 'hr_traineeship':
					if (isset($input['type'])) {
						switch ($input['type']) {
							case 'edu':
								$query->where('status', Partner::STATUS_HR_TRAINEESHIP_EDU);
								break;
							case 'work':
								$query->where('status', Partner::STATUS_HR_TRAINEESHIP_WORK);
								break;
							default:
								$query->whereIn('status', array(Partner::STATUS_HR_TRAINEESHIP_EDU, Partner::STATUS_HR_TRAINEESHIP_WORK));
						}
					}
					else {
						$query->whereIn('status', array(Partner::STATUS_HR_TRAINEESHIP_EDU, Partner::STATUS_HR_TRAINEESHIP_WORK));
					}
					break;
				case 'hr_employed':
					$query->where('status', Partner::STATUS_HR_EMPLOYED);
					break;
				case 'hr_reserve':
					$query->where('status', Partner::STATUS_HR_RESERVE);
					break;
				case 'hr_test':
					$query->where('status', Partner::STATUS_HR_TEST);
					break;
			}
		}
		else {
			$query->whereIn('status', array(Partner::STATUS_WORK, Partner::STATUS_DELIVERY_AFTER_WAIT_PAY));
//			$query
//							->where('status', '!=', Partner::STATUS_REJECT)
//							->where('status', '!=', Partner::STATUS_NOANSWER)
//							->where('status', '!=', Partner::STATUS_TRASH_PHONE)
//							->where('status', '!=', Partner::STATUS_REPEATED)
//							->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL)
//							->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_DELIVERING)
//							->where('status', '!=', Partner::STATUS_DELIVERY_AFTER_SUCCESS)
//							->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_DELIVERING)
//							->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL)
//							->where('status', '!=', Partner::STATUS_DELIVERY_BEFORE_SUCCESS);
		}
		if (isset($input) && isset($input['rejectId']) && $input['rejectId']) {
			$query->whereRejectId($input['rejectId']);
		}
	}

	public function saveHistory($message, $sender_id = null, $reciver_id = null) {
		if ($this->importantcall == 1) {
			$this->importantcall = 0;
			$this->save();
		}

		return Refrence::create(array(
								'partner_id'			 => e($this->id),
								'comment'					 => e($message),
								'status'					 => e($this->status),
								'sender_user_id'	 => e($sender_id ? $sender_id : Auth::user()->id),
								'reciver_user_id'	 => e($reciver_id ? $reciver_id : Auth::user()->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->status == Partner::STATUS_WORK) {
			$statusName = "<span class='label label-default'>{$statusName}</span>";
		}
		elseif (in_array($this->status, array(Partner::STATUS_DELIVERY_AFTER_WAIT_PAY, Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM, Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY))) {
			$statusName = "<span class='label label-warning'>{$statusName}</span>";
		}
		elseif (in_array($this->status, array(Partner::STATUS_REJECT, Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL, Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL))) {
			$statusName = "<span class='label label-danger'>{$statusName}</span>";
		}
		elseif (in_array($this->status, array(Partner::STATUS_DELIVERY_AFTER_REGISTRATION, Partner::STATUS_DELIVERY_BEFORE_REGISTRATION))) {
			$statusName = "<span class='label label-info'>{$statusName}</span>";
		}
		elseif (in_array($this->status, array(Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING, Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING, Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING, Partner::STATUS_DELIVERY_AFTER_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_DELIVERING))) {
			$statusName = "<span class='label label-primary'>{$statusName}</span>";
		}
		elseif (in_array($this->status, array(Partner::STATUS_DELIVERY_AFTER_SUCCESS, Partner::STATUS_DELIVERY_BEFORE_SUCCESS))) {
			$statusName = "<span class='label label-success'>{$statusName}</span>";
		}
		elseif (in_array($this->status, array(Partner::STATUS_TRASH_PHONE))) {
			$statusName = "<span class='label label-default'>{$statusName}</span>";
		}
		return $statusName;
	}

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

	public function getTransportTypeName() {
		$transportTypeName = $this->getRawTransportTypeName();
		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_DELIVERY_AFTER_WAIT_PAY,
								Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM
										)
						)) ? true : false;
	}

	public function statusIsAllow($action) {
		switch ($action) {
			case Partner::ALLOW_TRASH_PHONE:
				if (in_array($this->status, array(Partner::STATUS_WORK))) {
					if ($this->user_id == Auth::user()->id) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_REPEATED:
				if (in_array($this->status, array(Partner::STATUS_WORK))) {
					if ($this->user_id == Auth::user()->id) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_SETDATETIME:
				if ($this->project->type != Project::TYPE_HR || ($this->status != Partner::STATUS_HR_INTERVIEW_WAIT && $this->status != Partner::STATUS_HR_INTERVIEW)) {
					return true;
				}
				break;
			case Partner::ALLOW_REJECT:
				if (in_array($this->status, array(
										Partner::STATUS_WORK,
										Partner::STATUS_NOANSWER,
										Partner::STATUS_DELIVERY_BEFORE_REGISTRATION,
										Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING,
										Partner::STATUS_DELIVERY_BEFORE_DELIVERING,
										Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY,
										Partner::STATUS_DELIVERY_AFTER_WAIT_PAY,
										Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM
								))) {
					if ($this->status == Partner::STATUS_WORK && $this->project->type == Project::TYPE_HR) {
						return false;
					}
					if ($this->user_id == Auth::user()->id || Auth::user()->hasRole(Role::ROLE_LOGISTICS)) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_AGREE:
				if (in_array($this->status, array(
										Partner::STATUS_WORK,
										Partner::STATUS_REJECT,
										Partner::STATUS_HR_RESERVE,
										Partner::STATUS_NOANSWER,
										Partner::STATUS_TRASH_PHONE,
										Partner::STATUS_DELIVERY_BEFORE_DELIVERING_FAIL,
										Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_FAIL
								))) {
					if ($this->user_id == Auth::user()->id || $this->project->type == Project::TYPE_HR) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_AGREE_EDIT:
				if (in_array($this->status, array(
										Partner::STATUS_DELIVERY_BEFORE_REGISTRATION,
										Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING,
										Partner::STATUS_DELIVERY_AFTER_WAIT_PAY,
										Partner::STATUS_DELIVERY_AFTER_REGISTRATION,
										Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING,
										Partner::STATUS_HR_INTERVIEW_WAIT
								))) {
					if (!$this->shoplogistics_code || ($this->shoplogistics_code && $this->shoplogistics_status == 'Черновик')) {
						return true;
					}
				}
				elseif (in_array($this->status, array(
										Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING
								))) {
					if ($this->shoplogistics_code && $this->shoplogistics_status == 'Черновик') {
						return true;
					}
				}
				break;
			case Partner::ALLOW_PAYMENT_RECEPTION:
				if (in_array($this->status, array(
										Partner::STATUS_DELIVERY_AFTER_WAIT_PAY,
										Partner::STATUS_DELIVERY_AFTER_WAIT_PAY_CONFIRM,
										Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY
								))) {
//					if ($this->user_id == Auth::user()->id) {
					return true;
//					}
				}
				break;
			case Partner::ALLOW_PAYMENT_CONFIRM:
				if (in_array($this->status, array(
										Partner::STATUS_DELIVERY_AFTER_WAIT_PAY
								))) {
//					if ($this->user_id == Auth::user()->id) {
					return true;
//					}
				}
				break;
			case Partner::ALLOW_UPLOAD_FILE:
				if (in_array($this->status, array(
										Partner::STATUS_DELIVERY_BEFORE_REGISTRATION,
										Partner::STATUS_DELIVERY_AFTER_REGISTRATION,
										Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING,
										Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING
								))) {
					if (Auth::user()->hasRole(Role::ROLE_LOGISTICS)) {
						if ($this->transport_type != Partner::TRANSPORT_TYPE_POST) {
							return true;
						}
					}
				}
				break;
			case Partner::ALLOW_REGISTRATION_OK:
				if (in_array($this->status, array(
										Partner::STATUS_DELIVERY_BEFORE_REGISTRATION,
										Partner::STATUS_DELIVERY_AFTER_REGISTRATION
								))) {
					if ($this->transport_type == Partner::TRANSPORT_TYPE_DPD && !$this->clarification_address) {
						if (Auth::user()->hasRole(Role::ROLE_LOGISTICS)) {
							return true;
						}
					}
				}
				break;
			case Partner::ALLOW_REGISTRATION_OK_POST:
				if ($this->status == Partner::STATUS_DELIVERY_BEFORE_REGISTRATION) {
					if ($this->transport_type == Partner::TRANSPORT_TYPE_POST && !$this->clarification_address) {
						if (Auth::user()->hasRole(Role::ROLE_LOGISTICS)) {
							return true;
						}
					}
				}
				break;
			case Partner::ALLOW_TO_DELIVERING:
				if (in_array($this->status, array(
										Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING,
										Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING
								))) {
					if (Auth::user()->hasRole(Role::ROLE_LOGISTICS)) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_SENDED:
				if (in_array($this->status, array(
										Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING,
										Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING
								))) {
					if (Auth::user()->hasRole(Role::ROLE_LOGISTICS)) {
						if (!$this->shoplogistics_code) {
							return true;
						}
					}
				}
				break;
			case Partner::ALLOW_RECIVED:
				if (in_array($this->status, array(
										Partner::STATUS_DELIVERY_BEFORE_DELIVERING,
										Partner::STATUS_DELIVERY_AFTER_DELIVERING
								))) {
					if (Auth::user()->hasAnyRole(array(Role::ROLE_LOGISTICS, Role::ROLE_CRM))) {
						if (!$this->shoplogistics_code) {
							return true;
						}
					}
				}
				break;
			case Partner::ALLOW_RECIVED_AND_PAYMENT_RECIVED:
				if ($this->status == Partner::STATUS_DELIVERY_BEFORE_DELIVERING) {
					if (Auth::user()->hasAnyRole(array(Role::ROLE_LOGISTICS, Role::ROLE_CRM))) {
						if (!$this->shoplogistics_code || ($this->status == Partner::STATUS_DELIVERY_BEFORE_DELIVERING && $this->transport_type == Partner::TRANSPORT_TYPE_POST)) {
							return true;
						}
					}
				}
				break;
			case Partner::ALLOW_HR_SUCCESS:
				if (in_array($this->status, array(
										Partner::STATUS_HR_WAIT_CALL,
										Partner::STATUS_HR_TRAINEESHIP_EDU,
										Partner::STATUS_HR_TRAINEESHIP_WORK,
										Partner::STATUS_HR_INTERVIEW_WAIT,
										Partner::STATUS_HR_INTERVIEW,
										Partner::STATUS_HR_TEST
								))) {
					if ($this->project->type == Project::TYPE_HR && Auth::user()->hasRole(Role::ROLE_CRM)) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_HR_REJECT:
				if (in_array($this->status, array(
										Partner::STATUS_WORK,
										Partner::STATUS_HR_WAIT_CALL,
										Partner::STATUS_HR_TRAINEESHIP_EDU,
										Partner::STATUS_HR_TRAINEESHIP_WORK,
										Partner::STATUS_HR_EMPLOYED,
										Partner::STATUS_HR_INTERVIEW_WAIT,
										Partner::STATUS_HR_INTERVIEW,
										Partner::STATUS_HR_RESERVE,
										Partner::STATUS_HR_TEST,
								))) {
					if ($this->project->type == Project::TYPE_HR && Auth::user()->hasRole(Role::ROLE_CRM)) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_HR_RESERVE:
				if (in_array($this->status, array(
										Partner::STATUS_WORK,
										Partner::STATUS_REJECT,
										Partner::STATUS_HR_TRAINEESHIP_EDU,
										Partner::STATUS_HR_TRAINEESHIP_WORK,
										Partner::STATUS_HR_INTERVIEW_WAIT,
										Partner::STATUS_HR_INTERVIEW,
										Partner::STATUS_HR_TEST
								))) {
					if ($this->project->type == Project::TYPE_HR && Auth::user()->hasRole(Role::ROLE_CRM)) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_HR_TEST:
				if (in_array($this->status, array(
										Partner::STATUS_HR_INTERVIEW
								))) {
					if ($this->project->type == Project::TYPE_HR && Auth::user()->hasRole(Role::ROLE_CRM)) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_CALL:
				$user = Auth::user();
				if ($user->sip_number) {
					return true;
				}
				break;
			case Partner::ALLOW_SEND_TO_SHOPLOGISTICS:
				if ($this->project_id == 20 || $this->project_id == 91) {
					if (in_array($this->status, array(
											Partner::STATUS_DELIVERY_BEFORE_REGISTRATION,
													//Partner::STATUS_DELIVERY_AFTER_REGISTRATION
									))) {
						if (!$this->clarification_address && (!$this->shoplogistics_code || ($this->shoplogistics_errors && $this->shoplogistics_status == 'Черновик'))) {
							if ($this->transport_type == Partner::TRANSPORT_TYPE_POST) {
								if (Auth::user()->hasRole(Role::ROLE_LOGISTICS)) {
									return true;
								}
							}
						}
					}
				}
				break;
			case Partner::ALLOW_CLARIFICATION_ADDRESS:
				if (in_array($this->status, array(
										Partner::STATUS_DELIVERY_BEFORE_REGISTRATION,
										Partner::STATUS_DELIVERY_AFTER_REGISTRATION
								))) {
					if (!$this->clarification_address && !$this->shoplogistics_code) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_CHECK_SHOPLOGISTICS:
				if ($this->project_id == 20 || $this->project_id == 91) {
					if ($this->shoplogistics_code && !$this->shoplogistics_errors && $this->shoplogistics_status != 'Черновик') {
						return true;
					}
				}
				break;
			case Partner::ALLOW_SEND_TO_CDEK:
				if (in_array($this->project_id, array(20, 63, 68, 70, 91))) {
					if (in_array($this->status, array(Partner::STATUS_DELIVERY_BEFORE_REGISTRATION, Partner::STATUS_DELIVERY_AFTER_REGISTRATION))) {
						if (!$this->clarification_address) {
							if ($this->transport_type == Partner::TRANSPORT_TYPE_CDEK && !$this->cdek_dispatchNumber) {
								if (Auth::user()->hasRole(Role::ROLE_LOGISTICS)) {
									return true;
								}
							}
						}
					}
				}
				break;
			case Partner::ALLOW_CHECK_CDEK:
				if (in_array($this->project_id, array(20, 63, 68, 70, 91))) {
					if ($this->cdek_dispatchNumber) {
						return true;
					}
				}
				break;
			case Partner::ALLOW_DELETE_CDEK:
				if (in_array($this->project_id, array(20, 63, 68, 70, 91))) {
					if ($this->cdek_dispatchNumber && $this->cdek_statusCode == 1) {
						if (in_array($this->status, array(Partner::STATUS_DELIVERY_AFTER_REGISTRATION, Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_REGISTRATION, Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING))) {
							return true;
						}
					}
				}
				break;
			case Partner::ALLOW_CHANGE_MANAGER:
				if ($this->user_id == Auth::user()->id) {
					return true;
				}
				break;
		}
		return false;
	}

	public function sendBonusSMS() {
		if (in_array($this->project->id, array(20))) {
			$bonus = round($this->cartprice / 20, 0);
			$smsc	 = new SMSCService();
			$url	 = GoogleURL::short("http://legaton.com/lbonus/?utm_source=sms&utm_term={$this->id}");
			$smsc->sendSMS($this->phone, "Вам начислен бонус {$bonus} руб. {$url}");
		}
	}

	public function sendShoplogisticsDeliveredToPost() {
		$smsc	 = new SMSCService();
		$price = $this->cartprice + $this->deliveryprice;
		$smsc->sendSMS($this->phone, "Заказ ожидает вас на почте, можете забрать его. Стоимость заказа {$this->cartprice} руб., доставки {$this->deliveryprice} руб. Тел. 8 (800) 500-11-25");
//		$smsc->sendSMS("79063959102", "Заказ ожидает вас на почте, можете забрать его. Стоимость заказа {$this->cartprice} руб., доставки {$this->deliveryprice} руб. Тел. 8 (800) 500-11-25");
	}

	public function sendShoplogisticsCode($code = null) {
		$code	 = $code ? $code : $this->shoplogistics_post_id;
		$smsc	 = new SMSCService();
		$smsc->sendSMS($this->phone, "Заказ отправлен на почту. Почтовый идентификатор {$code}. Тел. 8 (800) 500-11-25");
	}

	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 addToShopLogistics() {
//		if (in_array($this->id, array(5698, 8745, 9380))) {
//			$result = array(
//					'status'	 => 'fail',
//					'message'	 => "пока не отправляем"
//			);
//			return $result;
//		}
		$sl							 = new ShopLogistics();
		$res						 = $sl->addPostDelivery($this->id);
		$errors					 = true;
		$errors_message	 = '';
		if (is_array($res) && is_array($res['deliveries']) && is_array($res['deliveries']['delivery'])) {
			$delivery										 = $res['deliveries']['delivery'];
			$shopLogisticsOrder					 = $this->getShoplogisticsOrder();
			$shopLogisticsOrder->code		 = $delivery['code'];
			$shopLogisticsOrder->status	 = $delivery['status'];
			if ($delivery['errors'] && !is_array($delivery['errors'])) {
				$shopLogisticsOrder->errors	 = $delivery['errors'];
				$errors_message							 = $delivery['errors'];
			}
			else {
				$shopLogisticsOrder->errors = '';
			}
			$shopLogisticsOrder->save();
			$this->shoplogistics_code		 = $delivery['code'];
			$this->shoplogistics_status	 = $delivery['status'];
			if ($delivery['errors'] && !is_array($delivery['errors'])) {
				$this->shoplogistics_errors = $delivery['errors'];
			}
			else {
				$this->shoplogistics_errors = '';
			}
			if (in_array($delivery['error_code'], array(11, 12))) {
				if (!$delivery['errors'] || is_array($delivery['errors'])) {
					$errors = false;
				}
			}
			else {
				if ($delivery['error_code'] == 13) {
					$errors_message = "Cтатус доставки не позволяет ее редактировать";
				}
				elseif ($delivery['error_code'] == 10) {
					$errors_message = "Номер заказа не задан, доставка не может быть добавлена";
				}
			}
		}

		if ($errors) {
			$result = array(
					'status'	 => 'fail',
					'message'	 => $errors_message
			);
			return $result;
		}

		$message = "";
		if ($this->transport_type == Partner::TRANSPORT_TYPE_POST) {
			if ($this->status == Partner::STATUS_DELIVERY_AFTER_REGISTRATION) {
				$this->status = Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING;
			}
			elseif ($this->status == Partner::STATUS_DELIVERY_BEFORE_REGISTRATION) {
				$this->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING;
			}
			$message = "Заявка отправлена в ShopLogistics. Ждем отправки на почту.";
		}
		else {
//			if ($this->status == Partner::STATUS_DELIVERY_AFTER_REGISTRATION) {
//				$this->status = Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING;
//			}
//			elseif ($this->status == Partner::STATUS_DELIVERY_BEFORE_REGISTRATION) {
//				$this->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING;
//			}
//			$message = "Документы на доставку оформлены. Ждем передачи в транспортную компанию.";
		}

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

	public function checkShopLogistics() {
		$sl	 = new ShopLogistics();
		$res = $sl->getPostDelivery($this);
		if (!isset($res['deliveries']['delivery'])) {
			$result = array(
					'status'	 => 'false',
					'message'	 => "Ошибка"
			);
			return $result;
		}
		$delivery						 = $res['deliveries']['delivery'];
		$shopLogisticsOrder	 = $this->getShoplogisticsOrder();
		if (isset($delivery['post_id']) && $delivery['post_id']) {
			if ($this->shoplogistics_post_id != $delivery['post_id']) {
				$this->sendShoplogisticsCode($delivery['post_id']);
			}
			$this->shoplogistics_post_id = $delivery['post_id'];
			$shopLogisticsOrder->post_id = $delivery['post_id'];
		}
		if (is_array($delivery['post_operation'])) {
			$delivery['post_operation'] = '';
		}
		if (isset($delivery['post_operation']) && $delivery['post_operation']) {
			if ($this->shoplogistics_post_operation != $delivery['post_operation'] && $delivery['post_operation'] == 'Неудачная попытка вручения') {
				$this->sendShoplogisticsDeliveredToPost();
			}
			elseif ($this->shoplogistics_post_operation == 'Обработка' && $this->shoplogistics_post_operation_attr != $delivery['post_operation_attr'] && $delivery['post_operation_attr'] == 'Прибыло в место вручения') {
				$this->sendShoplogisticsDeliveredToPost();
			}
			$this->shoplogistics_post_operation			 = $delivery['post_operation'];
			$this->shoplogistics_post_operation_attr = $delivery['post_operation_attr'];
			$shopLogisticsOrder->post_operation			 = $delivery['post_operation'];
		}
		$shopLogisticsOrder->status = $delivery['status'];
		if ($delivery['errors'] && !is_array($delivery['errors'])) {
			$shopLogisticsOrder->errors = $delivery['errors'];
		}
		else {
			$shopLogisticsOrder->errors = '';
		}
		$shopLogisticsOrder->delivery_history	 = $delivery['delivery_history'];
		$shopLogisticsOrder->save();
		$this->shoplogistics_code							 = $delivery['code'];
		$this->shoplogistics_status						 = $delivery['status'];
		if ($delivery['errors'] && !is_array($delivery['errors'])) {
			$this->shoplogistics_errors = $delivery['errors'];
		}
		else {
			$this->shoplogistics_errors = '';
		}
		$message	 = "Проверка статуса отправления в ShopLogistics: {$delivery['status']}, {$delivery['post_operation']}";
		$oldStatus = $this->status;
		if ($delivery['status'] == 'Выполнен') {
			if ($this->transport_type == Partner::TRANSPORT_TYPE_POST) {
				if ($this->status == Partner::STATUS_DELIVERY_AFTER_DELIVERING || $this->status == Partner::STATUS_DELIVERY_BEFORE_DELIVERING) {
					if ($delivery['post_operation'] == 'Вручение') {
						if ($this->status == Partner::STATUS_DELIVERY_AFTER_DELIVERING) {
							$this->status = Partner::STATUS_DELIVERY_AFTER_SUCCESS;
						}
						elseif ($this->status == Partner::STATUS_DELIVERY_BEFORE_DELIVERING) {
							$this->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY;
						}
						$message = "Проверка статуса отправления в ShopLogistics - товар вручен клиенту.";
					}
				}
				else {
					if ($this->status == Partner::STATUS_DELIVERY_AFTER_REGISTRATION || $this->status == Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING || $this->status == Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING) {
						$this->status = Partner::STATUS_DELIVERY_AFTER_DELIVERING;
					}
					elseif ($this->status == Partner::STATUS_DELIVERY_BEFORE_REGISTRATION || $this->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING || $this->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING) {
						$this->status = Partner::STATUS_DELIVERY_BEFORE_DELIVERING;
					}
					$message = "Проверка статуса отправления в ShopLogistics - товар отправлен клиенту.";
				}
			}
		}
		elseif ($delivery['status'] == 'Не скомплектован') {
			if ($this->transport_type == Partner::TRANSPORT_TYPE_POST) {
				if ($this->status == Partner::STATUS_DELIVERY_AFTER_REGISTRATION || $this->status == Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING || $this->status == Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING) {
					$this->status = Partner::STATUS_DELIVERY_AFTER_REGISTRATION;
				}
				elseif ($this->status == Partner::STATUS_DELIVERY_BEFORE_REGISTRATION || $this->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING || $this->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING) {
					$this->status = Partner::STATUS_DELIVERY_BEFORE_REGISTRATION;
				}
				$this->shoplogisticsOrder()->delete();
				$this->shoplogistics_code		 = DB::raw('NULL');
				$this->shoplogistics_status	 = DB::raw('NULL');
				$message										 = "Проверка статуса отправления в ShopLogistics - товар не скомплектован. Возвращен на регистрацию документов на доставку.";
			}
		}
		elseif ($delivery['status'] == 'Отменен') {
			if ($this->transport_type == Partner::TRANSPORT_TYPE_POST) {
				if ($this->status == Partner::STATUS_DELIVERY_AFTER_REGISTRATION || $this->status == Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING || $this->status == Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING) {
					$this->status = Partner::STATUS_DELIVERY_AFTER_REGISTRATION;
				}
				elseif ($this->status == Partner::STATUS_DELIVERY_BEFORE_REGISTRATION || $this->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING || $this->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING) {
					$this->status = Partner::STATUS_DELIVERY_BEFORE_REGISTRATION;
				}
				$this->shoplogisticsOrder()->delete();
				$this->shoplogistics_code		 = DB::raw('NULL');
				$this->shoplogistics_status	 = DB::raw('NULL');
				if (isset($delivery['service_comment']) && !is_array($delivery['service_comment'])) {
					$message = "Проверка статуса отправления в ShopLogistics - заказ отменен: {$delivery['service_comment']}. Возвращен на регистрацию документов на доставку.";
				}
				else {
					$message = "Проверка статуса отправления в ShopLogistics - заказ отменен. Возвращен на регистрацию документов на доставку.";
				}
			}
		}

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

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

	public function checkCdek() {
		$cdek			 = new CdekIntegrator(($this->project_id==70));
		$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_DELIVERY_AFTER_REGISTRATION, Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING, Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING, Partner::STATUS_DELIVERY_AFTER_DELIVERING))) {
						$this->status = Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING;
					}
					elseif (in_array($this->status, array(Partner::STATUS_DELIVERY_BEFORE_REGISTRATION, Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING, Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_DELIVERING))) {
						$this->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING;
					}
					$message = "Проверка статуса отправления в СДЭК - отправлена заявка в транспортную, ждем забор товара.";
				}
				elseif ($res['Order']['Status']['@attributes']['Code'] == 3) {
					if (in_array($this->status, array(Partner::STATUS_DELIVERY_AFTER_REGISTRATION, Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING, Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING, Partner::STATUS_DELIVERY_AFTER_DELIVERING))) {
						if ($this->status != Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING) {
							$this->sendCdekCode();
						}
						$this->status = Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING;
					}
					elseif (in_array($this->status, array(Partner::STATUS_DELIVERY_BEFORE_REGISTRATION, Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING, Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_DELIVERING))) {
						if ($this->status != Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING) {
							$this->sendCdekCode();
						}
						$this->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING;
					}
					$message = "Проверка статуса отправления в СДЭК - товар принят на склад.";
				}
				elseif ($res['Order']['Status']['@attributes']['Code'] == 4) {
					if (in_array($this->status, array(Partner::STATUS_DELIVERY_AFTER_REGISTRATION, Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING, Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING, Partner::STATUS_DELIVERY_AFTER_DELIVERING))) {
						$this->status = Partner::STATUS_DELIVERY_AFTER_SUCCESS;
					}
					elseif (in_array($this->status, array(Partner::STATUS_DELIVERY_BEFORE_REGISTRATION, Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING, Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_DELIVERING))) {
						$this->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY;
					}
					$message = "Проверка статуса отправления в СДЭК - товар получен клиентом.";
				}
				elseif ($res['Order']['Status']['@attributes']['Code'] == 5) {
					if (in_array($this->status, array(Partner::STATUS_DELIVERY_AFTER_REGISTRATION, Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING, Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING, Partner::STATUS_DELIVERY_AFTER_DELIVERING))) {
						$this->status = Partner::STATUS_DELIVERY_AFTER_SUCCESS;
					}
					elseif (in_array($this->status, array(Partner::STATUS_DELIVERY_BEFORE_REGISTRATION, Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING, Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING, Partner::STATUS_DELIVERY_BEFORE_DELIVERING))) {
						$this->status = Partner::STATUS_DELIVERY_BEFORE_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_DELIVERY_AFTER_REGISTRATION, Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING, Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING))) {
						$this->status = Partner::STATUS_DELIVERY_AFTER_DELIVERING;
					}
					elseif (in_array($this->status, array(Partner::STATUS_DELIVERY_BEFORE_REGISTRATION, Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING, Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING))) {
						$this->status = Partner::STATUS_DELIVERY_BEFORE_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(($this->project_id==70));
		$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_DELIVERY_AFTER_REGISTRATION || $this->status == Partner::STATUS_DELIVERY_AFTER_WAIT_SENDING || $this->status == Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING) {
					$this->status = Partner::STATUS_DELIVERY_AFTER_REGISTRATION;
				}
				elseif ($this->status == Partner::STATUS_DELIVERY_BEFORE_REGISTRATION || $this->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_SENDING || $this->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING) {
					$this->status = Partner::STATUS_DELIVERY_BEFORE_REGISTRATION;
				}
				$message = "Проверка статуса отправления в СДЭК - заявка отменена.";
			}
		}

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

}
