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; }
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; }
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(); } } } } } } } } }
/** * Return the description of the service area holding the geometry passed as id or wkt. * @param object $id_or_wkt ID as integer or WKT as string * @return string The service area description, NULL if none is found. */ public static function Get_Service_Area($id_or_wkt) { $sa = Geometry::Get_Service_Area_Detailed($id_or_wkt); if ($sa) { if (array_key_exists('desc_area', $sa)) { return $sa['desc_area']; } } return ''; }