meraproject/themes/merakomis/emp/controller.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

386 lines
15 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?
namespace controller\themes\merakomis\emp;
use core\core\structure\eRowClick;
use core\db\structure\Column;
use ms\table\Filter;
use themes\Merakomis;
use themes\merakomis\dictionary\Department;
use themes\merakomis\dictionary\Staffing;
use themes\merakomis\Emp;
use themes\merakomis\emp\Rules;
use themes\merakomis\History;
use themes\merakomis\Post;
use themes\merakomis\structure\merakomisControllerTable;
use themes\merakomis\structure\merakomisModuleTable;
use themes\merakomis\Telegram;
class Api extends merakomisControllerTable {
/** @var merakomisModuleTable */
static $class = 'themes\merakomis\Emp';
function isSummaryAnalysis(){
echo je([
'result'=>Rules::isAnalysisProjectsSummary(),
]);
}
function getBirthday(){
$res = Emp::getBirthday();
echo je($res);
}
function exit(){
Emp::exit();
}
public static function updatePassword() {
$res = ['e'=>0,'m'=>''];
if(Emp::$IS_AUTH) {
$data = Emp::$data;
$hash = $data[Emp::$PASSWORD];
$data[Emp::$PASSWORD] = $_POST['old'];
$hash2 = Emp::hash($data);
if(strcmp($hash,$hash2)==0){
Emp::updateMyPass($data,$_POST['pass1']);
$res['notify']['content'] = "Пароль обновлён";
} else {
$res['e'] = 1;
$res['m'] = 'Неверный старый пароль';
$res['notify']['color'] = 1;
$res['notify']['content'] = $res['m'];
}
}
echo je($res);
}
public static function getForm() {
$res = [];
if(Emp::$IS_AUTH) {
$_POST[static::$class::$ID] = $_POST['id'];
$res = static::$class::getFormInfo($_POST);
$res['title'] = 'Редактор сотрудника';
}
echo je($res);
}
public static function getTableData($post = []) {
//Emp::getSubEmps(1);
$isArchive = false;
if(isset($post['data']['my_company'])){
//$TITLE = ['title'=>'Моя компания','subtitle'=>'Моя команда','text'=>'Контакт-лист всех ваших коллег: от Владивостока до Калининграда.'];
$TITLE = [
'title' => 'Моя компания',
'edit' => true,
'subtitle' => Merakomis::$COMPANY_TABLE_SUBTITLE,
'text' => Merakomis::$COMPANY_TABLE_TEXT,
'subtitle_var' => Merakomis::$_COMPANY_TABLE_SUBTITLE,
'text_var' => Merakomis::$_COMPANY_TABLE_TEXT,
];
$post['options'][\ModuleTable::ROW_CLICK] = eRowClick::CUSTOM;
$post['options'][\Query::SORT] = [Emp::$NAME=>'ASC'];
//if(!$post[])
$post['options'][\Query::WHERE] = \Where::_operator(Emp::$ARCHIVE,'=',0);
//$posts ? \Where::_in(Member::$POST,$posts) : null,
$post['options'][\ModuleTable::COLUMN_RENDER]=[
Emp::$IMAGE => [
\ModuleTable::COLUMN_RENDER_CUSTOM => true,
],
];
$post['options'][\ModuleTable::COLUMN_LIST]=[
Emp::$IMAGE,
//Emp::$ABSENCE,
Emp::$NAME,
Emp::$STAFFING,
Emp::$ROLES,
Emp::$SKYPE,
Emp::$DISCORD,
Emp::$EMAIL,
Emp::$CITY,
];
}
if(isset($post['data']['my'])){
$post['options'][\ModuleTable::ROW_CLICK] = eRowClick::NONE;
if(!Emp::isSuperView()) {
$emps = Emp::getSubEmps(Emp::$AUTH_ID) ?: [0];
$post['options'][\Query::WHERE] = \Where::_in(Emp::$ID, $emps);
}
$post['options'][\ModuleTable::COLUMN_RENDER] = [
Emp::$NAME => [
\ModuleTable::COLUMN_RENDER_LINK_FUNCTION=>function($v){
return '/public_profile/'.$v[Emp::$ID].'/';
}
]
];
}
if(isset($post['data']['archive'])){
$post['options'][\ModuleTable::ROW_CLICK] = eRowClick::NONE;
if(!isset($post['options']['filter'][Emp::$ARCHIVE])) {
$post['options'][\Query::WHERE] = \Where::_operator(Emp::$ARCHIVE, '=', intval($post['data']['archive']));
}
/*
if(!isset($post['options']['filter'][Emp::$ARCHIVE])){
$post['options']['filter'][Emp::$ARCHIVE] = intval($post['data']['archive']);
}
*/
if($post['data']['archive']){
$isArchive = true;
$post['options'][\ModuleTable::ROW_CLICK] = eRowClick::CUSTOM;
$post['options'][\ModuleTable::COLUMN_LIST]=[
Emp::$ARCHIVE,
Emp::$NAME,
Emp::$STAFFING,
Emp::$ROLES,
Emp::$CITY,
Emp::$IS_FREELANCER,
Emp::$ORG,
Emp::$ORG_TYPE,
Emp::$ORG,
//Emp::$NOPRIZ,
//Emp::$NOSTROI,
//Emp::$TECHNADZOR,
Emp::$DATE_HIRE,
Emp::$STATUS,
Emp::$ARCHIVE_DATE,
];
} else {
}
}
if(isset($post['data']['mini'])){
$post['options'][\ModuleTable::ROW_CLICK] = eRowClick::NONE;
//$TITLE= ['title'=>'Сотрудники','subtitle'=>'Наша команда','text'=>'Компьютеры коренным образом изменили жизнь каждого человека. Несколько десятилетий назад люди даже не знали ничего об этих электронных устройствах, тогда как в наши дни даже маленький ребенок может управлять этой машиной. Почти все современные технологии зависит от компьютеров, которые используются для хранения данных: файлов, секретной информации, банковских операций и прочего.'];
// $TITLE = ['title'=>'Сотрудники','subtitle'=>Merakomis::$DEPARTMENTS_TABLE_SUBTITLE,'text'=>Merakomis::$DEPARTMENTS_TABLE_TEXT];
$TITLE = [
'title' => 'Сотрудники',
'edit' => true,
'subtitle' => Merakomis::$DEPARTMENTS_TABLE_SUBTITLE,
'text' => Merakomis::$DEPARTMENTS_TABLE_TEXT,
'subtitle_var' => Merakomis::$_DEPARTMENTS_TABLE_SUBTITLE,
'text_var' => Merakomis::$_DEPARTMENTS_TABLE_TEXT,
];
$post['options'][\ModuleTable::COLUMN_LIST]=[
Emp::$NAME,
Emp::$STAFFING,
Emp::$ROLES,
Emp::$TYPE,
Emp::$GROUP,
Emp::$ACCEPT,
Emp::$ACTIVE,
Emp::$ARCHIVE,
];
}
if(isset($post['data']['all']) && !isset($post['data']['archive'])){
$post['options'][\ModuleTable::COLUMN_LIST]=[
Emp::$ARCHIVE,
Emp::$NAME,
Emp::$STAFFING,
Emp::$ROLES,
Emp::$CITY,
Emp::$IS_FREELANCER,
Emp::$ORG,
Emp::$ORG_TYPE,
Emp::$DATE_HIRE,
Emp::$STATUS,
Emp::$FOT,
];
}
$post['getData'] = true;
$res = parent::getTableData($post);
if($TITLE) $res['title'] = $TITLE;
else {
// $res['title'] = ['title'=>'Сотрудники','subtitle'=>Merakomis::$EMP_TABLE_SUBTITLE,'text'=>Merakomis::$EMP_TABLE_TEXT];
$res['title'] = [
'title' => 'Сотрудники',
'edit' => true,
'subtitle' => $isArchive ? Merakomis::$EMP_TABLE_ARCHIVE_SUBTITLE : Merakomis::$EMP_TABLE_SUBTITLE,
'text' => $isArchive ? Merakomis::$EMP_TABLE_ARCHIVE_TEXT : Merakomis::$EMP_TABLE_TEXT,
'subtitle_var' => $isArchive ? Merakomis::$_EMP_TABLE_ARCHIVE_SUBTITLE : Merakomis::$_EMP_TABLE_SUBTITLE,
'text_var' => $isArchive ? Merakomis::$_EMP_TABLE_ARCHIVE_TEXT : Merakomis::$_EMP_TABLE_TEXT,
];
}
if(isset($post['data']['my_company']) || isset($post['data']['all'])){
$res["per_page_options"] = [
["id"=>0,"title"=>'Показать все'],
["id"=>10, "title"=>'10'],
["id"=>25, "title"=>'25'],
["id"=>50, "title"=>'50'],
["id"=>100,"title"=>'100'],
];
}
echo je($res);
}
static function new_pass(){
$res = ['e'=>0,'m'=>''];
$pass = trim($_POST['password1']);
$pass2 = trim($_POST['password2']);
if(!$pass){
$ERROR = 'Введите пароль';
} else if(strcmp($pass,$pass2)!=0){
$ERROR = 'Пароли не совпадают';
} else {
$ERROR = Emp::checkRemind($_POST['id'],$_POST['key'],$_POST['hash']);
}
if($ERROR){
$res['e'] = 1;
$res['m'] = $ERROR;
} else {
$profile = Emp::getByID(intval($_POST['id']));
Emp::updateMyPass($profile,$_POST['password1']);
$res['m'] = 'Пароль успешно обновлён. Через 3 секунды вы будете авторизованы';
History::remind(intval($_POST['id']));
}
echo je($res);
}
static function test()
{
Emp::sendAuthCode(1);
//echo Emp::getTgStartLink();
//$x = Merakomis::mail('v.gvozdikov@merakom.ru', 'Виктор', 'test', 'Тест');
}
static function remind(){
$res = ['e'=>0];
$profile = Emp::getByLogin((string)$_POST['login']);
if($profile){
//$res['m']='Вам выслан email с ссылкой на восстановление пароля '.ShopTheme::getRemindLink($profile);
$res['m']='Вам выслан email с ссылкой на восстановление пароля';//.ShopTheme::getRemindLink($profile);
$link = Emp::getRemindLink($profile);
//$res['link'] = $link;
$html = $link;
//$html = 'Здравствуйте, '.$profile[Emp::$NAME]."\n".
$html = 'Кликните <a href="'.$link.'">ссылку</a> для установки нового пароля';
//$res['html'] = $html;
$res['res'] = Emp::sendEmail($profile,$html,'Восстановление вашего пароля');
//$res['res2'] = Emp::sendEmail($profile,'test','test2');
} else {
$res['e'] = 1;
$res['m'] = 'Такой аккаунт в системе не найден';
}
$res['post'] = $_POST;
echo je($res);
}
static function getMyData(){
$res = [];
if(Emp::$IS_AUTH){
$res = Emp::format(Emp::$data);
}
echo je($res);
}
static function getData(){
$res = [];
if(Emp::$IS_AUTH){
$res = Emp::format(Emp::getByID(intval($_POST['id'])));
}
echo je($res);
}
static function updateMe(){
$res = [];
if(Emp::$IS_AUTH){
$res['r'] = Emp::updateById(Emp::$AUTH_ID,[
Emp::$PHONE=>$_POST['data'][Emp::$PHONE],
Emp::$SKYPE=>$_POST['data'][Emp::$SKYPE],
Emp::$DISCORD=>$_POST['data'][Emp::$DISCORD],
]);
$res['notify']['content'] = 'Контакты успешно обновлены';
}
echo je($res);
}
static function getMyForm(){
if(Emp::$IS_AUTH) {
$emp_id = intval($_POST['id']) ?: Emp::$AUTH_ID;
echo je(Emp::getPublicData($emp_id));
}
}
static function reg(){
$res = Emp::reg($_POST['login'],$_POST['pass1'],$_POST['pass2']);
echo je($res);
}
static function login(){
$res = Emp::login($_POST['login'],$_POST['pass']);
echo je($res);
}
static function removeTelegram(){
$res = [];
if(Emp::$IS_AUTH){
Emp::updateById(intval(Emp::$AUTH_ID),[
Emp::$TG_ACC=>0,
]);
}
echo je($res);
}
static function checkTelegram(){
$res = ['connect'=>false];
if(Emp::$IS_AUTH){
$res['connect'] = Emp::checkTelegram();
}
echo je($res);
}
static function qr(){
if(Emp::$IS_AUTH) {
include __DIR__ . '/../../../lib/php/qr/qrlib.php';
$link = Emp::getTgStartLink();
// $text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false
\QRcode::png($link, false, QR_ECLEVEL_L, 5);
}
}
static function toTelegram(){
if(Emp::$IS_AUTH){
echo '
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap" rel="stylesheet">
<div style="max-width:500px;display:flex;height:100%;align-items:center;flex-direction: column;margin:0 auto;text-align:center;justify-content: center;font-family:Montserrat;line-height:1.4">
<img src="/api/themes.merakomis.emp/qr/"/>
<p>Отсканируйте QR-код камерой вашего смартфона с установленным Telegram и нажмите кнопку «START BOT» на экране мобильного телефона.</p>
<p>После этого окно можно закрыть.</p>
<p>Проверьте привязку, нажав кнопку «Проверить» в карточке сотрудника: статус-бар окрасится в синий цвет. <br/><br/Закройте карточку сотрудника: пиктограмма Телеграма в шапке сайта также окрасится в синий цвет.</p>
<!--
<p>Отсканируйте QR-код камерой вашего мобильного телефона с установленным Telegram и следуйте инструкциям на экране. <br/><br/>После нажатия кнопки «Send Message» в мобильном приложении это окно можно закрыть.<br/><br/>
Проверьте привязку, нажав кнопку «Проверить» в карточке сотрудника: статус-бар окрасится в синий цвет. <br/><br/Закройте карточку сотрудника: пиктограмма Телеграма в шапке сайта также окрасится в синий цвет.</p>
-->
</div>';
}
}
}