<?php

function cmp($a, $b) {
	return strcmp($a["id"], $b["id"]);
}

class ShipmentsController extends BaseController {

	private $allowCreate = false;
	private $user				 = null;
	private $workProject = null;

	/**
	 * Constructor
	 */
	public function __construct() {
		// Establish Filters
		$this->beforeFilter('auth');
		$this->beforeFilter('hasRole:' . Role::ROLE_LOGISTICS, array('except' => 'getRefrenceStat'));

		if (Sentry::getUser()) {
			$shipTime		 = '15:00:00';
			$time				 = date('H:i:s');
			list($hours, $mins, $secs) = explode(':', $shipTime);
			$shipSeconds = ($hours * 3600 ) + ($mins * 60 ) + $secs;
			list($hours, $mins, $secs) = explode(':', $time);
			$seconds		 = ($hours * 3600 ) + ($mins * 60 ) + $secs;

//			if ($seconds > $shipSeconds) {
			$this->allowCreate = true;
//			}

			$this->workProject = Project::find(9);
			$this->user				 = User::find(Sentry::getUser()->id);
		}
	}

	public function index() {
		$input = Input::except('page');

		if (!Input::has('date')) {
			$input['date'] = Session::get('shipments_date');
		}
		if (!$input['date']) {
			$input['date'] = date('Y-m-d');
		}
		Session::set('shipments_date', $input['date']);

		$shipments = Shipment::whereProjectId($this->workProject->id)->whereDate($input['date'])->get();
		foreach ($shipments as $shipment) {
			if ($shipment->status == Shipment::STATUS_NEW) {
				if ($shipment->transport_type == Partner::TRANSPORT_TYPE_CDEK) {
					$partnersCdek = Partner::with('user')
									->whereStatus(Partner::STATUS_REGISTRATION)
									->whereProjectId($this->workProject->id)
									->whereTransportType(Partner::TRANSPORT_TYPE_CDEK)
									->whereClarificationAddress(0)
									->whereIsFranchiseesOrder(0)
									->whereRaw('partners.id NOT IN (SELECT partner_id FROM shipments_partners WHERE shipment_id IN (SELECT id FROM shipments WHERE status!=?))', array(Shipment::STATUS_SUCCESS))
									->get();
					if ($partnersCdek->count()) {
						foreach ($partnersCdek as $partner) {
							$shipment->partners()->attach($partner);
						}
					}
				}

//				if ($shipment->transport_type == Partner::TRANSPORT_TYPE_POST) {
//					$partnersPost = Partner::with('user')
//									->checkStatus(array('statusType' => 'agreed', 'type' => 'registration'))
//									->whereProjectId($this->workProject->id)
//									->whereTransportType(Partner::TRANSPORT_TYPE_POST)
//									->whereClarificationAddress(0)
//									->whereRaw('partners.id NOT IN (SELECT partner_id FROM shipments_partners WHERE shipment_id IN (SELECT id FROM shipments WHERE status!=?))', array(Shipment::STATUS_SUCCESS))
//									->get();
//					if ($partnersPost->count()) {
//						foreach ($partnersPost as $partner) {
//							$shipment->partners()->attach($partner);
//						}
//					}
//
//					$productsPost = array();
//					foreach ($shipment->partners as $partner) {
//						if ($partner->getCart() && !$partner->shipment_no_goods) {
//							foreach ($partner->getCart() as $item) {                        
//								if ($item['quant'] > 0) {
//									$product = Product::withTrashed()->whereId($item['id'])->first();
//									if ($product) {
//										if (!isset($productsPost[$product->article])) {
//											$productsPost[$product->article]['article']	 = $product->article;
//											$productsPost[$product->article]['name']		 = $product->name;
//											$productsPost[$product->article]['price']		 = $product->price_purchase;
//											$productsPost[$product->article]['weight']	 = $product->weight;
//											$productsPost[$product->article]['quant']		 = 0;
//										}
//										$productsPost[$product->article]['quant'] += $item['quant'];
//									}
//								}
//							}
//						}
//					}
//
//					usort($productsPost, 'cmp');
//					$shipment->products = $productsPost;
//				}
			}
		}
		$dates = Shipment::whereProjectId($this->workProject->id)->where('status', '!=', Shipment::STATUS_SUCCESS)->groupBy('date')->orderBy('date', 'ASC')->select('date')->get();

		return $this->setupLayout('shipments.index')
										->with('input', $input)
										->with('months', $this->months)
										->with('dates', $dates)
										->with('shipments', $shipments)
										->with('allowCreate', $this->allowCreate);
	}

	public function create() {
		if (!$this->allowCreate) {
			return Redirect::to('/shipments');
		}

		$partnersCdek	 = Partner::with('user')
						->whereStatus(Partner::STATUS_REGISTRATION)
						->whereProjectId($this->workProject->id)
						->whereClarificationAddress(0)
						->whereIsFranchiseesOrder(0)
						->whereTransportType(Partner::TRANSPORT_TYPE_CDEK)
//						->whereRaw('(DATE(datetime_of_agree)<DATE(NOW()) OR (DATE(datetime_of_agree)=DATE(NOW()) AND TIME(datetime_of_agree)<TIME(?)))', array('16:00:00'))
						->whereRaw('partners.id NOT IN (SELECT partner_id FROM shipments_partners WHERE shipment_id IN (SELECT id FROM shipments WHERE status!=?))', array(Shipment::STATUS_SUCCESS))
						->get();
		$productsCdek	 = array();
		foreach ($partnersCdek as $partner) {
			if ($partner->getCart()) {
				foreach ($partner->getCart() as $cartItem) {
					foreach ($cartItem as $item) {
						if ($item['quant'] > 0) {
							$product = Product::withTrashed()->whereId($item['product_id'])->first();
							if ($product) {
								if (!isset($productsCdek[$product->id])) {
									$productsCdek[$product->id]['id']		 = $product->id;
									$productsCdek[$product->id]['name']	 = $product->name;
									$productsCdek[$product->id]['price'] = $product->price_purchase;
									$productsCdek[$product->id]['quant'] = 0;
								}
								$productsCdek[$product->id]['quant'] += $item['quant'];
							}
						}
					}
				}
			}
		}

		$partnersPost	 = array();
//		$partnersPost	 = Partner::with('user')
//						->checkStatus(array('statusType' => 'agreed', 'type' => 'registration'))
//						->whereProjectId($this->workProject->id)
//						->whereClarificationAddress(0)
//						->whereTransportType(Partner::TRANSPORT_TYPE_POST)
////						->whereRaw('(DATE(datetime_of_agree)<DATE(NOW()) OR (DATE(datetime_of_agree)=DATE(NOW()) AND TIME(datetime_of_agree)<TIME(?)))', array('16:00:00'))
//						->whereRaw('partners.id NOT IN (SELECT partner_id FROM shipments_partners WHERE shipment_id IN (SELECT id FROM shipments WHERE deleted_at IS NULL AND status!=?))', array(Shipment::STATUS_SUCCESS))
//						->get();
		$productsPost	 = array();
//		foreach ($partnersPost as $partner) {
//			if ($partner->getCart()) {
//				foreach ($partner->getCart() as $item) {
//					if ($item['quant'] > 0) {
//						$product = Product::withTrashed()->whereId($item['id'])->first();
//						if ($product) {
//							if (!isset($productsPost[$product->article])) {
//								$productsPost[$product->article]['name']		 = $product->name;
//								$productsPost[$product->article]['price']		 = $product->price_purchase;
//								$productsPost[$product->article]['quant']		 = 0;
//							}
//							$productsPost[$product->article]['quant'] += $item['quant'];
//						}
//					}
//				}
//			}
//		}

		usort($productsCdek, 'cmp');
//		usort($productsPost, 'cmp');

		$shipmentCdek	 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_CDEK)->whereProjectId($this->workProject->id)->whereStatus(Shipment::STATUS_NEW)->first();
//		$shipmentPost	 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_POST)->whereProjectId($this->workProject->id)->whereStatus(Shipment::STATUS_NEW)->first();
		$shipmentPost	 = null;

		return $this->setupLayout('shipments.create')
										->with('months', $this->months)
										->with('shipmentCdek', $shipmentCdek)
										->with('shipmentPost', $shipmentPost)
										->with('partnersCdek', $partnersCdek)
										->with('productsCdek', $productsCdek)
										->with('partnersPost', $partnersPost)
										->with('productsPost', $productsPost);
	}

	public function store() {
		if (!$this->allowCreate) {
			$response = array(
					'status' => 'fail'
			);
			return Response::json($response);
		}

		$shipmentCdek = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_CDEK)->whereProjectId($this->workProject->id)->whereStatus(Shipment::STATUS_NEW)->first();
//		$shipmentPost	 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_POST)->whereProjectId($this->workProject->id)->whereStatus(Shipment::STATUS_NEW)->first();

		if (!$shipmentCdek) {
			$partnersCdek = Partner::with('user')
							->whereStatus(Partner::STATUS_REGISTRATION)
							->whereProjectId($this->workProject->id)
							->whereClarificationAddress(0)
							->whereIsFranchiseesOrder(0)
							->whereTransportType(Partner::TRANSPORT_TYPE_CDEK)
//							->whereRaw('(DATE(datetime_of_agree)<DATE(NOW()) OR (DATE(datetime_of_agree)=DATE(NOW()) AND TIME(datetime_of_agree)<TIME(?)))', array('16:00:00'))
							->whereRaw('partners.id NOT IN (SELECT partner_id FROM shipments_partners WHERE shipment_id IN (SELECT id FROM shipments WHERE status!=?))', array(Shipment::STATUS_SUCCESS))
							->get();
			if ($partnersCdek->count()) {
				$shipment = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_CDEK)->whereRaw('date=DATE(NOW())')->first();
				if (!$shipment) {
					$shipment = Shipment::create(array(
											'transport_type' => Partner::TRANSPORT_TYPE_CDEK,
											'date'					 => DB::raw('NOW()'),
											'status'				 => Shipment::STATUS_NEW
					));
					$shipment->user()->associate($this->user);
					$shipment->project()->associate($this->workProject);
					$shipment->save();
				}
				$shipment->partners()->sync($partnersCdek);
			}
		}

//		if (!$shipmentPost) {
//			$partnersPost = Partner::with('user')
//							->checkStatus(array('statusType' => 'agreed', 'type' => 'registration'))
//							->whereProjectId($this->workProject->id)
//							->whereClarificationAddress(0)
//							->whereTransportType(Partner::TRANSPORT_TYPE_POST)
//							->whereRaw('(DATE(datetime_of_agree)<DATE(NOW()) OR (DATE(datetime_of_agree)=DATE(NOW()) AND TIME(datetime_of_agree)<TIME(?)))', array('16:00:00'))
//							->whereRaw('partners.id NOT IN (SELECT partner_id FROM shipments_partners WHERE shipment_id IN (SELECT id FROM shipments WHERE status!=?))', array(Shipment::STATUS_SUCCESS))
//							->get();
//			if ($partnersPost->count()) {
//				$shipment = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_POST)->whereRaw('date=DATE(NOW())')->first();
//				if (!$shipment) {
//					$shipment = Shipment::create(array(
//											'transport_type' => Partner::TRANSPORT_TYPE_POST,
//											'date'					 => DB::raw('NOW()'),
//											'status'				 => Shipment::STATUS_NEW
//					));
//					$shipment->user()->associate($this->user);
//					$shipment->project()->associate($this->workProject);
//					$shipment->save();
//				}
//				$shipment->partners()->sync($partnersPost);
//			}
//		}

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

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

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

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

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

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

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

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

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

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

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

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

		$shipment = $partner->shipment()->first();
		if (!$shipment->cdekDeliveryRequest) {
			$cdekDeliveryRequest = CdekDeliveryRequest::create(array(
									'date'		 => date('Y-m-d'),
									'user_id'	 => $this->user->id,
			));
			$shipment->cdekDeliveryRequest()->associate($cdekDeliveryRequest);
			$shipment->save();
		}

		$cdek	 = new CdekIntegrator();
		$res	 = $cdek->addDeliveries(Partner::with('user')->whereId($partner->id)->get(), $shipment->cdekDeliveryRequest);
		foreach ($res['Order'] as $item) {
			if (isset($item['@attributes']['DispatchNumber'])) {
				$partner = Partner::find($item['@attributes']['Number']);
				$partner->update(array('cdek_dispatchNumber' => $item['@attributes']['DispatchNumber'], 'cdek_deliveryRequestNumber' => $shipment->cdekDeliveryRequest->id));
				if ($partner->status == Partner::STATUS_REGISTRATION) {
					$partner->status = Partner::STATUS_WAIT_DELIVERING;
				}
				$message = "Заявка отправлена в СДЭК. Номер отправления СДЭК - {$partner->cdek_dispatchNumber}.";
				$partner->saveHistory($message);
				$partner->save();
			}
		}

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

	public function shoplogisticsActFence() {
		$input			 = Input::all();
		$shipmentId	 = $input['id'];
		$shipment		 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_POST)->whereid($shipmentId)->whereStatus(Shipment::STATUS_NEW)->first();
		if (!$shipment) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		$productsPost = array();
		foreach ($shipment->partners as $partner) {
			if ($partner->getCart()) {
				foreach ($partner->getCart() as $item) {
					if ($item['quant'] > 0) {
						$product = Product::withTrashed()->whereId($item['id'])->first();
						if ($product) {
							if (!isset($productsPost[$product->article])) {
								$productsPost[$product->article]['article']	 = $product->article;
								$productsPost[$product->article]['name']		 = $product->name;
								$productsPost[$product->article]['price']		 = $product->price_purchase;
								$productsPost[$product->article]['weight']	 = $product->weight;
								$productsPost[$product->article]['quant']		 = 0;
							}
							$productsPost[$product->article]['quant'] += $item['quant'];
						}
					}
				}
			}
		}
		foreach ($input['products'] as $key => $value) {
			if ($value < $productsPost[$key]['quant']) {
				$quant = $productsPost[$key]['quant'] - $value;
				foreach (Partner::whereRaw('partners.id IN (SELECT partner_id FROM shipments_partners WHERE shipment_id=?)', array($shipment->id))
								->where('cart', 'LIKE', '%"article":"' . $key . '"%')
								->orderBy('datetime_of_agree', 'ASC')
								->get() as $partner) {
					foreach ($partner->getCart() as $item) {
						if ($item['article'] == $key && !$partner->shipment_no_goods) {
							if ($quant > 0 && $item['quant'] > 0) {
								$partner->shipment_no_goods = 1;
								$partner->save();
								$quant -= $item['quant'];
							}
						}
					}
				}
			}
		}

		$partners = $shipment->partners()->whereShipmentNoGoods(0)->get();
		$shipment->partners()->sync($partners);
		Partner::whereTransportType(Partner::TRANSPORT_TYPE_POST)->update(array('shipment_no_goods' => 0));

		$shipment	 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_POST)->whereid($shipmentId)->whereStatus(Shipment::STATUS_NEW)->first();
		$sl				 = new ShopLogistics();
		$res			 = $sl->addProductsAct($shipment);
		if (isset($res['error']) && !$res['error']) {
			$shipment->status = Shipment::STATUS_WAIT_ZABOR;
			$shipment->save();
		}

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

	public function shoplogisticsAddZabor() {
		$shipmentId	 = Input::get('id');
		$shipment		 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_POST)->whereid($shipmentId)->whereStatus(Shipment::STATUS_WAIT_ZABOR)->first();
		if (!$shipment) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}
		$date = date('Y-m-d');
		if (Input::has('date')) {
			$date	 = explode(".", Input::get('date'));
			$date	 = "{$date[2]}-{$date[1]}-{$date[0]}";
		}

		$sl	 = new ShopLogistics();
		$res = $sl->addZabor($shipment, $date);
		if (isset($res['error']) && !$res['error']) {
			if ($res['zabors']['zabor']['error_code'] == 43) {
				$response = array('status' => 'fail', 'message' => 'Выбранная дата уже закрыта');
				return Response::json($response);
			}
			elseif ($res['zabors']['zabor']['error_code'] == 44) {
				$response = array('status' => 'fail', 'message' => 'Забор на выбранную дату уже есть в базе');
				return Response::json($response);
			}
			$shipment->status = Shipment::STATUS_WAIT_TRANSFER;
			$shipment->save();
		}

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

	public function shoplogisticsTransfered() {
		$shipmentId	 = Input::get('id');
		$shipment		 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_POST)->whereid($shipmentId)->whereStatus(Shipment::STATUS_WAIT_TRANSFER)->first();
		if (!$shipment) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		$shipment->status = Shipment::STATUS_WAIT_SEND;
		$shipment->save();

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

	public function shoplogisticsSend() {
		$shipmentId	 = Input::get('id');
		$shipment		 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_POST)->whereid($shipmentId)->whereStatus(Shipment::STATUS_WAIT_SEND)->first();
		if (!$shipment) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		foreach ($shipment->partners as $partner) {
			if ($partner && $partner->statusIsAllow(Partner::ALLOW_SEND_TO_SHOPLOGISTICS)) {
				$result					 = $partner->addToShopLogistics();
				$partner->recall = 0;
				$partner->save();

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

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

	//формирование акта забора ShopLogistics
	public function downloadShoplogisticsActFence($shipmentId) {
		$shipment = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_POST)->whereid($shipmentId)->first();
		if (!$shipment) {
			return Redirect::to('shipments');
		}

		Session::set('shipments_shipmentId', $shipmentId);
		$fileName = "ShopLogisticsActFence-{$shipment->date}";
		Excel::create($fileName, function($excel) {
			$excel->sheet('Лист1', function($sheet) {
				$shipmentId	 = Session::get('shipments_shipmentId');
				$shipment		 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_POST)->whereid($shipmentId)->first();
				if ($shipment) {
					$products = array();

					foreach ($shipment->partners as $partner) {
						if ($partner->getCart()) {
							foreach ($partner->getCart() as $item) {
								if ($item['quant'] > 0) {
									$product = Product::withTrashed()->whereId($item['id'])->first();
									if ($product) {
										if (!isset($products[$product->article])) {
											$products[$product->article]['article']	 = $product->article;
											$products[$product->article]['name']		 = $product->name;
											$products[$product->article]['price']		 = $product->price_purchase;
											$products[$product->article]['quant']		 = 0;
										}
										$products[$product->article]['quant'] += $item['quant'];
									}
								}
							}
						}
					}
					$sheet->loadView('crm.shoplogistics.act_fence')->with('products', $products);
				}
			});
		})->store('xlsx');

		return Response::download('../app/storage/exports/' . $fileName . '.xlsx');
	}

	public function cdekSend() {
		$shipmentId	 = Input::get('id');
		$shipment		 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_CDEK)->whereId($shipmentId)->whereStatus(Shipment::STATUS_WAIT_ZABOR)->first();
		if (!$shipment) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

//		if ($shipment->partners->count()) {
//			$cdekDeliveryRequest = CdekDeliveryRequest::create(array(
//									'date'		 => date('Y-m-d'),
//									'user_id'	 => $this->user->id,
//			));
//			$cdek								 = new CdekIntegrator();
//			$res								 = $cdek->addDeliveries($shipment->partners, $cdekDeliveryRequest);
//			foreach ($res['Order'] as $item) {
//				if (isset($item['@attributes']['DispatchNumber'])) {
//					$partner = Partner::find($item['@attributes']['Number']);
//					$partner->update(array('cdek_dispatchNumber' => $item['@attributes']['DispatchNumber'], 'cdek_deliveryRequestNumber' => $cdekDeliveryRequest->id));
//					if ($partner->status == Partner::STATUS_DELIVERY_AFTER_REGISTRATION) {
//						$partner->status = Partner::STATUS_DELIVERY_AFTER_WAIT_DELIVERING;
//					}
//					elseif ($partner->status == Partner::STATUS_DELIVERY_BEFORE_REGISTRATION) {
//						$partner->status = Partner::STATUS_DELIVERY_BEFORE_WAIT_DELIVERING;
//					}
//					$message = "Заявка отправлена в СДЭК. Номер отправления СДЭК - {$partner->cdek_dispatchNumber}.";
//					$partner->saveHistory($message);
//					$partner->save();
//				}
//			}
//		}
		$shipment->status = Shipment::STATUS_SUCCESS;
		$shipment->save();

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

	//формирование печатной формы СДЭК
	public function downloadCdekOrderPrint($partnerId) {
		$partner = Partner::whereId($partnerId)->first();
		if (!$partner || !$partner->statusIsAllow(Partner::ALLOW_CHECK_CDEK)) {
			return Redirect::to('shipments');
		}

		$cdek	 = new CdekIntegrator();
		$res	 = $cdek->ordersPrint(Partner::whereId($partner->id)->get());

		return Response::make($res, 200, array('content-type' => 'application/pdf'));
	}

	public function cdekActFence() {
		$shipmentId	 = Input::get('id');
		$shipment		 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_CDEK)->whereid($shipmentId)->whereStatus(Shipment::STATUS_NEW)->first();
		if (!$shipment) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		$shipment->partners()->update(array('shipment_no_goods' => 0));
		$partners = $shipment->partners()->whereStatus(Partner::STATUS_WAIT_DELIVERING)->get();
		$shipment->partners()->sync($partners);

		$shipment->status = Shipment::STATUS_WAIT_ZABOR;
		$shipment->save();

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

	//формирование акта забора СДЭК
	public function downloadCdekActFence($shipmentId) {
		$shipment = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_CDEK)->whereId($shipmentId)->first();
		if (!$shipment) {
			return Redirect::to('shipments');
		}

		Session::set('shipments_shipmentId', $shipmentId);
		$fileName = "CdekActFence-{$shipment->date}";
		Excel::create($fileName, function($excel) {
			$excel->sheet('Лист1', function($sheet) {
				$shipmentId	 = Session::get('shipments_shipmentId');
				$shipment		 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_CDEK)->whereid($shipmentId)->first();
				if ($shipment) {
					$products = array();

					foreach ($shipment->partners as $partner) {
						if ($partner->getCart()) {
							foreach ($partner->getCart() as $cartItem) {
								foreach ($cartItem as $item) {
									if ($item['quant'] > 0) {
										$product = Product::withTrashed()->whereId($item['product_id'])->first();
										if ($product) {
											$prices = $product->getPrices();
											if (!isset($products[$product->id])) {
												$products[$product->id]['id']		 = $product->id;
												$products[$product->id]['name']	 = $product->name;
												$products[$product->id]['price'] = $prices[$item['product_type_id']]['price'];
												$products[$product->id]['quant'] = 0;
											}
											$products[$product->id]['quant'] += $item['quant'];
										}
									}
								}
							}
						}
					}
					$sheet->loadView('crm.shoplogistics.act_fence')->with('products', $products);
				}
			});

			$excel->sheet('Лист2', function($sheet) {
				$shipmentId	 = Session::get('shipments_shipmentId');
				$shipment		 = Shipment::whereTransportType(Partner::TRANSPORT_TYPE_CDEK)->whereid($shipmentId)->first();
				if ($shipment) {
					$sum		 = 0;
					$weight	 = 0;
					foreach ($shipment->partners as $partner) {
						$partner->weight = 0;
						if ($partner->getCart()) {
							foreach ($partner->getCart() as $cartItem) {
								foreach ($cartItem as $item) {
									if ($item['quant'] > 0) {
										$product = Product::withTrashed()->whereId($item['product_id'])->first();
										if ($product) {
											$partner->weight += 3000 * $item['quant'];
											$partner->sum += $item['price'] * $item['quant'];
											$weight += 3000 * $item['quant'];
											$sum += $item['price'] * $item['quant'];
										}
									}
								}
							}
						}
					}
					$sheet->loadView('crm.cdek.act_fence')->with('shipment', $shipment)->with('months', $this->months)->with('sum', $sum)->with('weight', $weight);
				}
			});
		})->store('xlsx');

		return Response::download('../app/storage/exports/' . $fileName . '.xlsx');
	}

	//формирование выгрузки для почтовой программы
	public function downloadPostExport() {
		
		/*if (!$shipment) {
			return Redirect::to('shipments');
		}*/

		//Session::set('shipments_shipmentId', $shipmentId);
		$fileName = 'PostExport-'.date('d-m-Y');
		Excel::create($fileName, function($excel) {
			$excel->sheet('Лист1', function($sheet) {
				//$shipmentId	 = Session::get('shipments_shipmentId');
				$shipments = Partner::whereTransportType(Partner::TRANSPORT_TYPE_POST)
											      ->whereStatus(Partner::STATUS_REGISTRATION)
											      ->get();
				if ($shipments) {
					//$sum		 = 0;
					foreach ($shipments as $partner) {
						if ($partner->getCart()) {
							$weight	 = 0;
							foreach ($partner->getCart() as $cartItem) {
								foreach ($cartItem as $item) {
									if ($item['quant'] > 0) {
										$product = Product::withTrashed()->whereId($item['product_id'])->first();
										if ($product) {
											if($item['product_type_id'] == 1 || $item['product_type_id'] == 2  || $item['product_type_id'] == 4 || $item['product_type_id'] == 5){
											  $partner->weight += 1 * $item['quant'];
											  //$partner->sum += $item['price'] * $item['quant'];
											} else if($item['product_type_id'] == 3){
												$partner->weight += 3 * $item['quant'];
											}
										}
									}
								}
							}
						}
					}
					
					$sheet->setColumnFormat(array(
							'H' => '0.000',
					));
					$sheet->loadView('crm.post.export')->with('shipments', $shipments);
				}
			});
//					print_r($excel);die();
		})->store('xls');

		//$file = storage_path() . '/exports/' . $fileName . '.csv';
		//File::put($file, iconv('UTF-8', "windows-1251", str_replace("','", "';'", str_replace("\"", "'", File::get($file)))));

		return Response::download('../app/storage/exports/' . $fileName . '.xls');
	}
	
	// загрузка файла с почты
	public function uploadPostExport() {

		$valid_exts	 = array('xls', 'xlsx');
		$max_size		 = 5 * 1024 * 1024;
		$path				 = storage_path() . '/cdek/';
		$file				 = Input::file('file');
		$ext				 = ($file->getClientOriginalExtension()) ? $file->getClientOriginalExtension() : 'xls';
		$size				 = $file->getClientSize();
		$name				 = date("YmdHis") . "." . $ext;

		if (in_array($ext, $valid_exts) && $size < $max_size) {
			if ($file->move($path, $name)) {
				Excel::load($path . $name, function($reader) {
					$result	 = array();
					$reg		 = "#Накладная (.*?) #is";
					foreach ($reader->getActiveSheet()->toArray() as $key => $value) {
						preg_match_all($reg, $value[0], $matches);
						if (isset($matches[1][0]) && $matches[1][0]) {
							if (!isset($result[$matches[1][0]])) {
								$result[$matches[1][0]]['cdek_dispatchNumber'] = $matches[1][0];
								$result[$matches[1][0]]['sum']								 = 0;
							}
							if ($value[1]) {
								$result[$matches[1][0]]['sum'] -= $value[1];
							}
							if ($value[2]) {
								$result[$matches[1][0]]['sum'] += $value[2];
							}
						}
					}
					$operationsProcessCount	 = 0;
					$operationsAddCount			 = 0;
					$operationsSum					 = 0;
					$unknown = array();
					foreach ($result as $item) {
						$operationsProcessCount++;
						$partner = Partner::withTrashed()->where('cdek_dispatchNumber', '=', $item['cdek_dispatchNumber'])->first();
						if ($partner) {
							$operationsAddCount++;
							if ($partner->status == Partner::STATUS_DELIVERY_BEFORE_WAIT_PAY) {
								$partner->status = Partner::STATUS_DELIVERY_BEFORE_SUCCESS;
							}
							$partner->paidsum = $item['sum'];
							$partner->save();
							$operationsSum += $item['sum'];
						}
						else {
							$unknown[$item['cdek_dispatchNumber']]['cdek_dispatchNumber'] = $item['cdek_dispatchNumber'];
						}
					}
					Session::set('operationsProcessCount', $operationsProcessCount);
					Session::set('operationsAddCount', $operationsAddCount);
					Session::set('operationsSum', $operationsSum);
					Session::set('unknown', $unknown);
				});
				$response = array(
						'status'	 => 'success',
						'message'	 => 'Файл успешно загружен',
						'stat'		 => $this->setupLayout('cdek.upload.stat')
										->with('operationsProcessCount', Session::get('operationsProcessCount'))
										->with('operationsAddCount', Session::get('operationsAddCount'))
										->with('operationsSum', Session::get('operationsSum'))
										->with('unknown', Session::get('unknown'))
										->render()
				);
				return Response::json($response);
			}
		}

		$response = array(
				'status'	 => 'fail',
				'message'	 => 'Некорректный файл'
		);
		return Response::json($response);
	}

}
