'; echo var_dump($achi_id,$uid); echo ''; if($achi_id and $uid) { $r = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$ACHI,'=',$achi_id), \Where::_operator(self::$USER,'=',$user_id), ])), \Query::COUNT=>1, ]); if(\DB::numRows($r)){ $res = \DB::fetch($r); } else { $r = self::insert([ self::$USER => $user_id, self::$ACHI => $achi_id, ]); $res = self::getByID($r->id); History::start($r->id); } } return $res; } static function incrementValue($project_id,$achi_text_id,$uid,$value){ $value = max(0,cfloatval($value)); if(!$value) return; // Получаем саму ачивку, это понадобится для расчёта максимального значения. $achi = Achi::getByProjectIDAndTextID($project_id,$achi_text_id); if($achi[Achi::$TYPE]=eAchiType::NUMBER) { $achi_id = $achi[Achi::$ID]; $need = cfloatval($achi[Achi::$VALUE]); // Теперь находим прогресс по текущему пользователю $progress = self::getForUID($project_id, $achi_id, $uid); $progress_id = $progress[self::$ID]; $now = cfloatval($progress[self::$VALUE]); // Получаем текущее значение и увеличиваем его, но не больше максимального. $left = $need - $now; $newValue = $now + min($value,$left); $isFinished = $newValue>=$need; if($newValue!=$now){ self::updateById($progress_id,[ self::$VALUE => $newValue, ]); History::increment($progress_id,$value,$newValue); if($isFinished) { self::finished($progress_id); } } else { // Значит цель уже достигала максимального значения // Надо просто проверить, не отмечена ли она достигнутой if(!$progress[self::$FINISHED]){ self::finished($progress_id); } } } } static function finished($progress_id){ $progress_id = intval($progress_id); self::updateById($progress_id,[ self::$FINISHED => 1, self::$FTIME => time() , ]); History::finished($progress_id); } static function columnInfo() : array { return [ new C([ C::VAR_NAME =>&self::$ID, C::TYPE =>eColumnType::INT, C::AUTO_INCREMENT =>true, C::PRIMARY =>true, C::DEFAULT =>0, C::HIDDEN =>true, C::TH =>V::get(Vars::$ID), ]), new C([ C::VAR_NAME => &self::$USER, C::TYPE => eColumnType::INT, ]), new C([ C::VAR_NAME => &self::$ACHI, C::TYPE => eColumnType::INT, ]), new C([ C::VAR_NAME => &self::$VALUE, C::TYPE => eColumnType::DOUBLE, C::LENGTH => '10,2' ]), new C([ C::VAR_NAME => &self::$TIME, C::TYPE => eColumnType::TIME, C::DEFAULT => '00:00:00', ]), new C([ C::VAR_NAME => &self::$FINISHED, C::TYPE => eColumnType::TINYINT, C::DEFAULT => 0, ]), new C([ C::VAR_NAME => &self::$FTIME, C::TYPE => eColumnType::INT, C::DEFAULT => 0, ]), new C([ C::VAR_NAME => &self::$ACCOUNT, C::TYPE => eColumnType::INT, C::LENGTH => 11, C::TH => V::get(Vars::$ACCOUNT), C::DEFAULT => intval(\Site::$owner_id), c::HIDDEN=>true, c::FUNC_VALUE => function($v){ if($id = $v[self::$ACCOUNT]) { return \Account::getName( \Account::getByID($id) ); } else return '-'; }, ]), new C([ C::VAR_NAME => &self::$CREATED, C::TYPE => eColumnType::INT, C::LENGTH => 11, C::TH => V::get(Vars::$CREATED), C::DEFAULT => time(), c::FUNC_VALUE => function($v){return self::formatDate($v[self::$CREATED]);}, c::HIDDEN=>true, ]), new C([ C::VAR_NAME => &self::$UPDATED, C::TYPE => eColumnType::INT, C::DEFAULT => time(), C::TH => V::get(Vars::$UPDATED), c::FUNC_VALUE => function($v){return self::formatDate($v[self::$UPDATED]);}, c::HIDDEN=>true, ]), ]; } } new Progress(); ///