<?php

class BudgetCostsRequests extends \Eloquent {

	use SoftDeletingTrait;

	protected $guarded		 = array();
	protected $table       = 'budget_costs_requests';
	public static $rules	 = array();

	// при добавлении новых статусов добавить также в costsRequests.js, common.js - var statusArray
	const STATUS_CREATED		 = 0; // Создана
	const STATUS_WORK			   = 1; // В работе
  const STATUS_SIGNED   	 = 5; // Подписано непосредственным начальником (директором)
  const STATUS_BACK_OFF    = 6; // Возврат заявки директором
	const STATUS_SIGN_REJECT = 7; // Отказ в подписи
	const STATUS_CLOSED      = 8; // Закрыта автором после возврата от директора // пока не используется
	const STATUS_REJECT_DIR  = 2; // Отказано фин. директором
	const STATUS_APPROVED	   = 3; // Одобрено
	const STATUS_PAID   	   = 4; // Оплачено

	protected static $allowStatus				 = array(
			BudgetCostsRequests::STATUS_CREATED,
			BudgetCostsRequests::STATUS_WORK,
			BudgetCostsRequests::STATUS_SIGNED,
			BudgetCostsRequests::STATUS_BACK_OFF,
			BudgetCostsRequests::STATUS_SIGN_REJECT,
			BudgetCostsRequests::STATUS_CLOSED,
      BudgetCostsRequests::STATUS_REJECT_DIR,
      BudgetCostsRequests::STATUS_APPROVED,
      BudgetCostsRequests::STATUS_PAID
	);

	public function project() {
		return $this->belongsTo('Project');
	}
	
	public function budgetCostsRequestsFiles() {
		return $this->hasMany('BudgetCostsRequestsFiles')->orderBy('created_at', 'DESC');
	}
	
	public function budgetRefrence() {
		return $this->hasMany('BudgetRefrence', 'request_id');
	}
	
	public function budgetUpload() {
		return $this->belongsTo('BudgetUpload')->withTrashed()->remember(60);
	}
	
	public function getAmountAttribute() {
		return round($this->attributes['requested_amount'] / 100, 2);
	}	
	
	public function getCostName() {
		$costName = '';
		$cost = BudgetCost::find($this->budget_cost_group_id);
		if($cost){
		  $costName = $cost->name;
		}
		
		return $costName;
	}
	
	public function getRequestAccount() {
	 $account = BudgetAccount::find($this->budget_account_id);
		
		return $account;
	}
	
	public function getChildrenRequests() {
		$childrenRequestsId = '';
		
		$childrenRequests = BudgetCostsRequests::whereParentRequestId($this->id)->get();
		if(isset($childrenRequests[0])){
			$childrenRequestsId = '<br><a  href="'.URL::to('budget/costsrequests/search').'?type=id&content='.$this->id.'"><b>Связанные заявки:</b></a> ';
			foreach ($childrenRequests as $childrenRequest){
			  $childrenRequestsId .= '<a  href="'.URL::to('budget/costsrequests/search').'?type=id&content='. $childrenRequest->id.'">#'. $childrenRequest->id.'</a>; ';
			}
		}
		
		return $childrenRequestsId;
	}
	
	public function getClassName() {
		$class = '';
		
    if ($this->status == BudgetCostsRequests::STATUS_WORK || ($this->status == BudgetCostsRequests::STATUS_BACK_OFF) ) {
			$class .= 'text-info';
		}
		elseif ( $this->status == BudgetCostsRequests::STATUS_CREATED ) {
			$class .= 'text-bold text-info';
		}
		elseif ( $this->status == BudgetCostsRequests::STATUS_PAID ) {
			$class .= 'text-muted';
		}
		elseif ( ($this->status == BudgetCostsRequests::STATUS_REJECT_DIR) || ($this->status == BudgetCostsRequests::STATUS_SIGN_REJECT) || ($this->status == BudgetCostsRequests::STATUS_CLOSED) ) {
			$class .= 'text-danger';
		}
		elseif ($this->status == BudgetCostsRequests::STATUS_APPROVED) {
			$class .= 'text-success';
			if( $this->payment_order_number && Auth::user()->hasAnyRole(array(Role::ROLE_BUDGET_ACCOUNTANT, Role::ROLE_BUDGET_ACC_SECRETARY)) ){
				$class .= ' warning';
			}
		}
		if ($this->deleted_at) {
			$class .= ' danger';
		}
		return $class;
	}
	
	public function getApplicantName() {
		$applicantFIO = '';
		
		$applicant = User::find($this->applicant_id);
		if($applicant){
		  $applicantFIO = $applicant->last_name.' '.$applicant->first_name;
		}
		return $applicantFIO;
	}
	
	public function getDirectorName() {
		$directorFIO = '';
		
		$director = User::find($this->director_id);
		if($director){
		  $directorFIO = $director->last_name.' '.$director->first_name;
		}
		return $directorFIO;
	}
	
	public function getAccountantName() {
		$accountantFIO = '';
		
		$accountant = User::find($this->accountant_id);
		if($accountant){
		  $accountantFIO = $accountant->last_name.' '.$accountant->first_name;
		}
		return $accountantFIO;
	}
	
	public function getProjectName() {
		$projectName = '';
		
		$project = Project::find($this->project_id);
		if($project){
		  $projectName = $project->name;
		}
		return $projectName;
	}
	
  public function getDateTime($dateType) {
		if($this->$dateType){
			$dateTime = explode(' ', $this->$dateType);
			$date = explode('-', $dateTime[0]);
			
			$time = explode(':', $dateTime[1]);

			$result = "{$date[2]}.{$date[1]}.{$date[0]}, {$time[0]}:{$time[1]} ";				
		}
		else{
			$result = '';
		}
		return $result;
	}
	
	public function getDate($dateType) {
		if($this->$dateType){
			$date = explode('-', $this->$dateType);	
			$result = "{$date[2]}.{$date[1]}.{$date[0]}";				
		}
		else{
			$result = '';
		}			
		return $result;
	}
	
	public function getDbDate($dateType) {
		$date = explode('.', $dateType);	
		$result = "{$date[2]}-{$date[1]}-{$date[0]}";				
						
		return $result;
	}
	
	public function checkCostsRequestTable($projectAmount = null) {
		// запрошенная сумма
		$requestedAmount = $this->requested_amount/100;
		// id проекта
		$projectId = $this->project_id;
		// проект
		$project = Project::find($projectId);
		// id статьи расхода
	  $costId = $this->budget_cost_group_id;
		// статья расхода
		$cost = BudgetCost::find($costId);
		// id группы
		$costGroupId = $cost->budget_cost_group_id;
		// группа
		$costGroup = BudgetCostGroup::find($costGroupId);
		// % Группы
		$costGroupProject = BudgetCostGroupProject::where('project_id', '=', $projectId)
						                                  ->where('budget_cost_group_id', '=', $costGroupId)
						                                  ->first();
		if($costGroupProject){
		  $costGroupPercent = $costGroupProject->amount/100;
		}
		else{
			$costGroupPercent = 0;
		}
		// бюджет проекта
		if(!$projectAmount){
		  $projectAmount = $project->getCurrentBudgetMonthPlan();
		}
		// бюджет группы
		$costGroupAmount = $projectAmount*$costGroupPercent/100;
		// расходы группы
		$groupFactSum = $costGroup->getGroupSum($projectId);
		
		if($costGroupAmount){
			$availableAfter = ($costGroupAmount - $groupFactSum - $requestedAmount)*100/$costGroupAmount;
		}
		else{
			$availableAfter = 0;
		}
		
		$status  = '<td class="costs-over" data-costs-over="1"></td>';
		if( (!$projectAmount || !$costGroupPercent) ){
			$status  = '<td title="Не задан бюджет группы или проекта. Баланс группы: '.round($groupFactSum*(-1), 2).' руб." class="text-center costs-over" data-costs-over="1">Нет бюджета</td>';
		} 
		else{
			if($requestedAmount){
				if( $availableAfter < 0 ){
					$status  = '<td title="Перерасход бюджета группы" class="text-danger text-center costs-over" data-costs-over="100"> >100%</td>';
				}
				else if( $availableAfter < 30 ){
					$status  = '<td title="Будет превышено 70% бюджета группы" class="text-warning text-center costs-over" data-costs-over="70"> >70%</td>';
				}
			}
		}
		
		return $status;
	}
	
	// вверху панель кнопок с проектами - кол-во заявок по проекту которые нужно обработать для разных ролей
	public function getCountRequestSheet() {
		$requestsForSign  = 0; // подписать заявок
		$requestsSigned   = 0; // финдиректору - одобрить подписанных
		$requestsApproved = 0; // бух. - оплатить одобренных
		
		$requestsBackOff = BudgetCostsRequests::whereProjectId($this->id)   // возврат от директора
																					->whereApplicantId(Auth::user()->id)
																					->whereStatus(BudgetCostsRequests::STATUS_BACK_OFF)
																					->orderBy('created_at', 'DESC')
																					->count();
		
		if (Auth::user()->hasRole(Role::ROLE_BUDGET_SIGN_COST_REQUEST)) { 
			$requestsForSign = BudgetCostsRequests::whereProjectId($this->id)
							                              ->whereDirectorId(Auth::user()->id)
																						->whereStatus(BudgetCostsRequests::STATUS_WORK)
																						->orderBy('created_at', 'DESC')
																						->count();
		}

		if (Auth::user()->hasRole(Role::ROLE_BUDGET_CFO)) {
		  $requestsSigned = BudgetCostsRequests::whereProjectId($this->id)
							                             ->whereStatus(BudgetCostsRequests::STATUS_SIGNED)
																					 ->orderBy('created_at', 'DESC')
																					 ->count();
		}
		else if ( Auth::user()->hasAnyRole(array(Role::ROLE_BUDGET_ACCOUNTANT, Role::ROLE_BUDGET_ACC_SECRETARY)) ) {
			$requestsApproved = BudgetCostsRequests::whereProjectId($this->id)
							                               ->whereStatus(BudgetCostsRequests::STATUS_APPROVED)
																						 ->orderBy('created_at', 'DESC')
																						 ->count();
		}
		$result = $requestsBackOff + $requestsForSign + $requestsSigned + $requestsApproved;
						
		return $result;
	}
	
	public function scopeMy($query) {
		$user   = Auth::user();
		$userId = $user->id;
		
		if ( $user->isAdmin() ) {
			$query;
		}
		else if ( $user->hasRole(Role::ROLE_BUDGET_OUTCOMING_REQUEST) && !$user->hasRole(Role::ROLE_BUDGET_SIGN_COST_REQUEST) ) {
			$query->whereApplicantId($userId);
		}
		else if ( $user->hasRole(Role::ROLE_BUDGET_OUTCOMING_REQUEST) && $user->hasRole(Role::ROLE_BUDGET_SIGN_COST_REQUEST) ) {
			$query->whereRaw('(applicant_id = '.$userId.' OR director_id = '.$userId.')');
		}
		else if ( $user->hasAnyRole(array(Role::ROLE_BUDGET_ACCOUNTANT, Role::ROLE_BUDGET_ACC_SECRETARY, Role::ROLE_BUDGET_CFO)) ) {
			$query->whereIn('budget_costs_requests.project_id', $user->getBudgetProjectsId());
		}
	}
	
	public function saveCostRequestHistoryMessage($message, $statusOld, $statusNew) { // логи работы с заявкой

		return BudgetRefrence::create(array(
								'request_id'			 => $this->id,
				        'user_id'          => Auth::user()->id,
								'comment'					 => $message,
								'status_old'			 => $statusOld,
								'status_new'			 => $statusNew
		));
	}
	
	public function saveCostRequestEditHistory($costRequestNew, $costRequestOld = null) { // создание/редактирование заявки

		if (!isset($costRequestOld)){
			$statusOld = 0;
			$comment = 'Создание заявки';
			$projectIdNew = $costRequestNew->project_id;
			$budgetCostGroupIdNew = $costRequestNew->budget_cost_group_id;
			$budgetAccountIdNew = $costRequestNew->budget_account_id;
			$requestedAmountNew = $costRequestNew->requested_amount;
			$requestCommentNew = $costRequestNew->request_comment;
			$directorIdNew = $costRequestNew->director_id;
			$directorCommentNew = null;
		}else{
			$comment = 'Редактирование';
			if($costRequestNew->status == BudgetCostsRequests::STATUS_APPROVED && $costRequestNew->status != $costRequestOld->status){
				$comment = 'Заявка одобрена';
			}
			$statusOld = $costRequestOld->status;
			$projectIdNew = null;
			if($costRequestNew->project_id != $costRequestOld->project_id){
				$projectIdNew = $costRequestNew->project_id;
			}
			$budgetCostGroupIdNew = null;
			if($costRequestNew->budget_cost_group_id!= $costRequestOld->budget_cost_group_id){
				$budgetCostGroupIdNew = $costRequestNew->budget_cost_group_id;
			}
			$budgetAccountIdNew = null;
			if($costRequestNew->budget_account_id != $costRequestOld->budget_account_id){
				$budgetAccountIdNew = $costRequestNew->budget_account_id;
			}
			$requestedAmountNew = null;
			if($costRequestNew->requested_amount != $costRequestOld->requested_amount){
				$requestedAmountNew = $costRequestNew->requested_amount;
			}
			$requestCommentNew = null;
			if($costRequestNew->request_comment != $costRequestOld->request_comment){
				$requestCommentNew = $costRequestNew->request_comment;
			}
			$directorIdNew = null;
			if($costRequestNew->director_id != $costRequestOld->director_id){
				$directorIdNew = $costRequestNew->director_id;
			}
			$directorCommentNew = null;
			if($costRequestNew->director_comment != $costRequestOld->director_comment){
				$directorCommentNew = $costRequestNew->director_comment;
			}
	  }
		return BudgetRefrence::create(array(
								'request_id'			         => $costRequestNew->id,
				        'user_id'                  => Auth::user()->id,
				        'comment'                  => $comment,
								'status_old'			         => $statusOld,
								'status_new'			         => $costRequestNew->status,
								'project_id_new'			     => $projectIdNew,
				        'budget_cost_group_id_new' => $budgetCostGroupIdNew,
								'budget_account_id_new'		 => $budgetAccountIdNew,
								'requested_amount_new'		 => $requestedAmountNew,
								'request_comment_new'			 => $requestCommentNew,
				        'director_id_new'          => $directorIdNew,
								'director_comment_new'		 => $directorCommentNew
		));
	}
	
	public function createNotification($refrenceId, $userId) {
		
		return BudgetCostsRequestsNotification::create(array(
									'budget_refrence_id'	  => $refrenceId,
									'access_user_id'        => $userId
		));
	}
	
}