/** * 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; }