meraproject/themes/merakomis/fot/model.php

620 lines
22 KiB
PHP
Raw Normal View History

<?
namespace themes\merakomis;
use core\columns\structure\eFilterType;
use core\db\structure\Column as C;
use core\db\structure\eColumnType;
use core\lang\structure\LangVariable as V;
use ModuleBZ\Form\Input\Hidden;
use ModuleBZ\Form\Input\Select;
use ModuleBZ\Layout\Column;
use ms\ms\structure\msModuleTable;
use common\Image;
use ModuleBZ\Form\Input\ImagePicker;
use ModuleBZ\Form\Input\Switcher;
use ModuleBZ\Form\Input\Text;
use ModuleBZ\Form\Input\Textarea;
use ModuleBZ\Layout\Row;
use themes\Merakomis;
use themes\merakomis\dictionary\City;
use themes\merakomis\dictionary\EmpStatus;
use themes\merakomis\dictionary\Org;
use themes\merakomis\dictionary\OrgType;
use themes\merakomis\fot\Budget;
use themes\merakomis\fot\structure\eFotStatus;
use themes\merakomis\fot\structure\lang as Vars;
use themes\merakomis\emp\structure\tMerakomisEmpLang as EmpVars;
use themes\merakomis\input\Save as InputSave;
use themes\merakomis\structure\merakomisModuleTable;
class Fot extends merakomisModuleTable {
static $self;
static $cache = [];
static $table_name = 'tMerakomisFot';
static $controller = 'themes.merakomis.fot';
static $ID = 'id';
static $NAME = 'name';
static $EMP = 'emp';
static $YM = 'ym';
static $YEAR = 'year';
static $MONTH = 'month';
static $FZP = 'fzp';
static $K = 'k';
static $ADD = 'add';
static $INSURE = 'insure';
static $FOT = 'fot';
static $PK = 'pk';
static $PER_HOUR = 'per_hour';
static $STATUS = 'status';
//----
static $EMP_NAME = 'empName';
static $EMP_ROLES = 'empRoles';
static $EMP_DEPARTMENT = 'empDepartment';
static $EMP_CITY = 'empCity';
static $EMP_ORG = 'empOrg';
static $EMP_ORG_TYPE = 'empOrgType';
static $EMP_IS_FREELANCE = 'empIsFreelance';
static $EMP_STATUS = 'empStatus';
public static function installUniques()
{
\Db::addUnique(self::$table_name,self::$table_name.'_unique',[self::$EMP,self::$YEAR,self::$MONTH]);
}
public static function checkUserAddAccess(array $values = [], int $id = 0, bool $isEdit = false): bool
{
return true;
}
static $ENC_COLUMNS;
static function getEncryptedColumns()
{
return self::$ENC_COLUMNS ?? self::$ENC_COLUMNS = [
self::$FZP,
self::$K,
self::$ADD,
self::$INSURE,
self::$FOT,
self::$PK,
self::$PER_HOUR,
];
}
public static function getByID(int $id)
{
$res = parent::getByID($id);
self::decrypt($res);
return $res;
}
static public function decrypt(&$l)
{
$enc = self::getEncryptedColumns();
foreach ($enc as $c) {
if(isset($l[$c])) $l[$c] = Merakomis::decryptNumber($l[$c]);
}
}
static function getTitle(){return V::get(Vars::$MODULE_NAME);}
static function getSystemLangValues():array{ return Vars::getArray(); }
public function _insert(array $values, array $options = array())
{
$m = $values[self::$MONTH];
$values[self::$YM] = $values[self::$YEAR].'-'.($m<10?'0':'').$m;
$enc = self::getEncryptedColumns();
foreach ($enc as $c) {
if(isset($values[$c])) $values[$c] = Merakomis::encryptNumber($values[$c]);
}
$r = parent::_insert($values, $options);
//if($r) Fot::math($r->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();