Beispiel #1
0
 /**
  * Функция высчитывает данные о пройденном расстоянии от выбранной даты или за все время
  *
  * @param int $carID
  * @param string $date
  */
 protected static function updateDayOdometer($carID = null, $date = null)
 {
     $dateHelper = new DateHelper();
     $arResult = array();
     if (is_null($carID)) {
         $carID = MyCar::getDefaultCarID();
     }
     if (is_null($date)) {
         //TODO: Проверить работу кода
         $arRes = Tables\RoutsTable::getList(array('select' => array('ID', 'DATE', 'ODO'), 'filter' => array('MY_CAR_ID' => $carID, '>ODO' => 0), 'order' => array('DATE' => 'ASC', 'ID' => 'ASC')));
         $arResult['BUY_ODO'] = MyCar::getBuyCarOdo($carID);
         $arResult['MAX_DATE_ODO'] = array();
         $bFirst = true;
         foreach ($arRes as $ar_res) {
             if ($bFirst) {
                 $bFirst = false;
                 $arResult['FIRST_DAY'] = $ar_res['DATE'];
             }
             $arResult['ROUTS'][$ar_res['ID']]['DATE'] = $ar_res['DATE'];
             $arResult['ROUTS'][$ar_res['ID']]['ODO'] = $ar_res['ODO'];
             if (!isset($arResult['MAX_DATE_ODO'][$ar_res['DATE']]) || $ar_res['ODO'] > $arResult['MAX_DATE_ODO'][$ar_res['DATE']]) {
                 $arResult['MAX_DATE_ODO'][$ar_res['DATE']] = $ar_res['ODO'];
             }
         }
         $arResult['LAST_DAY'] = date('d.m.Y');
         $lastOdo = $arResult['BUY_ODO'];
         $arResult['DAY_ODO'] = array();
         foreach ($arResult['MAX_DATE_ODO'] as $day => $odo) {
             $arResult['DAY_ODO'][$day] = round($odo - $lastOdo, 1);
             $lastOdo = $odo;
         }
         $arResult['ODO_ALL_DAYS'] = array();
         $now_day = $arResult['FIRST_DAY'];
         while ($now_day !== $arResult['LAST_DAY']) {
             if (isset($arResult['DAY_ODO'][$now_day])) {
                 $arResult['ODO_ALL_DAYS'][$now_day] = $arResult['DAY_ODO'][$now_day];
             } else {
                 $arResult['ODO_ALL_DAYS'][$now_day] = 0;
             }
             $now_day = $dateHelper->strToTime($now_day, '+1 day', 'site');
         }
     } else {
         $arResult['FIRST_DAY'] = $date;
         $arResult['LAST_DAY'] = date('d.m.Y');
         $arResult['BUY_ODO'] = MyCar::getBuyCarOdo($carID);
         //TODO: Проверить работу кода
         $arRes = Tables\RoutsTable::getList(array('select' => array('ID', 'DATE', 'ODO'), 'filter' => array('MY_CAR_ID' => $carID, '>=DATE' => $date, '>ODO' => 0), 'order' => array('DATE' => 'ASC', 'ID' => 'ASC')));
         $arResult['MAX_DATE_ODO'] = array();
         foreach ($arRes as $ar_res) {
             $arResult['ROUTS'][$ar_res['ID']]['DATE'] = $ar_res['DATE'];
             $arResult['ROUTS'][$ar_res['ID']]['ODO'] = $ar_res['ODO'];
             if (!isset($arResult['MAX_DATE_ODO'][$ar_res['DATE']]) || $ar_res['ODO'] > $arResult['MAX_DATE_ODO'][$ar_res['DATE']]) {
                 $arResult['MAX_DATE_ODO'][$ar_res['DATE']] = $ar_res['ODO'];
             }
         }
         //TODO: Проверить работу кода
         $arRes2 = Tables\RoutsTable::getList(array('select' => array('ID', 'DATE', 'ODO'), 'filter' => array('MY_CAR_ID' => $carID, '<DATE' => $date, '>ODO' => 0), 'order' => array('DATE' => 'DESC', 'ID' => 'DESC')));
         if ($arRes2) {
             $lastOdo = $arRes2[0]['ODO'];
             $arResult['LAST_RES'] = $arRes2[0];
         } else {
             $lastOdo = $arResult['BUY_ODO'];
         }
         $arResult['LAST_ODO'] = $lastOdo;
         $arResult['DAY_ODO'] = array();
         foreach ($arResult['MAX_DATE_ODO'] as $day => $odo) {
             $arResult['DAY_ODO'][$day] = round($odo - $lastOdo, 1);
             $lastOdo = $odo;
         }
         $arResult['ODO_ALL_DAYS'] = array();
         $now_day = $arResult['FIRST_DAY'];
         while ($now_day !== $arResult['LAST_DAY']) {
             if (isset($arResult['DAY_ODO'][$now_day])) {
                 $arResult['ODO_ALL_DAYS'][$now_day] = $arResult['DAY_ODO'][$now_day];
             } else {
                 $arResult['ODO_ALL_DAYS'][$now_day] = 0;
             }
             $now_day = $dateHelper->strToTime($now_day, '+1 day', 'site');
         }
     }
     //TODO: Проверить работу кода
     $arRes2 = Tables\OdoTable::getList(array('select' => array('ID', 'DATE', 'ODO'), 'filter' => array('MY_CAR_ID' => $carID, '>=DATE' => $arResult['FIRST_DAY']), 'order' => array('DATE' => 'ASC')));
     $arResult['ODO_TABLE'] = array();
     foreach ($arRes2 as $ar_res) {
         $arResult['ODO_TABLE'][$ar_res['DATE']] = array('ID' => $ar_res['ID'], 'ODO' => $ar_res['ODO']);
     }
     $arResult['UPDATED'] = $arResult['INSERTED'] = array();
     foreach ($arResult['ODO_ALL_DAYS'] as $day => $odo) {
         if (isset($arResult['ODO_TABLE'][$day])) {
             if ($odo != $arResult['ODO_TABLE'][$day]['ODO']) {
                 $query = new Query('update');
                 $query->setUpdateParams(array('ODO' => $odo), $arResult['ODO_TABLE'][$day]['ID'], Tables\OdoTable::getTableName(), Tables\OdoTable::getMapArray());
                 $res = $query->exec();
                 $arResult['UPDATED'][$day] = $res->getResult();
             }
         } else {
             $query = new Query('insert');
             $arInsert[0] = array('MY_CAR_ID' => $carID, 'DATE' => $day, 'ODO' => $odo);
             $query->setInsertParams($arInsert, Tables\OdoTable::getTableName(), Tables\OdoTable::getMapArray());
             $res = $query->exec();
             $arResult['INSERTED'][$day] = $res->getInsertId();
         }
     }
 }
Beispiel #2
0
 /**
  * Функция пресчитывает расход топлива для всех записей, начиная с заданной
  *
  * @param array $arData
  */
 protected static function recalculateExpence($arData = null)
 {
     try {
         if (is_null($arData)) {
             throw new Exception\ArgumentNullException('arData');
         } elseif (!is_array($arData)) {
             throw new Exception\ArgumentTypeException('arData', 'array');
         }
     } catch (Exception\ArgumentNullException $e) {
         die($e->showException());
     } catch (Exception\ArgumentTypeException $e2) {
         die($e2->showException());
     }
     if (!isset($arData['MY_CAR_ID']) || intval($arData['MY_CAR_ID']) <= 0) {
         $arData['MY_CAR_ID'] = MyCar::getDefaultCarID();
     }
     if (!isset($arData['DATE'])) {
         $arList = array('select' => array('ID', 'DATE', 'ODO', 'LITER', 'FULL', 'EXPENCE'), 'filter' => array('MY_CAR_ID' => $arData['MY_CAR_ID']), 'order' => array('DATE' => 'ASC', 'ID' => 'ASC'));
         $arRes = Tables\FuelTable::getList($arList);
         $bFirst = true;
         $buyOdo = MyCar::getBuyCarOdo($arData['MY_CAR_ID']);
         $lastOdo = 0;
         $sumLiter = 0;
         foreach ($arRes as $ar_res) {
             if ($bFirst) {
                 $bFirst = false;
                 if ($ar_res['ODO'] <= 0) {
                     $lastOdo = $buyOdo;
                 }
             }
             if ($ar_res['ODO'] <= 0 || !$ar_res['FULL']) {
                 $sumLiter += $ar_res['LITER'];
             } else {
                 $mileage = $ar_res['ODO'] - $lastOdo;
                 $sumLiter += $ar_res['LITER'];
                 $expence = $sumLiter * 100 / $mileage;
                 $expence = round($expence, 2);
                 if ($expence != $ar_res['EXPENCE']) {
                     $arUpdate = array('EXPENCE' => $expence);
                     $res = static::updateExpence($ar_res['ID'], $arUpdate);
                     if (!$res) {
                         //TODO: Добавить сообщения об ошибке
                     }
                 }
                 $lastOdo = $ar_res['ODO'];
                 $sumLiter = 0;
             }
         }
     } else {
         $arRes = Tables\FuelTable::getList(array('select' => array('ID', 'DATE', 'ODO', 'LITER', 'FULL', 'EXPENCE'), 'filter' => array('MY_CAR_ID' => $arData['MY_CAR_ID'], '<DATE' => $arData['DATE'], '>EXPENCE' => 0), 'order' => array('DATE' => 'DESC', 'ID' => 'DESC'), 'limit' => 1));
         if (!$arRes) {
             static::recalculateExpence(array());
         } else {
             $arRes = $arRes[0];
             $lastOdo = $arRes['ODO'];
             $date = $arRes['DATE'];
             $sumLiter = 0;
             $arRes = Tables\FuelTable::getList(array('select' => array('ID', 'DATE', 'ODO', 'LITER', 'FULL', 'EXPENCE'), 'filter' => array('MY_CAR_ID' => $arData['MY_CAR_ID'], '>DATE' => $date), 'order' => array('DATE' => 'ASC', 'ID' => 'ASC')));
             if ($arRes) {
                 foreach ($arRes as $ar_res) {
                     if ($ar_res['ODO'] <= 0 || !$ar_res['FULL']) {
                         $sumLiter += $ar_res['LITER'];
                     } else {
                         $mileage = $ar_res['ODO'] - $lastOdo;
                         $sumLiter += $ar_res['LITER'];
                         $expence = $sumLiter * 100 / $mileage;
                         $expence = round($expence, 2);
                         if ($expence != $ar_res['EXPENCE']) {
                             $arUpdate = array('EXPENCE' => $expence);
                             $res = static::updateExpence($ar_res['ID'], $arUpdate);
                             if (!$res) {
                                 //TODO: Добавить сообщения об ошибке
                             }
                         }
                         $lastOdo = $ar_res['ODO'];
                         $sumLiter = 0;
                     }
                 }
             }
         }
     }
 }