/**
  * Creates a new Comercio model.
  * If creation is successful, the browser will be redirected to the 'view' page.
  * @return mixed
  */
 public function actionCreate()
 {
     $model = new Comercio();
     if ($model->load(Yii::$app->request->post()) && $model->validate()) {
         $model->save();
         return $this->redirect(['view', 'id' => $model->id]);
     } else {
         return $this->render('create', ['model' => $model]);
     }
 }
 public function getComerciosOrdenados()
 {
     $rutaDiariaComercios = $this->getRutaDiariaComercios()->orderBy('orden')->all();
     $comerciosOrdenados = [];
     $i = 0;
     foreach ($rutaDiariaComercios as $rutaDiariaComercio) {
         $comercio = Comercio::find()->where(['id' => $rutaDiariaComercio->id_comercio])->one();
         $comerciosOrdenados[$i] = $comercio;
         $i++;
     }
     return $comerciosOrdenados;
 }
    <?php 
$form = ActiveForm::begin();
?>

    <?php 
echo $form->field($model, 'fecha')->textInput(['label' => Yii::t('core', 'Date')]);
?>

    <?php 
echo $form->field($model, 'vendidos')->textInput(['label' => Yii::t('core', 'Sold')]);
?>

    <?php 
$comercio = array(Comercio::find()->all());
$listData = ArrayHelper::map(Comercio::find()->all(), 'id', 'nombre');
echo $form->field($model, 'id_comercio')->dropDownList($listData, ['prompt' => Yii::t('core', 'Select...')]);
?>

    <?php 
//$comercio=array(Comercio::find()->all());
$listData = ArrayHelper::map(Producto::find()->all(), 'id', 'nombre');
echo $form->field($model, 'id_producto')->dropDownList($listData, ['prompt' => Yii::t('core', 'Select...')]);
?>

    <div class="form-group">
        <?php 
echo Html::submitButton($model->isNewRecord ? Yii::t('core', 'Create') : Yii::t('core', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']);
?>
    </div>
 public function actionPedidosComercio()
 {
     $model = new GraficasForm();
     $model->setScenario('storeOrders');
     //die(var_dump(Yii::$app->request->post()['orden-ruta-form']));
     $model->load(Yii::$app->request->post());
     $nombreTienda = "Tienda1";
     $nombreComercio = Comercio::Find()->select('nombre')->where(['id' => $model->opcionComercio2])->one()->nombre;
     $carga = $this->cargarArrayPedidos($model->opcionComercio2, $model->fechaDesde, $model->fechaHasta);
     $cargaAdaptadaParaChart = [];
     $cargaAdaptadaParaChart[0] = [Yii::t('core', 'Order'), Yii::t('core', 'Units Ordered')];
     $i = 1;
     foreach ($carga as $comercioPedido) {
         //$nombreProducto = Producto::Find()->select('nombre')->where(['id'=>$venta['id_producto']])->one()->nombre;
         $cargaAdaptadaParaChart[$i] = [$comercioPedido['nombre'], $comercioPedido['cantidad']];
         $i++;
     }
     if (count($cargaAdaptadaParaChart) > 1) {
         return $this->render('comercioPedidos', ['nombreTienda' => $nombreComercio, 'arrayPedidos' => $cargaAdaptadaParaChart]);
     } else {
         Yii::$app->getSession()->setFlash('danger', Yii::t('core', 'There are no orders for selected store'));
         $this->redirect(['index']);
     }
 }
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getIdComercio()
 {
     return $this->hasOne(Comercio::className(), ['id' => 'id_comercio']);
 }
 /**
  * Updates an existing Ruta model.
  * If update is successful, the browser will be redirected to the 'view' page.
  * @param integer $id
  * @return mixed
  */
 public function actionUpdate($id)
 {
     $model = $this->findModel($id);
     if ($model->load(Yii::$app->request->post())) {
         $validar = $model->validar();
         if ($validar == 'OK' && $model->save()) {
             return $this->redirect(['view', 'id' => $model->id]);
         } else {
             Yii::$app->getSession()->setFlash('danger', $validar);
             return $this->redirect(['update', 'id' => $model->id]);
         }
     } else {
         if ($model->getOrdenComercios()->count() != 0) {
             $ordenComercios = $model->getOrdenComercios()->all();
             $usuario = User::findOne($model->id_usuario);
             $comercios = [];
             $i = 0;
             foreach ($ordenComercios as $ordenComercio) {
                 $comercios[$i] = Comercio::find()->where(['id' => $ordenComercio->id_comercio])->one();
                 $i++;
             }
             $requestRuta = json_encode(sysconfigs::getRutaRequestParaMostrar($usuario, $comercios));
             return $this->render('update', ['model' => $this->findModel($id), 'tieneRecorrido' => true, 'requestRuta' => $requestRuta]);
         } else {
             return $this->render('update', ['model' => $model]);
         }
     }
 }
 private function calcularRuta($usuario, $comerciosValidos)
 {
     //obtenemos las coordenadas del usuario (punto de partida en la ruta) y los comercios.
     $coordenadasUsuario = ['latitud' => $usuario->latitud, 'longitud' => $usuario->longitud];
     $latitudModificada = $usuario->latitud + 0.0001;
     $longitudModificada = $usuario->longitud + 0.0001;
     //$coordenadasUsuarioMod = ['latitud'=>$latitudModificada,'longitud'=>$longitudModificada];
     $coordenadasComercios = $this->obtenerCoordenadasComercios($comerciosValidos);
     $request = ['origin' => ['lat' => $coordenadasUsuario['latitud'], 'lng' => $coordenadasUsuario['longitud']], 'travelMode' => 'walking'];
     $comerciosOrdenados = [];
     //si tenemos mas de un comercio armamos la ruta con waypoints...
     if (count($comerciosValidos) > 1) {
         //armamos la primera url que nos ordena los comercios, de ahi sacamos el ultimo. En esta instancia el user es origen y destino.
         $comerciosIndexados = [];
         $url1 = "https://maps.googleapis.com/maps/api/directions/json?origin=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&destination=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&key=" . sysconfigs::API_KEY_GMAPS_RUTAS . "&mode=walking&waypoints=optimize:true";
         $i = 0;
         //guardamos los comercios por el indice en el cual se agrego en los waypoints.
         foreach ($coordenadasComercios as $idComercio => $coordenadasComercio) {
             $comercio = Comercio::findOne($idComercio);
             $url1 = $url1 . '|' . $coordenadasComercio['latitud'] . ',' . $coordenadasComercio['longitud'];
             $comerciosIndexados[$i] = $comercio;
             $i++;
         }
         $response = file_get_contents($url1);
         $json1 = json_decode($response, true);
         if ($json1['status'] == 'OK') {
             //obtenemos los waypoints ordenados y armamos la ruta desde el user hasta el ultimo waypoint recibido
             $ordenComercios = $json1['routes'][0]['waypoint_order'];
             $comercioDestino = $comerciosIndexados[end($ordenComercios)];
             $url2 = "https://maps.googleapis.com/maps/api/directions/json?origin=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&destination=" . $comercioDestino->latitud . "," . $comercioDestino->longitud . "&key=" . sysconfigs::API_KEY_GMAPS_RUTAS . "&mode=walking&waypoints=optimize:true";
             foreach ($coordenadasComercios as $idComercio => $coordenadasComercio) {
                 if ($idComercio != $comercioDestino->id) {
                     $url2 = $url2 . '|' . $coordenadasComercio['latitud'] . ',' . $coordenadasComercio['longitud'];
                 }
             }
             $response = file_get_contents($url2);
             $json2 = json_decode($response, true);
             if ($json2['status'] == 'OK') {
                 $distancia = 0;
                 //calculamos la distancia total de la ruta.
                 $legs = $json2['routes'][0]['legs'];
                 foreach ($legs as $leg) {
                     $distancia = $distancia + $leg['distance']['value'];
                 }
                 if ($distancia <= sysconfigs::DISTANCIA_RELEVADOR) {
                     $request['destination'] = ['lat' => $comercioDestino->latitud, 'lng' => $comercioDestino->longitud];
                     $request['optimizeWaypoints'] = true;
                     $ordenComercios = $json1['routes'][0]['waypoint_order'];
                     //die("ordenComercios:".var_dump($ordenComercios));
                     $i = 0;
                     $request['waypoints'] = [];
                     foreach ($ordenComercios as $orden) {
                         if ($comerciosIndexados[$orden]->id != $comercioDestino->id) {
                             $comerciosOrdenados[$i] = $comerciosIndexados[$orden];
                             $request['waypoints'][$i] = ['lat' => $comerciosIndexados[$orden]->latitud, 'lng' => $comerciosIndexados[$orden]->longitud];
                             $i++;
                         }
                     }
                     $comerciosOrdenados[$i] = $comercioDestino;
                     return ['jsonRuta' => $json2, 'jsonRequest' => $request, 'comerciosOrdenados' => $comerciosOrdenados];
                 } else {
                     //desechamos uno de los comercios con menor prioridad que este lo mas cerca del final del recorrido.
                     $keyComercio = null;
                     $comercioDesechable = null;
                     foreach ($comerciosIndexados as $key => $comercio) {
                         if ($keyComercio == null) {
                             $keyComercio = $key;
                             $comercioDesechable = $comercio;
                         } else {
                             if ($comercio->prioridad >= $comercio->prioridad) {
                                 $keyComercio = $key;
                                 $comercioDesechable = $comercio;
                             }
                         }
                     }
                     unset($comerciosIndexados[$keyComercio]);
                     return $this->calcularRuta($usuario, $comerciosIndexados);
                 }
             } else {
                 //algo fallo!
                 return false;
             }
         } else {
             return false;
         }
     } else {
         //tenemos solo un comercio, por tanto la ruta generada es solo entre el usuario y el comercio.
         foreach ($coordenadasComercios as $idComercio => $coordenadasComercio) {
             $url3 = "https://maps.googleapis.com/maps/api/directions/json?origin=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&destination=" . $coordenadasComercio['latitud'] . "," . $coordenadasComercio['longitud'] . "&key=" . sysconfigs::API_KEY_GMAPS_RUTAS . "&mode=walking";
             $response = file_get_contents($url3);
             $json3 = json_decode($response, true);
             if ($json3['status'] == 'OK') {
                 //vemos si la ruta generada no se pasa de la distancia
                 $distancia = 0;
                 //calculamos la distancia total de la ruta.
                 $legs = $json3['routes'][0]['legs'];
                 foreach ($legs as $leg) {
                     $distancia = $distancia + $leg['distance']['value'];
                 }
                 if ($distancia <= sysconfigs::DISTANCIA_RELEVADOR) {
                     $request['destination'] = ['lat' => $coordenadasComercio['latitud'], 'lng' => $coordenadasComercio['longitud']];
                     $comercio = Comercio::findOne($idComercio);
                     $comerciosOrdenados[0] = $comercio;
                     return ['jsonRuta' => $json3, 'jsonRequest' => $request, 'comerciosOrdenados' => $comerciosOrdenados];
                 } else {
                     //no se puede generar una ruta cumpliendo las reglas, por tanto se retorna false
                     return false;
                 }
             } else {
                 return false;
             }
         }
     }
 }
 /**
  * Creates data provider instance with search query applied
  *
  * @param array $params
  *
  * @return ActiveDataProvider
  */
 public function search($params)
 {
     $query = Comercio::find();
     $dataProvider = new ActiveDataProvider(['query' => $query]);
     $this->load($params);
     if (!$this->validate()) {
         // uncomment the following line if you do not want to return any records when validation fails
         // $query->where('0=1');
         return $dataProvider;
     }
     $query->andFilterWhere(['id' => $this->id, 'latitud' => $this->latitud, 'longitud' => $this->longitud, 'direccion' => $this->direccion]);
     if (strtolower($this->esActivo) == strtolower(Yii::t('core', 'Yes'))) {
         $query->andFilterWhere(['esActivo' => $this->esActivo == 0]);
     } else {
         if (strtolower($this->esActivo) == strtolower(Yii::t('core', 'No'))) {
             $query->andFilterWhere(['esActivo' => $this->esActivo == 1]);
         }
     }
     if (strtolower($this->dia) == strtolower(Yii::t('core', 'Monday'))) {
         $query->andFilterWhere(['dia' => 1]);
     } else {
         if (strtolower($this->dia) == strtolower(Yii::t('core', 'Tuesday'))) {
             $query->andFilterWhere(['dia' => 2]);
         } else {
             if (strtolower($this->dia) == strtolower(Yii::t('core', 'Wednesday'))) {
                 $query->andFilterWhere(['dia' => 3]);
             } else {
                 if (strtolower($this->dia) == strtolower(Yii::t('core', 'Thursday'))) {
                     $query->andFilterWhere(['dia' => 4]);
                 } else {
                     if (strtolower($this->dia) == strtolower(Yii::t('core', 'Friday'))) {
                         $query->andFilterWhere(['dia' => 5]);
                     } else {
                         if (strtolower($this->dia) == strtolower(Yii::t('core', 'Saturday'))) {
                             $query->andFilterWhere(['dia' => 6]);
                         } else {
                             if (strtolower($this->dia) == strtolower(Yii::t('core', 'Sunday'))) {
                                 $query->andFilterWhere(['dia' => 7]);
                             }
                         }
                     }
                 }
             }
         }
     }
     if (strtolower($this->prioridad) == strtolower(Yii::t('core', 'Very High'))) {
         $query->andFilterWhere(['prioridad' => 1]);
     } else {
         if (strtolower($this->prioridad) == strtolower(Yii::t('core', 'High'))) {
             $query->andFilterWhere(['prioridad' => 2]);
         } else {
             if (strtolower($this->prioridad) == strtolower(Yii::t('core', 'Normal'))) {
                 $query->andFilterWhere(['prioridad' => 3]);
             } else {
                 if (strtolower($this->prioridad) == strtolower(Yii::t('core', 'Low'))) {
                     $query->andFilterWhere(['prioridad' => 4]);
                 } else {
                     if (strtolower($this->prioridad) == strtolower(Yii::t('core', 'Very Low'))) {
                         $query->andFilterWhere(['prioridad' => 5]);
                     }
                 }
             }
         }
     }
     $query->andFilterWhere(['like', 'nombre', $this->nombre]);
     return $dataProvider;
 }