Ejemplo n.º 1
0
 public function getJsonObject()
 {
     $airline = Airline::getAirlineByCode($this->transportAirlineCode);
     //echo 1;
     //die();
     if (!$this->markAirline) {
         //$this->markAirline = $airline;
         $ret = array('transportAirline' => $this->transportAirlineCode, 'transportAirlineName' => $airline->localRu, 'transportAirlineNameEn' => $airline->localEn, 'departureCity' => City::getCityByPk($this->departureCityId)->localRu, 'departureCityPre' => City::getCityByPk($this->departureCityId)->casePre, 'departureCityId' => $this->departureCityId, 'arrivalCity' => City::getCityByPk($this->arrivalCityId)->localRu, 'arrivalCityPre' => City::getCityByPk($this->arrivalCityId)->casePre, 'arrivalCityId' => $this->arrivalCityId, 'datetimeBegin' => DateTimeHelper::formatForJs($this->timestampBegin), 'datetimeEnd' => DateTimeHelper::formatForJs($this->timestampEnd), 'flightCode' => $this->code, 'duration' => $this->duration, 'departureAirport' => $this->departureAirport->localRu, 'arrivalAirport' => $this->arrivalAirport->localRu, 'departureAirportId' => $this->departureAirport->id, 'arrivalAirportId' => $this->arrivalAirport->id, 'aircraftCode' => $this->aircraftCode, 'aircraftName' => $this->getAircraftName(), 'stopNum' => $this->stopNum, 'bookingCode' => $this->bookingCodes[0]);
     } else {
         $ret = array('transportAirline' => $this->transportAirlineCode, 'transportAirlineName' => $airline->localRu, 'transportAirlineNameEn' => $airline->localEn, 'markAirline' => $this->markAirline->code, 'markAirlineName' => $this->markAirline->localRu, 'markAirlineNameEn' => $this->markAirline->localEn, 'departureCity' => City::getCityByPk($this->departureCityId)->localRu, 'departureCityPre' => City::getCityByPk($this->departureCityId)->casePre, 'departureCityId' => $this->departureCityId, 'arrivalCity' => City::getCityByPk($this->arrivalCityId)->localRu, 'arrivalCityPre' => City::getCityByPk($this->arrivalCityId)->casePre, 'arrivalCityId' => $this->arrivalCityId, 'datetimeBegin' => DateTimeHelper::formatForJs($this->timestampBegin), 'datetimeEnd' => DateTimeHelper::formatForJs($this->timestampEnd), 'flightCode' => $this->code, 'duration' => $this->duration, 'departureAirport' => $this->departureAirport->localRu, 'arrivalAirport' => $this->arrivalAirport->localRu, 'departureAirportId' => $this->departureAirport->id, 'arrivalAirportId' => $this->arrivalAirport->id, 'aircraftCode' => $this->aircraftCode, 'aircraftName' => $this->getAircraftName(), 'stopNum' => $this->stopNum, 'bookingCode' => $this->bookingCodes[0]);
     }
     //print_r($ret);
     //die();
     return $ret;
 }
Ejemplo n.º 2
0
 private function initFromJsonObject($params)
 {
     if (isset($params['price'])) {
         $this->price = $params['price'];
     }
     //$this->taxes = $oParams->commission_price;
     $this->flightKey = $params['flightKey'];
     //$this->commission = $oParams->commission_price;
     $this->webService = $params['service'];
     $this->charges = $params['commission'];
     $this->refundable = $params['refundable'];
     $this->_commission = $params['commission'];
     $this->_taxes = $params['taxes'];
     $this->flights = array();
     //$this->searchKey = $oParams->searchId;
     if (!$this->valAirline) {
         $this->valAirline = Airline::getAirlineByCode($params['valCompany']);
     }
     $iInd = 0;
     $lastArrTime = 0;
     $lastCityToId = 0;
     $bStart = true;
     if ($params['flights']) {
         foreach ($params['flights'] as $iGroupId => $aParts) {
             $iIndPart = 0;
             $this->flights[$iGroupId] = new Flight();
             foreach ($aParts['flightParts'] as $oPartParams) {
                 $oPart = new FlightPart($oPartParams);
                 $this->flights[$iGroupId]->addPart($oPart);
             }
         }
     } else {
         throw new CException(Yii::t('application', 'Required param $oParams->parts not set.'));
     }
 }
 /**
  * Execute the action.
  * @param array command line parameters specific for this command
  */
 public function actionIndex($type = 'airports', $filename = '')
 {
     if ($type == 'airports') {
         if ($filename) {
             $path = Yii::getPathOfAlias('application.runtime');
             if (file_exists($filename)) {
                 $fp = fopen($filename, 'r');
                 $outfp = fopen($path . '/' . basename($filename), 'w');
                 if (!$outfp) {
                     echo "Cant open file " . $path . '/' . basename($filename) . " for writing\n";
                     die;
                 }
                 $formatLine = fgets($fp);
                 $formatLine = str_replace(array("\r", "\n"), array(''), $formatLine);
                 $columnNames = explode('|', $formatLine);
                 //print_r($formatLine);die();
                 $column = array();
                 foreach ($columnNames as $i => $columnName) {
                     $column[$columnName] = $i;
                 }
                 //print_r($column);
                 $skipAll = false;
                 while (!feof($fp)) {
                     $lineData = fgets($fp);
                     $lineData = str_replace(array("\r", "\n"), array(''), $lineData);
                     $lineData = iconv("cp1251", "UTF-8", $lineData);
                     $data = explode('|', $lineData);
                     $needSave = true;
                     $country = Country::getCountryByCode($data[$column['country_code']]);
                     if ($country) {
                         $cities = $this->getCities($country->id, $data[$column['city_en']], $data[$column['city_ru']]);
                         if (!$cities) {
                             $cities = City::model()->findAllByAttributes(array('countryId' => $country->id, 'code' => $data[$column['iata_code']]));
                         }
                         $abort = false;
                         while (!$abort) {
                             if ($cities) {
                                 if (count($cities) > 1) {
                                     $citiesTmp = City::model()->findAllByAttributes(array('countryId' => $country->id, 'code' => $data[$column['iata_code']]));
                                     if ($citiesTmp && count($citiesTmp) == 1) {
                                         $cities = $citiesTmp;
                                     }
                                 }
                                 if (count($cities) > 1) {
                                     echo "Found " . count($cities) . " cities for line: {$lineData}\n";
                                     echo str_pad('code', 5, " ", STR_PAD_RIGHT) . str_pad('localRu', 15, " ", STR_PAD_LEFT) . str_pad('localEn', 15, " ", STR_PAD_LEFT) . "\n";
                                     foreach ($cities as $city) {
                                         echo str_pad($city->code, 5, " ", STR_PAD_RIGHT) . str_pad($city->localRu, 15, " ", STR_PAD_LEFT) . str_pad($city->localEn, 15, " ", STR_PAD_LEFT) . "\n";
                                     }
                                     echo "Type code of the selected city:\n";
                                     $name = trim(fgets(STDIN));
                                     $cities = $this->getCities($country->id, $name);
                                 } else {
                                     $this->selectAirport($data, $column, $lineData, $outfp, $cities[0]);
                                     $abort = true;
                                 }
                             } else {
                                 echo "City not found in Db. Type s - skip, c - create, f - try find in db:\n";
                                 echo "{$lineData}\n";
                                 //$char = trim(fgets(STDIN));
                                 $char = 's';
                                 if ($char == 's') {
                                     echo "Dont found any same city. Skipping line: {$lineData} \n";
                                     fwrite($outfp, $lineData . "|nocity\n");
                                     $abort = true;
                                 } elseif ($char == 'c') {
                                     $city = new City();
                                     echo "Creating new city...\n";
                                     $city->countryId = $country->id;
                                     if (!$data[$column['city_ru']]) {
                                         $data[$column['city_ru']] = $data[$column['city_en']];
                                     }
                                     echo "City name rus (default {$data[$column['city_ru']]}):\n";
                                     $newName = trim(fgets(STDIN));
                                     if ($newName) {
                                         $city->localRu = $newName;
                                     } else {
                                         $city->localRu = $data[$column['city_ru']];
                                     }
                                     echo "City name eng (default {$data[$column['city_en']]}):\n";
                                     $newName = trim(fgets(STDIN));
                                     if ($newName) {
                                         $city->localEn = $newName;
                                     } else {
                                         $city->localEn = $data[$column['city_en']];
                                     }
                                     echo "City code:\n";
                                     $newCode = trim(fgets(STDIN));
                                     if ($newCode) {
                                         $city->code = $newCode;
                                     } else {
                                         continue;
                                     }
                                     $city->position = 0;
                                     $city->save();
                                     $city->id = $city->getPrimaryKey();
                                     $this->selectAirport($data, $column, $lineData, $outfp, $city);
                                 } else {
                                     echo "Type part of city name:\n";
                                     $name = trim(fgets(STDIN));
                                     $cities = $this->getCities($country->id, $name);
                                 }
                             }
                         }
                     } else {
                         echo "Country not found, skipping line: {$lineData} \n";
                         fwrite($outfp, $lineData . "|nocountry\n");
                     }
                 }
                 fclose($fp);
                 fclose($outfp);
             } else {
                 echo 'Import file not found on path: ' . $filename;
             }
         } else {
             echo 'Option --filename cant be empty';
         }
     }
     if ($type == 'airlineWeight') {
         echo 'INN';
         if ($filename) {
             $path = Yii::getPathOfAlias('application.runtime');
             if (file_exists($filename)) {
                 $airlinessxe = simplexml_load_string(file_get_contents($filename));
                 foreach ($airlinessxe->Item as $item) {
                     $airlineCode = (string) $item['id'];
                     $modified = false;
                     try {
                         $airline = Airline::getAirlineByCode($airlineCode);
                     } catch (CException $e) {
                         $airline = false;
                     }
                     if ($airline) {
                         $airlineLocalRu = (string) $item['rusname'];
                         $airlineLocalEn = (string) $item['name'];
                         if (UtilsHelper::countRussianCharacters($airline->localRu) <= 0) {
                             $airline->localRu = $airlineLocalRu;
                             $modified = true;
                         } else {
                             echo "o_O !!! " . $airline->localRu;
                         }
                         if (!$airline->localEn && $airlineLocalEn) {
                             $airline->localEn = $airlineLocalEn;
                             $modified = true;
                         }
                         $economPrice = (string) $item->luggage->econom->price;
                         $economFreeWeight = (string) $item->luggage->econom->weight;
                         if ($airline->economFreeWeight && $economFreeWeight) {
                             if ($economPrice == 'charge') {
                                 $airline->economFreeWeight = 0;
                             } else {
                                 $airline->economFreeWeight = str_replace('kg', '', $economFreeWeight);
                             }
                             $modified = true;
                         }
                         $businessPrice = (string) $item->luggage->business->price;
                         $businessFreeWeight = (string) $item->luggage->business->weight;
                         if ($airline->businessFreeWeight && $businessFreeWeight) {
                             if ($businessPrice == 'charge') {
                                 $airline->businessFreeWeight = 0;
                             } else {
                                 $airline->businessFreeWeight = str_replace('kg', '', $businessFreeWeight);
                             }
                             $modified = true;
                         }
                         $economDescription = (string) $item->luggage->econom->description;
                         if ($airline->economDescription && $economDescription) {
                             $economDescription = substr($economDescription, strpos($economDescription, 'Багаж не должен'));
                             $airline->economDescription = trim($economDescription);
                             $modified = true;
                         }
                         $businessDescription = (string) $item->luggage->business->description;
                         if ($airline->businessDescription && $businessDescription) {
                             $businessDescription = substr($businessDescription, strpos($businessDescription, 'Багаж не должен'));
                             $airline->businessDescription = trim($businessDescription);
                             echo "try modyf ";
                             $modified = true;
                         }
                         if ($modified) {
                             $airline->save();
                         }
                     } else {
                         echo "!!!! NOT FOUND {$airlineCode}";
                         $airline = new Airline();
                         $airline->code = $airlineCode;
                         $airlineLocalRu = (string) $item['rusname'];
                         $airlineLocalEn = (string) $item['name'];
                         if (UtilsHelper::countRussianCharacters($airline->localRu) <= 0) {
                             $airline->localRu = $airlineLocalRu;
                             $airline->localEn = $airlineLocalEn;
                             $modified = true;
                         }
                         $economFreeWeight = (string) $item->luggage->econom->weight;
                         if (!$airline->economFreeWeight && $economFreeWeight) {
                             $airline->economFreeWeight = str_replace('kg', '', $economFreeWeight);
                             $modified = true;
                         }
                         $businessFreeWeight = (string) $item->luggage->business->weight;
                         if (!$airline->businessFreeWeight && $businessFreeWeight) {
                             $airline->businessFreeWeight = str_replace('kg', '', $businessFreeWeight);
                             $modified = true;
                         }
                         $economDescription = (string) $item->luggage->econom->description;
                         if (!$airline->economDescription && $economDescription) {
                             $airline->economDescription = $economDescription;
                             $modified = true;
                         }
                         $businessDescription = (string) $item->luggage->business->description;
                         if (!$airline->businessDescription && $businessDescription) {
                             $airline->businessDescription = $businessDescription;
                             $modified = true;
                         }
                         if (!$airline->save()) {
                             CVarDumper::dump($airline->getErrors());
                         }
                     }
                     echo "airline {$airlineCode} {$airlineLocalRu} {$economFreeWeight}\n";
                 }
                 echo 'ютф?';
                 //CVarDumper::dump($airlinessxe);
             }
         }
     }
     if ($type == 'iconv') {
         if ($filename) {
             $path = Yii::getPathOfAlias('application.runtime');
             if (file_exists($filename)) {
                 $data = file_get_contents($filename);
                 echo iconv('cp1251', 'UTF-8', $data);
             }
         }
     }
     if ($type == 'test') {
         $cities = City::model()->findAllByAttributes(array('code' => 'LED', 'countryId' => 174));
         if ($cities) {
             echo "Found " . count($cities) . " cities for line: \n";
             echo str_pad('code', 5, " ", STR_PAD_RIGHT) . str_pad('localRu', 19, " ", STR_PAD_LEFT) . str_pad('localEn', 19, " ", STR_PAD_LEFT) . "\n";
             foreach ($cities as $city) {
                 echo str_pad($city->code, 5, " ", STR_PAD_RIGHT) . str_pad($city->localRu, 19, " ", STR_PAD_LEFT) . str_pad($city->localEn, 19, " ", STR_PAD_LEFT) . ' ' . $city->country->id . "\n";
             }
         }
     }
     if ($type == 'hotelbookCountries') {
         Yii::import('site.common.modules.hotel.models.*');
         $HotelClient = new HotelBookClient();
         $countries = $HotelClient->getCountries();
         print_r($countries);
         foreach ($countries as $hotelCountry) {
             $nameRu = $hotelCountry['nameRu'];
             $name = $hotelCountry['nameEn'];
             $ourCountries = $this->getCountries($name, $nameRu);
             if ($ourCountries) {
                 if (count($ourCountries) > 1) {
                     echo "Found " . count($ourCountries) . " countries for nameEn:{$hotelCountry['nameEn']} nameRu:{$hotelCountry['nameRu']} \n";
                     echo str_pad('code', 5, " ", STR_PAD_RIGHT) . str_pad('localRu', 19, " ", STR_PAD_LEFT) . str_pad('localEn', 19, " ", STR_PAD_LEFT) . "\n";
                     foreach ($ourCountries as $country) {
                         echo str_pad($country->code, 5, " ", STR_PAD_RIGHT) . str_pad($country->localRu, 19, " ", STR_PAD_LEFT) . str_pad($country->localEn, 19, " ", STR_PAD_LEFT) . ' ' . $country->id . "\n";
                     }
                     echo "Enter id of country or 's' - for skip \n";
                     $oldId = trim(fgets(STDIN));
                     if ($oldId !== 's') {
                         $country = Country::getCountryByPk(intval($oldId));
                         $country->hotelbookId = $hotelCountry['id'];
                         $country->save();
                     }
                 } else {
                     $country = $ourCountries[0];
                     if (!$country->hotelbookId) {
                         $country->hotelbookId = $hotelCountry['id'];
                         $country->save();
                     }
                 }
             } else {
                 $nameRu = substr($hotelCountry['nameRu'], 0, strpos($hotelCountry['nameRu'], ' '));
                 $name = substr($hotelCountry['nameEn'], 0, strpos($hotelCountry['nameRu'], ' '));
                 $ourCountries = $this->getCountries($name, $nameRu);
                 if ($ourCountries) {
                     if (count($ourCountries) > 1) {
                         echo "Found " . count($ourCountries) . " countries for nameEn:{$hotelCountry['nameEn']} nameRu:{$hotelCountry['nameRu']} \n";
                         echo str_pad('code', 5, " ", STR_PAD_RIGHT) . str_pad('localRu', 19, " ", STR_PAD_LEFT) . str_pad('localEn', 19, " ", STR_PAD_LEFT) . "\n";
                         foreach ($ourCountries as $country) {
                             echo str_pad($country->code, 5, " ", STR_PAD_RIGHT) . str_pad($country->localRu, 19, " ", STR_PAD_LEFT) . str_pad($country->localEn, 19, " ", STR_PAD_LEFT) . ' ' . $country->id . "\n";
                         }
                         echo "Enter id of country or 's' - for skip \n";
                         $oldId = trim(fgets(STDIN));
                         if ($oldId !== 's') {
                             $country = Country::getCountryByPk(intval($oldId));
                             $country->hotelbookId = $hotelCountry['id'];
                             $country->save();
                         }
                     } else {
                         if (!$country->hotelbookId) {
                             $country = $ourCountries[0];
                             $country->hotelbookId = $hotelCountry['id'];
                             $country->save();
                         }
                     }
                 }
             }
         }
     }
     if ($type == 'geonames') {
         $criteria = new CDbCriteria();
         $criteria->condition = 'hotelbookId IS NOT NULL';
         //$criteria->params=array(':postID'=>10);
         $start = false;
         $countries = Country::model()->findAll($criteria);
         $formatLine = 'geonameid|name_mixed|name|names|latitude|longitude|feature|feature_code|country_code|country_codes|state_code|admin2_code|admin3_code|admin4_code|population|elevation|dem|timezone|modification_date';
         $formatLine = str_replace(array("\r", "\n"), array(''), $formatLine);
         $columnNames = explode('|', $formatLine);
         //print_r($formatLine);die();
         $column = array();
         foreach ($columnNames as $i => $columnName) {
             $column[$columnName] = $i;
         }
         foreach ($countries as $country) {
             $filename = '/srv/www/oleg.voyanga/public_html/console/data_files/' . $country->code . '.txt';
             if (!$start) {
                 if ($country->code == 'HR') {
                     $start = true;
                 } else {
                     continue;
                 }
             }
             if ($filename) {
                 $path = Yii::getPathOfAlias('application.runtime');
                 if (file_exists($filename)) {
                     echo "Starting parse " . $country->code . ".txt\n";
                     $fp = fopen($filename, 'r');
                     //$countryCode = basename($filename);
                     //$countryCode = substr($countryCode,0,strpos($countryCode,'.'));
                     $outfp = fopen($path . '/' . basename($filename), 'w');
                     if (!$outfp) {
                         echo "Cant open file " . $path . '/' . basename($filename) . " for writing\n";
                         die;
                     }
                     //print_r($column);
                     $skipAll = false;
                     $lineCount = 0;
                     $addedCount = 0;
                     $haveAltNames = 0;
                     $haveRuName = 0;
                     $haveIataCode = 0;
                     echo str_pad('Parsed', 10, " ", STR_PAD_RIGHT) . str_pad('Added', 10, " ", STR_PAD_RIGHT) . str_pad('AltNames', 10, " ", STR_PAD_RIGHT) . str_pad('RuName', 10, " ", STR_PAD_RIGHT) . str_pad('IataCode', 10, " ", STR_PAD_RIGHT) . "\n";
                     while (!feof($fp)) {
                         $lineData = fgets($fp);
                         $lineData = str_replace(array("\r", "\n"), array(''), $lineData);
                         $data = explode("\t", $lineData);
                         if (!$data) {
                             continue;
                         }
                         if (count($data) <= 11) {
                             continue;
                         }
                         $lineCount++;
                         $geoNames = new GeoNames();
                         if ($data[$column['feature_code']]) {
                             if ($data[$column['feature_code']] == 'PPL' || $data[$column['feature_code']] == 'PPLA' || $data[$column['feature_code']] == 'PPLC' || $data[$column['feature_code']] == 'AIRP') {
                                 $geoNames->type = $data[$column['feature_code']];
                                 $geoNames->nameEn = $data[$column['name']];
                                 $geoNames->soundexEn = UtilsHelper::soundex($geoNames->nameEn);
                                 $geoNames->countryCode = $data[$column['country_code']];
                                 $geoNames->latitude = $data[$column['latitude']];
                                 $geoNames->longitude = $data[$column['longitude']];
                                 if (in_array($data[$column['country_code']], self::$sng)) {
                                     $geoNames->nameRu = UtilsHelper::fromTranslite($geoNames->nameEn);
                                     $ruFactor = 6;
                                 } else {
                                     $geoNames->nameRu = UtilsHelper::ruTranscript($geoNames->nameEn);
                                     $ruFactor = 12;
                                 }
                                 if ($data[$column['state_code']]) {
                                     $geoNames->stateCode = $data[$column['state_code']];
                                 }
                                 if ($data[$column['names']]) {
                                     $names = explode(',', $data[$column['names']]);
                                     $rusWord = array('index' => 0, 'count' => 0, 'replacements' => 20);
                                     $manyRusWords = false;
                                     $altNames = array();
                                     $iataCode = '';
                                     foreach ($names as $ind => $altName) {
                                         $altNames[] = $altName;
                                         if ($this->isIataCode($altName)) {
                                             if ($altName != mb_strtoupper($data[$column['name']])) {
                                                 $iataCode = $altName;
                                                 $geoNames->iataCode = $iataCode;
                                                 $haveIataCode++;
                                                 unset($altNames[$ind]);
                                                 continue;
                                             }
                                         }
                                         $n = UtilsHelper::countRussianCharacters($altName);
                                         if ($n > 0) {
                                             $altCase = mb_convert_case($altName, MB_CASE_TITLE, "UTF-8");
                                             $k = levenshtein($geoNames->nameRu, $altName);
                                             $l = levenshtein($geoNames->nameRu, $altCase);
                                             if ($l < $k) {
                                                 $k = $l;
                                                 $altNames[$ind] = $altCase;
                                                 $names[$ind] = $altCase;
                                             }
                                         }
                                         if ($n > 0 && $k < $rusWord['replacements']) {
                                             if ($rusWord['count'] > 0) {
                                                 $manyRusWords = true;
                                             }
                                             $rusWord['index'] = $ind;
                                             $rusWord['replacements'] = $k;
                                             $rusWord['count'] = $n;
                                         }
                                     }
                                     if ($manyRusWords) {
                                         fwrite($outfp, "{$geoNames->latitude}|{$geoNames->longitude}|{$data[$column['name']]}|{$names[$rusWord['index']]}\n");
                                     }
                                     if ($rusWord['count'] > 0) {
                                         if ($rusWord['replacements'] < $ruFactor) {
                                             $geoNames->nameRu = $names[$rusWord['index']];
                                             $haveRuName++;
                                             //unset($altNames[$rusWord['index']]);
                                         }
                                     }
                                     $geoNames->alternateNames = implode(',', $altNames);
                                     unset($names);
                                     unset($altNames);
                                     unset($rusWord);
                                     $haveAltNames++;
                                 }
                                 $geoNames->soundexRu = UtilsHelper::soundex($geoNames->nameRu, 'RU');
                                 $geoNames->metaphoneRu = UtilsHelper::ruMetaphone($geoNames->nameRu);
                                 $geoNames->save();
                                 $addedCount++;
                             }
                         }
                         unset($geoNames);
                         unset($lineData);
                         unset($data);
                         if ($lineCount % 30000 == 0) {
                             echo str_pad($lineCount, 10, " ", STR_PAD_RIGHT) . str_pad($addedCount, 10, " ", STR_PAD_RIGHT) . str_pad($haveAltNames, 10, " ", STR_PAD_RIGHT) . str_pad($haveRuName, 10, " ", STR_PAD_RIGHT) . str_pad($haveIataCode, 10, " ", STR_PAD_RIGHT) . "\n";
                         }
                     }
                     echo str_pad($lineCount, 10, " ", STR_PAD_RIGHT) . str_pad($addedCount, 10, " ", STR_PAD_RIGHT) . str_pad($haveAltNames, 10, " ", STR_PAD_RIGHT) . str_pad($haveRuName, 10, " ", STR_PAD_RIGHT) . str_pad($haveIataCode, 10, " ", STR_PAD_RIGHT) . "\n";
                     fclose($outfp);
                 } else {
                     echo "Not found " . $country->code . ".txt\n";
                 }
             }
             //endif filename
         }
         //endforeach countries
     }
     if ($type == 'hotelbookCities') {
         Yii::import('site.common.modules.hotel.models.*');
         $HotelClient = new HotelBookClient();
         $criteria = new CDbCriteria();
         $criteria->condition = 'hotelbookId IS NOT NULL';
         $path = Yii::getPathOfAlias('application.runtime');
         //$criteria->params=array(':postID'=>10);
         $countries = Country::model()->findAll($criteria);
         $start = false;
         foreach ($countries as $country) {
             if (!$start) {
                 /*if($country->code == 'UA')
                   {
                       $start = true;
                   }else{
                       continue;
                   }/**/
                 if ($country->code == 'US') {
                     continue;
                 }
             }
             $hotelCities = $HotelClient->getCities($country->hotelbookId);
             $oneResult = 0;
             $someResult = 0;
             $manyResult = 0;
             $noResult = 0;
             $outfp = fopen($path . '/' . $country->code . '-hotel-log.txt', 'w');
             if (!$outfp) {
                 echo "Cant open file " . $path . '/' . $country->code . "-hotel-log.txt for writing\n";
                 die;
             }
             foreach ($hotelCities as $hotelCity) {
                 if (in_array($country->code, self::$sng)) {
                     $hotelCity['nameRu'] = UtilsHelper::fromTranslite($hotelCity['nameEn']);
                 } else {
                     $hotelCity['nameRu'] = UtilsHelper::ruTranscript($hotelCity['nameEn']);
                 }
                 $hotelCity['metaphoneRu'] = UtilsHelper::ruMetaphone($hotelCity['nameRu']);
                 $hotelCity['sondexEn'] = UtilsHelper::soundex($hotelCity['nameEn']);
                 $hotels = $HotelClient->getHotels($hotelCity);
                 if (count($hotels) == 0) {
                     //We are don't need empty cities
                     continue;
                 }
                 $cnt = 0;
                 $haveCoordinates = false;
                 foreach ($hotels as $hotelObj) {
                     $cnt++;
                     $query[$hotelObj['id']] = $HotelClient->hotelDetail($hotelObj['id'], true);
                     if ($cnt > 10) {
                         break;
                     }
                 }
                 $HotelClient->processAsyncRequests();
                 foreach ($query as $hotelId => $responseId) {
                     if (isset($HotelClient->requests[$responseId]['result'])) {
                         if (isset($HotelClient->requests[$responseId]['result']->latitude, $HotelClient->requests[$responseId]['result']->longitude) && $HotelClient->requests[$responseId]['result']->latitude && $HotelClient->requests[$responseId]['result']->longitude) {
                             $haveCoordinates = true;
                             $possibleLatitude = $HotelClient->requests[$responseId]['result']->latitude;
                             $possibleLongitude = $HotelClient->requests[$responseId]['result']->longitude;
                             break;
                         }
                     }
                 }
                 $cityCriteria = new CityFindCriteria();
                 $cityCriteria->paramValues = array('countryCode' => $country->code, 'nameEn' => $hotelCity['nameEn'], 'metaphoneRu' => $hotelCity['metaphoneRu'], 'soundexEn' => $hotelCity['sondexEn']);
                 //$prevCriteria = null;
                 //$prevCount = 0;
                 $currCriteria = null;
                 $count = 0;
                 $findEnd = false;
                 $needSave = false;
                 while (!$findEnd) {
                     $prevCriteria = $currCriteria;
                     $prevCount = $count;
                     $currCriteria = $cityCriteria->getCriteria();
                     $count = GeoNames::model()->count($currCriteria);
                     $findGeo = null;
                     echo "Params: " . implode(',', $cityCriteria->paramUsed) . ' count:' . $count . "\n";
                     if ($haveCoordinates && $count < 15) {
                         $geoNames = GeoNames::model()->findAll($currCriteria);
                         foreach ($geoNames as $geoName) {
                             if ($geoName->latitude && $geoName->longitude) {
                                 $distance = intval(UtilsHelper::calculateTheDistance($geoName->latitude, $geoName->longitude, $possibleLatitude, $possibleLongitude));
                                 if ($distance < 10000) {
                                     $findGeo = $geoName;
                                     $count = 1;
                                 }
                             }
                         }
                     }
                     if ($count > 1) {
                         $findEnd = !$cityCriteria->setPlus();
                     } elseif ($count < 1) {
                         $findEnd = !$cityCriteria->setMinus();
                     } else {
                         $findEnd = true;
                     }
                 }
                 if ($count < 1) {
                     if ($count < $prevCount) {
                         $currCriteria = $prevCriteria;
                         $count = $prevCount;
                         $needSave = true;
                     }
                 } else {
                     $needSave = true;
                 }
                 if ($needSave) {
                     if ($count > 6) {
                         echo "Many results for city {$hotelCity['nameEn']} - {$count}\n";
                         $manyResult++;
                         fwrite($outfp, "{$hotelCity['nameEn']}|{$hotelCity['nameRu']}|{$hotelCity['id']}|{$count}\n");
                     } elseif ($count > 1) {
                         //echo "Many results for city {$hotelCity['nameEn']} - $count\n";
                         $geoName = GeoNames::model()->find($currCriteria);
                         echo "Possible by city name city {$hotelCity['nameEn']} City: {$geoName->nameEn} Ru: {$geoName->nameRu} IATA: {$geoName->iataCode} coords: {$geoName->longitude} {$geoName->latitude}\n";
                         $someResult++;
                         fwrite($outfp, "{$hotelCity['nameEn']}|{$hotelCity['nameRu']}|{$hotelCity['id']}|{$count}\n");
                     } else {
                         if ($findGeo) {
                             $geoName = $findGeo;
                         } else {
                             $geoName = GeoNames::model()->find($currCriteria);
                         }
                         echo "Found by city name city {$hotelCity['nameEn']} City: {$geoName->nameEn} Ru: {$geoName->nameRu} IATA: {$geoName->iataCode} coords: {$geoName->longitude} {$geoName->latitude}" . ($findGeo ? " ByCoords" : "") . "\n";
                         if ($geoName->iataCode) {
                             $city = City::model()->findByAttributes(array('code' => $geoName->iataCode, 'countryId' => $country->id));
                             if (!$city) {
                                 $city = new City();
                                 $city->localEn = $geoName->nameEn;
                                 $city->localRu = $geoName->nameRu;
                                 $city->countryId = $country->id;
                                 $city->code = $geoName->iataCode;
                             }
                             $city->latitude = $geoName->latitude;
                             $city->longitude = $geoName->longitude;
                             $city->metaphoneRu = $geoName->metaphoneRu;
                             $city->hotelbookId = $hotelCity['id'];
                             if ($geoName->stateCode) {
                                 $city->stateCode = $geoName->stateCode;
                             }
                             $city->save();
                         } else {
                             $city = City::model()->findByAttributes(array('localEn' => $geoName->nameEn, 'localRu' => $geoName->nameRu, 'countryId' => $country->id));
                             if (!$city) {
                                 $city = new City();
                                 $city->localEn = $geoName->nameEn;
                                 $city->localRu = $geoName->nameRu;
                                 $city->countryId = $country->id;
                                 $city->code = $geoName->iataCode;
                             }
                             $city->latitude = $geoName->latitude;
                             $city->longitude = $geoName->longitude;
                             $city->metaphoneRu = $geoName->metaphoneRu;
                             $city->hotelbookId = $hotelCity['id'];
                             if ($geoName->stateCode) {
                                 $city->stateCode = $geoName->stateCode;
                             }
                             $city->save();
                         }
                         $oneResult++;
                     }
                 } else {
                     echo "Dont found anything for city {$hotelCity['nameEn']}\n";
                     $noResult++;
                     fwrite($outfp, "{$hotelCity['nameEn']}|{$hotelCity['nameRu']}|{$hotelCity['id']}|{$count}\n");
                 }
                 //$criteria = new EMongoCriteria(array('conditions'=>array('countryCode'=>array('equals'=>$country->code)) ));
                 //$criteria->limit(10);
                 //$geoNames = GeoNames::model()->findAll($criteria);
             }
             echo "NoResults:{$noResult} OneResult:{$oneResult} SomeResults:{$someResult} ManyResults: {$manyResult}\n";
             fclose($outfp);
             //break;
         }
     }
     if ($type == 'iataCode') {
         $criteria = new CDbCriteria();
         $criteria->condition = 'hotelbookId IS NOT NULL';
         $path = Yii::getPathOfAlias('application.runtime');
         //$criteria->params=array(':postID'=>10);
         $countries = Country::model()->findAll($criteria);
         $start = false;
         foreach ($countries as $country) {
             if (!$start) {
                 /*
                                     if($country->code == 'RU')
                                     {
                                         $start = true;
                                     }else{
                                         continue;
                                     }/**/
                 /*if($country->code == 'US')
                   {
                       continue;
                   }/**/
             }
             $criteriaCity = new CDbCriteria();
             $criteriaCity->addCondition('code IS NOT NULL');
             $criteriaCity->addCondition('countryId=' . $country->id);
             $path = Yii::getPathOfAlias('application.runtime');
             //$criteria->params=array(':postID'=>10);
             $countCities = City::model()->count($criteriaCity);
             echo "Start parsing for country {$country->code} {$countCities} results\n";
             $pageLimit = 20;
             $n = ceil($countCities / $pageLimit);
             $criteriaCity->limit = $pageLimit;
             $oneResult = 0;
             $modifyCount = 0;
             $noResult = 0;
             $lineCount = 0;
             $outfp = fopen($path . '/' . $country->code . '-iata-log.txt', 'w');
             if (!$outfp) {
                 echo "Cant open file " . $path . '/' . $country->code . "-hotel-log.txt for writing\n";
                 die;
             }
             for ($i = 0; $i < $n; $i++) {
                 $criteriaCity->offset = $i * $pageLimit;
                 //print_r($criteriaCity);
                 //echo "\n";
                 $cities = City::model()->findAll($criteriaCity);
                 foreach ($cities as $city) {
                     $lineCount++;
                     if (UtilsHelper::countRussianCharacters($city->localRu)) {
                         $nameRu = $city->localRu;
                     } else {
                         if (in_array($country->code, self::$sng)) {
                             $nameRu = UtilsHelper::fromTranslite($city->localEn);
                         } else {
                             $nameRu = UtilsHelper::ruTranscript($city->localEn);
                         }
                     }
                     $metaphoneRu = UtilsHelper::ruMetaphone($nameRu);
                     $sondexEn = UtilsHelper::soundex($city->localEn);
                     $cityCriteria = new CityFindCriteria();
                     $cityCriteria->states = array('value' => array('iata'));
                     $cityCriteria->states[0] = array('value' => array('nameEn'));
                     $cityCriteria->states[1] = array('value' => array('iata', 'nameEn'));
                     $cityCriteria->states[1][0] = array('value' => array('iata', 'metaphoneRu'));
                     $cityCriteria->states[1][1] = array('value' => array('iata', 'nameEn', 'metaphoneRu'));
                     $cityCriteria->states[0][1] = array('value' => array('nameEn', 'metaphoneRu'));
                     $cityCriteria->states[0][0] = array('value' => array('metaphoneRu'));
                     $cityCriteria->paramUsed = $cityCriteria->states['value'];
                     $cityCriteria->paramValues = array('countryCode' => $country->code, 'nameEn' => $city->localEn, 'metaphoneRu' => $metaphoneRu, 'soundexEn' => $sondexEn, 'iata' => $city->code);
                     $currCriteria = null;
                     $count = 0;
                     $findEnd = false;
                     while (!$findEnd) {
                         //$prevCriteria = $currCriteria;
                         //$prevCount = $count;
                         $currCriteria = $cityCriteria->getCriteria();
                         $count = GeoNames::model()->count($currCriteria);
                         //echo "Params: ".implode(',',$cityCriteria->paramUsed).' count:'.$count."\n";
                         if ($count > 1) {
                             $findEnd = !$cityCriteria->setPlus();
                         } elseif ($count < 1) {
                             $findEnd = !$cityCriteria->setMinus();
                         } else {
                             $findEnd = true;
                         }
                     }
                     if ($count == 1) {
                         $oneResult++;
                         $geoName = GeoNames::model()->find($currCriteria);
                         $needSave = false;
                         if (!$city->latitude) {
                             $city->latitude = $geoName->latitude;
                             $city->longitude = $geoName->longitude;
                             $needSave = true;
                         }
                         if (!UtilsHelper::countRussianCharacters($city->localRu)) {
                             $city->localRu = $geoName->nameRu;
                             $needSave = true;
                         }
                         if (!$city->metaphoneRu) {
                             $city->metaphoneRu = $geoName->metaphoneRu;
                             $needSave = true;
                         }
                         if (!$city->stateCode) {
                             $city->stateCode = $geoName->stateCode;
                             $needSave = true;
                         }
                         if ($needSave) {
                             $modifyCount++;
                             $city->save();
                         }
                     } else {
                         $noResult++;
                         fwrite($outfp, "{$city->localEn}|{$city->code}|{$city->id}|{$count}\n");
                     }
                     if ($lineCount % 30000 == 0) {
                         echo "NoResults:{$noResult} OneResult:{$oneResult}\n";
                     }
                 }
             }
             echo "Total NoResults:{$noResult} OneResult:{$oneResult} ModifyCount: {$modifyCount} line count: {$lineCount}\n";
             fclose($outfp);
             //break;
         }
     }
     if ($type == 'updateMetaphone') {
         $criteria = new CDbCriteria();
         $criteria->condition = 'hotelbookId IS NOT NULL';
         //$criteria->params=array(':postID'=>10);
         $countries = Country::model()->findAll($criteria);
         $start = false;
         foreach ($countries as $country) {
             if (!$start) {
                 if ($country->code == 'UA') {
                     $start = true;
                 } else {
                     continue;
                 }
             }
             echo 'Update ' . $country->code . " metaphone\n";
             $criteria = new EMongoCriteria(array('conditions' => array('countryCode' => array('equals' => $country->code))));
             //$criteria->limit(10);
             $geoNames = GeoNames::model()->findAll($criteria);
             $k = 0;
             foreach ($geoNames as $geoName) {
                 $geoName->metaphoneRu = UtilsHelper::ruMetaphone($geoName->nameRu);
                 $geoName->save();
                 $k++;
                 if ($k % 30000 == 0) {
                     echo "Updated {$k} lines\n";
                 }
             }
             echo "{$country->code} complete. Updated {$k} lines\n";
             //break;
         }
         //$criteria = new EMongoCriteria(array('conditions'=>array('countryCode'=>array('equals'=>$country),'metaphoneRu'=>array('equals'=>$metaphoneRu)) ));
         //VarDumper::dump(GeoNames::model()->find($criteria));
     }
 }
Ejemplo n.º 4
0
 public function FlightTicketing(FlightTicketingParams $flightTicketingRequest)
 {
     $aParams = array('Request' => array('Ticketing' => array('BookID' => $flightTicketingRequest->nemoBookId, 'Commision' => array('Percent' => '2'))), 'Source' => array('ClientId' => Yii::app()->params['GDSNemo']['agencyId'], 'APIKey' => Yii::app()->params['GDSNemo']['agencyApiKey'], 'Language' => 'RU', 'Currency' => 'RUB'));
     $response = self::request('Ticketing', $aParams, $bCache = FALSE, $iExpiration = 0);
     $flightTicketingResponse = new FlightTicketingResponse();
     if (isset($response->Response->Error)) {
         $status = 'error';
         $flightTicketingResponse->status = 2;
         $flightTicketingResponse->responseStatus = ResponseStatus::ERROR_CODE_EXTERNAL;
         $flightTicketingResponse->addError('error', $response->Response->Error);
     } else {
         if (isset($response->Response->Ticketing->Status)) {
             $status = $response->Response->Ticketing->Status;
         } elseif (isset($response->Error->_)) {
             $status = 'error';
             $flightTicketingResponse->addError($response->Error->Code, $response->Error->_);
         } else {
             $status = 'error';
             if (GDSNemoSoapClient::$lastCurlError) {
                 $flightTicketingResponse->addError('connection error', GDSNemoSoapClient::$lastCurlError);
             }
         }
     }
     if ($status == 'ticket') {
         $flightTicketingResponse->status = 1;
         $aParts = array();
         UtilsHelper::soapObjectsArray($response->Response->Ticketing->Flight->Segments->Segment);
         foreach ($response->Response->Ticketing->Flight->Segments->Segment as $arrKey => $oSegment) {
             $oPart = new stdClass();
             //Yii::beginProfile('loadAirportData');
             if (!isset($oSegment->DepAirp)) {
                 Yii::log(print_r($oSegment, true) . '|||' . $arrKey, 'info');
             }
             try {
                 $oPart->departure_airport = Airport::getAirportByCode(UtilsHelper::soapElementValue($oSegment->DepAirp));
                 $oPart->departure_city = $oPart->departure_airport->city;
                 $oPart->arrival_airport = Airport::getAirportByCode(UtilsHelper::soapElementValue($oSegment->ArrAirp));
                 $oPart->arrival_city = $oPart->arrival_airport->city;
                 $oPart->departure_terminal_code = isset($oSegment->DepTerminal) ? UtilsHelper::soapElementValue($oSegment->DepTerminal) : '';
                 $oPart->arrival_terminal_code = isset($oSegment->ArrTerminal) ? UtilsHelper::soapElementValue($oSegment->ArrTerminal) : '';
                 $oPart->markAirline = Airline::getAirlineByCode($oSegment->MarkAirline);
                 if ($oSegment->OpAirline == '**') {
                     $oPart->opAirline = $oPart->markAirline;
                     $oPart->transport_airline = $oPart->markAirline;
                 } else {
                     $oPart->opAirline = Airline::getAirlineByCode($oSegment->OpAirline);
                     $oPart->transport_airline = Airline::getAirlineByCode($oSegment->OpAirline);
                 }
                 $oPart->code = $oSegment->FlightNumber;
                 $oPart->duration = $oSegment->FlightTime * 60;
                 $oPart->datetime_begin = UtilsHelper::soapElementValue($oSegment->DepDateTime);
                 $oPart->datetime_end = UtilsHelper::soapElementValue($oSegment->ArrDateTime);
                 $oPart->stopNum = UtilsHelper::soapElementValue($oSegment->StopNum);
                 $oPart->aircraft_code = $oSegment->AircraftType;
                 $oPart->aTariffs = array();
                 $oPart->aTaxes = array();
                 $oPart->aBookingCodes = array();
                 UtilsHelper::soapObjectsArray($oSegment->BookingCodes->BookingCode);
                 foreach ($oSegment->BookingCodes->BookingCode as $sBookingCode) {
                     $oPart->aBookingCodes[] = UtilsHelper::soapElementValue($sBookingCode);
                 }
                 $aParts[$oSegment->SegNum] = $oPart;
             } catch (CException $e) {
             }
         }
         if ($aParts) {
             $flightTicketingResponse->aParts = $aParts;
         }
         UtilsHelper::soapObjectsArray($response->Response->Ticketing->Travellers->Traveller);
         foreach ($response->Response->Ticketing->Travellers->Traveller as $traveller) {
             $ticket = array('ticketNumber' => $traveller->Ticket->TickectNum, 'documentNumber' => $traveller->DocumentInfo->DocNum);
             $flightTicketingResponse->tickets[] = $ticket;
         }
     } else {
         $flightTicketingResponse->responseStatus = ResponseStatus::ERROR_CODE_EXTERNAL;
         $flightTicketingResponse->addError('error', 'Status is:' . $status);
         $flightTicketingResponse->status = 2;
     }
     return $flightTicketingResponse;
 }