meraproject/themes/merakomis/time/absence/model.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

227 lines
7.9 KiB
PHP

<?
namespace themes\merakomis\time;
use core\db\structure\Column as C;
use core\db\structure\eColumnType;
use core\lang\structure\LangVariable as V;
use ModuleBZ\Form\Input\DatePicker;
use ModuleBZ\Form\Input\Hidden;
use ModuleBZ\Form\Input\Select;
use ModuleBZ\Form\Input\Switcher;
use ModuleBZ\Form\Input\Text;
use ModuleBZ\Layout\Row;
use themes\Merakomis;
use themes\merakomis\Emp;
use themes\merakomis\structure\merakomisModuleTable;
use themes\merakomis\Time;
use themes\merakomis\time\absence\structure\lang as Vars;
use \themes\merakomis\dictionary\Absence as DAbsence;
class Absence extends merakomisModuleTable {
static $self;
static $cache = [];
static $table_name = 'tMerakomisTimeAbsence';
static $controller = 'themes.merakomis.time.absence';
static $ID = 'id';
static $EMP = 'emp';
static $ABSENCE = 'absence';
static $DATE = 'date';
static $PORTAL = 'portal';
static $ACCOUNT = 'account';
static function getTitle(){return V::get(Vars::$MODULE_NAME);}
static function getSystemLangValues():array{ return Vars::getArray(); }
public static function installUniques() {
\DB::addUnique(self::$table_name,self::$table_name.'_unique',[
self::$EMP,self::$DATE,
]);
\DB::addIndexManyColumns(self::$table_name,[self::$EMP,self::$DATE]);
}
static function setDays($emp_id,$absence_id,$begin,$end){
if($begin=='0000-00-00') $begin=null;
if($end=='0000-00-00') $end=null;
$res = ['e'=>0,'m'=>''];
$dates = [];
$day = 60*60*24;
$startTime = strtotime($begin);
$endTime = strtotime($end);
for($i=$startTime;$i<=$endTime;$i+=$day){
$dates[] = date('Y-m-d',$i);
}
if(!$begin){
$res['e']=1;
$res['m']='Укажите дату начала';
} else if(!$end){
$res['e']=1;
$res['m']='Укажите дату окончания';
} else if($endTime<$startTime){
$res['e']=1;
$res['m']='Дата окончания должна быть больше, чем дата начала';
} else if(!$emp_id){
$res['e']=1;
$res['m']='Укажите сотрудника';
}
if(!$res['e']) {
if ($dates) {
$r = self::delete(new \Where(\Where::_and([
\Where::_operator(self::$EMP, '=', $emp_id),
\Where::_in(self::$DATE, $dates),
])));
Time::delete(new \Where(\Where::_and([
\Where::_operator(Time::$EMP, '=', $emp_id),
\Where::_in(Time::$DATE, $dates),
\Where::_operator(Time::$IS_OVER, '=', 0),
])));
}
if ($absence_id and $emp_id) {
foreach ($dates as $date) {
$r = self::insert([
self::$EMP => $emp_id,
self::$ABSENCE => $absence_id,
self::$DATE => $date
]);
$res[] = Cache::removeRows($date,$emp_id);
}
}
$res['m'] = 'Успешно сохранено';
}
return $res;
}
public function _insert(array $values, array $options = array()) {
$options[\Query::ON_DUPLICATE_KEY_UPDATE] = [
self::$ABSENCE => $values[self::$ABSENCE],
];
return parent::_insert($values, $options); // TODO: Change the autogenerated stub
}
public static function afterUadd($values, $id, $result) {
$res = parent::afterUadd($values, $id, $result);
if($id and !$values[self::$ABSENCE]){
self::deleteByID($id);
}
if($values[self::$DATE] and $values[self::$EMP] and !$values[self::$ABSENCE]){
self::delete(new \Where(\Where::_and([
\Where::_operator(self::$EMP,'=',$values[self::$EMP]),
\Where::_operator(self::$DATE,'=',$values[self::$DATE]),
])));
}
if($values[self::$DATE]){
Time::delete(new \Where(\Where::_and([
\Where::_operator(Time::$EMP,'=',$values[self::$EMP]),
\Where::_operator(Time::$DATE,'=',$values[self::$DATE]),
\Where::_operator(Time::$IS_OVER,'=',0),
])));
}
return $res;
}
static function getFormInputs(\ModuleBZ\Form &$form, array $data, $C, bool $isEdit) {
$form
->addInput((new Hidden())->setName(self::$ID)->setValue( intval($C[self::$ID]?:$data['id']) ))
->addInput((new Hidden())->setName(self::$EMP)->setValue( intval($C[self::$EMP]?:($data['emp']?:Emp::$AUTH_ID)) ))
->addInput((new Hidden())->setName(self::$DATE)->setValue( $C[self::$DATE]?:($data['date']?:date('Y-m-d')) ))
->addRow((new Row())
/*
->addColumn(((new DatePicker())
->setName(self::$DATE)
->setValue($C[self::$DATE])
->setClassAll('c-50')
->setLabel($c = V::get(Vars::$DATE))
->setPlaceholder($c)
))
*/
->addColumn(((new Select())
->setName(self::$ABSENCE)
->setValue(intval($C[self::$ABSENCE]))
->setClassAll('c-100')
->setLabel($c = V::get(Vars::$ABSENCE))
->setPlaceholder($c)
->setLabel($c)
->setOptions(DAbsence::getNameList(([
'zero'=>true,
\Query::WHERE => new \Where(\Where::_or([
\Where::_operator(DAbsence::$VIS,'=',1),
$isEdit ? \Where::_operator(DAbsence::$ID,'=',intval($C[self::$ABSENCE])) : null,
]))
])))
))
)
;
}
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::$EMP,
C::TYPE => eColumnType::INT,
C::DEFAULT => intval(Emp::$AUTH_ID),
c::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$DATE,
C::TYPE => eColumnType::DATE,
C::TH => V::get(Vars::$DATE),
C::FUNC_VALUE_DATA => function($v){
return Merakomis::fdate($v[self::$DATE]);
}
]),
new C([
C::VAR_NAME => &self::$ABSENCE,
C::TYPE => eColumnType::INT,
C::TH => V::get(Vars::$ABSENCE),
C::FUNC_VALUE_DATA => function($v){
return DAbsence::getName(DAbsence::getByID(intval($v[self::$ABSENCE])));
}
]),
new C([
C::VAR_NAME => &self::$PORTAL,
C::TYPE => eColumnType::INT,
C::DEFAULT => intval(\Site::$portal_id),
c::HIDDEN => true,
]),
new C([
C::VAR_NAME => &self::$ACCOUNT,
C::TYPE => eColumnType::INT,
C::DEFAULT => intval(\Site::$owner_id),
//C::TH => V::get(Vars::$ACCOUNT),
c::HIDDEN => true,
]),
];
}
}
new Absence();
///