Example #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;
 }