Ejemplo n.º 1
0
 public function updatePEAndWD($parameter = null, $value = null, $geom = null, &$info = null)
 {
     //retrieve city_state
     $g = isset($geom) ? $geom : $this->wr_geometry_id;
     $service_area = Geometry::Get_Service_Area_Detailed($g);
     $city_state = Geometry::Get_City_State($g);
     if ($city_state == null) {
         Yii::log('Comune non trovato. $g=' . $g, CLogger::LEVEL_INFO, 'updatePEAndWD');
         // DEBUG
         if (isset($info)) {
             $info['city'] = '--';
             $info['service_area'] = '--';
             $info['water_demand'] = -1;
             $info['margin'] = -1;
             $info['maximum_water_supply'] = -1;
             $info['scenari'] = null;
         }
         return;
     }
     $water_supply = WaterSupply::model()->find('lower(city_state)=:city_state', array(':city_state' => strtolower($city_state)));
     if (!$water_supply) {
         Yii::log('Manca la WaterSupply. $city_state=' . $city_state, CLogger::LEVEL_INFO, 'updatePEAndWD');
         // DEBUG
         return;
     }
     $dg = $water_supply->daily_maximum_water_supply;
     $da = $water_supply->yearly_average_water_supply;
     if (!isset($parameter) || !isset($value)) {
         $p = null;
         $v = null;
         foreach ($this->properties as $property) {
             if ($property->use4ae) {
                 $p = $property->parameter;
                 $v = $property->value;
                 break;
             }
         }
     } else {
         $p = $parameter;
         $v = $value;
     }
     if ($p === null) {
         $this->pe = 0;
     } else {
         //calculate PE
         $zone = $this->zone_name;
         while ($zone != null) {
             $conversion_index = ZonesWaterRequestParameters::model()->active_parameters()->find('parameter=:parameter AND zone=:zone', array(':parameter' => $p, ':zone' => $zone));
             if ($conversion_index) {
                 break;
             }
             $zone = Zones::parentZone($zone);
         }
         if (strcmp($p, $conversion_index->parameter) == 0) {
             if (is_numeric($conversion_index->value)) {
                 $val = $conversion_index->value;
                 $this->pe = $v * $val;
             } else {
                 $val = str_ireplace(array('dg', 'da'), array($dg, $da), $conversion_index->value);
                 //TODO: mettere nel config il valore delle stringe dg e da
                 try {
                     $val = Math::safe_eval($val);
                     $ret = $v * $val;
                     if (is_numeric($ret)) {
                         $this->pe = $ret;
                     } else {
                         $this->pe = -1;
                     }
                 } catch (Exception $e) {
                     $this->pe = 0;
                     Yii::log('PE Error. $conversion_index=' . $conversion_index->parameter . '|' . $conversion_index->value, CLogger::LEVEL_INFO, 'updatePEAndWD');
                     // DEBUG
                 }
             }
         } else {
             $this->pe = 0;
         }
     }
     $formula = $this->zone->formula;
     $fformula = $formula->formula;
     /*
     		if (stripos($formula->formula,Yii::app()->params['formulas']['pe'])!==false) {
     			$fformula = str_ireplace(Yii::app()->params['formulas']['pe'],$this->pe,$fformula);
     		}
     		
     		if (stripos($formula->formula,Yii::app()->params['formulas']['dg'])!==false) {
     			$fformula = str_ireplace(Yii::app()->params['formulas']['dg'],$dg,$fformula);
     		}
     		
     		if (stripos($formula->formula,Yii::app()->params['formulas']['da'])!==false) {
     			$fformula = str_ireplace(Yii::app()->params['formulas']['da'],$da,$fformula);
     		}*/
     foreach ($this->properties() as $property) {
         if (stripos($formula->formula, $property->parameter) !== false) {
             $fformula = str_ireplace($property->parameter, $property->value, $fformula);
         }
     }
     if (stripos($formula->formula, Yii::app()->params['formulas']['da']) !== false) {
         $fformula = str_ireplace(Yii::app()->params['formulas']['da'], $da, $fformula);
     }
     if (stripos($formula->formula, Yii::app()->params['formulas']['dg']) !== false) {
         $fformula = str_ireplace(Yii::app()->params['formulas']['dg'], $dg, $fformula);
     }
     $fformula_with_pe = null;
     if (stripos($formula->formula, Yii::app()->params['formulas']['pe']) !== false) {
         $fformula_with_pe = $fformula;
         $fformula = str_ireplace(Yii::app()->params['formulas']['pe'], $this->pe, $fformula);
     }
     try {
         $ret = Math::safe_eval($fformula);
         if (is_numeric($ret)) {
             $this->water_demand = $ret;
         } else {
             $this->water_demand = -1;
         }
     } catch (Exception $e) {
         $this->water_demand = 0;
         Yii::log('WD Error. $fformula=' . $fformula, CLogger::LEVEL_INFO, 'updatePEAndWD');
         // DEBUG
     }
     if (isset($info)) {
         $info['city'] = ucwords(strtolower($city_state));
         $info['water_demand'] = Math::wd_round($this->water_demand) . ' ' . Yii::app()->params['water_demand_unit'];
         if ($service_area == null) {
             $info['service_area'] = '--';
             $operative_margin = DummyOperativeMargin::model()->findAll('lower(area)=:area', array(':area' => strtolower($city_state)));
             if (count($operative_margin) == 0) {
                 Yii::log('Manca il margine operativo del comune. area=' . $city_state, CLogger::LEVEL_INFO, 'updatePEAndWD');
                 // DEBUG
                 return;
             }
         } else {
             //var_dump($service_area);
             $info['service_area'] = ucwords(strtolower($service_area['desc_area']));
             /*TODO: cambiare il $service_area*/
             $operative_margin = DummySAOperativeMargin::model()->findAll('lower(area)=:area', array(':area' => strtolower($service_area['area'])));
             if (count($operative_margin) == 0) {
                 Yii::log('Manca il margine operativo dell\'area di servizio. area=' . $city_state, CLogger::LEVEL_INFO, 'updatePEAndWD');
                 // DEBUG
                 return;
             }
         }
         $actual_margin = null;
         foreach ($operative_margin as $op) {
             if ($op->scenario == null) {
                 $actual_margin = Math::margin_round($op->margin);
                 break;
             }
         }
         if ($actual_margin == null) {
             Yii::log('Manca il margine operativo attuale. area=' . $city_state, CLogger::LEVEL_INFO, 'updatePEAndWD');
             // DEBUG
             $actual_margin = 0;
         }
         if ($this->water_demand > $actual_margin) {
             $info['margin'] = -1;
         } else {
             if ($this->water_demand > $actual_margin - $actual_margin * (int) Yii::app()->params['water_demand_range'] / 100) {
                 $info['margin'] = 0;
             } else {
                 $info['margin'] = 1;
             }
         }
         $info['maximum_water_supply'] = Math::margin_round($actual_margin) . ' ' . Yii::app()->params['water_demand_unit'];
         if ($fformula_with_pe != null) {
             $info['max_parameter'] = array();
             $info['max_parameter']['name'] = $p;
             $fformula_with_pe = str_ireplace(Yii::app()->params['formulas']['pe'], 1 / $actual_margin, $fformula_with_pe);
             try {
                 $ret = Math::safe_eval($fformula_with_pe);
                 if (is_numeric($ret)) {
                     $max_pe = 1 / $ret;
                 } else {
                     $max_pe = -1;
                 }
             } catch (Exception $e) {
                 $max_pe = -1;
                 Yii::log('MAX PE Error. $fformula_with_pe=' . $fformula_with_pe, CLogger::LEVEL_INFO, 'updatePEAndWD');
                 // DEBUG
             }
             if ($max_pe > 0) {
                 $info['max_parameter']['value'] = $max_pe / $val;
             } else {
                 $info['max_parameter']['value'] = -1;
             }
         }
         $info['scenari'] = array();
         foreach ($operative_margin as $op) {
             if ($op->scenario == null) {
                 continue;
             }
             $item = array();
             $item['scenario'] = $op->scenario;
             $item['maximum_water_supply'] = Math::margin_round($op->margin) . ' ' . Yii::app()->params['water_demand_unit'];
             if ($this->water_demand > $op->margin) {
                 $item['margin'] = -1;
             } else {
                 if ($this->water_demand > $op->margin - $op->margin * (int) Yii::app()->params['water_demand_range'] / 100) {
                     $item['margin'] = 0;
                 } else {
                     $item['margin'] = 1;
                 }
             }
             array_push($info['scenari'], $item);
         }
     }
     return;
 }
Ejemplo n.º 2
0
 public function updateOperativeMargin()
 {
     if ($this->status == WaterRequests::CONFIRMED_STATUS && $this->phase == 2 || $this->status == WaterRequests::COMPLETED_STATUS && $this->phase == 3) {
         //loop into geoms
         foreach ($this->geometries as $geom) {
             $service_area = Geometry::Get_Service_Area_Detailed($geom->id);
             $city_state = Geometry::Get_City_State($geom->id);
             if ($service_area == null) {
                 $operative_margin = OperativeMargin::model()->findAll('lower(area)=:area', array(':area' => strtolower($city_state)));
                 $dummy_operative_margin = DummyOperativeMargin::model()->findAll('lower(area)=:area', array(':area' => strtolower($city_state)));
                 if (count($operative_margin) == 0 || count($dummy_operative_margin) == 0) {
                     Yii::log('Manca il margine operativo del comune. area=' . $city_state, CLogger::LEVEL_INFO, 'updateOperativeMargin');
                     // DEBUG
                     return;
                 }
             } else {
                 $operative_margin = SAOperativeMargin::model()->findAll('lower(area)=:area', array(':area' => strtolower($service_area['area'])));
                 $dummy_operative_margin = DummySAOperativeMargin::model()->findAll('lower(area)=:area', array(':area' => strtolower($service_area['area'])));
                 if (count($operative_margin) == 0 || count($dummy_operative_margin) == 0) {
                     Yii::log('Manca il margine operativo dell\'area di servizio. area=' . $service_area['area'], CLogger::LEVEL_INFO, 'updateOperativeMargin');
                     // DEBUG
                     return;
                 }
             }
             if ($this->phase == 2) {
                 foreach ($dummy_operative_margin as $dop) {
                     $dop->margin = $dop->margin - $geom->geom_water_demand;
                     $dop->save();
                 }
             } else {
                 foreach ($operative_margin as $op) {
                     $op->margin = $op->margin - $geom->geom_water_demand;
                     $op->save();
                     // it has a parent, release the water from the dummy tables
                     if ($this->parent_wr) {
                         $parent = $this->parent_wr;
                         foreach ($parent->geometries as $g) {
                             $sa = Geometry::Get_Service_Area_Detailed($g->id);
                             $cs = Geometry::Get_City_State($g->id);
                             if (strcmp($service_area, $sa) === 0 && strcmp($city_state, $cs) === 0) {
                                 foreach ($dummy_operative_margin as $dop) {
                                     $dop->margin = $dop->margin + $geom->geom_water_demand;
                                     $dop->save();
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 3
0
 public static function feasibilityCheck($geom_id, $wd)
 {
     //Yii::log('geom_id= '.print_r($geom_id, true).' wd= '.print_r($wd, true), CLogger::LEVEL_INFO, 'feasibilitycheck()');  // DEBUG
     $ret = array();
     $service_area = Geometry::Get_Service_Area_Detailed($geom_id);
     $city_state = Geometry::Get_City_State($geom_id);
     //Yii::log('city_state= '.print_r($city_state, true).' wd= '.print_r($wd, true), CLogger::LEVEL_INFO, 'feasibilitycheck()');  // DEBUG
     if ($city_state == null || $wd == null) {
         $ret['sarea'] = null;
         $ret['city'] = '--';
         $ret['scenari'] = null;
         $ret['margin'] = -1;
         $ret['maximum_water_supply'] = -1;
         return $ret;
     }
     $ret['city'] = ucwords(strtolower($city_state));
     // uso city_state ma potrei usare service_area->desc_area se Get_Service_Area ritornasse un array
     if (!$service_area) {
         $ret['sarea'] = null;
         $water_supply = DummyOperativeMargin::model()->findAll('lower(area)=:area', array(':area' => strtolower($city_state)), array('limit' => 3));
         if (!$water_supply) {
             Yii::log('Cannot find Operative Margin for $city_state=' . $city_state, CLogger::LEVEL_INFO, 'feasibilityCheck');
             // DEBUG
             $ret['scenari'] = null;
             $ret['margin'] = -1;
             $ret['maximum_water_supply'] = -1;
             return $ret;
         }
     } else {
         $ret['sarea'] = $service_area['desc_area'];
         $water_supply = DummySAOperativeMargin::model()->findAll('lower(area)=:area', array(':area' => strtolower($service_area['area'])), array('limit' => 3));
     }
     $ret['scenari'] = array();
     foreach ($water_supply as $ws) {
         //Yii::log(print_r($ws->attributes, true), CLogger::LEVEL_INFO, 'foreach');  // DEBUG
         $operative_margin = $ws->margin;
         if ($ws->scenario == null) {
             $ret['maximum_water_supply'] = Math::wd_round($operative_margin);
             if ($wd > $operative_margin) {
                 $ret['margin'] = -1;
             } else {
                 if ($wd > $operative_margin - (int) Yii::app()->params['water_demand_range']) {
                     $ret['margin'] = 0;
                 } else {
                     $ret['margin'] = 1;
                 }
             }
         } else {
             $item = array();
             $item['scenario'] = $ws->scenario;
             $item['maximum_water_supply'] = Math::wd_round($operative_margin);
             if ($wd > $operative_margin) {
                 $item['margin'] = -1;
             } else {
                 if ($wd > $operative_margin - (int) Yii::app()->params['water_demand_range']) {
                     $item['margin'] = 0;
                 } else {
                     $item['margin'] = 1;
                 }
             }
             array_push($ret['scenari'], $item);
         }
     }
     return $ret;
 }
Ejemplo n.º 4
0
<p><b><?php 
echo Yii::t('waterrequest', 'Involved Service Areas');
?>
:</b></p>
<?php 
$cities = array();
$margin = array();
foreach ($model->geometries() as $geom) {
    $cs = $geom->city_state;
    $sas = Geometry::Get_Service_Area_ByID($geom->id);
    if (count($sas)) {
        if (array_key_exists('desc_area', $sas[0])) {
            $sa = $sas[0]['desc_area'];
            $water_supply = DummySAOperativeMargin::model()->find('lower(area)=:area AND scenario IS NULL', array(':area' => strtolower($sas[0]['area'])), array('limit' => 1));
            $margin[$sa] = $water_supply->margin;
        } else {
            $sa = 'unnamed';
            $margin[$sa] = 0;
        }
    } else {
        $sa = 'unknown';
        $margin[$sa] = 0;
    }
    //$sa = $geom->service_area;
    if (array_key_exists($cs, $cities)) {
        if (array_key_exists($sa, $cities[$cs])) {
            $cities[$cs][$sa] += $geom->geom_water_demand;
        } else {
            $cities[$cs][$sa] = $geom->geom_water_demand;
        }
    } else {
Ejemplo n.º 5
0
 /**
  * Deletes a particular model.
  * If deletion is successful, the browser will be redirected to the 'admin' page.
  * @param integer $id the ID of the model to be deleted
  */
 public function actionDelete($id)
 {
     if (Yii::app()->request->isPostRequest) {
         // we only allow deletion via POST request
         $model = $this->loadModel($id);
         $dummy = DummySAOperativeMargin::model()->findByAttributes(array('area' => $model->area, 'scenario' => $model->scenario));
         $model->delete();
         $dummy->delete();
         // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
         if (!isset($_GET['ajax'])) {
             $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
         }
     } else {
         throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
     }
 }