id); return $r; } public function _update(\Where $w, array $values) { $enc = self::getEncryptedColumns(); foreach ($enc as $c) { if(isset($values[$c])) $values[$c] = Merakomis::encryptNumber($values[$c]); } return parent::_update($w, $values); // TODO: Change the autogenerated stub } public static function afterUadd($values, $id, $result) { // self::math($id); } public static function getEmpIdsForBudget($year,$month) { $res = []; $begin = $year.'-'.($month<10?'0':'').$month.'-01'; $end = date('Y-m-d',strtotime($begin.' + 1 month - 1 day')); $r = Time::select([ \Query::SELECT => ['DISTINCT '.Time::$EMP], \Query::WHERE => new \Where(\Where::_and([ \Where::_between(Time::$DATE,$begin,$end), ])), ]); while($l = \DB::fetch($r)){ $res[] = $l[Time::$EMP]; } return $res; } public static function generate($year,$month){ $r = Emp::getAll(); $empAllIds = array_keys($r); //$need_ids = self::getEmpIdsForBudget($year,$month); $emp_ids = []; $need_ids = []; $time = strtotime($year.'-'.$month.'-01'); $prevTime = strtotime("-1 month", $time); $prevMonth = date('m',$prevTime); $prevYear = date('Y',$prevTime); $need_and = Time::getEmpWhereAnd(date('Y-m-d',$time),date('Y-m-t',$time)); $r = Emp::select([ \Query::SELECT => [Emp::$ID], \Query::WHERE => new \Where($need_and), ]); while($l = \DB::fetch($r)){ $need_ids[] = $l[Emp::$ID]; } $need_remove = array_diff($empAllIds,$need_ids); if($need_remove) { $rr = self::delete(new \Where( \Where::_and([ \Where::_in(self::$EMP, $need_remove), \Where::_operator(self::$MONTH,'=',$month), \Where::_operator(self::$YEAR,'=',$year), ]) )); } $r = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$MONTH,'=',$month), \Where::_operator(self::$YEAR,'=',$year), ])) ]); $copy_prev = []; while($l = \DB::fetch($r)){ self::decrypt($l); $emp_ids[] = $l[self::$EMP]; $fzp = cfloatval($l[self::$FZP]); if(!$fzp && !$l[self::$STATUS]){ $copy_prev[$l[self::$ID]] = $l[self::$EMP]; } } $need_ids = array_diff($need_ids,$emp_ids); foreach ($need_ids as $id){ $r = self::insert([ self::$EMP => $id, self::$MONTH => $month, self::$YEAR => $year, ]); $copy_prev[$r->id] = $id; } foreach ($copy_prev as $id=>$emp_id){ $r = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$EMP,'=',$emp_id), \Where::_operator(self::$MONTH,'=',$prevMonth), \Where::_operator(self::$YEAR,'=',$prevYear), ])), \Query::COUNT => 1 ]); if(\DB::numRows($r)){ $l = \DB::fetch($r); Fot::decrypt($l); $x = self::updateById($id,[self::$FZP => $l[self::$FZP]]); } } if($copy_prev) { Budget::mathByYearMonth($year,$month,['not_generate'=>true]); } } public static function beforeUadd(array $values = []): array { $res = []; if(!$values[self::$YEAR]){ $res[self::$YEAR][] = 'Не указан год'; } if(!$values[self::$MONTH]){ $res[self::$MONTH][] = 'Не указан месяц'; } if(!$res) { $r = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$YEAR, '=', $values[self::$YEAR]), \Where::_operator(self::$MONTH, '=', $values[self::$MONTH]), \Where::_operator(self::$EMP, '=', $values[self::$EMP]), ])) ]); if (\DB::numRows($r)) { $l = \DB::fetch($r); if ($l[self::$ID] == $values[self::$ID]) { } else { $res[self::$YEAR][] = 'Такая комбинация года и месяца уже существует'; } } } return $res; } public function _updateById(int $id, array $values) { $res = parent::_updateById($id, $values); // TODO: Change the autogenerated stub if(!isset($values[self::$FOT])) { // self::math($id); }; return $res; } static function getForEmp($emp,$year,$month){ $key = md5($emp.$year.$month); if(isset(self::$cache[$key])) return self::$cache[$key]; $r = self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$EMP,'=',$emp), \Where::_operator(self::$MONTH,'=',$month), \Where::_operator(self::$YEAR,'=',$year), ])), \Query::COUNT => 1 ]); $l = \DB::fetch($r); self::decrypt($l); return self::$cache[$key] = $l; } static function math($id){ $C = self::getByID($id); /* $allVars = Variable::getAllVariables(); $vars = $allVars[$C[self::$YEAR]]; $fond0 = (1+$vars[Variable::$FOND1]/100); $fond1 = (1+$vars[Variable::$FOND2]/100); $fond2 = (1+$vars[Variable::$FOND3]/100); $insurance = $vars[Variable::$MROT] * $fond0 * $fond1 + ( $C[self::$FZP] - ( $fond1 * $vars[Variable::$MROT]) ) * $fond2 ; $C[self::$FOT] = $C[self::$FZP] + $C[self::$ADD] + $insurance; */ //$C[self::$FOT] = $C[self::$FZP] * (1+$C[self::$K]); //$C[self::$FOT] = $budget * (1+$C[self::$K]); $beginDay = $C[self::$YEAR].'-'.$C[self::$MONTH].'-01'; $days = date('t',strtotime($beginDay)); $endDay = $C[self::$YEAR].'-'.$C[self::$MONTH].'-'.$days; //$days = Day::getWorkDays($beginDay,$endDay); $hours = Day::getWorkHours($beginDay,$endDay); $C[self::$PK] = $hours; $C[self::$PER_HOUR] = ($C[self::$FOT] / $hours); //$C[self::$INSURE] = $insurance; self::updateByID($C[self::$ID],$C); } static function getMonths(){ return [ ['id'=>1,'title'=>'Январь'], ['id'=>2,'title'=>'Февраль'], ['id'=>3,'title'=>'Март'], ['id'=>4,'title'=>'Апрель'], ['id'=>5,'title'=>'Май'], ['id'=>6,'title'=>'Июнь'], ['id'=>7,'title'=>'Июль'], ['id'=>8,'title'=>'Август'], ['id'=>9,'title'=>'Сентябрь'], ['id'=>10,'title'=>'Октябрь'], ['id'=>11,'title'=>'Ноябрь'], ['id'=>12,'title'=>'Декабрь'], ]; } static function getStatusName($x){ return eFotStatus::getName($x); } static function getFormInputs(\ModuleBZ\Form &$form, array $data, $C, bool $isEdit) { $emp_id = $C[self::$EMP]??$_POST['params']['id']; $form ->addRow((new Row()) ->addColumn((new Column())->setClassAll('c-40 ') ->addRow((new Row()))) ->addColumn( (new Column())->setClassAll('c-20 ') ->addRow((new Row()) ->addColumn(((new Hidden()) ->setName(self::$EMP) ->setValue($emp_id) ->setClassAll('c-100') )) ->addColumn(((new Text()) ->setName(self::$YEAR) ->setValue($C[self::$YEAR]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$YEAR)) ->setPlaceholder($c) )) ->addColumn(((new Select()) ->setName(self::$MONTH) ->setValue(intval($C[self::$MONTH])) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$MONTH)) ->setPlaceholder($c) ->setOptions(self::getMonths()) )) ->addColumn(((new Text()) ->setName(self::$FZP) ->setValue($C[self::$FZP]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$FZP)) ->setPlaceholder($c) )) ->addColumn(((new Text()) ->setName(self::$ADD) ->setValue($C[self::$ADD]) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$ADD)) ->setPlaceholder($c) )) ->addColumn(((new Select()) ->setName(self::$STATUS) ->setValue(intval($C[self::$STATUS])) ->setClassAll('c-100') ->setLabel($c = V::get(Vars::$STATUS)) ->setPlaceholder($c) ->setOptions(eFotStatus::getNameList()) )) )->addRow((new Row()) ->addColumn(((new InputSave())->setClassAll('c-100')->setName('save'))) ) ) ) ; } 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::$NAME, C::TYPE => eColumnType::TEXT, C::TH => V::get(EmpVars::$NAME), ]), //---- new C([ C::VAR_NAME => &self::$EMP_NAME, C::TYPE => eColumnType::NONE, C::TH => V::get(EmpVars::$NAME), C::FUNC_VALUE_DATA => function($v) { return [ 'id'=>$v[Emp::$ID], 'archive'=>boolval($v[Emp::$ARCHIVE]), 'name'=>Emp::SurnameIO($v), ]; } ]), new C([ C::VAR_NAME => &self::$EMP_ROLES, C::TYPE => eColumnType::NONE, C::TH => V::get(EmpVars::$STAFFING), C::TD_CLASS => 'pre_wrap', C::FUNC_VALUE_DATA => function($v) { return implode("\n",Emp::getStaffingList($v)); //return Emp::getDepartmentList($v); } ]), new C([ C::VAR_NAME => &self::$EMP_DEPARTMENT, C::TYPE => eColumnType::NONE, C::TH => V::get(EmpVars::$ROLES), C::TD_CLASS => 'pre_wrap', C::FUNC_VALUE_DATA => function($v) { return implode("\n",Emp::getDepartmentList($v)); //return Emp::getDepartmentList($v); } ]), new C([ C::VAR_NAME => &self::$EMP_CITY, C::TYPE => eColumnType::NONE, C::FILTER_TYPE => eFilterType::SELECT, C::DEFAULT => 0, C::TH => V::get(EmpVars::$CITY), C::FUNC_VALUE_DATA => function($v){ return City::getName( City::getByIDCached(intval($v[Emp::$CITY])) ); }, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return City::getNameList(); }, ]), new C([ C::VAR_NAME => &self::$EMP_IS_FREELANCE, C::TYPE => eColumnType::NONE, C::FILTER_TYPE => eFilterType::BOOLEAN, C::DEFAULT => 0, // C::HIDDEN => true, C::TH => V::get(EmpVars::$IS_FREELANCER), //C::TH => 'Удалёнка', C::FUNC_VALUE_DATA => function($v){ return Merakomis::fbool($v[Emp::$IS_FREELANCER]); }, ]), new C([ C::VAR_NAME => &self::$EMP_ORG, C::TYPE => eColumnType::NONE, C::LENGTH => 1, C::DEFAULT => 1, C::TH => V::get(EmpVars::$ORG), C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return Org::getNameList(); }, C::FUNC_VALUE_DATA => function($v){ return Org::getName(Org::getByIDCached(intval($v[Emp::$ORG]))); }, ]), new C([ C::VAR_NAME => &self::$EMP_ORG_TYPE, C::TYPE => eColumnType::NONE, C::LENGTH => 1, C::DEFAULT => 1, //C::TH => V::get(Vars::$ORG_TYPE), C::TH => 'Вид', C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return OrgType::getNameList(); }, C::FUNC_VALUE_DATA => function($v){ return OrgType::getName(OrgType::getByIDCached(intval($v[Emp::$ORG_TYPE]))); }, ]), new C([ C::VAR_NAME => &self::$EMP_STATUS, C::TYPE => eColumnType::NONE, C::LENGTH => 1, C::DEFAULT => '0', C::TH => V::get(EmpVars::$STATUS), C::FILTER_TYPE => eFilterType::SELECT, C::FUNC_FILTER_SELECT_OPTIONS => function(){ return EmpStatus::getNameList(); }, C::FUNC_VALUE_DATA => function($v){ return EmpStatus::getName(EmpStatus::getByIDCached(intval($v[Emp::$STATUS]))); }, ]), //---- new C([ C::VAR_NAME => &self::$EMP, C::TYPE => eColumnType::INT, C::TH => V::get(Vars::$EMP), ]), new C([ C::VAR_NAME => &self::$STATUS, C::TYPE => eColumnType::TINYINT, C::DEFAULT => '0', C::TH => V::get(Vars::$STATUS), C::FUNC_VALUE_DATA => function($v) { return self::getStatusName($v[self::$STATUS]); } ]), new C([ C::VAR_NAME => &self::$YM, C::TYPE => eColumnType::VARCHAR, C::LENGTH => '7', C::HIDDEN => true, C::TH => V::get(Vars::$YM), ]), new C([ C::VAR_NAME => &self::$YEAR, C::TYPE => eColumnType::INT, C::TH => V::get(Vars::$YEAR), ]), new C([ C::VAR_NAME => &self::$MONTH, C::TYPE => eColumnType::INT, C::TH => V::get(Vars::$MONTH), ]), new C([ C::VAR_NAME => &self::$FZP, C::TYPE => eColumnType::VARCHAR, C::LENGTH => '128', C::DEFAULT => '0', C::TH => V::get(Vars::$FZP), ]), new C([ C::VAR_NAME => &self::$K, C::TYPE => eColumnType::VARCHAR, C::LENGTH => '128', C::DEFAULT => '0', //C::TH => V::get(Vars::$K), ]), new C([ C::VAR_NAME => &self::$ADD, C::TYPE => eColumnType::VARCHAR, C::LENGTH => '128', C::TH => V::get(Vars::$ADD), ]), new C([ C::VAR_NAME => &self::$INSURE, C::TYPE => eColumnType::VARCHAR, C::LENGTH => '128', C::DEFAULT => '0', C::TH => V::get(Vars::$INSURE), ]), new C([ C::VAR_NAME => &self::$FOT, C::TYPE => eColumnType::VARCHAR, C::LENGTH => '128', C::DEFAULT => '0', C::TH => V::get(Vars::$FOT), ]), new C([ C::VAR_NAME => &self::$PK, C::TYPE => eColumnType::VARCHAR, C::LENGTH => '128', C::DEFAULT => '0', C::TH => V::get(Vars::$PK), ]), new C([ C::VAR_NAME => &self::$PER_HOUR, C::TYPE => eColumnType::VARCHAR, C::LENGTH => '128', C::DEFAULT => '0', C::TH => V::get(Vars::$PER_HOUR), ]), ]; } } new Fot();