mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-12-26 22:50:29 +01:00
3913 lines
149 KiB
PHP
3913 lines
149 KiB
PHP
<?php
|
|
/*
|
|
**** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
|
|
*
|
|
* Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
|
|
*
|
|
* This file is licensed under the Embedded Projects General Public License *Version 3.1.
|
|
*
|
|
* You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis
|
|
* to obtain the text of the corresponding license version.
|
|
*
|
|
**** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
|
|
*/
|
|
?>
|
|
<?php
|
|
use Xentral\Components\Barcode\BarcodeFactory;
|
|
use Xentral\Components\Http\JsonResponse;
|
|
use Xentral\Components\Http\RedirectResponse;
|
|
use Xentral\Components\Http\Request;
|
|
use Xentral\Components\Http\Session\Session;
|
|
use Xentral\Components\Http\Session\SessionHandler;
|
|
use Xentral\Components\Mailer\Data\EmailRecipient;
|
|
use Xentral\Modules\DownloadSpooler\DownloadSpoolerGateway;
|
|
use Xentral\Modules\DownloadSpooler\DownloadSpoolerService;
|
|
use Xentral\Modules\DownloadSpooler\Exception\DownloadSpoolerExceptionInterface;
|
|
use Xentral\Modules\GoogleApi\Exception\AuthorizationExpiredException;
|
|
use Xentral\Modules\GoogleApi\Exception\GoogleAccountNotFoundException;
|
|
use Xentral\Modules\GoogleApi\GoogleScope;
|
|
use Xentral\Modules\GoogleApi\Service\GoogleAccountGateway;
|
|
use Xentral\Modules\GoogleApi\Service\GoogleAccountService;
|
|
use Xentral\Modules\GoogleApi\Service\GoogleAuthorizationService;
|
|
use Xentral\Modules\GoogleApi\Service\GoogleCredentialsService;
|
|
use Xentral\Modules\GoogleCalendar\Client\GoogleCalendarClientFactory;
|
|
use Xentral\Modules\GoogleCalendar\Exception\GoogleCalendarSyncException;
|
|
use Xentral\Modules\GoogleCalendar\Service\GoogleCalendarSynchronizer;
|
|
use Xentral\Modules\SystemHealth\Service\SystemHealthService;
|
|
use Xentral\Modules\SystemMailer\SystemMailer;
|
|
use Xentral\Modules\SystemNotification\Service\NotificationService;
|
|
use Xentral\Modules\TOTPLogin\TOTPLoginService;
|
|
use Xentral\Modules\RoleSurvey\SurveyGateway;
|
|
use Xentral\Modules\RoleSurvey\SurveyService;
|
|
|
|
class Welcome
|
|
{
|
|
/** @var erpooSystem $app */
|
|
var $app;
|
|
|
|
var $_meineapps;
|
|
|
|
const MODULE_NAME = 'Welcome';
|
|
|
|
public $javascript = [
|
|
'./classes/Modules/Calendar/www/js/fullcalendar.js',
|
|
'./classes/Modules/Calendar/www/js/calendar.js',
|
|
'./classes/Modules/Calendar/www/js/calendargroups.js',
|
|
];
|
|
|
|
/**
|
|
* Welcome constructor.
|
|
*
|
|
* @param Application $app
|
|
* @param bool $intern
|
|
*/
|
|
public function __construct($app, $intern = false)
|
|
{
|
|
$this->app=$app;
|
|
$this->_meineapps = null;
|
|
if($intern){
|
|
return;
|
|
}
|
|
$this->app->ActionHandlerInit($this);
|
|
|
|
$this->app->ActionHandler("login","WelcomeLogin");
|
|
$this->app->ActionHandler("main","WelcomeMain");
|
|
$this->app->ActionHandler("poll","WelcomePoll");
|
|
$this->app->ActionHandler("list","TermineList");
|
|
$this->app->ActionHandler("cronjob","WelcomeCronjob");
|
|
$this->app->ActionHandler("cronjob2","WelcomeCronjob2");
|
|
$this->app->ActionHandler("adapterbox","WelcomeAdapterbox");
|
|
$this->app->ActionHandler("help","WelcomeHelp");
|
|
$this->app->ActionHandler("info","WelcomeInfo");
|
|
$this->app->ActionHandler("icons","WelcomeIcons");
|
|
$this->app->ActionHandler("vorgang","VorgangAnlegen");
|
|
$this->app->ActionHandler("removevorgang","VorgangEntfernen");
|
|
$this->app->ActionHandler("editvorgang","VorgangEdit");
|
|
$this->app->ActionHandler("logout","WelcomeLogout");
|
|
$this->app->ActionHandler("start","WelcomeStart");
|
|
$this->app->ActionHandler("list","WelcomeStart");
|
|
$this->app->ActionHandler("settings","WelcomeSettings");
|
|
$this->app->ActionHandler("mobileapps","WelcomeMobileApps");
|
|
$this->app->ActionHandler("spooler","WelcomeSpooler");
|
|
$this->app->ActionHandler("redirect","WelcomeRedirect");
|
|
$this->app->ActionHandler("startseite","WelcomeStartseite");
|
|
|
|
$this->app->ActionHandler("addnote","WelcomeAddNote");
|
|
$this->app->ActionHandler("addpinwand","WelcomeAddPinwand");
|
|
$this->app->ActionHandler("movenote","WelcomeMoveNote");
|
|
$this->app->ActionHandler("oknote","WelcomeOkNote");
|
|
$this->app->ActionHandler("delnote","WelcomeDelNote");
|
|
$this->app->ActionHandler("pinwand","WelcomePinwand");
|
|
|
|
$this->app->ActionHandler("css","WelcomeCss");
|
|
$this->app->ActionHandler("logo","WelcomeLogo");
|
|
$this->app->ActionHandler("unlock","WelcomeUnlock");
|
|
$this->app->ActionHandler("direktzugriff","WelcomeDirektzugriff");
|
|
$this->app->ActionHandler("meineapps","WelcomeMeineApps");
|
|
$this->app->ActionHandler("passwortvergessen","Welcomepasswortvergessen");
|
|
$this->app->ActionHandler("changelog", "WelcomeChangelog");
|
|
$this->app->ActionHandler("survey", "WelcomeSurvey");
|
|
$this->app->NoHooks = array('poll');
|
|
|
|
$this->app->DefaultActionHandler("login");
|
|
$action = $this->app->Secure->GetGET('action');
|
|
if(
|
|
!in_array(
|
|
$action,
|
|
[
|
|
'login','logout','poll','css','logo','unlock','icons','cronjob','cronjob2',
|
|
'addnote', 'addpinwand','movenote','oknote','delnote','adapterbox','spooler',
|
|
'removevorgang','editvorgang','vorgang', 'survey',
|
|
]
|
|
)
|
|
){
|
|
$this->GetMeineApps();
|
|
$this->app->erp->RegisterMenuHook('startseite', 'MenuHook', $this);
|
|
}
|
|
$this->app->ModuleScriptCache->IncludeJavascriptFiles('welcome', ['./classes/Modules/TOTPLogin/www/js/totplogin.js']);
|
|
$this->app->ActionHandlerListen($app);
|
|
}
|
|
|
|
public function Install()
|
|
{
|
|
try {
|
|
/** @var SurveyService $surveyService */
|
|
$surveyService = $this->app->Container->get('SurveyService');
|
|
$surveyService->create('xentral_role', 'welcome', 'start', true, true);
|
|
}
|
|
catch (Exception $e) {
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return JsonResponse
|
|
*/
|
|
public function HandleSaveSurveyDataAjaxAction()
|
|
{
|
|
$surveyId = $this->app->Secure->GetPOST('surveyId');
|
|
$surveyName = $this->app->Secure->GetPOST('surveyName');
|
|
if(empty($surveyId)){
|
|
/** @var SurveyGateway $surveyGateway */
|
|
$surveyGateway = $this->app->Container->get('SurveyGateway');
|
|
$survey = $surveyGateway->getByName($surveyName);
|
|
if(!empty($survey)) {
|
|
$surveyId = (int)$survey['id'];
|
|
}
|
|
}
|
|
/** @var SurveyService $surveyService */
|
|
$surveyService = $this->app->Container->get('SurveyService');
|
|
try{
|
|
$surveyUserId = $surveyService->saveUserAnswer(
|
|
$surveyId,
|
|
$this->app->User->GetID(),
|
|
$this->app->Secure->POST
|
|
);
|
|
/* try{
|
|
$surveyService->sendToXentral(
|
|
$surveyId,
|
|
"https://{$this->app->Conf->updateHost}/sendsurvey.php",
|
|
$this->app->erp->Firmendaten('lizenz'),
|
|
$this->app->erp->Firmendaten('schluessel')
|
|
);
|
|
}
|
|
catch (Exception $e) {
|
|
|
|
}*/
|
|
}
|
|
catch(Exception $e) {
|
|
return new JsonResponse(
|
|
['sucess' => false, 'error' =>$e->getMessage()],
|
|
JsonResponse::HTTP_BAD_REQUEST
|
|
);
|
|
}
|
|
$response = ['success' => true, 'surveyUserId' => $surveyUserId];
|
|
$this->app->erp->RunHook('welcome_surveysave', 3, $surveyId, $surveyUserId, $response);
|
|
|
|
return new JsonResponse($response);
|
|
}
|
|
|
|
/**
|
|
* @return JsonResponse
|
|
*/
|
|
public function HandleOpenSurveyAjaxAction()
|
|
{
|
|
$surveyId = $this->app->Secure->GetPOST('surveyId');
|
|
$surveyName = $this->app->Secure->GetPOST('surveyName');
|
|
/** @var SurveyGateway $surveyGateway */
|
|
$surveyGateway = $this->app->Container->get('SurveyGateway');
|
|
if(empty($surveyId)) {
|
|
$survey = $surveyGateway->getByName($surveyName);
|
|
if(!empty($survey)) {
|
|
$surveyId = (int)$survey['id'];
|
|
}
|
|
}
|
|
else{
|
|
$survey = $surveyGateway->getById($surveyId);
|
|
}
|
|
if(empty($survey)) {
|
|
return new JsonResponse(
|
|
['sucess' => false, 'error' => 'Umfrage nicht gefunden'],
|
|
JsonResponse::HTTP_BAD_REQUEST
|
|
);
|
|
}
|
|
|
|
$filled = $surveyGateway->getFilledSurveyByUser($surveyId, $this->app->User->GetID());
|
|
if(!empty($filled)) {
|
|
$filled = json_decode($filled, true);
|
|
}
|
|
|
|
return new JsonResponse(['success' => true, 'survey' => $survey, 'data' => $filled]);
|
|
}
|
|
|
|
public function WelcomeSurvey()
|
|
{
|
|
$cmd = $this->app->Secure->GetGET('cmd');
|
|
if($cmd === 'saveSurveyData') {
|
|
return $this->HandleSaveSurveyDataAjaxAction();
|
|
}
|
|
if($cmd === 'openSurvey') {
|
|
return $this->HandleOpenSurveyAjaxAction();
|
|
}
|
|
}
|
|
|
|
public function Welcomepasswortvergessen()
|
|
{
|
|
$this->app->acl->Passwortvergessen();
|
|
}
|
|
|
|
public function MenuHook()
|
|
{
|
|
/* if($this->GetMeineApps())
|
|
{
|
|
$this->app->erp->InsertMenuAfter('index.php?module=welcome&action=meineapps','Meine Apps','welcome','start');
|
|
}
|
|
*/
|
|
}
|
|
|
|
public function StartseiteMenu()
|
|
{
|
|
$module = $this->app->Secure->GetGET('module');
|
|
|
|
$this->app->erp->MenuEintrag('index.php?module=welcome&action=start','Startseite');
|
|
$this->app->erp->MenuEintrag('index.php?module=welcome&action=pinwand','Pinnwand');
|
|
|
|
|
|
if($module==='aufgaben'){
|
|
$this->app->erp->MenuEintrag('index.php?module=aufgaben&action=create', 'Neue Aufgaben');
|
|
}
|
|
|
|
$this->app->erp->MenuEintrag('index.php?module=aufgaben&action=list','Aufgaben');
|
|
|
|
$this->app->erp->MenuEintrag('index.php?module=kalender&action=list','Kalender');
|
|
$this->app->erp->MenuEintrag('index.php?module=chat&action=list','Chat');
|
|
$this->app->erp->MenuEintrag('index.php?module=zeiterfassung&action=create','Zeiterfassung buchen');
|
|
$this->app->erp->MenuEintrag('index.php?module=zeiterfassung&action=listuser','Eigene Zeiterfassung Übersicht');
|
|
if($this->app->Secure->GetGET('action') ==='changelog'){
|
|
$this->app->erp->MenuEintrag('index.php?module=welcome&action=changelog', 'Changelog');
|
|
}
|
|
$this->app->erp->RunMenuHook('startseite');
|
|
}
|
|
|
|
/**
|
|
* @param string $bezeichnung
|
|
* @param string $url
|
|
*/
|
|
public function CheckFav($bezeichnung, $url)
|
|
{
|
|
if($this->app->erp->GetKonfiguration('checkFav'. md5($url))){
|
|
return;
|
|
}
|
|
$this->app->erp->SetKonfigurationValue('checkFav'. md5($url),1);
|
|
$user = $this->app->DB->SelectArr("SELECT u.id FROM `user` u LEFT JOIN `userrights` ur ON u.id = ur.`user` AND ur.module = 'amazon' AND ur.action = 'list' WHERE NOT isnull(ur.id) OR u.type = 'admin'");
|
|
if(empty($user))
|
|
{
|
|
return;
|
|
}
|
|
foreach($user as $vu)
|
|
{
|
|
$u = $vu['id'];
|
|
$eigenlinks = $this->app->DB->Select("SELECT uk.`value` FROM `userkonfiguration` uk WHERE `name` = 'welcome_links_eigen' AND `user` = '$u' LIMIT 1");
|
|
$index = 1;
|
|
$check2 = null;
|
|
$check3 = null;
|
|
if($eigenlinks)
|
|
{
|
|
for($i = 1; $i <= 8; $i++)
|
|
{
|
|
$link = $this->app->DB->SelectRow("SELECT uk.`value`, uk.id FROM `userkonfiguration` uk WHERE `name` = 'welcome_linklink".$i."' AND `user` = '$u' LIMIT 1");
|
|
if(empty($link)) {
|
|
$link = array('id'=>0, 'link'=>'');
|
|
}
|
|
if(stripos($link['value'], $url) !== false)
|
|
{
|
|
$index = 9;
|
|
break;
|
|
}
|
|
if($link['value'] != '')
|
|
{
|
|
if($index == $i)$index++;
|
|
}else{
|
|
$check2 = $link['id'];
|
|
$check3 = $this->app->DB->Select("SELECT uk.id FROM `userkonfiguration` uk WHERE `name` = 'welcome_linkname".$i."' AND `user` = '$u' LIMIT 1");
|
|
break;
|
|
}
|
|
}
|
|
}else{
|
|
$check = $this->app->DB->Select("SELECT id FROM `userkonfiguration` uk WHERE `name` = 'welcome_links_eigen' AND `user` = '$u' LIMIT 1");
|
|
if($check)
|
|
{
|
|
$this->app->DB->Update("UPDATE `userkonfiguration` SET `value` = '1' WHERE id = '$check' LIMIT 1");
|
|
}else{
|
|
$this->app->DB->Insert("INSERT INTO `userkonfiguration` (`user`, `value`, `name`) VALUES ('$u', '1', 'welcome_links_eigen')");
|
|
}
|
|
if(!$this->app->DB->Select("SELECT id FROM `userkonfiguration` WHERE `user` = '$u' AND `name` LIKE 'welcome\_linklink_%'"))
|
|
{
|
|
$index = 2;
|
|
$this->app->DB->Insert("INSERT INTO `userkonfiguration` (`user`, `value`, `name`) VALUES ('$u', 'index.php?module=welcome&action=settings', 'welcome_linklink1')");
|
|
$this->app->DB->Insert("INSERT INTO `userkonfiguration` (`user`, `value`, `name`) VALUES ('$u', 'Eigene Einstellungen', 'welcome_linkname1')");
|
|
}
|
|
}
|
|
if($index <= 8)
|
|
{
|
|
if($check2)
|
|
{
|
|
$this->app->DB->Update("UPDATE `userkonfiguration` SET `value` = '".$this->app->DB->real_escape_string($url)."' WHERE id = '$check2' LIMIT 1");
|
|
}else
|
|
{
|
|
$this->app->DB->Insert("INSERT INTO `userkonfiguration` (`user`, `value`, `name`) VALUES ('$u', '".$this->app->DB->real_escape_string($url)."', 'welcome_linklink".$index."')");
|
|
}
|
|
if($check3)
|
|
{
|
|
$this->app->DB->Update("UPDATE `userkonfiguration` SET `value` = '".$this->app->DB->real_escape_string($bezeichnung)."' WHERE id = '$check3' LIMIT 1");
|
|
}else{
|
|
$this->app->DB->Insert("INSERT INTO `userkonfiguration` (`user`, `value`, `name`) VALUES ('$u', '".$this->app->DB->real_escape_string($bezeichnung)."', 'welcome_linkname".$index."')");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return bool|int
|
|
*/
|
|
public function CheckRights()
|
|
{
|
|
if($this->app->User->GetType()==='admin'){
|
|
return true;
|
|
}
|
|
$action = $this->app->Secure->GetGET('action');
|
|
if($action !== 'meineapps') {
|
|
return true;
|
|
}
|
|
if(!$this->app->erp->RechteVorhanden('welcome','start')){
|
|
return false;
|
|
}
|
|
|
|
return $this->GetMeineApps();
|
|
}
|
|
|
|
/**
|
|
* @return bool|int
|
|
*/
|
|
protected function GetMeineApps()
|
|
{
|
|
if(is_array($this->_meineapps)) {
|
|
return (!empty($this->_meineapps)?count($this->_meineapps):0);
|
|
}
|
|
|
|
$anz = 0;
|
|
/** @var Appstore $appstore */
|
|
$appstore = $this->app->loadModule('appstore');
|
|
$modulliste = $appstore->getAppsList();
|
|
$modulliste = $appstore->markGetAppsWithUserRights($modulliste);
|
|
|
|
if(!empty($modulliste['installiert'])) {
|
|
foreach($modulliste['installiert'] as $module)
|
|
{
|
|
if(!empty($module['my_app'])) {
|
|
$this->_meineapps[] = $module;
|
|
$anz++;
|
|
}
|
|
}
|
|
}
|
|
if($anz) {
|
|
return $anz;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public function WelcomeMeineApps()
|
|
{
|
|
$this->app->User->SetParameter('appstore_filter', 'userapps');
|
|
$this->app->Location->execute('index.php?module=appstore&action=list');
|
|
|
|
// Suchebegriff wurde eingegeben
|
|
if ($this->app->Secure->GetGET('cmd') === 'suche') {
|
|
return $this->GetMeineAppsSuchergebnisse();
|
|
}
|
|
|
|
$this->app->erp->StartseiteMenu();
|
|
if($this->_meineapps) {
|
|
$cmeineapps = !empty($this->_meineapps)?count($this->_meineapps):0;
|
|
for($i = 0; $i < $cmeineapps; $i++)
|
|
{
|
|
$modul = $this->_meineapps[$i];
|
|
$modul['IconUrl'] = './themes/'.$this->app->Conf->WFconf['defaulttheme'].'/images/einstellungen/'.$modul['Icon'];
|
|
if (empty($modul['key'])){
|
|
$modul['key'] = md5($modul['Bezeichnung']);
|
|
}
|
|
$appstore = $this->app->erp->LoadModul('appstore');
|
|
$iconTag = $appstore->GetAppIconTagByCategory($modul['kategorie']);
|
|
|
|
$modulHtml = sprintf(
|
|
'<div class="app" id="%s">'.
|
|
'<a href="%s"><div class="icon app-category-icon-%s" alt="%s" border="0"></div><span>%s</span></a>'.
|
|
'</div>',
|
|
'modul-'.$modul['key'],
|
|
$modul['Link'],
|
|
$iconTag,
|
|
$modul['Bezeichnung'],
|
|
$modul['Bezeichnung']
|
|
);
|
|
$this->app->Tpl->Add('APPLIST', $modulHtml);
|
|
}
|
|
}
|
|
|
|
$this->app->Tpl->Parse('PAGE','welcome_meineapps.tpl');
|
|
}
|
|
|
|
/**
|
|
* @return JsonResponse
|
|
*/
|
|
public function GetMeineAppsSuchergebnisse(): JsonResponse
|
|
{
|
|
$suchbegriff = $this->app->Secure->GetPOST('val');
|
|
$modulliste = $this->_meineapps;
|
|
|
|
$anzeigen = [];
|
|
$ausblenden = [];
|
|
$moduleGefunden = 0;
|
|
/** @var Appstore $appStore */
|
|
$appStore = $this->app->loadModule('appstore');
|
|
|
|
foreach ($modulliste as $modul) {
|
|
if (empty($modul['key'])){
|
|
$modul['key'] = md5($modul['Bezeichnung']);
|
|
}
|
|
$appId = 'modul-'.$modul['key'];
|
|
if (empty($suchbegriff) || $appStore->match($modul['Bezeichnung'], $suchbegriff)) {
|
|
$anzeigen[$appId] = true;
|
|
$moduleGefunden++;
|
|
} else {
|
|
$ausblenden[$appId] = true;
|
|
}
|
|
}
|
|
|
|
return new JsonResponse(['anzeigen'=>$anzeigen,'ausblenden'=>$ausblenden,'gefunden'=>$moduleGefunden]);
|
|
}
|
|
|
|
|
|
public function WelcomePoll()
|
|
{
|
|
//$saction = $this->app->Secure->GetGET("saction"); //Edit Bruno 14.12.17 wird nicht verwendet
|
|
if(!empty($this->app->User) && method_exists($this->app->User, 'GetID') && !$this->app->User->GetID()) {
|
|
echo json_encode(array(array('event'=>'logout')));
|
|
exit;
|
|
}
|
|
$sid = (int)$this->app->Secure->GetGET('sid');
|
|
$noTimeoutUserEdit = $this->app->Secure->GetGET('nousertimeout');
|
|
|
|
if($sid > 0 && empty($noTimeoutUserEdit)) {
|
|
$user = $this->app->Secure->GetGET('user'); //Edit Bruno 14.12.17 reingezogen
|
|
$smodule = $this->app->Secure->GetGET('smodule');
|
|
$this->app->erp->TimeoutUseredit($smodule,$sid,$user);
|
|
}
|
|
|
|
$inv = false;
|
|
$invisible = (String)$this->app->Secure->GetPOST('invisible');
|
|
if($invisible == '1'){
|
|
$inv = true;
|
|
}
|
|
$cmd = $this->app->Secure->GetGET('cmd');
|
|
if($cmd==='messages') {
|
|
$result = $this->app->erp->UserEvent($inv);
|
|
if(!empty($result) && is_array($result)) {
|
|
echo json_encode($result);
|
|
$this->app->ExitXentral();
|
|
}
|
|
echo json_encode([]);
|
|
}
|
|
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
|
|
function WelcomeDirektzugriff()
|
|
{
|
|
$direktzugriff = $this->app->Secure->GetPOST('direktzugriff');
|
|
|
|
|
|
switch($direktzugriff)
|
|
{
|
|
case "1": $link="index.php?module=adresse&action=list"; break;
|
|
case "11": $link="index.php?module=adresse&action=list"; break;
|
|
case "12": $link="index.php?module=artikel&action=list"; break;
|
|
case "13": $link="index.php?module=projekt&action=list"; break;
|
|
|
|
case "2": $link="index.php?module=angebot&action=list"; break;
|
|
case "21": $link="index.php?module=anfrage&action=list"; break;
|
|
case "22": $link="index.php?module=angebot&action=list"; break;
|
|
case "23": $link="index.php?module=auftrag&action=list"; break;
|
|
|
|
case "3": $link="index.php?module=bestellung&action=list"; break;
|
|
case "31": $link="index.php?module=bestellung&action=list"; break;
|
|
case "32": $link="index.php?module=lager&action=ausgehend"; break;
|
|
case "33": $link="index.php?module=produktion&action=list"; break;
|
|
|
|
case "5": $link="index.php?module=rechnung&action=list"; break;
|
|
|
|
case "8": $link="index.php?module=lieferschein&action=list"; break;
|
|
case "81": $link="index.php?module=lieferschein&action=list"; break;
|
|
case "82": $link="index.php?module=lager&action=list"; break;
|
|
case "84": $link="index.php?module=versanderzeugen&action=offene"; break;
|
|
default: $link="index.php";
|
|
}
|
|
|
|
header('Location: '.$link);
|
|
exit;
|
|
}
|
|
|
|
function WelcomeAdapterbox()
|
|
{
|
|
$anzahl = null;
|
|
$ip = $this->app->Secure->GetGET('ip');
|
|
$serial = $this->app->Secure->GetGET('serial');
|
|
$device = $this->app->Secure->GetGET('device');
|
|
if(is_numeric($ip)){
|
|
$ip = long2ip($ip);
|
|
}
|
|
else {
|
|
$ip='';
|
|
}
|
|
|
|
echo 'OK';
|
|
$this->app->DB->Delete("DELETE FROM `adapterbox_log` WHERE `ip`='$ip' OR `seriennummer`='$serial'");
|
|
$this->app->DB->Insert("INSERT INTO `adapterbox_log` (`id`,`datum`,`ip`,`meldung`,`seriennummer`,`device`)
|
|
VALUES ('',NOW(),'$ip','Adapterbox connected ($device)','$serial','device')");
|
|
|
|
// check if there is an adapterbox
|
|
|
|
if($device==='zebra'
|
|
&& ($this->app->DB->Select("SELECT COUNT(`id`) FROM `drucker` WHERE `art`=2 AND `anbindung`='adapterbox'")
|
|
) <= 0 ) {
|
|
$this->app->DB->Insert(
|
|
"INSERT INTO `drucker` (`id`,`art`,`anbindung`,`adapterboxseriennummer`,`bezeichnung`,`name`,`aktiv`,`firma`)
|
|
VALUES ('','2','adapterbox','$serial','Zebra','Etikettendrucker',1,1)"
|
|
);
|
|
$tmpid = $this->app->DB->GetInsertID();
|
|
|
|
$this->app->erp->FirmendatenSet("standardetikettendrucker",$tmpid);
|
|
}
|
|
|
|
$xml ='
|
|
<label>
|
|
<line x="3" y="3" size="4">Step 2 of 2</line>
|
|
<line x="3" y="8" size="4">Connection establish</line>
|
|
<line x="3" y="13" size="4">Server: '.$_SERVER['SERVER_ADDR'].'</line>
|
|
</label>
|
|
';
|
|
|
|
if($this->app->erp->Firmendaten('deviceenable')=='1')
|
|
{
|
|
$job = base64_encode(json_encode(array('label'=>base64_encode($xml),'amount'=>$anzahl)));//."<amount>".$anzahl."</amount>");
|
|
$this->app->DB->Insert(
|
|
"INSERT INTO `device_jobs` (`id`,`zeitstempel`,`deviceidsource`,`deviceiddest`,`job`,`art`)
|
|
VALUES ('',NOW(),'000000000','$serial','$job','labelprinter')"
|
|
);
|
|
}
|
|
|
|
|
|
// update ip
|
|
if($ip!=''){
|
|
$this->app->DB->Update("UPDATE `drucker` SET `adapterboxip`='$ip' WHERE `adapterboxseriennummer`='$serial' LIMIT 1");
|
|
}
|
|
|
|
$this->app->erp->ExitWawi();
|
|
}
|
|
|
|
|
|
|
|
|
|
function WelcomeCronjob()
|
|
{
|
|
@ignore_user_abort(true);
|
|
include dirname(dirname(__DIR__)).'/cronjobs/starter.php';
|
|
exit;
|
|
}
|
|
|
|
function WelcomeCronjob2()
|
|
{
|
|
@ignore_user_abort(true);
|
|
include dirname(dirname(__DIR__)).'/cronjobs/starter2.php';
|
|
exit;
|
|
}
|
|
|
|
public function WelcomeStart()
|
|
{
|
|
$addtionalcspheader = ' '.str_replace([';','"'],'',$this->app->erp->Firmendaten('additionalcspheader')).' ';
|
|
$this->app->Tpl->Add('ADDITIONALCSPHEADER', $addtionalcspheader);
|
|
|
|
if($this->app->erp->UserDevice()==='smartphone')
|
|
{
|
|
$this->WelcomeStartSmartphone();
|
|
} else {
|
|
$this->WelcomeStartDesktop();
|
|
}
|
|
}
|
|
|
|
function WelcomeStartSmartphone()
|
|
{
|
|
header('Location: index.php?module=mobile&action=list');
|
|
exit;
|
|
}
|
|
|
|
public function WelcomeStartDesktop()
|
|
{
|
|
$tpl = '';
|
|
if($this->app->Secure->GetPOST('addfav')) {
|
|
$link = $this->app->Secure->GetPOST('link');
|
|
if(substr($link, -4) === '&id=') {
|
|
$link = substr($link, 0, -4);
|
|
}
|
|
if(strpos($link,'action=delete') !== false) {
|
|
$link = '';
|
|
}
|
|
$title = $this->app->Secure->GetPOST('title');
|
|
$newlink = $this->app->Secure->GetPOST('newlink');
|
|
$success = 0;
|
|
if(!empty($link)) {
|
|
for ($i = 1; $i <= 8; $i++) {
|
|
$linkAct = (String)$this->app->User->GetParameter('welcome_linklink' . $i);
|
|
if($linkAct === '' || $linkAct === $link){
|
|
$success = 1;
|
|
$this->app->User->SetParameter('welcome_links_eigen', 1);
|
|
$this->app->User->SetParameter('welcome_linklink' . $i, $link);
|
|
$this->app->User->SetParameter('welcome_linkname' . $i, $title);
|
|
$this->app->User->SetParameter('welcome_linkintern' . $i, $newlink ? 0 : 1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
header('Content-Type: application/json');
|
|
echo json_encode(['success' => $success]);
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
if($this->app->Secure->GetPOST('savelinks'))
|
|
{
|
|
$this->app->User->SetParameter('welcome_links_eigen',1);
|
|
for($i = 1; $i <= 8; $i++)
|
|
{
|
|
$this->app->User->SetParameter('welcome_linklink'.$i, $this->app->Secure->GetPOST('linklink'.$i));
|
|
$this->app->User->SetParameter('welcome_linkname'.$i, $this->app->Secure->GetPOST('linkname'.$i));
|
|
$this->app->User->SetParameter('welcome_linkintern'.$i, $this->app->Secure->GetPOST('linkintern'.$i));
|
|
}
|
|
}
|
|
$eigenlinks = $this->app->User->GetParameter('welcome_links_eigen');
|
|
|
|
if($eigenlinks)
|
|
{
|
|
for($i = 1; $i <= 8; $i++)
|
|
{
|
|
$links[] = array('name'=>$this->app->User->GetParameter('welcome_linkname'.$i),'link'=>$this->app->User->GetParameter('welcome_linklink'.$i),'intern'=>$this->app->User->GetParameter('welcome_linkintern'.$i));
|
|
}
|
|
|
|
}else{
|
|
$links = array(
|
|
array('name'=>'Eigene Einstellungen','link'=>'index.php?module=welcome&action=settings'),
|
|
array('name'=>'','link'=>'','intern'=>''),
|
|
array('name'=>'','link'=>'','intern'=>''),
|
|
array('name'=>'','link'=>'','intern'=>''),
|
|
array('name'=>'','link'=>'','intern'=>''),
|
|
array('name'=>'','link'=>'','intern'=>''),
|
|
array('name'=>'','link'=>'','intern'=>''),
|
|
array('name'=>'','link'=>'','intern'=>'')
|
|
);
|
|
}
|
|
if($links)
|
|
{
|
|
foreach($links as $k => $link)
|
|
{
|
|
$this->app->Tpl->Set('LINKNAME'.($k+1),$link['name']);
|
|
$this->app->Tpl->Set('LINKLINK'.($k+1),$link['link']);
|
|
if(isset($link['intern']) && $link['intern']){
|
|
$this->app->Tpl->Set('LINKINTERN'.($k+1),' checked="checked" ');
|
|
}
|
|
if($link['link'] && $link['name'])
|
|
{
|
|
$this->app->Tpl->Add('LINKS','<a href="'.$link['link'].'" '.(isset($link['intern']) && $link['intern']?'':'target="_blank"').' class="button button-primary">'.$link['name'].'</a> ');
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->app->erp->Headlines('Ihre Startseite');
|
|
$this->app->Tpl->Set('KURZUEBERSCHRIFT2','[BENUTZER]');
|
|
$this->app->erp->StartseiteMenu();
|
|
|
|
$this->app->Tpl->Set('TABTEXT','Ihre Startseite');
|
|
|
|
$module = $this->app->Secure->GetGET('module');
|
|
|
|
|
|
//fenster rechts offene vorgaenge ***
|
|
$this->app->Tpl->Set('SUBSUBHEADING','Vorgänge');
|
|
$arrVorgaenge = $this->app->DB->SelectArr("SELECT * FROM offenevorgaenge WHERE adresse='{$this->app->User->GetAdresse()}' ORDER by id DESC");
|
|
$this->app->Tpl->Set('INHALT','');
|
|
$carrVorgaenge = !empty($arrVorgaenge)?count($arrVorgaenge):0;
|
|
for($i=0;$i<$carrVorgaenge;$i++)
|
|
{
|
|
|
|
$this->app->Tpl->Add('VORGAENGE',"<tr><td>".substr(ucfirst($arrVorgaenge[$i]['titel']),0,100)."</td><td align=\"right\"><img src=\"./themes/[THEME]/images/1x1t.gif\" width=\"7\" border=\"0\" align=\"right\">
|
|
<a href=\"index.php?".$arrVorgaenge[$i]['href']."\"><img src=\"./themes/[THEME]/images/right.png\" border=\"0\" align=\"right\" title=\"Erledigen\"></a>
|
|
<a href=\"index.php?module=welcome&action=removevorgang&vorgang={$arrVorgaenge[$i]['id']}\"><img src=\"./themes/[THEME]/images/delete.svg\" border=\"0\" align=\"right\" title=\"Erledigt\"></a>
|
|
<img src=\"./themes/[THEME]/images/1x1t.gif\" width=\"3\" border=\"0\" align=\"right\">
|
|
<a href=\"javascript: var ergebnistext=prompt('Offenen Vorgang umbenennen:','".ucfirst($arrVorgaenge[$i]['titel'])."'); if(ergebnistext!='' && ergebnistext!=null) window.location.href='index.php?module=welcome&action=editvorgang&vorgang={$arrVorgaenge[$i]['id']}&titel='+ergebnistext;\"><img src=\"./themes/[THEME]/images/edit.svg\" alt=\"Bearbeiten\" title=\"Bearbeiten\" border=\"0\" align=\"right\"></a></td></tr>");
|
|
|
|
}
|
|
|
|
$this->app->Tpl->Set('CALENDAR_DAYNAMES','["{|Sonntag|}", "{|Montag|}", "{|Dienstag|}", "{|Mittwoch|}",
|
|
"{|Donnerstag|}", "{|Freitag|}", "{|Samstag|}"]');
|
|
$this->app->Tpl->Set('CALENDAR_MONTHNAMES','["{|Januar|}", "{|Februar|}", "{|März|}", "{|April|}", "{|Mai|}",
|
|
"{|Juni|}", "{|Juli|}", "{|August|}", "{|September|}", "{|Oktober|}", "{|November|}", "{|Dezember|}"]');
|
|
$this->app->Tpl->Set('CALENDAR_TODAY','{|Heute|}');
|
|
$this->app->Tpl->Set('CALENDAR_MONTH','{|Monat|}');
|
|
$this->app->Tpl->Set('CALENDAR_WEEK','{|Woche|}');
|
|
$this->app->Tpl->Set('CALENDAR_DAY','{|Tag|}');
|
|
$this->app->erp->KalenderList('KALENDER');
|
|
|
|
$this->app->Tpl->Parse('STARTSEITE','lesezeichen.tpl');
|
|
|
|
if($this->app->User->GetType()==='admin')
|
|
{
|
|
$this->app->Tpl->Set('UMSATZ','<h1 onmouseover="document.getElementById(\'umsatzwoche\').style.display=\'block\';" onmouseout="document.getElementById(\'umsatzwoche\').style.display=\'none\';">Umsatz ab Montag</h1>
|
|
<div style="margin:5px;display:none" id="umsatzwoche"><table width="90%">
|
|
'.$tpl.'
|
|
</table>
|
|
</div>
|
|
<br>');
|
|
}
|
|
|
|
if($this->app->erp->RechteVorhanden('kalender','list'))
|
|
{
|
|
$this->app->Tpl->Set('TERMINE', $this->Termine($this->app->DB->Select('SELECT CURDATE();')));
|
|
$this->app->Tpl->Set('TERMINEMORGEN', $this->Termine($this->app->DB->Select('SELECT DATE_ADD(CURDATE(), INTERVAL 1 DAY);')));
|
|
}
|
|
|
|
$summestunden = $this->app->DB->Select("SELECT SUM((UNIX_TIMESTAMP(z.bis)-UNIX_TIMESTAMP(z.von))/3600.0) as stunden
|
|
FROM zeiterfassung z WHERE z.abrechnen='1' AND z.ist_abgerechnet IS NULL OR z.ist_abgerechnet='0' AND z.adresse_abrechnung > 0");
|
|
|
|
if($summestunden > 0)
|
|
$this->app->Tpl->Add('DRINGEND','<li>'.number_format($summestunden,2,',','.').' Stunden nicht abgerechnet (<a href="index.php?module=zeiterfassung&action=abrechnenpdf">PDF</a>)</li>');
|
|
|
|
|
|
$this->app->Tpl->Set('USERNAME',$this->app->User->GetName());
|
|
|
|
$tmp = $this->app->DB->SelectArr("SELECT * FROM aufgabe WHERE (adresse='".$this->app->User->GetAdresse()."' OR (initiator='".$this->app->User->GetAdresse()."' AND adresse<=0)) AND startseite='1' AND (status='offen' or status='') AND ((intervall_tage > 0 AND abgabe_bis <=NOW()) OR intervall_tage <=0) ORDER by prio DESC");
|
|
//TODOFORUSER
|
|
$ctmp = !empty($tmp)?count($tmp):0;
|
|
for($i=0;$i<$ctmp;$i++)
|
|
{
|
|
$name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='".$tmp[$i]['initiator']."' LIMIT 1");
|
|
$high="";
|
|
if($tmp[$i]['initiator']!=$tmp[$i]['adresse']) {
|
|
$additional = "<br><font style=\"font-size:8pt\">von ".$name."</font>";
|
|
} else {
|
|
$additional='';
|
|
}
|
|
|
|
|
|
if($tmp[$i]['prio']=='1') {
|
|
$class='noteit_highprio';
|
|
$high=" (<font color=red><strong>Prio</strong></font>)";
|
|
}
|
|
else {
|
|
$class='noteit';
|
|
}
|
|
|
|
|
|
|
|
$this->app->Tpl->Add('TODOFORUSER',"<tr><td width=\"90%\">".$tmp[$i]['aufgabe'].$additional.$high."</td><td width=\"10%\"><span style=\"cursor:pointer\" onclick=\"if(!confirm('Wirklich ".$tmp[$i]['aufgabe']." bearbeiten?')) return false; else AufgabenEdit(".$tmp[$i]['id'].");\"><img src=\"./themes/new/images/edit.svg\"></span>
|
|
<span style=\"cursor:pointer\" onclick=\"if(!confirm('Wirklich ".$tmp[$i]['aufgabe']." abschließen?')) return false; else window.location.href='index.php?module=aufgaben&action=abschluss&id=".$tmp[$i]['id']."&referrer=1';\"><img src=\"./themes/new/images/forward.svg\"></span></td></tr>");
|
|
|
|
}
|
|
|
|
if($i<=0){
|
|
$this->app->Tpl->Add('TODOFORUSER', '<tr><td><center><i>{|Keine Aufgaben für die Startseite|}</i></center></td></tr>');
|
|
}
|
|
|
|
$tmp = $this->app->DB->SelectArr("SELECT * FROM aufgabe WHERE initiator='".$this->app->User->GetAdresse()."' AND adresse!='".$this->app->User->GetAdresse()."' AND adresse > 0 AND startseite='1' AND status='offen' AND ((intervall_tage > 0 AND abgabe_bis <=NOW()) OR intervall_tage <=0) ORDER by prio DESC");
|
|
$ctmp = !empty($tmp)?count($tmp):0;
|
|
|
|
if($ctmp > 0){
|
|
$this->app->Tpl->Add('TODOFORMITARBEITER', '<h4> Vergebene Aufgaben:</h4>');
|
|
}
|
|
|
|
|
|
for($i=0;$i<$ctmp;$i++)
|
|
{
|
|
$name = $this->app->DB->Select("SELECT name FROM adresse WHERE id='".$tmp[$i]['adresse']."' LIMIT 1");
|
|
$high='';
|
|
if($tmp[$i]['prio']=='1') {
|
|
$class='noteit_highprio';
|
|
$high=' (Prio)';
|
|
}
|
|
else {
|
|
$class='noteit';
|
|
}
|
|
|
|
|
|
$this->app->Tpl->Add('TODOFORMITARBEITER','<tr><td>'.$tmp[$i]['aufgabe']."$high<br><font style=\"font-size:8pt\">für ".$name.'</font></td></tr>');
|
|
}
|
|
|
|
$this->app->Tpl->Set('ACCORDION', $this->Accordion());
|
|
|
|
$ctx = stream_context_create(array(
|
|
'http' => array(
|
|
'timeout' => 1
|
|
)
|
|
)
|
|
);
|
|
|
|
/*
|
|
$result_news = file_get_contents("https://{$this->app->Conf->updateHost}/news.php?version=".$this->app->erp->Version(),0, $ctx);
|
|
|
|
if($result_news=='')
|
|
{
|
|
$result_news = '
|
|
<div class="content">
|
|
<span class="headline">Die neue Version 20.3 ist nun verfügbar und gespickt mit dutzenden neuen Features!</span>
|
|
<p>Im Xentral Community Forum könnt Ihr euch einen Überblick über die neuen Funktionen verschaffen.</p>
|
|
<a href="//community.xentral.com/hc/de/articles/360017815440-Top-Features-ab-Version-20-3" target="_blank" class="to-nues">Neues von Xentral</a>
|
|
</div>';
|
|
}
|
|
$this->app->Tpl->Set('EXTERNALNEWS', $result_news);
|
|
*/
|
|
|
|
|
|
/*
|
|
$result_handbook = file_get_contents('https://xentral.biz/handbook.php?version='.$this->app->erp->Version(),0, $ctx);
|
|
if($result_handbook=='')
|
|
{
|
|
$result_handbook='<ul>
|
|
<li><a href="https://xentral.biz/helpdesk/kurzanleitung-einrichtung-faq-leitfaden" target="_blank">Erste Schritte / Einstieg</a></li>
|
|
<li><a style="font-weight:normal" href="https://xentral.biz/helpdesk/kurzanleitung-import-von-stammdaten" target="_blank">Import von Stammdaten</a> <a href="https://xentral.biz/helpdesk/kurzanleitung-import-von-stammdaten" target="_blank">mehr</a></li>
|
|
<li><a style="font-weight:normal" href="https://xentral.biz/helpdesk/kurzanleitung-import-von-stammdaten" target="_blank">Automatisches Backup einrichten</a> <a href="https://xentral.biz/helpdesk/backup" target="_blank">mehr</a></li>
|
|
<li><a href="https://xentral.biz/akademie-home" target="_blank">Link zu Online-Handbuch</a></li>
|
|
<li><a href="https://forum.xentral.biz/" target="_blank">Forum für Open-Source Version</a></li><li><a href="https://xentral.biz/versionen#tab-versionen-tab4" target="_blank">Supportverträge für Xentral</a></li></ul>';
|
|
}
|
|
|
|
$this->app->Tpl->Set('EXTERNALHANDBOOK', $result_handbook);
|
|
*/
|
|
|
|
// Aufgabe-Bearbeiten-Popup
|
|
$pinnwaende = $this->app->erp->GetPinwandSelect();
|
|
$pinnwand = "";
|
|
foreach($pinnwaende as $key=>$value){
|
|
$pinnwand .= "<option value='$key'>".$value."</option>";
|
|
}
|
|
$this->app->Tpl->Set("PINNWAND", $pinnwand);
|
|
$this->app->YUI->CkEditor("e_notizen","belege",array("width"=>"625"));
|
|
$this->app->YUI->CkEditor("e_beschreibung","belege",array("width"=>"420"));
|
|
$this->app->YUI->DatePicker("e_datum");
|
|
$this->app->YUI->TimePicker("e_zeit");
|
|
$this->app->Tpl->Parse('AUFGABENPOPUP','aufgaben_popup.tpl');
|
|
// ENDE:Aufgabe-Bearbeiten-Popup
|
|
|
|
$this->app->erp->RunHook('welcome_start', 1 , $this);
|
|
|
|
// Xentral 20 database compatibility
|
|
if ($this->app->DB->Select("SHOW COLUMNS FROM `user` LIKE 'role'")) {
|
|
|
|
if(empty($this->app->User->GetField('role')) || $this->app->acl->IsAdminadmin()) {
|
|
$this->app->ModuleScriptCache->IncludeWidgetNew('ClickByClickAssistant');
|
|
$this->app->ModuleScriptCache->IncludeJavascriptFiles(
|
|
'welcome',
|
|
[
|
|
'body' => [
|
|
'./classes/Modules/Welcome/www/js/welcome_firststart.js',
|
|
],
|
|
]
|
|
);
|
|
$this->app->Tpl->Parse('AUFGABENPOPUP', 'welcome_firststart.tpl');
|
|
}
|
|
}
|
|
|
|
if($this->app->User->GetType() === 'admin') {
|
|
$this->app->Tpl->Set('COLROWTASKS', '6');
|
|
}
|
|
else {
|
|
$this->app->Tpl->Set('COLROWTASKS', '12');
|
|
$this->app->Tpl->Set('BEFORELEARNINGDASHBOARDTILE', '<!--');
|
|
$this->app->Tpl->Set('AFTERLEARNINGDASHBOARDTILE', '-->');
|
|
}
|
|
|
|
$this->checkFreeSpace();
|
|
|
|
$this->app->Tpl->Parse('PAGE','startseite.tpl');
|
|
}
|
|
|
|
protected function checkFreeSpace(){
|
|
/** @var SystemHealthService $service */
|
|
$systemHealthService = $this->app->Container->get('SystemHealthService');
|
|
try{
|
|
$freeDiskSpace = $systemHealthService->getDiskFree('');
|
|
|
|
if($freeDiskSpace === false){
|
|
return;
|
|
}
|
|
|
|
$freeDiskSpaceInMegabyte = $freeDiskSpace / (1024 * 1024);
|
|
if($freeDiskSpaceInMegabyte < 512){
|
|
$this->app->Tpl->Set('MESSAGE', '<div class="error">{|Weniger als 500 MB Speicherplatz frei.|}</div>');
|
|
}
|
|
elseif($freeDiskSpaceInMegabyte < 2048){
|
|
$this->app->Tpl->Set('MESSAGE', '<div class="warning">{|Weniger als 2 GB Speicherplatz frei.|}</div>');
|
|
}
|
|
|
|
} catch(Exception $e){
|
|
$this->app->erp->LogFile('can not evaluate disk space: ' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
|
|
public function WelcomeIcons()
|
|
{
|
|
$type = $this->app->Secure->GetGET('type');
|
|
header('Content-type: image/svg+xml');
|
|
|
|
switch($type)
|
|
{
|
|
case 'artikelgruppe.svg':
|
|
$xml = file_get_contents('./images/icons/artikelgruppe.svg');
|
|
break;
|
|
}
|
|
|
|
$farbe1 = $this->app->erp->Firmendaten('firmenfarbeganzdunkel');
|
|
|
|
if($farbe1 ==''){
|
|
$farbe1 = '#26727a';//$farbe1 = "rgb(7, 134, 153)";
|
|
}
|
|
|
|
$farbe2 = '#e43f25'; // rot im artikel
|
|
$farbe3 = '#a6e0be'; // hell tyrkis im artikel kreis
|
|
$farbe4 = '#449cbe'; // dunkelblau im artikel rechteck
|
|
|
|
$xml = str_replace('#3fb9cd',$farbe1,$xml);
|
|
$xml = str_replace('#e43f25',$farbe2,$xml);
|
|
$xml = str_replace('#a6e0be',$farbe3,$xml);
|
|
$xml = str_replace('#449cbe',$farbe4,$xml);
|
|
|
|
echo $xml;
|
|
$this->app->erp->ExitWawi();
|
|
}
|
|
|
|
public function WelcomeLogo()
|
|
{
|
|
$firmenlogo = $this->app->erp->getSettingsFile('firmenlogo');
|
|
if($firmenlogo!='')
|
|
{
|
|
header('Content-Type: image/png');
|
|
echo $firmenlogo;
|
|
}
|
|
$this->app->erp->ExitWawi();
|
|
}
|
|
|
|
|
|
public function WelcomeCss()
|
|
{
|
|
$file = $this->app->Secure->GetGET('file');
|
|
|
|
if ($this->app->erp->UserDevice()!=='smartphone') {
|
|
if($file==='style.css'){
|
|
$tmp = file_get_contents('./themes/new/css/style.css');
|
|
}
|
|
|
|
|
|
if($file==='popup.css'){
|
|
$tmp = file_get_contents('./themes/new/css/popup.css');
|
|
}
|
|
|
|
|
|
if($file==='grid.css'){
|
|
$tmp = file_get_contents('./themes/new/css/grid.css');
|
|
}
|
|
}
|
|
$tmpfirmendatenfkt = 'Firmendaten';
|
|
if(method_exists($this->app->erp,'TplFirmendaten')){
|
|
$tmpfirmendatenfkt = 'TplFirmendaten';
|
|
}
|
|
|
|
$firmenfarbehell = $this->app->erp->$tmpfirmendatenfkt('firmenfarbehell');
|
|
if($firmenfarbehell ==''){
|
|
$firmenfarbehell = '#c2e3ea';//rgb(67, 187, 209)"; //ALT
|
|
}
|
|
|
|
$firmenfarbedunkel = $this->app->erp->$tmpfirmendatenfkt('firmenfarbedunkel');
|
|
if($firmenfarbedunkel ==''){
|
|
$firmenfarbedunkel = '#53bed0';//rgb(2, 125, 141)"; //ALT
|
|
}
|
|
|
|
$firmenfarbeganzdunkel = $this->app->erp->$tmpfirmendatenfkt('firmenfarbeganzdunkel');
|
|
if($firmenfarbeganzdunkel ==''){
|
|
$firmenfarbeganzdunkel = '#018fa3';
|
|
}
|
|
|
|
$navigationfarbe = $this->app->erp->$tmpfirmendatenfkt('navigationfarbe'); //ALT
|
|
if($navigationfarbe ==''){
|
|
$navigationfarbe = '#48494b';
|
|
}
|
|
|
|
$navigationfarbeschrift = $this->app->erp->$tmpfirmendatenfkt('navigationfarbeschrift');
|
|
if($navigationfarbeschrift ==''){
|
|
$navigationfarbeschrift = '#c9c9cb';
|
|
}
|
|
|
|
$navigationfarbe2 = $this->app->erp->$tmpfirmendatenfkt('navigationfarbe2'); //ALT
|
|
if($navigationfarbe2 ==''){
|
|
$navigationfarbe2 = $navigationfarbeschrift;
|
|
}
|
|
|
|
$navigationfarbeschrift2 = $this->app->erp->$tmpfirmendatenfkt('navigationfarbeschrift2');
|
|
if($navigationfarbeschrift2 ==''){
|
|
$navigationfarbeschrift2 = $navigationfarbe;
|
|
}
|
|
|
|
$unternavigationfarbe = $this->app->erp->$tmpfirmendatenfkt('unternavigationfarbe');
|
|
if($unternavigationfarbe ==''){
|
|
$unternavigationfarbe = '#d5ecf2';
|
|
}
|
|
|
|
$unternavigationfarbeschrift = $this->app->erp->$tmpfirmendatenfkt('unternavigationfarbeschrift');
|
|
if($unternavigationfarbeschrift ==''){
|
|
$unternavigationfarbeschrift = '#027d8d';
|
|
}
|
|
|
|
|
|
$firmenfarbe = $this->app->erp->$tmpfirmendatenfkt('firmenfarbe');
|
|
if($firmenfarbe ==''){
|
|
$firmenfarbe = '#48494b';
|
|
}
|
|
|
|
$navigationfarbeschrift2 = $this->app->erp->$tmpfirmendatenfkt('navigationfarbeschrift2');
|
|
if($navigationfarbeschrift2 ==''){
|
|
$navigationfarbeschrift2 = '#ffffff';
|
|
}
|
|
|
|
$tmp = str_replace('[TPLSYSTEMBASE]',$firmenfarbe,$tmp);
|
|
|
|
if($this->app->erp->Firmendaten('iconset_dunkel')=='1'){
|
|
$tmp = str_replace('[TPLNACHRICHTBOX]', 'rgba(255,255,255,0.5)', $tmp);
|
|
}
|
|
else{
|
|
$tmp = str_replace('[TPLNACHRICHTBOX]', 'rgba(255,255,255,0.1)', $tmp);
|
|
}
|
|
|
|
$tmp = str_replace('[TPLFIRMENFARBEHELL]',$firmenfarbehell,$tmp);
|
|
$tmp = str_replace('[TPLFIRMENFARBEDUNKEL]',$firmenfarbedunkel,$tmp);
|
|
$tmp = str_replace('[TPLFIRMENFARBEGANZDUNKEL]',$firmenfarbeganzdunkel,$tmp);
|
|
$tmp = str_replace('[TPLNAVIGATIONFARBE]',$navigationfarbe,$tmp);
|
|
$tmp = str_replace('[TPLNAVIGATIONFARBE2]',$navigationfarbe2,$tmp);
|
|
$tmp = str_replace('[TPLNAVIGATIONFARBESCHRIFT]',$navigationfarbeschrift,$tmp);
|
|
$tmp = str_replace('[TPLNAVIGATIONFARBESCHRIFT2]',$navigationfarbeschrift2,$tmp);
|
|
|
|
$tmp = str_replace('[TPLUNTERNAVIGATIONFARBE]',$unternavigationfarbe,$tmp);
|
|
$tmp = str_replace('[TPLUNTERNAVIGATIONFARBESCHRIFT]',$unternavigationfarbeschrift,$tmp);
|
|
|
|
|
|
$subaction = $this->app->Secure->GetGET('subaction');
|
|
$submodule = $this->app->Secure->GetGET('submodule');
|
|
if($subaction=='pinwand' || $subaction=='start' || $submodule=='kalender'){
|
|
$tmp = str_replace('[JSDMMZINDEX]', '10000', $tmp);
|
|
}
|
|
else{
|
|
$tmp = str_replace('[JSDMMZINDEX]', '10', $tmp);
|
|
}
|
|
|
|
if($this->app->erp->Firmendaten('standardaufloesung')=='1'){
|
|
$tmp = str_replace('[CSSSMALL1]','1000',$tmp);
|
|
$tmp = str_replace('[CSSSMALL2]','1000',$tmp);
|
|
$tmp = str_replace('[CSSMARGIN]','margin-left: auto; margin-right: auto;',$tmp);
|
|
} else {
|
|
$tmp = str_replace('[CSSSMALL1]','1200',$tmp);
|
|
$tmp = str_replace('[CSSSMALL2]','1200',$tmp);
|
|
$tmp = str_replace('[CSSMARGIN]','margin-left: auto; margin-right: auto;',$tmp);
|
|
}
|
|
|
|
header('Content-type: text/css');
|
|
echo $tmp;
|
|
$this->app->erp->ExitWawi();
|
|
}
|
|
|
|
|
|
public function WelcomeAddPinwand()
|
|
{
|
|
|
|
$user = $this->app->User->GetID();
|
|
$users = $this->app->DB->SelectArr("SELECT u.id, a.name as description FROM user u LEFT JOIN adresse a ON a.id=u.adresse WHERE u.activ='1' ORDER BY u.username");
|
|
$user_out = '';
|
|
$cusers = !empty($users)?count($users):0;
|
|
for($i=0; $i<$cusers;$i++){
|
|
$select = $user==$users[$i]['id'] ? 'selected' : '';
|
|
$user_out .= "<option value=\"{$users[$i]['id']}\" $select>{$users[$i]['description']}</option>";
|
|
}
|
|
$this->app->Tpl->Set('PERSONEN', $user_out);
|
|
|
|
$name = $this->app->Secure->GetPOST('name');
|
|
if($name!='')
|
|
{
|
|
$personen = $this->app->Secure->GetPOST('personen');
|
|
$this->app->DB->Insert("INSERT INTO pinwand (id,name,user) VALUES ('','$name','$user')");
|
|
$pinwand = $this->app->DB->GetInsertID();
|
|
$cpersonen = !empty($personen)?count($personen):0;
|
|
for($i=0;$i<=$cpersonen;$i++)
|
|
{
|
|
if($personen[$i] > 0)
|
|
{
|
|
$this->app->DB->Insert("INSERT INTO pinwand_user (pinwand,user) VALUES ('$pinwand','".$personen[$i]."')");
|
|
}
|
|
}
|
|
|
|
$this->app->Tpl->Set('PAGE', "<script>
|
|
parent.location.href = './index.php?module=welcome&action=pinwand';
|
|
</script>");
|
|
}
|
|
else {
|
|
$this->app->Tpl->Parse('PAGE','welcome_pinwand_addpinwand.tpl');
|
|
}
|
|
|
|
$this->app->BuildNavigation=false;
|
|
}
|
|
|
|
public function WelcomeAddNote()
|
|
{
|
|
$aufgabeid = (int)$this->app->Secure->GetGET('aufgabeid');
|
|
$beschreibung = $this->app->Secure->GetPOST('notebody');
|
|
if($beschreibung!='')
|
|
{
|
|
$color = $this->app->Secure->GetPOST('color');
|
|
$aufgabe = $beschreibung;
|
|
$pinwand = $this->app->Secure->GetGET('pinwand');
|
|
|
|
$aufgabe = str_replace('\r\n',' ',$aufgabe);
|
|
|
|
$max_z = $this->app->DB->Select("SELECT MAX(note_z) FROM aufgabe WHERE adresse='".$this->app->User->GetAdresse()."' ");
|
|
$new = true;
|
|
if($aufgabeid)
|
|
{
|
|
$cuid = $this->app->DB->Select("SELECT id FROM aufgabe WHERE adresse = '".$this->app->User->GetAdresse()."' AND id = ".$aufgabeid." LIMIT 1");
|
|
if($cuid)
|
|
{
|
|
$new = false;
|
|
$id = $cuid;
|
|
}
|
|
}
|
|
|
|
if($this->app->erp->is_html($aufgabe))
|
|
{
|
|
$aufgabe = strip_tags(str_replace('<', ' <', $aufgabe));
|
|
$aufgabe = trim(str_replace(' ', ' ', $aufgabe));
|
|
|
|
if($new){
|
|
$id = $this->app->erp->CreateAufgabe($this->app->User->GetAdresse(),$aufgabe);
|
|
}
|
|
}
|
|
else{
|
|
if($new){
|
|
$id = $this->app->erp->CreateAufgabe($this->app->User->GetAdresse(), $aufgabe);
|
|
}
|
|
}
|
|
$xy = $this->getCoordsForNewTask($id);
|
|
$note_x = $xy['note_x'];
|
|
$note_y = $xy['note_y'];
|
|
$this->app->DB->Update(
|
|
"UPDATE aufgabe
|
|
SET pinwand='1',
|
|
pinwand_id='$pinwand',
|
|
note_color='$color',
|
|
note_z='$max_z',
|
|
note_x='".$note_x."',
|
|
note_y='".$note_y."',
|
|
beschreibung='$beschreibung'
|
|
WHERE id='$id' LIMIT 1"
|
|
);
|
|
|
|
$this->app->Tpl->Set('PAGE', "<script>
|
|
parent.location.href = './index.php?module=welcome&action=pinwand&pinwand=$pinwand';
|
|
</script>");
|
|
}
|
|
else {
|
|
if($aufgabeid)
|
|
{
|
|
$aufg = $this->app->DB->SelectArr('SELECT * FROM aufgabe WHERE id = '.$aufgabeid.' LIMIT 1');
|
|
if($aufg)
|
|
{
|
|
$aufg = reset($aufg);
|
|
$this->app->Tpl->Set('PADDNOTE_BODY',$aufg['beschreibung']);
|
|
$this->app->Tpl->Set('PADDNOTE_JS',"
|
|
<script type=\"text/javascript\">
|
|
$(document).ready(function() {
|
|
$('#paddnotecolor').val('".$aufg['note_color']."');
|
|
});
|
|
</script>
|
|
");
|
|
|
|
}
|
|
}
|
|
|
|
$this->app->YUI->CkEditor('notebody','belege');//,array("height"=>"450"));
|
|
|
|
$this->app->Tpl->Parse('PAGE','welcome_pinwand_addnote.tpl');
|
|
}
|
|
|
|
$this->app->BuildNavigation=false;
|
|
}
|
|
|
|
public function WelcomeDelNote()
|
|
{
|
|
$id = $this->app->Secure->GetGET('id');
|
|
$pinwand = $this->app->Secure->GetGET('pinwand');
|
|
if($id > 0){
|
|
$this->app->DB->Update("DELETE FROM aufgabe WHERE id='$id' LIMIT 1");
|
|
}
|
|
header('Location: index.php?module=welcome&action=pinwand&pinwand='.$pinwand);
|
|
exit;
|
|
}
|
|
|
|
public function WelcomeOkNote()
|
|
{
|
|
$id = $this->app->Secure->GetGET('id');
|
|
$pinwand = $this->app->Secure->GetGET('pinwand');
|
|
|
|
$this->app->erp->AbschlussAufgabe($id);
|
|
//$this->app->DB->Update("UPDATE aufgabe SET status='abgeschlossen' WHERE id='$id' LIMIT 1");
|
|
header('Location: index.php?module=welcome&action=pinwand&pinwand='.$pinwand);
|
|
exit;
|
|
}
|
|
|
|
public function WelcomeMoveNote()
|
|
{
|
|
$id = $this->app->Secure->GetGET('id');
|
|
if($id > 0){
|
|
$x = $this->app->Secure->GetGET('x');
|
|
$y = $this->app->Secure->GetGET('y');
|
|
$z = $this->app->Secure->GetGET('z');
|
|
$this->app->DB->Update("UPDATE aufgabe SET note_x='$x',note_y='$y',note_z='$z' WHERE id='$id' LIMIT 1");
|
|
}
|
|
exit;
|
|
}
|
|
|
|
public function WelcomePinwand()
|
|
{
|
|
$this->app->erp->StartseiteMenu();
|
|
|
|
$cmd = $this->app->Secure->GetGET('cmd');
|
|
$pinwand = $this->app->Secure->GetGET('pinwand');
|
|
|
|
switch($cmd)
|
|
{
|
|
case 'resize':
|
|
$id = $this->app->Secure->GetGET('id');
|
|
if($id > 0)
|
|
{
|
|
$w = $this->app->Secure->GetGET('w');
|
|
$h = $this->app->Secure->GetGET('h');
|
|
$this->app->DB->Update("UPDATE aufgabe SET note_w='".$this->app->DB->real_escape_string($w)."',
|
|
note_h='".$this->app->DB->real_escape_string($h)."' WHERE id='$id' LIMIT 1");
|
|
$result['status']=1;
|
|
} else {
|
|
$result['status']=0;
|
|
$result['statusText']='Fehlgeschlagen';
|
|
}
|
|
echo json_encode($result);
|
|
exit;
|
|
break;
|
|
case 'get':
|
|
$id = $this->app->Secure->GetPOST('id');
|
|
$result['id']=$id;
|
|
$result['beschreibung']=$this->app->DB->Select("SELECT beschreibung FROM aufgabe WHERE id='$id' LIMIT 1");
|
|
$result['note_color']=$this->app->DB->Select("SELECT note_color FROM aufgabe WHERE id='$id' LIMIT 1");
|
|
$result['status']=1;
|
|
$result['statusText']='';
|
|
echo json_encode($result);
|
|
exit;
|
|
break;
|
|
case 'save':
|
|
$id = $this->app->Secure->GetPOST('id');
|
|
$beschreibung = $this->app->Secure->GetPOST('beschreibung');
|
|
$note_color = $this->app->Secure->GetPOST('note_color');
|
|
$pinwand = $this->app->Secure->GetPOST('pinwand');
|
|
if($pinwand <=0) {
|
|
$pinwand=0;
|
|
}
|
|
if($id > 0)
|
|
{
|
|
$this->app->DB->Update("UPDATE aufgabe SET beschreibung='".$this->app->DB->real_escape_string($beschreibung)."',
|
|
note_color='".$this->app->DB->real_escape_string($note_color)."' WHERE id='$id' LIMIT 1");
|
|
$result['note_color']=$note_color;
|
|
$result['beschreibung']=$beschreibung;
|
|
$result['status']=1;
|
|
} else {
|
|
$aufgabe = strip_tags(str_replace('<', ' <', $beschreibung));
|
|
$aufgabe = trim(str_replace(' ', ' ', $aufgabe));
|
|
$max_z = $this->app->DB->Select("SELECT MAX(note_z) FROM aufgabe WHERE adresse='".$this->app->User->GetAdresse()."'");
|
|
$id = $this->app->erp->CreateAufgabe($this->app->User->GetAdresse(),$aufgabe);
|
|
$xy = $this->getCoordsForNewTask($id);
|
|
$note_x = $xy['note_x'];
|
|
$note_y = $xy['note_y'];
|
|
$this->app->DB->Update(
|
|
"UPDATE aufgabe
|
|
SET note_color='".$this->app->DB->real_escape_string($note_color)."',
|
|
beschreibung='".$this->app->DB->real_escape_string($beschreibung)."',
|
|
note_z='".$max_z."',
|
|
note_x='".$note_x."',
|
|
note_y='".$note_y."',
|
|
pinwand='1',
|
|
pinwand_id='".$pinwand."'
|
|
WHERE id='$id' LIMIT 1"
|
|
);
|
|
|
|
$result['note_color']=$note_color;
|
|
$result['beschreibung']=$beschreibung;
|
|
$result['status']=1;
|
|
$result['statusText']='';
|
|
}
|
|
echo json_encode($result);
|
|
exit;
|
|
break;
|
|
|
|
}
|
|
|
|
if($pinwand <=0)
|
|
{
|
|
$tmp = $this->app->DB->SelectArr("SELECT * FROM aufgabe WHERE adresse='".$this->app->User->GetAdresse()."' AND pinwand='1' AND pinwand_id='0' AND status='offen'");
|
|
} else {
|
|
$erlaubt = true;
|
|
if($this->app->User->GetType() != 'admin')
|
|
{
|
|
$check = $this->app->DB->Select("SELECT id FROM pinwand WHERE id = '$pinwand' AND `user` = '".$this->app->User->GetID()."'");
|
|
if(!$check && !$this->app->DB->Select("SELECT id FROM pinwand_user WHERE pinwand = '$pinwand' AND `user` = '".$this->app->User->GetID()."' LIMIT 1"))
|
|
{
|
|
$erlaubt = false;
|
|
}
|
|
}
|
|
if($erlaubt)
|
|
{
|
|
$tmp = $this->app->DB->SelectArr("SELECT * FROM aufgabe WHERE pinwand='1' AND pinwand_id='$pinwand' AND status='offen'");
|
|
}
|
|
}
|
|
$ctmp = !empty($tmp)?count($tmp):0;
|
|
for($i=0;$i<$ctmp;$i++)
|
|
{
|
|
$left = $tmp[$i]['note_x'];
|
|
$color = $tmp[$i]['note_color'];
|
|
if($color==''){
|
|
$color='yellow';
|
|
}
|
|
$top = $tmp[$i]['note_y'];
|
|
$zindex = $tmp[$i]['note_z'];
|
|
$text = nl2br($this->app->erp->ReadyForPDF($tmp[$i]['beschreibung']));
|
|
if($text=='') {
|
|
$text = $tmp[$i]['aufgabe'];
|
|
}
|
|
$id = $tmp[$i]['id'];
|
|
$projekt = $this->app->DB->Select("SELECT abkuerzung FROM projekt WHERE id='".$tmp[$i]['projekt']."' LIMIT 1");
|
|
|
|
$width = $tmp[$i]['note_w']?$tmp[$i]['note_w']:130;
|
|
$height = $tmp[$i]['note_h']?$tmp[$i]['note_h']:130;
|
|
|
|
if($pinwand <= 0) {
|
|
$pinwand=0;
|
|
}
|
|
|
|
$seriennummer = $this->app->DB->Select("SELECT seriennummer FROM adapterbox WHERE verwendenals='bondrucker' LIMIT 1");
|
|
if($seriennummer!=''){
|
|
$menu_bon = '<a href="#" onclick=AjaxCall("index.php?module=aufgaben&action=bondrucker&id=' . $id . '");><img src="themes/[THEME]/images/bon_druck.png" border="0"></a> ';
|
|
}
|
|
else{
|
|
$menu_bon = '<a href="#" onclick=InfoBox("aufgabe_bondrucker");><img src="themes/[THEME]/images/bon_druck.png" border="0"></a> ';
|
|
}
|
|
|
|
switch($color)
|
|
{
|
|
case 'yellow': $color='#f69e06'; break;
|
|
case 'blue': $color='#41b3ce'; break;
|
|
case 'green': $color='#a9ca45'; break;
|
|
case 'coral': $color='#be3978'; break;
|
|
}
|
|
|
|
$result = ' <div class="note" id="note'.$id.'" style="border-left-color:'.$color.';left:'.$left.'px;top:'.$top.'px; z-index:'.$zindex.'; width:'.$width.'px;height:'.$height.'px;">
|
|
<div id="notehtml'.$id.'">'.$text.'</div>
|
|
<div class="author">'.$projekt.'
|
|
<a href="#" onclick="PinwandEdit('.$pinwand.','.$id.');">
|
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.9442 2.05599C13.5429 1.65638 12.9986 1.43371 12.4323 1.43755C11.866 1.44138 11.3247 1.6714 10.9289 2.07641L2.47058 10.5347L1.4375 14.5627L5.46542 13.5296L13.9238 5.07124C14.3288 4.67543 14.5588 4.13416 14.5626 3.56787C14.5664 3.00158 14.3438 2.45725 13.9442 2.05599Z" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M10.6875 2.31836L13.6823 5.31319" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M9.46484 3.54004L12.4597 6.53487" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M2.46875 10.5347L5.4665 13.5266" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>
|
|
</a>
|
|
<a href="#" onclick="AufgabenEdit('.$id.');return false;" target="_blank" title="Aufgabe bearbeiten" >
|
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M6.6875 9.31152L1.4375 14.5615" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M14.5625 5.37402V1.43652H10.625" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M1.4375 10.624V14.5615H5.375" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M14.5625 1.43652L9.3125 6.68652" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M9.3125 9.31152L14.5625 14.5615" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M1.4375 5.37402V1.43652H5.375" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M14.5625 10.624V14.5615H10.625" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M1.4375 1.43652L6.6875 6.68652" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>
|
|
</a>
|
|
'
|
|
//.$menu_bon
|
|
.'
|
|
<a href="index.php?module=welcome&action=oknote&id='.$id.'&pinwand='.$pinwand.'">
|
|
<svg width="16" height="14" viewBox="0 0 16 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M4.0625 12.6855L1.4375 10.0605L4.0625 7.43555" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M1.4375 10.0605H10.1875C12.6037 10.0605 14.5625 8.10179 14.5625 5.68555C14.5625 3.2693 12.6037 1.31055 10.1875 1.31055H6.6875" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>
|
|
</a>
|
|
<a href="index.php?module=welcome&action=delnote&id='.$id.'&pinwand='.$pinwand.'">
|
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M0.875 2.625H13.125" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.3125 0.875H5.6875C5.20425 0.875 4.8125 1.26675 4.8125 1.75V2.625H9.1875V1.75C9.1875 1.26675 8.79575 0.875 8.3125 0.875Z" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M5.6875 10.0625V5.6875" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path d="M8.3125 10.0625V5.6875" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.0046 12.3223C10.967 12.776 10.5877 13.125 10.1325 13.125H3.86808C3.41285 13.125 3.03363 12.776 2.996 12.3223L2.1875 2.625H11.8125L11.0046 12.3223Z" stroke="#929292" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>
|
|
</a>
|
|
</div>
|
|
<span class="data">'.$id.'</span>
|
|
</div>';
|
|
|
|
$this->app->Tpl->Add('NOTES',$result);
|
|
}
|
|
|
|
$this->app->Tpl->Set('POPUPWIDTH','700');
|
|
$this->app->Tpl->Set('POPUPHEIGHT','600');
|
|
|
|
$tmp = $this->app->DB->SelectArr("SELECT DISTINCT p.id,p.name FROM pinwand p
|
|
LEFT JOIN pinwand_user pu ON pu.pinwand=p.id WHERE (pu.user='".$this->app->User->GetID()."' OR p.user='".$this->app->User->GetID()."') ORDER by p.name");
|
|
$ctmp = !empty($tmp)?count($tmp):0;
|
|
for($i=0;$i<$ctmp;$i++)
|
|
{
|
|
if($pinwand==$tmp[$i]['id']) {
|
|
$selected='selected';
|
|
} else {
|
|
$selected='';
|
|
}
|
|
$this->app->Tpl->Add('PINWAENDE','<option value="'.$tmp[$i]['id']."\" $selected>".$tmp[$i]['name'].'</option>');
|
|
}
|
|
|
|
// Aufgabe-Bearbeiten-Popup
|
|
$pinnwaende = $this->app->erp->GetPinwandSelect();
|
|
$pinnwand = "";
|
|
foreach($pinnwaende as $key=>$value){
|
|
$pinnwand .= "<option value='$key'>".$value."</option>";
|
|
}
|
|
$this->app->Tpl->Set("PINNWAND", $pinnwand);
|
|
// ENDE:Aufgabe-Bearbeiten-Popup
|
|
|
|
$this->app->YUI->CkEditor('editbeschreibung', 'minimal', array('height'=>'150', 'width'=>'250','ckeditor5'=>true));
|
|
$this->app->YUI->ColorPicker('editnote_color');
|
|
$this->app->YUI->CkEditor("e_notizen","belege",array("width"=>"625"));
|
|
$this->app->YUI->CkEditor("e_beschreibung","belege",array("width"=>"420"));
|
|
$this->app->YUI->DatePicker("e_datum");
|
|
$this->app->YUI->TimePicker("e_zeit");
|
|
$this->app->Tpl->Parse('AUFGABENPOPUP','aufgaben_popup.tpl');
|
|
$this->app->Tpl->Parse('PAGE','welcome_pinwand.tpl');
|
|
}
|
|
|
|
private function getCoordsForNewTask($taskId){
|
|
|
|
$coords = ['note_x'=>0,'note_y'=>0];
|
|
|
|
$oldCoords = $this->app->DB->Select(
|
|
sprintf(
|
|
'SELECT MAX(a.note_x)
|
|
FROM `aufgabe` AS `a`
|
|
WHERE a.id != %d
|
|
AND (a.note_x = a.note_y OR (a.note_x IS NULL AND a.note_y IS NULL))
|
|
ORDER BY a.note_x',
|
|
$taskId
|
|
)
|
|
);
|
|
|
|
if(!empty($oldCoords) || $oldCoords==0){
|
|
|
|
$toAdd = 10;
|
|
|
|
if($oldCoords%$toAdd==0){
|
|
$coords = ['note_x' => $oldCoords + $toAdd, 'note_y' => $oldCoords + $toAdd];
|
|
}
|
|
}
|
|
|
|
return $coords;
|
|
}
|
|
|
|
public function Accordion()
|
|
{
|
|
// check if accordion is empty
|
|
|
|
//$this->app->DB->Insert("INSERT INTO accordion (name,target,position) VALUES ('Startseite','StartseiteWiki','1')");
|
|
$this->app->DB->DisableHTMLClearing(true);
|
|
$check_startseite = $this->app->DB->Select("SELECT `name` FROM wiki WHERE name='StartseiteWiki' LIMIT 1");
|
|
if($check_startseite == '')
|
|
{
|
|
$wikifirstpage='
|
|
<p>Herzlich Willkommen in Ihrem Xentral,<br><br>wir freuen uns Sie als Xentral Benutzer begrüßen zu dürfen. Mit Xentral organisieren Sie Ihre Firma schnell und einfach. Sie haben alle wichtigen Zahlen und Vorgänge im Überblick.<br><br>Für Einsteiger sind die folgenden Themen wichtig:<br><br></p>
|
|
<ul>
|
|
<li> <a href="index.php?module=firmendaten&action=edit" target="_blank"> Firmendaten</a> (dort richten Sie Ihr Briefpapier ein)</li>
|
|
<li> <a href="index.php?module=adresse&action=list" target="_blank"> Stammdaten / Adressen</a> (Kunden und Lieferanten anlegen)</li>
|
|
<li> <a href="index.php?module=artikel&action=list" target="_blank"> Artikel anlegen</a> (Ihr Artikelstamm)</li>
|
|
<li> <a href="index.php?module=angebot&action=list" target="_blank"> Angebot</a> / <a href="index.php?module=auftrag&action=list" target="_blank"> Auftrag</a> (Alle Dokumente für Ihr Geschäft)</li>
|
|
<li> <a href="index.php?module=rechnung&action=list" target="_blank"> Rechnung</a> / <a href="index.php?module=gutschrift&action=list" target="_blank"> Gutschrift</a></li>
|
|
<li> <a href="index.php?module=lieferschein&action=list" target="_blank"> Lieferschein</a></li>
|
|
</ul>
|
|
<p><br><br>Kennen Sie unsere Zusatzmodule die Struktur und Organisation in das tägliche Geschäft bringen?<br><br></p>
|
|
<ul>
|
|
<li> <a href="index.php?module=kalender&action=list" target="_blank"> Kalender</a></li>
|
|
<li> <a href="index.php?module=wiki&action=list" target="_blank"> Wiki</a></li>
|
|
</ul>';
|
|
|
|
$this->app->DB->Insert("INSERT INTO wiki (name,content) VALUES ('StartseiteWiki','".$wikifirstpage."')");
|
|
}
|
|
$data = $this->app->DB->SelectArr("SELECT * FROM accordion ORDER BY position");
|
|
|
|
|
|
$out = '';
|
|
$entry = '';
|
|
|
|
$edit = "<a class=\"edit\" href=\"index.php?module=wiki&action=edit&cmd=StartseiteWiki\"><img src=./themes/[THEME]/images/edit.svg></a>";
|
|
|
|
$wikipage_exists = $this->app->DB->Select("SELECT '1' FROM wiki WHERE name='StartseiteWiki' LIMIT 1");
|
|
if($wikipage_exists!='1'){
|
|
$this->app->DB->Insert("INSERT INTO wiki (name) VALUES ('StartseiteWiki')");
|
|
}
|
|
$wikipage_content = $this->app->DB->Select("SELECT content FROM wiki WHERE name='StartseiteWiki' LIMIT 1");
|
|
$this->app->DB->DisableHTMLClearing(false);
|
|
$wikipage_content = $this->app->erp->ReadyForPDF($wikipage_content);
|
|
$wikiparser = new WikiParser();
|
|
$content = $wikiparser->parse($wikipage_content);
|
|
|
|
|
|
$this->app->Tpl->Set("ACCORDIONEDIT",$edit);
|
|
|
|
$this->app->Tpl->Set('ACCORDIONENTRY0', $content);
|
|
$entry = '[ACCORDIONENTRY0]';
|
|
|
|
$out .= "<!--<h3><a href=\"#\">Startseite</a></h3>-->
|
|
<div><div class=\"wiki\"><!--$edit<br/>-->$entry<br><br></div></div>";
|
|
|
|
return $out;
|
|
}
|
|
|
|
public function Termine($date)
|
|
{
|
|
$userid = $this->app->User->GetID();
|
|
|
|
if(is_numeric($userid)) {
|
|
$termine = $this->app->DB->SelectArr("SELECT DISTINCT color,von,bis,bezeichnung,allDay,ke.id FROM kalender_user AS ka
|
|
RIGHT JOIN kalender_event AS ke ON ka.event=ke.id
|
|
WHERE (ka.userid='$userid' OR ke.public='1') AND DATE(von)='$date'
|
|
ORDER BY von");
|
|
$out = '';
|
|
if($termine)
|
|
{
|
|
foreach($termine AS $t) {
|
|
$von = date('G:i', strtotime($t['von']));
|
|
$bis = date('G:i', strtotime($t['bis']));
|
|
|
|
if($t['allDay']=='1') {
|
|
$von = 'Ganztags';
|
|
$bis = '';
|
|
}else {
|
|
if($von==$bis){
|
|
$bis = '';
|
|
}
|
|
else{
|
|
$bis = '- ' . $bis;
|
|
}
|
|
}
|
|
|
|
$color = (($t['color']!='') ? "style='background-color: {$t['color']};border-color: {$t['color']};'" : '');
|
|
|
|
$out .= "<li $color onclick=\"openeventdialog(".$t['id'].",'".$von."','".$bis."','".$t['allDay']."','".htmlspecialchars($t['bezeichnung'])."')\"><span class=\"description\">{$t['bezeichnung']}<br>$von $bis </span></li>";
|
|
}
|
|
$out .= ' <script>
|
|
function openeventdialog(id, start, end, allday, task)
|
|
{
|
|
if($("#TerminDialog").SetFormData(id, start, end, allday,task))
|
|
$("#TerminDialog").dialog("open");
|
|
}</script>';
|
|
}
|
|
|
|
if(!$termine || (!empty($termine)?count($termine):0)==0) {
|
|
$out = '<center><i>{|Keine Termine vorhanden|}</i></center>';
|
|
}
|
|
|
|
return $out;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function Aufgaben($parse)
|
|
{
|
|
|
|
}
|
|
|
|
function WelcomeHelp()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Nur eine Fake-Action um eine Berechtigung zu erzeugen
|
|
*
|
|
* @return void
|
|
*/
|
|
public function WelcomeMobileApps()
|
|
{
|
|
}
|
|
|
|
public function WelcomeSettings()
|
|
{
|
|
$cmd = $this->app->Secure->GetGET('cmd');
|
|
switch ($cmd) {
|
|
case 'inviteteamclickbyclick':
|
|
return $this->HandleInviteTeamClickByClick();
|
|
break;
|
|
case 'startclickbyclick':
|
|
return $this->HandleStartClickByClick();
|
|
break;
|
|
case 'changeroleclickbyclick':
|
|
return $this->HandleChangeRoleClickByClick();
|
|
break;
|
|
case 'changepasswordclickbyclick':
|
|
return $this->HandlePasswordChangeClickByClick();
|
|
break;
|
|
// Passwort ändern
|
|
case 'password-change':
|
|
$this->HandlePasswordChange();
|
|
break;
|
|
|
|
// Einstellungen speichern
|
|
case 'settings-save':
|
|
$this->HandleProfileSettingsSave();
|
|
break;
|
|
|
|
// Profilbild löschen
|
|
case 'picture-delete':
|
|
$this->HandleProfilePictureDeletion();
|
|
break;
|
|
|
|
// Profilbild hochladen
|
|
case 'picture-upload':
|
|
$this->HandleProfilePictureUpload();
|
|
break;
|
|
|
|
case 'mobile-apps-account':
|
|
$this->HandleMobileAppsAccount();
|
|
break;
|
|
|
|
case 'googlecalendar-save':
|
|
$this->HandleGoogleCalendarSave();
|
|
break;
|
|
|
|
case 'gmail-save':
|
|
$this->HandleGoogleMailAuth();
|
|
break;
|
|
|
|
case 'gmail-test':
|
|
$this->HandleGoogleMailTest();
|
|
break;
|
|
|
|
case 'totp_toggle':
|
|
$this->HandleTOTPToggle();
|
|
break;
|
|
|
|
case 'totp_regenerate':
|
|
$this->HandleTOTPRegenerate();
|
|
break;
|
|
}
|
|
|
|
// Einstellungen laden
|
|
$settings = $this->app->DB->SelectRow(
|
|
"SELECT u.startseite, u.chat_popup, u.callcenter_notification, u.defaultcolor, u.sprachebevorzugen
|
|
FROM `user` AS u WHERE u.id = '" . $this->app->User->GetID() . "' LIMIT 1"
|
|
);
|
|
|
|
$this->app->Tpl->Set('STARTSEITE', $settings['startseite']);
|
|
$this->app->Tpl->Set('DEFAULTCOLOR', $settings['defaultcolor']);
|
|
$this->app->Tpl->Set('SPRACHEBEVORZUGEN', $this->languageSelectOptions($settings['sprachebevorzugen']));
|
|
|
|
if($settings['chat_popup']){
|
|
$this->app->Tpl->Set('CHAT_POPUP', ' checked="checked" ');
|
|
}
|
|
if($settings['callcenter_notification']){
|
|
$this->app->Tpl->Set('CALLCENTER_NOTIFICATION', ' checked="checked" ');
|
|
}
|
|
|
|
// Profilbild laden
|
|
$adresse = $this->app->User->GetAdresse();
|
|
$dateiversion = (int)$this->app->DB->Select("SELECT dv.id FROM datei_stichwoerter ds INNER JOIN datei d ON ds.datei = d.id INNER JOIN datei_version dv ON dv.datei = d.id WHERE d.geloescht = 0 AND objekt like 'Adressen' AND parameter = '" . $adresse . "' AND subjekt like 'Profilbild' ORDER by d.id DESC, dv.id DESC LIMIT 1");
|
|
if($dateiversion){
|
|
$this->app->Tpl->Add('DATEI', "<span id=\"profilbild\" style=\"padding:0;margin:0;height:100px;width:100px;display:inline-block;position:relative;background-repeat:no-repeat; background-image: url('index.php?module=ajax&action=profilbild&id=" . $this->app->User->GetID() . "'); \"></span>");
|
|
}else{
|
|
$this->app->Tpl->Set('VORPROFILBILDLOESCHEN', '<!--');
|
|
$this->app->Tpl->Set('NACHPROFILBILDLOESCHEN', '-->');
|
|
$this->app->Tpl->Add('DATEI', "<span id=\"profilbild\" style=\"padding:0;margin:0;height:100px;width:100px;display:inline-block;position:relative;background-repeat:no-repeat; background-image: url('./themes/new/images/keinbild_dunkel.png'); \"></span>");
|
|
}
|
|
|
|
// Mobile Apps Einstellungen laden
|
|
$apiAccountActive = false;
|
|
$apiAccountExisting = false;
|
|
$hasMobileAppsPermission = (bool)$this->app->erp->RechteVorhanden('welcome','mobileapps');
|
|
if ($hasMobileAppsPermission){
|
|
$apiAccountId = (int)$this->app->User->GetParameter('mobile_apps_api_account_id');
|
|
$apiAccountData = $this->app->DB->SelectRow("SELECT a.remotedomain, a.initkey, a.aktiv FROM api_account AS a WHERE a.id = '{$apiAccountId}'");
|
|
$apiAccountActive = isset($apiAccountData['aktiv']) && (int)$apiAccountData['aktiv'] === 1;
|
|
$apiAccountExisting = isset($apiAccountData['remotedomain']) && !empty($apiAccountData['remotedomain']);
|
|
|
|
/** @var Request $request */
|
|
$request = $this->app->Container->get('Request');
|
|
$serverUrl = $request->getBaseUrl() . '/'; // Url muss aufs www-Verzeichnis zeigen; App hängt 'api/v1/mobileapi/dashboard' an
|
|
$qrCodeArray = [
|
|
'server_url' => $serverUrl,
|
|
'username' => $apiAccountData['remotedomain'],
|
|
'password' => $apiAccountData['initkey'],
|
|
];
|
|
$qrCodeData = json_encode($qrCodeArray);
|
|
}
|
|
|
|
if ($hasMobileAppsPermission && $apiAccountExisting && $apiAccountActive) {
|
|
/** @var BarcodeFactory $barcodeFactory */
|
|
$barcodeFactory = $this->app->Container->get('BarcodeFactory');
|
|
$barcodeObject = $barcodeFactory->createQrCode($qrCodeData);
|
|
$qrCodeHtml = $barcodeObject->toHtml(3, 3);
|
|
$this->app->Tpl->Set('MOBILE_APP_QRCODE', $qrCodeHtml);
|
|
$this->app->Tpl->Set('MOBILE_APP_DESCRIPTION', 'Bitte scannen Sie den hier angezeigten QR-Code mit Ihrem Handy in der Xentral App unter "Registrieren".');
|
|
$this->app->Tpl->Set('MOBILE_APP_BUTTON', '<input type="submit" name="mobile_app_api_deactivate" value="{|Zugang deaktivieren|}">');
|
|
}
|
|
if ($hasMobileAppsPermission && $apiAccountExisting && !$apiAccountActive){
|
|
$this->app->Tpl->Set('MOBILE_APP_QRCODE', '');
|
|
$this->app->Tpl->Set('MOBILE_APP_DESCRIPTION', 'API-Zugang ist deaktiviert. Aktivieren Sie den Zugang um die Mobile App nutzen zu können.');
|
|
$this->app->Tpl->Set('MOBILE_APP_BUTTON', '<input type="submit" name="mobile_app_api_activate" value="{|Zugang aktivieren|}">');
|
|
}
|
|
if ($hasMobileAppsPermission && !$apiAccountExisting){
|
|
$this->app->Tpl->Set('MOBILE_APP_QRCODE', '');
|
|
$this->app->Tpl->Set('MOBILE_APP_DESCRIPTION', '');
|
|
$this->app->Tpl->Set('MOBILE_APP_BUTTON', '<input type="submit" name="mobile_app_api_create" value="{|Zugang anlegen|}"> (Legt API-Account an)');
|
|
}
|
|
if (!$hasMobileAppsPermission){
|
|
$this->app->Tpl->Set('MOBILE_APP_QRCODE', '');
|
|
$this->app->Tpl->Set('MOBILE_APP_DESCRIPTION', 'Sie haben kein Rechte eine Mobile App zu registrieren. Bitte wenden Sie sich an Ihren Administrator.');
|
|
$this->app->Tpl->Set('MOBILE_APP_BUTTON', '');
|
|
}
|
|
|
|
$this->renderGoogleCalendarSettings();
|
|
$this->renderGoogleMailSettings();
|
|
|
|
$this->app->erp->Headlines('Mein Bereich', 'Persönliche Einstellungen');
|
|
$this->app->erp->MenuEintrag('index.php?module=welcome&action=settings','Übersicht');
|
|
|
|
$this->app->YUI->AutoSaveUserParameter('name_fuer_unterartikel','matrixprodukt_name_fuer_unterartikel');
|
|
$this->app->YUI->ColorPicker('defaultcolor');
|
|
$this->app->YUI->PasswordCheck('password', 'repassword', '', 'submit_password');
|
|
|
|
$this->renderTOTP();
|
|
$this->app->Tpl->Parse('PAGE','welcome_settings.tpl');
|
|
}
|
|
|
|
private function renderTOTP(){
|
|
/** @var TOTPLoginService $totpLoginManager */
|
|
$totpLoginManager = $this->app->Container->get('TOTPLoginService');
|
|
|
|
$userID = $this->app->User->GetID();
|
|
|
|
$totpEnabled = $totpLoginManager->isTOTPEnabled($userID);
|
|
|
|
$this->app->Tpl->Set('TOTP_TOGGLE_VALUE', $totpEnabled ? 'TOTP ausschalten' : 'TOTP einschalten');
|
|
$this->app->Tpl->Set('TOTP_TOGGLE_ID', $totpEnabled ? 'totp_disable' : 'totp_enable');
|
|
if(!$totpEnabled) {
|
|
$this->app->Tpl->Set('TOTP_REGENERATE_VISIBILITY', 'style="display: none"');
|
|
return;
|
|
}
|
|
|
|
$label = 'Xentral' . ' | ' . $this->app->erp->GetFirmaName();
|
|
$qrCode = $totpLoginManager->generatePairingQrCode($userID, $label);
|
|
|
|
$secret = $totpLoginManager->getTOTPSecret($userID);
|
|
|
|
$this->app->Tpl->Set('TOTP_KEY_HTML', "Schlüssel: {$secret}");
|
|
|
|
$qrHtml = $qrCode->toHtml(3, 3);
|
|
|
|
$this->app->Tpl->Set('TOTP_QR_HTML', $qrHtml);
|
|
}
|
|
public function WelcomeRedirect()
|
|
{
|
|
$url = $this->app->Secure->GetGET('url');
|
|
if (empty($url)) {
|
|
$this->app->Tpl->Set('MESSAGE', '<div class="error">Es wurde keine Weiterleitungs-URL übergeben</div>');
|
|
}
|
|
|
|
$urlParts = parse_url($url);
|
|
if (!is_array($urlParts)) {
|
|
$this->app->Tpl->Set('MESSAGE', '<div class="error">Die übergebene Weiterleitungs-URL is ungültig.</div>');
|
|
}
|
|
if (empty($urlParts['scheme']) && empty($urlParts['host'])) {
|
|
$this->app->Tpl->Set('MESSAGE', '<div class="error">Die übergebene Weiterleitungs-URL ist unvollständig.</div>');
|
|
}
|
|
if (!empty($urlParts['scheme']) && !in_array($urlParts['scheme'], ['http', 'https'])) {
|
|
$this->app->Tpl->Set('MESSAGE', '<div class="warning">Die Weiterleitungs-URL führt nicht auf eine Webseite.</div>');
|
|
}
|
|
|
|
$this->app->Tpl->Set('REDIRECT_URL_LINK', $url);
|
|
$this->app->Tpl->Set('REDIRECT_URL_TEXT', htmlspecialchars($url));
|
|
$this->app->Tpl->Parse('PAGE','welcome_redirect.tpl');
|
|
}
|
|
|
|
/**
|
|
* @param Application $app
|
|
* @param string $name
|
|
* @param array $erlaubtevars
|
|
*
|
|
* @return array
|
|
*/
|
|
public function TableSearch(&$app, $name, $erlaubtevars)
|
|
{
|
|
$result = [];
|
|
switch ($name) {
|
|
case 'welcome_spooler':
|
|
$id = (int)$this->app->Secure->GetGET('id');
|
|
|
|
$aligncenter = array(1);
|
|
$heading = array('', 'Zeit', 'Dateiname', 'Bearbeiter', 'Gedruckt', 'Menü');
|
|
$width = array('1%', '30%', '30%', '20%', '10%', '5%');
|
|
$findcols = array('d.id', 'd.zeitstempel', 'd.filename', 'a.name', 'd.gedruckt', 'd.id');
|
|
$searchsql = array("DATE_FORMAT(d.zeitstempel,'%d.%m.%Y %H:%i:%s')", 'd.filename', 'a.name');
|
|
|
|
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" .
|
|
"<a href=\"index.php?module=welcome&action=spooler&cmd=download&file=%value%\" data-cmd=\"download\">" .
|
|
"<img src=\"themes/{$this->app->Conf->WFconf['defaulttheme']}/images/download.svg\" border=\"0\"></a>" .
|
|
" " .
|
|
"<a href=\"index.php?module=welcome&action=spooler&cmd=delete&file=%value%\" data-cmd=\"delete\">" .
|
|
"<img src=\"themes/{$this->app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" .
|
|
" </td></tr></table>";
|
|
|
|
$nichtGedruckt = (int)$app->YUI->TableSearchFilter($name, 1, 'nicht_gedruckt', '0', 0, 'checkbox');
|
|
if ($nichtGedruckt === 1) {
|
|
$subwhere = ' AND d.gedruckt = 0 ';
|
|
} else {
|
|
$subwhere = '';
|
|
}
|
|
|
|
// SQL statement
|
|
$sql = "SELECT
|
|
SQL_CALC_FOUND_ROWS d.id,
|
|
CONCAT('<input type=\"checkbox\" name=\"selection[]\" value=\"', d.id, '\">'),
|
|
DATE_FORMAT(d.zeitstempel,'%d.%m.%Y %H:%i:%s'),
|
|
IF(d.filename != '', d.filename, 'Kein Dateiname vorhanden'),
|
|
a.name,
|
|
IF(d.gedruckt = 1, 'ja', '') as gedruckt,
|
|
d.id
|
|
FROM drucker_spooler AS d
|
|
LEFT JOIN `user` AS u ON u.id = d.user
|
|
LEFT JOIN adresse AS a ON a.id = u.adresse ";
|
|
$where = " d.drucker = '{$id}' " . $subwhere;
|
|
$count = "SELECT COUNT(d.id) FROM drucker_spooler AS d WHERE " . $where;
|
|
|
|
$result = [
|
|
'aligncenter' => $aligncenter,
|
|
'heading' => $heading,
|
|
'width' => $width,
|
|
'findcols' => $findcols,
|
|
'searchsql' => $searchsql,
|
|
'menu' => $menu,
|
|
'where' => $where,
|
|
'sql' => $sql,
|
|
'count' => $count,
|
|
'maxrows' => 50,
|
|
];
|
|
|
|
break;
|
|
}
|
|
|
|
// Nicht erlaubt Keys aus Result entfernen
|
|
foreach ($result as $key => $value) {
|
|
if (!in_array($key, $erlaubtevars, true)) {
|
|
unset($result[$key]);
|
|
}
|
|
}
|
|
|
|
return !empty($result) ? $result : [];
|
|
}
|
|
|
|
public function WelcomeSpooler()
|
|
{
|
|
$cmd = $this->app->Secure->GetGET('cmd');
|
|
$fileId = (int)$this->app->Secure->GetGET('file');
|
|
$printerId = (int)$this->app->Secure->GetGET('id');
|
|
if ($printerId === 0) {
|
|
$printerId = null;
|
|
}
|
|
|
|
// Zip erstellen
|
|
if (!empty($this->app->Secure->GetPOST('makezip'))) {
|
|
try {
|
|
$selection = $this->app->Secure->GetPOST('selection');
|
|
$this->DownloadSpoolerZipCompilation($selection, $printerId);
|
|
$this->app->erp->ExitWawi();
|
|
} catch (DownloadSpoolerExceptionInterface $e) {
|
|
$notification = $this->GetNotificationService();
|
|
$notification->create(
|
|
$this->app->User->GetID(), 'error', 'Download-Drucker',
|
|
'Zip-Datei konnte nicht erstellt werden. Fehler: ' . $e->getMessage()
|
|
);
|
|
}
|
|
}
|
|
|
|
// Sammel-PDF erstellen
|
|
if (!empty($this->app->Secure->GetPOST('makepdf'))) {
|
|
try {
|
|
$selection = $this->app->Secure->GetPOST('selection');
|
|
$this->DownloadSpoolerPdfCompilation($selection, $printerId);
|
|
$this->app->erp->ExitWawi();
|
|
} catch (DownloadSpoolerExceptionInterface $e) {
|
|
$notification = $this->GetNotificationService();
|
|
$notification->create(
|
|
$this->app->User->GetID(), 'error', 'Download-Drucker',
|
|
'Sammel-PDF konnte nicht erstellt werden. Fehler: ' . $e->getMessage()
|
|
);
|
|
}
|
|
}
|
|
|
|
// Alle "noch nicht gedruckte" Dateien herunterladen
|
|
if($cmd === 'download-unprinted'){
|
|
try {
|
|
$this->DownloadSpoolerUnprintedFiles($printerId);
|
|
$this->app->erp->ExitWawi();
|
|
} catch (DownloadSpoolerExceptionInterface $e) {
|
|
$notification = $this->GetNotificationService();
|
|
$notification->create(
|
|
$this->app->User->GetID(), 'error', 'Download-Drucker',
|
|
'Dateien konnte nicht heruntergeladen werden. Fehler: ' . $e->getMessage()
|
|
);
|
|
}
|
|
}
|
|
|
|
// Einzelne Datei runterladen
|
|
if($cmd === 'download-file'){
|
|
try {
|
|
$this->DownloadSpoolerFile($fileId);
|
|
$this->app->erp->ExitWawi();
|
|
} catch (DownloadSpoolerExceptionInterface $e) {
|
|
$notification = $this->GetNotificationService();
|
|
$notification->create(
|
|
$this->app->User->GetID(), 'error', 'Download-Drucker',
|
|
'Datei konnte nicht heruntergeladen werden. Fehler: ' . $e->getMessage()
|
|
);
|
|
}
|
|
}
|
|
|
|
// Einzelne Datei löschen
|
|
if($cmd === 'delete-file'){
|
|
try {
|
|
$isFileDeleted = $this->DeleteSpoolerFile($fileId, $printerId);
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
echo json_encode(['success' => $isFileDeleted]);
|
|
$this->app->erp->ExitWawi();
|
|
} catch (DownloadSpoolerExceptionInterface $e) {
|
|
$notification = $this->GetNotificationService();
|
|
$notification->create(
|
|
$this->app->User->GetID(), 'error', 'Download-Drucker',
|
|
'Datei konnte nicht gelöscht werden. Fehler: ' . $e->getMessage()
|
|
);
|
|
}
|
|
}
|
|
|
|
// DataTable-HTML-Struktur
|
|
if ($cmd === 'datatable-html') {
|
|
$table = new DownloadSpoolerTable($this->app, $printerId);
|
|
$settings = $table->GetSettings(sprintf('./index.php?module=welcome&action=spooler&cmd=datatable-data&id=%s', $printerId));
|
|
|
|
header('Content-Type: text/html; charset=utf-8');
|
|
echo $table->GetContentHtml();
|
|
echo '<script type="application/json" id="downloadspooler-table-settings">';
|
|
echo json_encode($settings, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
|
|
echo '</script>';
|
|
$this->app->erp->ExitWawi();
|
|
}
|
|
|
|
// DataTable-Daten
|
|
if ($cmd === 'datatable-data') {
|
|
try {
|
|
$data = $this->DownloadSpoolerDataTableResult($printerId);
|
|
} catch (Exception $e) {
|
|
header('HTTP/1.1 404 Not Found');
|
|
$data = ['success' => false, 'error' => $e->getMessage()];
|
|
}
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
echo json_encode($data);
|
|
$this->app->erp->ExitWawi();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param int $printerId
|
|
*
|
|
* @throws RuntimeException
|
|
*
|
|
* @return array
|
|
*/
|
|
protected function DownloadSpoolerDataTableResult($printerId)
|
|
{
|
|
$columns = (array)$this->app->Secure->GetGET('columns');
|
|
$search = (array)$this->app->Secure->GetGET('search');
|
|
$order = (array)$this->app->Secure->GetGET('order');
|
|
$offset = (int)$this->app->Secure->GetGET('start');
|
|
$limit = (int)$this->app->Secure->GetGET('length');
|
|
$draw = (int)$this->app->Secure->GetGET('draw');
|
|
|
|
if ((int)$printerId === 0) {
|
|
throw new RuntimeException('Printer-ID darf nicht leer sein');
|
|
}
|
|
|
|
foreach ($columns as $column) {
|
|
if ($column['data'] === 'gedruckt') {
|
|
if (!empty($column['search']['value'])) {
|
|
$filter['ungedruckt'] = true;
|
|
} else {
|
|
$filter['ungedruckt'] = false;
|
|
}
|
|
if ($draw === 1) {
|
|
$filter['ungedruckt'] = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
$table = new DownloadSpoolerTable($this->app, $printerId);
|
|
$searchQuery = !empty($search['value']) ? $search['value'] : null;
|
|
$orderCol = (int)$order[0]['column'];
|
|
$orderDir = strtolower($order[0]['dir']) === 'desc' ? 'DESC' : 'ASC';
|
|
|
|
return $table->GetData($filter, $searchQuery, $orderCol, $orderDir, $offset, $limit, $draw);
|
|
}
|
|
|
|
/**
|
|
* Alle "noch nicht gedruckten" Dateien herunterladen
|
|
*
|
|
* @param int|null $printerId
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function DownloadSpoolerUnprintedFiles($printerId = null)
|
|
{
|
|
$gateway = $this->GetDownloadSpoolerGateway();
|
|
$unprinted = $gateway->getUnprintedFileIdsByUser($this->app->User->GetID());
|
|
if (empty($unprinted)) {
|
|
return;
|
|
}
|
|
|
|
// Einzelne Datei herunterladen
|
|
if ((!empty($unprinted)?count($unprinted):0) === 1) {
|
|
$this->DownloadSpoolerFile($unprinted[0]);
|
|
} else {
|
|
$this->DownloadSpoolerZipCompilation($unprinted, $printerId);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Einzelne Druckerspooler-Datei herunterladen
|
|
*
|
|
* @param int $fileId
|
|
*
|
|
* @throws DownloadSpoolerExceptionInterface
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function DownloadSpoolerFile($fileId)
|
|
{
|
|
$service = $this->GetDownloadSpoolerService();
|
|
$data = $service->fetchFile($fileId, $this->app->User->GetID());
|
|
|
|
$rawData = base64_decode($data['content']);
|
|
if(!empty($data['filename'])){
|
|
$filename = urlencode($data['filedate'] . '-' . $data['filename']);
|
|
} else{
|
|
$filename = urlencode($data['filedate']);
|
|
}
|
|
|
|
header('Content-Description: File Transfer');
|
|
header('Content-Type: application/octet-stream');
|
|
header('Content-Type: application/force-download');
|
|
header('Content-Disposition: attachment; filename=' . $filename);
|
|
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
|
|
header('Expires: 0');
|
|
header('Pragma: public');
|
|
header('Content-Length: ' . strlen($rawData));
|
|
echo $rawData;
|
|
$this->app->erp->ExitWawi();
|
|
}
|
|
|
|
/**
|
|
* @param array|int[] $spoolerIds
|
|
* @param int|null $printerId
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function DownloadSpoolerZipCompilation($spoolerIds, $printerId = null)
|
|
{
|
|
$downloadSpooler = $this->GetDownloadSpoolerService();
|
|
$zipPath = $downloadSpooler->createZipCompilation($spoolerIds, $this->app->User->GetID(), $printerId);
|
|
$zipName = 'DOWNLOAD_SPOOLER_' . date('Y-m-d') . '.zip';
|
|
|
|
// Download ZIP
|
|
header('Content-Type: application/zip');
|
|
header('Content-Disposition: attachment; filename=' . $zipName);
|
|
header('Content-Length: ' . filesize($zipPath));
|
|
readfile($zipPath);
|
|
unlink($zipPath);
|
|
$this->app->erp->ExitWawi();
|
|
}
|
|
|
|
/**
|
|
* @param array|int[] $spoolerIds
|
|
* @param int|null $printerId
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function DownloadSpoolerPdfCompilation($spoolerIds, $printerId = null)
|
|
{
|
|
$downloadSpooler = $this->GetDownloadSpoolerService();
|
|
$pdfPath = $downloadSpooler->createPdfCompilation($spoolerIds, $this->app->User->GetID(), $printerId);
|
|
$pdfName = 'DOWNLOAD_SPOOLER_' . date('Y-m-d') . '.pdf';
|
|
|
|
header('Content-Description: File Transfer');
|
|
header('Content-Type: application/octet-stream');
|
|
header("Content-Type: application/force-download");
|
|
header('Content-Disposition: attachment; filename=' . $pdfName);
|
|
header('Expires: 0');
|
|
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
|
|
header('Pragma: public');
|
|
header('Content-Length: ' . filesize($pdfPath));
|
|
readfile($pdfPath);
|
|
unlink($pdfPath);
|
|
$this->app->erp->ExitWawi();
|
|
}
|
|
|
|
/**
|
|
* @param int $fileId
|
|
* @param int $printerId
|
|
*
|
|
* @return bool
|
|
*/
|
|
protected function DeleteSpoolerFile($fileId, $printerId)
|
|
{
|
|
$downloadSpooler = $this->GetDownloadSpoolerService();
|
|
|
|
return $downloadSpooler->deleteFile($fileId, $printerId);
|
|
}
|
|
|
|
/**
|
|
* @param string $dir
|
|
*
|
|
* @return bool
|
|
*/
|
|
protected function DelFolder($dir) {
|
|
$files = array_diff(scandir($dir,SCANDIR_SORT_NONE), array('.','..'));
|
|
if(!empty($files)){
|
|
foreach ($files as $file) {
|
|
if(is_dir($dir . '/' . $file)){
|
|
$this->DelFolder($dir . '/' . $file);
|
|
}elseif(is_file($dir . '/' . $file)){
|
|
@unlink($dir . '/' . $file);
|
|
}
|
|
}
|
|
}
|
|
return is_dir($dir) && @rmdir($dir);
|
|
}
|
|
|
|
public function WelcomeInfo()
|
|
{
|
|
if($this->app->Secure->GetPOST('restoreoss') && is_dir(dirname(dirname(__DIR__)).'/www_oss') &&
|
|
is_dir(dirname(dirname(__DIR__)) . '/phpwf_oss') && is_dir(dirname(dirname(__DIR__)) . '/phpwf_oss/types') &&
|
|
$this->app->User->GetType() === 'admin')
|
|
{
|
|
chdir('..');
|
|
$dir = getcwd();
|
|
if(@rename($dir.'/www', $dir.'/www_old') && @rename($dir.'/phpwf', $dir.'/phpwf_old'))
|
|
{
|
|
sleep(1);
|
|
if(@rename($dir.'/www_oss', $dir.'/www') && @rename($dir.'/phpwf_oss', $dir.'/phpwf'))
|
|
{
|
|
if(is_file($dir.'/version_oss.php'))
|
|
{
|
|
@rename($dir.'/version.php',$dir.'/version_old.php');
|
|
if(@rename($dir.'/version_oss.php',$dir.'/version.php'))@unlink($dir.'/version_old.php');
|
|
}
|
|
if(is_dir($dir.'/www_old') && is_dir($dir.'/www')){
|
|
$this->DelFolder($dir . '/www_old');
|
|
}
|
|
if(is_dir($dir.'/phpwf_old') && is_dir($dir.'/phpwf')){
|
|
$this->DelFolder($dir . '/phpwf_old');
|
|
}
|
|
header('Location: index.php?module=welcome&action=info&msg='.$this->app->erp->base64_url_encode('<div class="info">Die Open Source-Version wurde wiederhergestellt</div>'));
|
|
exit;
|
|
}
|
|
}
|
|
header('Location: index.php?module=welcome&action=info&msg='.$this->app->erp->base64_url_encode('<div class="error">Die Open Source-Version konnte nicht wiederhergestellt werden. Bitte prüfen Sie die Dateirechte!</div>'));
|
|
exit;
|
|
}
|
|
|
|
$this->app->erp->Headlines('Informationen zur Software');
|
|
|
|
$this->app->Tpl->Set('TABTEXT','Informationen zur Software');
|
|
$this->app->Tpl->Set('TAB1','<fieldset><legend>Lizenzinformationen</legend><table><tr><td>');
|
|
if($this->app->erp->Version()!=='OSS')
|
|
{
|
|
$this->app->Tpl->Add('TAB1',"Sie benutzen die kommerzielle Version von Xentral. Alle Rechte vorbehalten. Beachten Sie die Nutzungsbedinungen.<br><br>© Copyright by Xentral ERP Software GmbH Augsburg");
|
|
}
|
|
else {
|
|
$this->app->Tpl->Add('TAB1','OpenXE is free open source software under AGPL/EGPL license, based on <a href="https://xentral.com" target="_blank">Xentral®</a> by Xentral ERP Software GmbH.<br><br><div class="info"><img src="themes/new/images/Xentral_ERP_Logo-200.png"><br>Das Logo und der Link zur Homepage <a href="https://xentral.biz" target=\_blank\>https://xentral.biz</a> dürfen nicht entfernt werden.</div><br>© Copyright by OpenXE project & Xentral ERP Software GmbH Augsburg');
|
|
}
|
|
|
|
if($this->app->erp->isIoncube() && method_exists($this->app->erp, 'IoncubeProperty'))
|
|
{
|
|
if(method_exists('erpAPI','Ioncube_Property'))
|
|
{
|
|
$hinweis = erpAPI::Ioncube_Property('versionshinweis');
|
|
}else{
|
|
$hinweis = $this->app->erp->IoncubeProperty('versionshinweis');
|
|
}
|
|
if($hinweis){$hinweis = ' ('.$hinweis.')';}else{$hinweis = '';}
|
|
if(method_exists('erpAPI', 'Ioncube_HasExpired'))
|
|
{
|
|
$hasexpired = erpAPI::Ioncube_HasExpired();
|
|
}else{
|
|
$hasexpired = $this->app->erp->IoncubeHasExpired();
|
|
}
|
|
if(method_exists('erpAPI', 'Ioncube_ExpireDate'))
|
|
{
|
|
$expiredate = erpAPI::Ioncube_ExpireDate();
|
|
}else{
|
|
$expiredate = $this->app->erp->IoncubeExpireDate();
|
|
}
|
|
|
|
if($hasexpired && is_dir(dirname(dirname(__DIR__)).'/www_oss') && is_dir(dirname(dirname(__DIR__)) . '/phpwf_oss') && is_dir(dirname(dirname(__DIR__)) . '/phpwf_oss/types') && $this->app->User->GetType() == 'admin')
|
|
{
|
|
if(is_dir(dirname(dirname(__DIR__)).'/www_oss') && is_dir(dirname(dirname(__DIR__)) . '/phpwf_oss') && is_dir(dirname(dirname(__DIR__)) . '/phpwf_oss/types') && $this->app->User->GetType() == 'admin')
|
|
{
|
|
$this->app->Tpl->Add('TAB1','<form method="post"><div class="info">
|
|
<input type="checkbox" value="1" name="restoreoss" /> {|Wieder auf Open-Source Version wechseln|}<br />
|
|
Hinweis: Bitte sichern Sie wenn Sie eigene Quelltexte in Xentral hinterlegt haben diese gesondert. Es werden alle fremden Quelltextdateien entfernt.<br />
|
|
<input type="submit" style="margin:5px;" value="{|Jetzt auf Open-Source Version wechseln|}" /><div style="clear:both;"></div>
|
|
</div></form>');
|
|
}
|
|
}
|
|
}
|
|
|
|
$tmp = file_get_contents('../LICENSE');
|
|
|
|
$phpmailer = file_get_contents('../www/plugins/phpmailer/LICENSE');
|
|
$this->app->Tpl->Add('PHPMAILER',nl2br($phpmailer));
|
|
|
|
$this->app->Tpl->Add('TAB1',nl2br($tmp));
|
|
|
|
$this->app->Tpl->Add('TAB1','</td></tr>');
|
|
|
|
if($this->app->erp->isIoncube() && method_exists($this->app->erp, 'IoncubeProperty'))
|
|
{
|
|
$first = true;
|
|
if(method_exists('erpAPI','Ioncube_getMaxUser'))
|
|
{
|
|
$maxuser = erpAPI::Ioncube_getMaxUser();
|
|
}else{
|
|
$maxuser = $this->app->erp->IoncubegetMaxUser();
|
|
}
|
|
$maxlightuser = 0;
|
|
$maxlightuserrechte = 0;
|
|
$anzahllightuser = 0;
|
|
|
|
if(method_exists('erpAPI','Ioncube_getMaxLightusers') && method_exists('erpAPI','Ioncube_getMaxLightusersRights'))
|
|
{
|
|
$maxlightuser = erpAPI::Ioncube_getMaxLightusers();
|
|
$maxlightuserrechte = erpAPI::Ioncube_getMaxLightusersRights();
|
|
}
|
|
$mitarbeiterzeiterfassung = $this->app->erp->ModulVorhanden('mitarbeiterzeiterfassung')?$maxuser:0;
|
|
|
|
if($maxuser) {
|
|
$anzuser2 = 0;
|
|
if($maxlightuser > 0) {
|
|
$anzuser2 = (int)$this->app->DB->Select("SELECT count(DISTINCT u.id) FROM `user` u WHERE activ = 1 AND type = 'lightuser' ");
|
|
$anzahllightuser = $anzuser2;
|
|
$anzuser = (int)$this->app->DB->Select("SELECT count(id) FROM `user` WHERE activ = 1 AND not isnull(hwtoken) AND hwtoken <> 4") - $anzuser2;
|
|
$anzuserzeiterfassung = (int)$this->app->DB->Select("SELECT count(*) from user where activ = 1 AND hwtoken = 4 AND type != 'lightuser'");
|
|
}else{
|
|
$anzuser = (int)$this->app->DB->Select("SELECT count(*) from user where activ = 1 AND hwtoken <> 4 ");
|
|
$anzuserzeiterfassung = (int)$this->app->DB->Select("SELECT count(*) from user where activ = 1 AND hwtoken = 4");
|
|
}
|
|
|
|
$userred = $anzuser > $maxuser
|
|
|| (
|
|
($anzuser + $anzuserzeiterfassung + $anzuser2) >
|
|
$mitarbeiterzeiterfassung + $maxuser + $maxlightuser
|
|
)
|
|
|| (($anzuser + $anzuserzeiterfassung) > $mitarbeiterzeiterfassung + $maxuser);
|
|
|
|
|
|
$this->app->Tpl->Add(
|
|
'TAB1',
|
|
'<tr><td><div' . ($userred ? ' style="color:red;" ' : '') . '>Benutzer ' .
|
|
($anzuser + $anzahllightuser + $anzuserzeiterfassung) .
|
|
($maxlightuser > 0 || $anzuserzeiterfassung > 0?' (davon ':'').
|
|
($maxlightuser > 0 ? $anzahllightuser . ' Light-User' : '') .
|
|
($maxlightuser > 0 && $anzuserzeiterfassung > 0?', ':'').
|
|
($anzuserzeiterfassung > 0 ? $anzuserzeiterfassung . ' Zeiterfassung-User' : '') .
|
|
($maxlightuser > 0 || $anzuserzeiterfassung > 0?')':'').
|
|
' von ' .
|
|
($maxuser + $maxlightuser + $mitarbeiterzeiterfassung) .
|
|
($maxlightuser > 0 || $mitarbeiterzeiterfassung > 0?' (davon ':'').
|
|
($maxlightuser > 0 ? $maxlightuser . ' Light-User' : '') .
|
|
($maxlightuser > 0 && $mitarbeiterzeiterfassung > 0?', ':'').
|
|
($mitarbeiterzeiterfassung > 0 ? $mitarbeiterzeiterfassung . ' Zeiterfassung-User' : '') .
|
|
($maxlightuser > 0 || $mitarbeiterzeiterfassung > 0?')':'').
|
|
'</div></td></tr>'
|
|
);
|
|
}
|
|
|
|
if(method_exists('erpAPI','Ioncube_Property'))
|
|
{
|
|
$hinweis = erpAPI::Ioncube_Property('versionshinweis');
|
|
}else{
|
|
$hinweis = $this->app->erp->IoncubeProperty('versionshinweis');
|
|
}
|
|
if($hinweis){
|
|
$hinweis = ' ('.$hinweis.')';
|
|
}else{
|
|
$hinweis = '';
|
|
}
|
|
if(method_exists('erpAPI', 'Ioncube_HasExpired'))
|
|
{
|
|
$hasexpired = erpAPI::Ioncube_HasExpired();
|
|
}else{
|
|
$hasexpired = $this->app->erp->IoncubeHasExpired();
|
|
}
|
|
if(method_exists('erpAPI', 'Ioncube_ExpireDate'))
|
|
{
|
|
$expiredate = erpAPI::Ioncube_ExpireDate();
|
|
}else{
|
|
$expiredate = $this->app->erp->IoncubeExpireDate();
|
|
}
|
|
if(method_exists('erpAPI', 'Ioncube_BeforeExpire'))
|
|
{
|
|
$ioncubebeforeexpire = erpAPI::Ioncube_BeforeExpire();
|
|
}else{
|
|
$ioncubebeforeexpire = $this->app->erp->IoncubeBeforeExpire();
|
|
}
|
|
|
|
if($hasexpired)
|
|
{
|
|
$first = false;
|
|
$this->app->Tpl->Add('TAB1','<tr><td><div style="color:red;">Ihre Lizenz ist am '.$expiredate.' abgelaufen'.$hinweis.'.</div></td></tr>');
|
|
} elseif($ioncubebeforeexpire) {
|
|
$first = false;
|
|
$this->app->Tpl->Add('TAB1','<tr><td><div style="color:red;">Ihre Lizenz läuft am '.$expiredate.' ab'.$hinweis.'.</div></td></tr>');
|
|
} elseif($expiredate) {
|
|
$first = false;
|
|
$this->app->Tpl->Add('TAB1','<tr><td><div>Die Lizenz läuft am '.$expiredate.' ab'.$hinweis.'.</div></td></tr>');
|
|
}
|
|
}
|
|
|
|
if(method_exists($this->app->erp, 'VersionsInfos'))
|
|
{
|
|
$ver = $this->app->erp->VersionsInfos();
|
|
$this->app->Tpl->Add('TAB1','<tr><td>'.$ver['Details'].'</td></tr>');
|
|
}
|
|
$this->app->Tpl->Add('TAB1','</table></fieldset>');
|
|
$this->app->Tpl->Parse('PAGE','tabview.tpl');
|
|
}
|
|
|
|
|
|
public function WelcomeMenu()
|
|
{
|
|
$this->app->Tpl->Add('KURZUEBERSCHRIFT','<h2>Startseite</h2>');
|
|
}
|
|
|
|
|
|
public function WelcomeMain()
|
|
{
|
|
|
|
$this->app->Tpl->Set('UEBERSCHRIFT','Herzlich Willkommen '.$this->app->User->GetDescription().'!');
|
|
$this->WelcomeMenu();
|
|
|
|
// muss jeder sehen
|
|
$this->app->erp->LagerAusgehend('ARTIKEL');
|
|
|
|
$this->app->Tpl->Parse('PAGE','welcome_main.tpl');
|
|
}
|
|
|
|
|
|
public function WelcomeStartseite()
|
|
{
|
|
$this->app->erp->Startseite();
|
|
}
|
|
|
|
public function WelcomeLogin()
|
|
{
|
|
|
|
if($this->app->User->GetID()>0)
|
|
{
|
|
// alle cookies SpryMedia loeschen
|
|
|
|
// Setzen des Verfalls-Zeitpunktes auf 1 Stunde in der Vergangenheit
|
|
$this->app->erp->ClearCookies();
|
|
$startseite = '';
|
|
if($code = $this->app->Secure->GetPOST('code'))
|
|
{
|
|
$result = $this->app->DB->SelectArr("SELECT url, reduziert FROM stechuhrdevice WHERE code = '$code' AND aktiv = 1 LIMIT 1");
|
|
|
|
$startseite = $result[0]['url'] ;
|
|
$isReduziert = $result[0]['reduziert'];
|
|
|
|
if($isReduziert){
|
|
$this->app->User->SetParameter('stechuhrdevicereduziert',true);
|
|
}
|
|
|
|
if($isReduziert && empty($startseite)){
|
|
$startseite = 'index.php?module=stechuhr&action=list&prodcmd=arbeitsschritt';
|
|
}
|
|
}
|
|
$this->app->erp->Startseite($startseite);
|
|
}
|
|
else
|
|
{
|
|
$this->app->erp->InitialSetup();
|
|
$this->app->Tpl->Set('UEBERSCHRIFT','Xentral · Enterprise Warehouse Management');
|
|
|
|
$this->app->acl->Login();
|
|
}
|
|
}
|
|
|
|
public function WelcomeLogout()
|
|
{
|
|
$this->app->acl->Logout();
|
|
$this->app->erp->ClearCookies();
|
|
}
|
|
|
|
public function WelcomeUnlock()
|
|
{
|
|
$gui = $this->app->Secure->GetGET('gui');
|
|
$id = $this->app->Secure->GetGET('id');
|
|
$backlink = $this->app->Secure->GetGET('backlink');
|
|
|
|
// Prüfen ob Backlink mit index.php? beginnt; ansonsten ist Open Redirect möglich
|
|
if (!empty($backlink) && strpos($backlink, 'index.php?') !== 0){
|
|
unset($backlink);
|
|
}
|
|
|
|
// sperre entfernen bzw umschreiben
|
|
if($gui==='angebot' || $gui==='auftrag' || $gui==='rechnung' || $gui==='bestellung' || $gui==='gutschrift' || $gui==='lieferschein' || $gui==='retoure' || $gui==='adresse' || $gui==='artikel' || $gui==='produktion' || $gui==='reisekosten' || $gui==='preisanfrage')
|
|
{
|
|
$this->app->DB->Update("UPDATE $gui SET usereditid='".$this->app->User->GetID()."' WHERE id='$id' LIMIT 1");
|
|
if(!empty($backlink))
|
|
{
|
|
header('Location: '.$backlink);
|
|
}else{
|
|
header("Location: index.php?module=$gui&action=edit&id=$id");
|
|
}
|
|
exit;
|
|
}
|
|
}
|
|
|
|
|
|
public function VorgangAnlegen()
|
|
{
|
|
//print_r($_SERVER['HTTP_REFERER']);
|
|
$titel = $this->app->Secure->GetGET('titel');
|
|
|
|
$url = parse_url($_SERVER['HTTP_REFERER']);
|
|
//$url = parse_url("http://dev.eproo.de/~sauterbe/eprooSystem-2009-11-21/webroot/index.php?module=ticket&action=edit&id=1");
|
|
|
|
//module=ticket&action=edit&id=1
|
|
//$url['query']
|
|
$params = explode('&',$url['query']);
|
|
foreach($params as $value){
|
|
$attribut = explode('=',$value);
|
|
$arrPara[$attribut[0]] = (!empty($attribut)?count($attribut):0) > 1?$attribut[1]:'';
|
|
}
|
|
|
|
$adresse = $this->app->User->GetAdresse();
|
|
if($titel==''){
|
|
$titel = ucfirst($arrPara['module']) . ' ' . $arrPara['id'];
|
|
}
|
|
$href = $url['query'];
|
|
$this->app->erp->AddOffenenVorgang($adresse, $titel, $href);
|
|
|
|
header('Location: '.$_SERVER['HTTP_REFERER']);
|
|
}
|
|
|
|
/**
|
|
* @param int $cacheTime
|
|
*
|
|
* @return string
|
|
*/
|
|
public function loadChangeLogCacheFile(int $cacheTime = 4): string
|
|
{
|
|
$version = $this->app->erp->Version();
|
|
$revision = $this->app->erp->Revision();
|
|
|
|
$tmp = explode('.',$revision);
|
|
$branch = strtolower($version).'_'.$tmp[0].'.'.$tmp[1];
|
|
|
|
$blogUrl = "https://{$this->app->Conf->updateHost}/wawision_2016.php?all=1&branch=".$branch;
|
|
$cacheFile = $this->app->erp->GetTMP().md5($blogUrl);
|
|
$cacheFile2 = $this->app->erp->GetTMP().md5($blogUrl).'2';
|
|
if(!file_exists($cacheFile2)) {
|
|
if(file_exists($cacheFile)) {
|
|
@unlink($cacheFile);
|
|
}
|
|
}
|
|
else{
|
|
if(trim(file_get_contents($cacheFile2)) != $version.$revision) {
|
|
@unlink($cacheFile);
|
|
}
|
|
}
|
|
|
|
if(!file_exists($cacheFile) || ((time() - filemtime($cacheFile)) > 3600 * $cacheTime)) {
|
|
if($feed_contents = @file_get_contents($blogUrl)) {
|
|
$fp = fopen($cacheFile, 'w');
|
|
fwrite($fp, $feed_contents);
|
|
fclose($fp);
|
|
@file_put_contents($cacheFile2, $version.$revision);
|
|
}
|
|
}
|
|
|
|
return $cacheFile;
|
|
}
|
|
|
|
/**
|
|
* @param int $hours
|
|
*/
|
|
public function loadChangeLogByTime(int $hours = 4): void
|
|
{
|
|
$lastTime = (int)$this->app->erp->GetKonfiguration('welcome_changelog_last_save');
|
|
if($lastTime > 0 && time() - $lastTime < $hours * 3600) {
|
|
return;
|
|
}
|
|
|
|
$this->loadArrFromChangeLogFile();
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function loadArrFromChangeLogFile(): array
|
|
{
|
|
$file = $this->loadChangeLogCacheFile();
|
|
$this->app->erp->SetKonfigurationValue('welcome_changelog_last_save', time());
|
|
if(!is_file($file)){
|
|
$this->app->erp->SetKonfigurationValue('welcome_changelog_count', 0);
|
|
return ['changelog' => [], 'act' => [], 'found' => false, 'types' => [], 'count_new' => 0,];
|
|
}
|
|
$content = file_get_contents($file);
|
|
if(empty($content)) {
|
|
$this->app->erp->SetKonfigurationValue('welcome_changelog_count', 0);
|
|
return ['changelog' => [], 'act' => [], 'found' => false, 'types' => [], 'count_new' => 0,];
|
|
}
|
|
$xml = simplexml_load_string($content);
|
|
if(empty($xml)) {
|
|
$this->app->erp->SetKonfigurationValue('welcome_changelog_count', 0);
|
|
return ['changelog' => [], 'act' => [], 'found' => false, 'types' => [], 'count_new' => 0,];
|
|
}
|
|
$json = json_encode($xml);
|
|
|
|
$array = json_decode($json, true);
|
|
if(empty($array)) {
|
|
$this->app->erp->SetKonfigurationValue('welcome_changelog_count', 0);
|
|
return ['changelog' => [], 'act' => [], 'found' => false, 'types' => [], 'count_new' => 0,];
|
|
}
|
|
$found = false;
|
|
$akt = [];
|
|
$version_revision = null;
|
|
include dirname(dirname(__DIR__)) .'/version.php';
|
|
if(isset($version_revision) && $version_revision != '') {
|
|
$ra = explode('.', $version_revision);
|
|
if(isset($ra[2]) && $ra[2] != '') {
|
|
$citems = isset($array['channel']['item'])?count($array['channel']['item']):0;
|
|
for($i=0;$i<$citems;$i++) {
|
|
if($found !== false) {
|
|
if(!empty($array['channel']['item'][$i]['title'])){
|
|
$akt['channel']['item'][$i] = $array['channel']['item'][$i];
|
|
}
|
|
unset($array['channel']['item'][$i]);
|
|
}
|
|
else {
|
|
$rev = isset($array['channel']['item'][$i]['guid'])?$array['channel']['item'][$i]['guid']:'';
|
|
if($rev == '') {
|
|
$rev = trim(trim($array['channel']['item'][$i]['title']),')');
|
|
$rev = trim(substr($rev, strrpos($rev, '(')+4));
|
|
}
|
|
if($rev == $ra[2]) {
|
|
$found = $i;
|
|
$akt['channel']['item'][$i] = $array['channel']['item'][$i];
|
|
unset($array['channel']['item'][$i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$citems = isset($array['channel']['item'])?count($array['channel']['item']):0;
|
|
|
|
$types = array();
|
|
for($i=0;$i<$citems;$i++) {
|
|
$messageType = explode(' ', ltrim($array['channel']['item'][$i]['description']));
|
|
$messageType = strtolower($messageType[0]);
|
|
if(!array_key_exists($messageType, $types)){
|
|
$types[$messageType] = [];
|
|
}
|
|
$types[$messageType][] = $array['channel']['item'][$i];
|
|
}
|
|
|
|
$this->app->erp->SetKonfigurationValue('welcome_changelog_count', $citems);
|
|
|
|
return ['changelog' => $array, 'act' => $akt, 'found' => $found, 'types' => $types, 'count_new' => $citems,];
|
|
}
|
|
|
|
public function WelcomeChangelog()
|
|
{
|
|
$this->StartseiteMenu();
|
|
|
|
$version_revision = null;
|
|
$revision = $this->app->erp->Revision();
|
|
|
|
$changeLogArray = $this->loadArrFromChangeLogFile();
|
|
$found = $changeLogArray['found'];
|
|
$array = $changeLogArray['changelog'];
|
|
$akt = $changeLogArray['act'];
|
|
$types = $changeLogArray['types'];
|
|
|
|
$this->app->Tpl->Add('TAB1', '<div class="row">
|
|
<div class="row-height">
|
|
<div class="col-md-12 col-md-height">
|
|
<div class="inside inside-full-height">
|
|
<fieldset><legend>Neue verfügbare Updates</legend>');
|
|
if(!empty($array['channel']) && !empty($array['channel']['item']) && is_array($array['channel']['item'])
|
|
&& count($array['channel']['item']) > 0) {
|
|
$listingOrder = ['new', 'add', 'change', 'fix', 'merge'];
|
|
foreach ($listingOrder as $informations){
|
|
if(isset($types[$informations])){
|
|
$this->app->Tpl->Add('TAB1', '<fieldset><legend>'.ucfirst($informations).'</legend><ul>');
|
|
foreach ($types[$informations] as $information){
|
|
$messageDate = DateTime::createFromFormat('Y-m-d', $information['pubDate']);
|
|
$messageDate = $messageDate->format('d.m.Y');
|
|
$this->app->Tpl->Add('TAB1', '<li>'.$information['description'].' ('.$messageDate.' rev '.$information['guid'].')</li>');
|
|
}
|
|
$this->app->Tpl->Add('TAB1', '</ul></fieldset>');
|
|
unset($types[$informations]);
|
|
}
|
|
}
|
|
|
|
//dynamic remaining messagetypes for output
|
|
foreach($types as $type=>$informations){
|
|
$this->app->Tpl->Add('TAB1', '<fieldset><legend>'.ucfirst($type).'</legend><ul>');
|
|
foreach ($informations as $value){
|
|
$messageDate = DateTime::createFromFormat('Y-m-d', $value['pubDate']);
|
|
$messageDate = $messageDate->format('d.m.Y');
|
|
$this->app->Tpl->Add('TAB1', '<li>'.$value['description'].' ('.$messageDate.' rev '.$value['guid'].')</li>');
|
|
}
|
|
$this->app->Tpl->Add('TAB1', '</ul></fieldset>');
|
|
unset($types[$type]);
|
|
}
|
|
}
|
|
elseif($found !== false){
|
|
$this->app->Tpl->Add('TAB1', '<div class="info">Ihre Version ist auf dem neuesten Stand.</div>');//<fieldset><legend>Ihre Version ist auf dem neuesten Stand.</legend></fieldset>');
|
|
}
|
|
$this->app->Tpl->Add('TAB1', '</fieldset></div></div></div></div>');
|
|
|
|
|
|
if(!empty($akt)) {
|
|
$this->app->Tpl->Add('TAB1', '<div class="row">
|
|
<div class="row-height">
|
|
<div class="col-md-12 col-md-height">
|
|
<div class="inside inside-full-height">
|
|
<fieldset><legend>Letzte durchgeführte Updates</legend><ul>');
|
|
$citems = isset($akt['channel']['item'])?count($akt['channel']['item']):0;
|
|
for($i=0;$i<$citems;$i++) {
|
|
if(empty($akt['channel']['item'][$i]['title'])){
|
|
continue;
|
|
}
|
|
$messageDate = DateTime::createFromFormat('Y-m-d', $akt['channel']['item'][$i]['pubDate']);
|
|
$messageDate = $messageDate->format('d.m.Y');
|
|
$this->app->Tpl->Add('TAB1', '<li>'.$akt['channel']['item'][$i]['description'].' ('.$messageDate.' rev '.$akt['channel']['item'][$i]['guid'].')</li>');
|
|
}
|
|
$this->app->Tpl->Add('TAB1', '</ul></fieldset></div></div></div></div>');
|
|
}
|
|
|
|
$versionNumber = explode('.', $revision);
|
|
$versionNumber = $versionNumber[0].'.'.$versionNumber[1];
|
|
|
|
$allChangesInVersionUrl = "https://{$this->app->Conf->updateHost}/xentral_2020.php?branch=".$versionNumber;
|
|
$allChangesInVersionCacheFile = $this->app->erp->GetTMP().md5($allChangesInVersionUrl);
|
|
$allChangesInVersionCacheFile2 = $this->app->erp->GetTMP().md5($allChangesInVersionUrl).'2';
|
|
|
|
if(!file_exists($allChangesInVersionCacheFile2)){
|
|
if(file_exists($allChangesInVersionCacheFile)){
|
|
@unlink($allChangesInVersionCacheFile);
|
|
}
|
|
}else{
|
|
if(trim(file_get_contents($allChangesInVersionCacheFile2)) != $versionNumber){
|
|
@unlink($allChangesInVersionCacheFile);
|
|
}
|
|
}
|
|
$allChangesInVersionCacheTime = 4; # hours
|
|
if(!file_exists($allChangesInVersionCacheFile) || ((time() - filemtime($allChangesInVersionCacheFile)) > 3600 * $allChangesInVersionCacheTime)){
|
|
if($feed_contents = @file_get_contents($allChangesInVersionUrl)){
|
|
$fp = fopen($allChangesInVersionCacheFile, 'w');
|
|
fwrite($fp, $feed_contents);
|
|
fclose($fp);
|
|
@file_put_contents($allChangesInVersionCacheFile2, $versionNumber);
|
|
}
|
|
}
|
|
$feed_contents = file_get_contents($allChangesInVersionCacheFile);
|
|
|
|
$allChangesInVersion = json_decode($feed_contents, TRUE);
|
|
|
|
$this->app->Tpl->Add('TAB2', '<div class="row">
|
|
<div class="row-height">
|
|
<div class="col-md-12 col-md-height">
|
|
<div class="inside inside-full-height">
|
|
<fieldset><legend>Alle Änderungen in Version '.$versionNumber.'</legend>');
|
|
|
|
$countChanges = isset($allChangesInVersion['new'])?count($allChangesInVersion['new']):0;
|
|
$types = array();
|
|
for($i=0;$i<$countChanges;$i++) {
|
|
$messageType = explode(' ', ltrim($allChangesInVersion['new'][$i]['msg']));
|
|
$messageType = strtolower($messageType[0]);
|
|
if(!array_key_exists($messageType, $types)){
|
|
$types[$messageType] = [];
|
|
}
|
|
$types[$messageType][] = $allChangesInVersion['new'][$i];
|
|
}
|
|
|
|
//fixed order of messagetypes for output
|
|
$listingOrder = ['new', 'add', 'change', 'fix', 'merge'];
|
|
foreach ($listingOrder as $informations){
|
|
if(isset($types[$informations])){
|
|
$this->app->Tpl->Add('TAB2', '<fieldset><legend>'.ucfirst($informations).'</legend><ul>');
|
|
foreach ($types[$informations] as $information){
|
|
$messageDate = DateTime::createFromFormat('Y-m-d\TH:i:sP', $information['date']);
|
|
$messageDate = $messageDate->format('d.m.Y');
|
|
$this->app->Tpl->Add('TAB2', '<li>'.$information['msg'].' ('.$messageDate.' rev '.$information['rev'].')</li>');
|
|
}
|
|
$this->app->Tpl->Add('TAB2', '</ul></fieldset>');
|
|
unset($types[$informations]);
|
|
}
|
|
}
|
|
|
|
//dynamic remaining messagetypes for output
|
|
foreach($types as $type=>$informations){
|
|
$this->app->Tpl->Add('TAB2', '<fieldset><legend>'.ucfirst($type).'</legend><ul>');
|
|
foreach ($informations as $value){
|
|
$messageDate = DateTime::createFromFormat('Y-m-d\TH:i:sP', $value['date']);
|
|
$messageDate = $messageDate->format('d.m.Y');
|
|
$this->app->Tpl->Add('TAB2', '<li>'.$value['msg'].' ('.$messageDate.' rev '.$value['rev'].')</li>');
|
|
}
|
|
$this->app->Tpl->Add('TAB2', '</ul></fieldset>');
|
|
unset($types[$type]);
|
|
}
|
|
$this->app->Tpl->Add('TAB2', '</fieldset></div></div></div></div>');
|
|
|
|
|
|
$this->app->Tpl->Set('VERSION', $versionNumber);
|
|
$this->app->Tpl->Parse('PAGE', 'welcome_changelog.tpl');
|
|
}
|
|
|
|
|
|
public function VorgangEdit()
|
|
{
|
|
$vorgang = $this->app->Secure->GetGET('vorgang');
|
|
$titel = $this->app->Secure->GetGET('titel');
|
|
$this->app->erp->RenameOffenenVorgangID($vorgang,$titel);
|
|
header('Location: '.$_SERVER['HTTP_REFERER']);
|
|
exit;
|
|
}
|
|
|
|
public function VorgangEntfernen()
|
|
{
|
|
$vorgang = $this->app->Secure->GetGET('vorgang');
|
|
$this->app->erp->RemoveOffenenVorgangID($vorgang);
|
|
header('Location: '.$_SERVER['HTTP_REFERER']);
|
|
exit;
|
|
}
|
|
|
|
private function getCurrentDefaultLanguage($fromPost){
|
|
|
|
if(empty($fromPost)){
|
|
$fromPost = $this->app->erp->Firmendaten('preferredLanguage');
|
|
|
|
if(empty($fromPost)){
|
|
$fromPost = 'deutsch';
|
|
}
|
|
}
|
|
return $fromPost;
|
|
}
|
|
|
|
/**
|
|
* Liefert einen String aus HTML-Optionen zurück
|
|
* @param string $fromPost
|
|
* @return string
|
|
*/
|
|
private function languageSelectOptions($fromPost=''){
|
|
|
|
$select = $this->getCurrentDefaultLanguage($fromPost);
|
|
|
|
$out = "";
|
|
$sprachen = $this->getLanguages();
|
|
|
|
foreach($sprachen as $sprache) {
|
|
$selected = (($select==$sprache) ? 'selected' : '');
|
|
$out .= "<option value=\"$sprache\" $selected>$sprache</option>";
|
|
}
|
|
return $out;
|
|
}
|
|
|
|
/**
|
|
* Liefert einen Array aus Strings zurück. Immer mindestens 'deutsch' enthalten
|
|
* @return array
|
|
*/
|
|
private function getLanguages(){
|
|
|
|
$sprachen[] = 'deutsch';
|
|
$folder = __DIR__ .'/../../languages';
|
|
if(is_dir($folder))
|
|
{
|
|
$handle = opendir($folder);
|
|
if($handle){
|
|
while($file = readdir($handle))
|
|
{
|
|
if ($file[0] !== '.')
|
|
{
|
|
if(is_dir($folder.'/'.$file) && (file_exists($folder.'/'.$file.'/variablen.php')|| file_exists($folder.'/'.$file.'/variablen_custom.php')))
|
|
{
|
|
if($file == 'german')$file = 'deutsch';
|
|
if(!in_array($file, $sprachen))$sprachen[] = $file;
|
|
}
|
|
}
|
|
}
|
|
closedir($handle);
|
|
}
|
|
}
|
|
return $sprachen;
|
|
}
|
|
|
|
/**
|
|
* @param array $arr
|
|
*
|
|
* @return array
|
|
*/
|
|
protected function formatOptionArrForVue($arr)
|
|
{
|
|
$ret = [];
|
|
foreach($arr as $key => $value) {
|
|
$ret[] = [
|
|
'text' => $value,
|
|
'value' => $key,
|
|
];
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
/**
|
|
* @return JsonResponse
|
|
*/
|
|
protected function HandleStartClickByClick()
|
|
{
|
|
$isAdminAdmin = $this->app->acl->IsAdminadmin();
|
|
$hasRole = !empty($this->app->User->GetField('role'));
|
|
/** @var Benutzer $userModule */
|
|
$userModule = $this->app->loadModule('benutzer');
|
|
$firstPage = [
|
|
'type' => 'form',
|
|
'submitType' => 'submit',
|
|
'submitUrl' => $isAdminAdmin
|
|
?'index.php?module=welcome&action=settings&cmd=changepasswordclickbyclick'
|
|
:'index.php?module=welcome&action=settings&cmd=changeroleclickbyclick',
|
|
'icon' => $isAdminAdmin?'password-icon':'add-person-icon',
|
|
'headline' => $isAdminAdmin?'Passwort ändern':'Ihre Rolle',
|
|
'subHeadline' => $isAdminAdmin?'Bitte geben Sie ein Passwort ein und bestätige es mit einer zweiten Eingabe'
|
|
:'Bitte geben Sie Ihre Rolle im Unternehmen ein',
|
|
'form' => [],
|
|
'ctaButtons' => [
|
|
[
|
|
'title' => 'Weiter',
|
|
'type' => 'submit',
|
|
'action' => 'submit'
|
|
]]
|
|
];
|
|
|
|
if($isAdminAdmin) {
|
|
$firstPage['form'] = [
|
|
[
|
|
'id' => 0,
|
|
'name' => 'set-password-row',
|
|
'inputs' => [
|
|
[
|
|
'type' => 'password',
|
|
'name' => 'setPassword',
|
|
'label' => 'Passwort',
|
|
'validation' => true,
|
|
]]
|
|
],
|
|
[
|
|
'id' => 1,
|
|
'name' => 'repeat-password-row',
|
|
'inputs' => [
|
|
[
|
|
'type' => 'password',
|
|
'name' => 'repeatPassword',
|
|
'label' => 'Passwort wiederholen',
|
|
'connectedTo' => 'setPassword',
|
|
'validation' => true,
|
|
'customErrorMsg' => 'Passwörter sind nicht identisch'
|
|
]]
|
|
]];
|
|
}
|
|
|
|
if(!$hasRole) {
|
|
|
|
$firstPage['form'][] = [
|
|
'id' => 2,
|
|
'name' => 'role-row',
|
|
'inputs' => [
|
|
[
|
|
'type' => 'select',
|
|
'name' => 'teamMemberRole',
|
|
'label' => 'Rolle',
|
|
'validation' => false,
|
|
'options' => $this->formatOptionArrForVue($userModule->getRoleOptions())
|
|
]
|
|
]
|
|
];
|
|
$firstPage['form'][] = [
|
|
'id' => 3,
|
|
'name' => 'otherrole-row',
|
|
'inputs' => [
|
|
[
|
|
'type' => 'text',
|
|
'name' => 'teamMemberOtherRole',
|
|
'label' => 'Sonstiges',
|
|
'validation' => false,
|
|
]
|
|
]
|
|
];
|
|
}
|
|
|
|
$pages[] = $firstPage;
|
|
|
|
|
|
/*/ This is pointless because the mailaccount is not configured yet
|
|
if($isAdminAdmin) {
|
|
$isFirstAdmin = $this->app->User->GetType() === 'admin' && $this->app->User->GetName('admin');
|
|
if($isFirstAdmin) {
|
|
$pages[] = [
|
|
'type' => 'form',
|
|
'submitType' => 'submit',
|
|
'submitUrl' => 'index.php?module=welcome&action=settings&cmd=inviteteamclickbyclick',
|
|
'icon' => 'add-person-icon',
|
|
'headline' => 'Lade Dein Team ein',
|
|
'subHeadline' => 'Du kannst bis zu 5 weitere Mitglieder hinzufügen',
|
|
'form' => [
|
|
[
|
|
'id' => 0,
|
|
'name' => 'add-person-row',
|
|
'removable' => true,
|
|
'add' => [
|
|
'allow'=> true,
|
|
'maximum'=> 5,
|
|
'text'=> 'Weitere Mitglieder hinzufügen'
|
|
],
|
|
'inputs' => [
|
|
[
|
|
'type' => 'text',
|
|
'name' => 'teamMemberName',
|
|
'label' => 'Name',
|
|
'validation' => false,
|
|
'customErrorMsg' => 'too short',
|
|
],
|
|
[
|
|
'type' => 'email',
|
|
'name' => 'teamMemberEmail',
|
|
'label' => 'E-Mail',
|
|
'validation' => false,
|
|
],
|
|
|
|
[
|
|
'type' => 'select',
|
|
'name' => 'teamMemberRole',
|
|
'label' => 'Rolle',
|
|
'validation' => false,
|
|
'options' => $this->formatOptionArrForVue($userModule->getRoleOptions())
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'ctaButtons' => [
|
|
[
|
|
'title' => 'Weiter',
|
|
'type' => 'submit',
|
|
'action' => 'submit'
|
|
]]
|
|
];
|
|
}
|
|
}
|
|
*/
|
|
|
|
if($isAdminAdmin) {
|
|
$subHeadline = 'Bitte nach der Installation das <a href="index.php?module=upgrade" target="_blank">Datenbank-Upgrade</a> durchführen.';
|
|
} else {
|
|
$subHeadline = 'Es kann nun losgehen.';
|
|
}
|
|
|
|
$lastPage = [
|
|
'type' => 'defaultPage',
|
|
'icon' => 'add-person-icon',
|
|
'headline' => $isAdminAdmin ? 'Das Passwort wurde geändert' : 'Ihre Rolle wurde gespeichert',
|
|
'subHeadline' => $subHeadline,
|
|
'ctaButtons' => [
|
|
[
|
|
'title' => 'Ok',
|
|
'action' => 'close'
|
|
]
|
|
]
|
|
];
|
|
if($showExampleImport) {
|
|
$lastPage['subHeadline'] .= '<br /><a href="index.php?module=systemtemplates&action=list">Beispieldaten einspielen</a>';
|
|
}
|
|
|
|
$pages[] = $lastPage;
|
|
|
|
return new JsonResponse(['success'=>true, 'pages'=>$pages]);
|
|
}
|
|
|
|
/**
|
|
* @param int $addressId
|
|
*
|
|
* @return int
|
|
*/
|
|
protected function ChangeAddressIdIfCollideWithExampleData(int $addressId): int
|
|
{
|
|
$lastAddressIdInExampleDataset = 8;
|
|
if($addressId > $lastAddressIdInExampleDataset) {
|
|
return $addressId;
|
|
}
|
|
$this->app->DB->Update(
|
|
sprintf(
|
|
'UPDATE `adresse` SET `id` = %d WHERE `id` = %d',
|
|
$lastAddressIdInExampleDataset + 1, $addressId
|
|
)
|
|
);
|
|
if($this->app->DB->affected_rows() > 0) {
|
|
$addressId = $lastAddressIdInExampleDataset + 1;
|
|
}
|
|
|
|
return $addressId;
|
|
}
|
|
|
|
/**
|
|
* @param int $userId
|
|
*
|
|
* @return int
|
|
*/
|
|
protected function ChangeUserIdIfCollideWithExampleData(int $userId): int
|
|
{
|
|
$lastUserIdInExampleDataset = 3;
|
|
if($userId > $lastUserIdInExampleDataset) {
|
|
return $userId;
|
|
}
|
|
$this->app->DB->Update(
|
|
sprintf(
|
|
'UPDATE `user` SET `id` = %d WHERE `id` = %d',
|
|
$lastUserIdInExampleDataset + 1 , $userId
|
|
)
|
|
);
|
|
if($this->app->DB->affected_rows() > 0) {
|
|
$userId = $lastUserIdInExampleDataset + 1;
|
|
}
|
|
|
|
return $userId;
|
|
}
|
|
|
|
/**
|
|
* @return JsonResponse
|
|
*/
|
|
protected function HandleInviteTeamClickByClick()
|
|
{
|
|
$userNames = [];
|
|
$members = [];
|
|
$needToPreventExampleImportFailure = !empty(erpAPI::Ioncube_Property('testlizenz'))
|
|
&& !empty(erpAPI::Ioncube_Property('iscloud'));
|
|
for($i = 0; $i < 5; $i++) {
|
|
$userName = $this->app->Secure->GetPOST('teamMemberName'.($i > 0?(string)$i:''));
|
|
if(empty($userName)) {
|
|
continue;
|
|
}
|
|
if(in_array($userName, $userNames)) {
|
|
return new JsonResponse(['error'=>'Usernamen sind identisch'],JsonResponse::HTTP_BAD_REQUEST);
|
|
}
|
|
$userNames[] = $userName;
|
|
$userEmail = $this->app->Secure->GetPOST('teamMemberEmail'.($i > 0?(string)$i:''));
|
|
if(empty($userEmail)) {
|
|
return new JsonResponse(['error'=>'Bitte füllen Sie die Email-Adresse aus'],JsonResponse::HTTP_BAD_REQUEST);
|
|
}
|
|
$userRole = $this->app->Secure->GetPOST('teamMemberRole'.($i > 0?(string)$i:''));
|
|
if(
|
|
$this->app->DB->Select(sprintf("SELECT COUNT(`id`) FROM `user` WHERE `username` = '%s'", $userName)) > 0
|
|
|| $this->app->DB->Select(sprintf("SELECT COUNT(`id`) FROM `adresse` WHERE `name` = '%s'", $userName)) > 0
|
|
) {
|
|
return new JsonResponse(
|
|
['error'=>sprintf('Usernamen %s existiert bereits', $userName)],
|
|
JsonResponse::HTTP_BAD_REQUEST
|
|
);
|
|
}
|
|
$members[] = ['username' => $userName, 'email' => $userEmail, 'role' => $userRole];
|
|
}
|
|
if(empty($members)) {
|
|
return new JsonResponse(['success'=>true]);
|
|
}
|
|
$projectId = $this->app->DB->Select(
|
|
'SELECT `id` FROM `projekt` WHERE `geloescht` = 0 ORDER BY `oeffentlich` DESC LIMIT 1'
|
|
);
|
|
foreach($members as $member) {
|
|
$password = $member['username'];
|
|
$this->app->DB->Insert(
|
|
sprintf(
|
|
"INSERT INTO `adresse` (`name`, `email`, `projekt`)
|
|
VALUES ('%s', '%s', %d)",
|
|
$member['username'], $member['email'], $projectId
|
|
)
|
|
);
|
|
$addressId = (int)$this->app->DB->GetInsertID();
|
|
if($needToPreventExampleImportFailure) {
|
|
$addressId = $this->ChangeAddressIdIfCollideWithExampleData($addressId);
|
|
}
|
|
$this->app->erp->AddRolleZuAdresse($addressId, 'Mitarbeiter', 'von', 'Projekt', $projectId);
|
|
$vorlage =
|
|
$this->app->DB->real_escape_string(
|
|
$this->app->DB->Select(
|
|
sprintf(
|
|
"SELECT `bezeichnung` FROM `uservorlage` WHERE `bezeichnung` = '%s'",
|
|
$member['role']
|
|
)
|
|
)
|
|
);
|
|
$this->app->DB->Insert(
|
|
sprintf(
|
|
"INSERT INTO `user`
|
|
(`username`, `passwordmd5`, `hwtoken`, `type`, `repassword`, `externlogin`,`firma`,`fehllogins`,
|
|
`adresse`,`standarddrucker`,`settings`, `activ`,`vorlage`,`role`)
|
|
VALUES ('%s', '%s', 0, 'benutzer', 0, 1,1,0,
|
|
%d,0,'',1,'%s','%s')",
|
|
$member['username'], md5($password),
|
|
$addressId, $vorlage, $member['role']
|
|
)
|
|
);
|
|
$newUserId = (int)$this->app->DB->GetInsertID();
|
|
if($needToPreventExampleImportFailure){
|
|
$newUserId = $this->ChangeUserIdIfCollideWithExampleData($newUserId);
|
|
}
|
|
$this->app->erp->insertDefaultUserRights($newUserId);
|
|
if($vorlage !== '') {
|
|
$this->app->erp->AbgleichBenutzerVorlagen($newUserId);
|
|
}
|
|
$link = $this->app->Location->getServer();
|
|
$this->app->erp->MailSend(
|
|
$this->app->erp->Firmendaten('email'),
|
|
$this->app->erp->Firmendaten('absendername'),
|
|
$member['email'],
|
|
$member['username'],
|
|
'Einladung',
|
|
sprintf(
|
|
'Hallo %s,<br />
|
|
<br />
|
|
Willkommen auf Xentral.<br />
|
|
<br />
|
|
Du kannst dich mit den folgenden Zugangsdaten einloggen<br /><br />
|
|
Username: %s<br />
|
|
Passwort: %s<br />
|
|
<a href="%s" style="margin-top:24px;display:inline-block;padding:10px 23px;color:#fff;background:#2DCA73;border-radius:4px;font-size:15px;font-weight:600;text-decoration:none;cursor:pointer">Hier gehts los</a>',
|
|
$member['username'],
|
|
$member['username'],
|
|
$password,
|
|
$link
|
|
),
|
|
'',0,true,'','',
|
|
true
|
|
);
|
|
}
|
|
|
|
return new JsonResponse(['success'=>true]);
|
|
}
|
|
|
|
/**
|
|
* @return JsonResponse
|
|
*/
|
|
protected function HandleChangeRoleClickByClick()
|
|
{
|
|
$role = $this->app->Secure->GetPOST('teamMemberRole');
|
|
if(empty($role)) {
|
|
return new JsonResponse(
|
|
['error'=>'Bitte eine Rolle angeben!'],
|
|
JsonResponse::HTTP_BAD_REQUEST
|
|
);
|
|
}
|
|
$this->app->DB->Update(
|
|
sprintf(
|
|
"UPDATE `user` SET `role` = '%s' WHERE `id` = %d",
|
|
$role, $this->app->User->GetID()
|
|
)
|
|
);
|
|
|
|
return new JsonResponse(['success'=>true]);
|
|
}
|
|
|
|
/**
|
|
* @return JsonResponse
|
|
*/
|
|
protected function HandlePasswordChangeClickByClick()
|
|
{
|
|
$password = $this->app->Secure->GetPOST('setPassword');
|
|
$repassword = $this->app->Secure->GetPOST('repeatPassword');
|
|
$role = (string)$this->app->Secure->GetPOST('teamMemberRole');
|
|
$otherRole = (string)$this->app->Secure->GetPOST('teamMemberOtherRole');
|
|
$hasUserRole = !empty($this->app->User->GetField('role'));
|
|
if($otherRole !== '' && ($role === '' || $role === 'Sonstiges')) {
|
|
$role = $otherRole;
|
|
}
|
|
if(!$hasUserRole && $role === ''
|
|
&& (string)$this->app->DB->Select(
|
|
sprintf(
|
|
'SELECT `role` FROM `user` WHERE `id` = %d', $this->app->User->GetID()
|
|
)
|
|
)
|
|
) {
|
|
return new JsonResponse(
|
|
['error'=>'Bitte gebe eine Rolle ein!'],
|
|
JsonResponse::HTTP_BAD_REQUEST
|
|
);
|
|
}
|
|
$passwordunescaped = $this->app->Secure->GetPOST('setPassword', '', '', 'noescape');
|
|
if(empty($password)) {
|
|
return new JsonResponse(
|
|
['error'=>'Passworteingabe falsch! Bitte geben Sie ein Passwort ein!'],
|
|
JsonResponse::HTTP_BAD_REQUEST
|
|
);
|
|
}
|
|
|
|
if(strlen($password) < 8) {
|
|
return new JsonResponse(
|
|
['error'=>'Passworteingabe falsch! Das Passwort muss mindestens 8 Zeichen enthalten!'],
|
|
JsonResponse::HTTP_BAD_REQUEST
|
|
);
|
|
}
|
|
|
|
if($password !== $repassword){
|
|
return new JsonResponse(
|
|
['error'=>'Passworteingabe falsch! Bitte zwei mal das gleiche Passwort eingeben!'],
|
|
JsonResponse::HTTP_BAD_REQUEST
|
|
);
|
|
}
|
|
|
|
if($password === $this->app->User->GetUsername()){
|
|
return new JsonResponse(
|
|
['error'=>'Das Passwort darf nicht dem Username entsprechen!'],
|
|
JsonResponse::HTTP_BAD_REQUEST
|
|
);
|
|
}
|
|
|
|
$this->changeUserPassword($password, $passwordunescaped);
|
|
if(!empty($role)) {
|
|
$this->app->DB->Update(
|
|
sprintf(
|
|
"UPDATE `user` SET `role` = '%s' WHERE `id` = %d",
|
|
$role, $this->app->User->GetID()
|
|
)
|
|
);
|
|
}
|
|
|
|
return new JsonResponse(['success'=>true]);
|
|
}
|
|
|
|
/**
|
|
* @param string $password
|
|
* @param string $passwordunescaped
|
|
*
|
|
* @return string|null
|
|
*/
|
|
protected function changeUserPassword($password, $passwordunescaped)
|
|
{
|
|
if(!empty($password) && $password !== $this->app->User->GetUsername()){
|
|
$this->app->DB->Select("SELECT u.passwordhash FROM `user` AS u WHERE u.id = '" . $this->app->User->GetID() . "' LIMIT 1");
|
|
if(!$this->app->DB->error()){
|
|
$options = array(
|
|
'cost' => 12,
|
|
);
|
|
$passwordhash = @password_hash($passwordunescaped, PASSWORD_BCRYPT, $options);
|
|
if(!empty($passwordhash)){
|
|
$this->app->DB->Update(
|
|
"UPDATE `user` SET
|
|
`passwordhash` = '" . $this->app->DB->real_escape_string($passwordhash) . "',
|
|
`password` = '',
|
|
`passwordmd5` = '',
|
|
`passwordsha512` = '',
|
|
`salt` = ''
|
|
WHERE `id` = '" . $this->app->User->GetID() . "' LIMIT 1"
|
|
);
|
|
|
|
return '<div class="warning">{|Passwort wurde erfolgreich geändert!|}</div>';
|
|
}
|
|
}else{
|
|
$salt = $this->app->DB->Select("SELECT u.salt FROM `user` AS u WHERE u.id = '" . $this->app->User->GetID() . "' LIMIT 1");
|
|
if(!$this->app->DB->error()){
|
|
if(empty($salt)){
|
|
$salt = hash('sha512', microtime(true));
|
|
}
|
|
$passwordsha512 = hash('sha512', $password . $salt);
|
|
if(!empty($salt) && !empty($passwordsha512)){
|
|
$this->app->DB->Update(
|
|
"UPDATE `user` SET
|
|
`password` = '',
|
|
`passwordmd5` = '',
|
|
`salt` = '{$salt}',
|
|
`passwordsha512` = '{$passwordsha512}'
|
|
WHERE `id` = '" . $this->app->User->GetID() . "' LIMIT 1"
|
|
);
|
|
}else{
|
|
$this->app->DB->Update(
|
|
"UPDATE `user` SET
|
|
`password` = '',
|
|
`passwordmd5` = MD5('{$password}'),
|
|
`salt` = '{$salt}',
|
|
`passwordsha512` = '{$passwordsha512}'
|
|
WHERE `id` = '" . $this->app->User->GetID() . "' LIMIT 1"
|
|
);
|
|
}
|
|
}else{
|
|
$this->app->DB->Update(
|
|
"UPDATE `user` SET
|
|
`password` = '',
|
|
`passwordmd5` = MD5('{$password}')
|
|
WHERE `id`='" . $this->app->User->GetID() . "' LIMIT 1"
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Passwort-Änderung
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function HandlePasswordChange()
|
|
{
|
|
$password = $this->app->Secure->GetPOST('password');
|
|
$repassword = $this->app->Secure->GetPOST('passwordre');
|
|
$passwordunescaped = $this->app->Secure->GetPOST('password', '', '', 'noescape');
|
|
|
|
if(!empty($password) && $password !== $repassword){
|
|
$this->app->Tpl->Set('MESSAGE', '<div class="error">{|Passworteingabe falsch! Bitte zwei mal das gleiche Passwort eingeben!|}</div>');
|
|
return;
|
|
}
|
|
|
|
if($password === $this->app->User->GetUsername()){
|
|
$this->app->Tpl->Set('MESSAGE', '<div class="error">{|Das Passwort darf nicht dem Username entsprechen!|}</div>');
|
|
return;
|
|
}
|
|
|
|
$message = $this->changeUserPassword($password, $passwordunescaped);
|
|
if($message !== null) {
|
|
$this->app->Tpl->Set('MESSAGE', $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Profileinstellungen speichern
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function HandleProfileSettingsSave()
|
|
{
|
|
$submit_startseite = $this->app->Secure->GetPOST('submit_startseite');
|
|
$startseite = $this->app->Secure->GetPOST('startseite');
|
|
$chat_popup = (int)$this->app->Secure->GetPOST('chat_popup');
|
|
$callcenter_notification = (int)$this->app->Secure->GetPOST('callcenter_notification');
|
|
$defaultcolor = $this->app->Secure->GetPOST('defaultcolor');
|
|
if($defaultcolor === 'transparent') $defaultcolor = '';
|
|
$sprachebevorzugen = $this->app->Secure->GetPOST('sprachebevorzugen');
|
|
|
|
// umzug in tabelle user
|
|
if($this->app->User->GetParameter('welcome_defaultcolor_fuer_kalender') != ''){
|
|
$defaultcolor = $this->app->Secure->GetPOST('defaultcolor');
|
|
$this->app->DB->Update("UPDATE `user` SET `defaultcolor` = '{$defaultcolor}' WHERE `id` = '" . $this->app->User->GetID() . "' LIMIT 1");
|
|
$this->app->User->SetParameter('welcome_defaultcolor_fuer_kalender', '');
|
|
}
|
|
|
|
if($sprachebevorzugen != ''){
|
|
$sprachebevorzugen = $this->app->Secure->GetPOST('sprachebevorzugen');
|
|
$this->app->DB->Update("UPDATE `user` SET `sprachebevorzugen` = '$sprachebevorzugen' WHERE `id` = '" . $this->app->User->GetID() . "' LIMIT 1");
|
|
}
|
|
|
|
if($submit_startseite != ''){
|
|
$this->app->DB->Update(
|
|
"UPDATE `user` SET
|
|
`startseite` = '{$startseite}',
|
|
`chat_popup` = '{$chat_popup}',
|
|
`callcenter_notification` = '{$callcenter_notification}',
|
|
`defaultcolor` = '{$defaultcolor}'
|
|
WHERE `id` = '" . $this->app->User->GetID() . "' LIMIT 1"
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Vorhandenes Profilbild löschen
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function HandleProfilePictureDeletion()
|
|
{
|
|
if(!empty($this->app->Secure->GetPOST('delete_datei'))){
|
|
$adresse = $this->app->User->GetAdresse();
|
|
$dateien = $this->app->DB->SelectArr(
|
|
"SELECT d.id
|
|
FROM datei AS d
|
|
INNER JOIN datei_stichwoerter AS ds ON d.id = ds.datei
|
|
WHERE d.geloescht = 0 AND ds.objekt LIKE 'Adressen' AND ds.parameter = '" . $adresse . "' AND ds.subjekt LIKE 'Profilbild'
|
|
ORDER BY d.id DESC"
|
|
);
|
|
if(!empty($dateien)){
|
|
foreach ($dateien as $datei) {
|
|
$this->app->erp->DeleteDatei($datei['id']);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Neues Profilbild hochladen
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function HandleProfilePictureUpload()
|
|
{
|
|
if(!empty($this->app->Secure->GetPOST('submit_datei'))){
|
|
|
|
$fileName = $this->app->DB->real_escape_string($_FILES['upload']['name']);
|
|
$fileTmp = $this->app->DB->real_escape_string($_FILES['upload']['tmp_name']);
|
|
|
|
if(empty($fileTmp)){
|
|
$this->app->Tpl->Set('UPLOADERROR', "<div class=\"error\">Keine Datei ausgewählt!</div>");
|
|
$this->app->erp->EnableTab("tabs-3");
|
|
}else{
|
|
$addressId = $this->app->User->GetAdresse();
|
|
$fileid = $this->app->erp->CreateDatei($fileName, 'Profilbild', '', '', $fileTmp, $this->app->User->GetName());
|
|
$this->app->erp->AddDateiStichwort($fileid, 'Profilbild', 'Adressen', $addressId);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* API-Account für mobile Apps de-/aktivieren
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function HandleMobileAppsAccount()
|
|
{
|
|
$hasPermission = (bool)$this->app->erp->RechteVorhanden('welcome','mobileapps');
|
|
if (!$hasPermission) {
|
|
$this->app->Tpl->Set('MESSAGE', '<div class="error">Sie haben nicht die erforderlichen Rechte für einen API-Account!</div>');
|
|
return;
|
|
}
|
|
|
|
// API-Account anlegen und aktivieren
|
|
if(!empty($this->app->Secure->GetPOST('mobile_app_api_create'))){
|
|
$title = $this->app->User->GetName() . ' / Mobile-Dashboard';
|
|
$username = $this->app->User->GetUsername() . '_dashboard';
|
|
$password = md5(uniqid('', true));
|
|
|
|
$sql = sprintf(
|
|
"INSERT INTO `api_account`
|
|
(`id`, `bezeichnung`, `initkey`, `importwarteschlange_name`, `event_url`, `remotedomain`, `aktiv`,
|
|
`importwarteschlange`, `cleanutf8`, `uebertragung_account`, `permissions`)
|
|
VALUES (NULL, '%s', '%s', '', '', '%s', 1, 0, 1, 0 , '%s')",
|
|
$this->app->DB->real_escape_string($title),
|
|
$this->app->DB->real_escape_string($password),
|
|
$this->app->DB->real_escape_string($username),
|
|
$this->app->DB->real_escape_string(json_encode(['mobile_app_communication']))
|
|
);
|
|
$this->app->DB->Insert($sql);
|
|
|
|
$apiAccountId = (int)$this->app->DB->Select(
|
|
sprintf(
|
|
"SELECT a.id FROM `api_account` AS `a` WHERE a.remotedomain = '%s' LIMIT 1",
|
|
$this->app->DB->real_escape_string($username)
|
|
)
|
|
);
|
|
$this->app->User->SetParameter('mobile_apps_api_account_id', $apiAccountId);
|
|
|
|
if ($apiAccountId === 0) {
|
|
$this->app->Tpl->Set('MESSAGE', '<div class="error">API-Account konnte nicht angelegt werden!</div>');
|
|
}
|
|
}
|
|
|
|
// API-Account aktivieren
|
|
if(!empty($this->app->Secure->GetPOST('mobile_app_api_activate'))){
|
|
$apiAccountId = (int)$this->app->User->GetParameter('mobile_apps_api_account_id');
|
|
$this->app->DB->Update("UPDATE api_account SET aktiv = 1 WHERE id = '{$apiAccountId}' LIMIT 1");
|
|
}
|
|
|
|
// API-Account deaktivieren
|
|
if(!empty($this->app->Secure->GetPOST('mobile_app_api_deactivate'))){
|
|
$apiAccountId = (int)$this->app->User->GetParameter('mobile_apps_api_account_id');
|
|
$this->app->DB->Update("UPDATE api_account SET aktiv = 0 WHERE id = '{$apiAccountId}' LIMIT 1");
|
|
}
|
|
}
|
|
|
|
private function handleTOTPRegenerate(){
|
|
/** @var TOTPLoginService $totpLoginManager */
|
|
$totpLoginManager = $this->app->Container->get('TOTPLoginService');
|
|
|
|
$userID = $this->app->User->GetID();
|
|
|
|
$totpLoginManager->regenerateUserSecret($userID);
|
|
|
|
$redirect = RedirectResponse::createFromUrl('index.php?module=welcome&action=settings');
|
|
$redirect->send();
|
|
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
private function HandleTOTPToggle(){
|
|
/** @var TOTPLoginService $totpLoginManager */
|
|
$totpLoginManager = $this->app->Container->get('TOTPLoginService');
|
|
|
|
$userId = $this->app->User->GetID();
|
|
|
|
if($totpLoginManager->isTOTPEnabled($userId)){
|
|
$totpLoginManager->disableTotp($userId);
|
|
}else{
|
|
$totpLoginManager->enableTotp($userId);
|
|
}
|
|
|
|
$redirect = RedirectResponse::createFromUrl('index.php?module=welcome&action=settings');
|
|
$redirect->send();
|
|
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
protected function HandleGoogleMailAuth()
|
|
{
|
|
/** @var Request $request */
|
|
$request = $this->app->Container->get('Request');
|
|
$email = $request->post->get('gmail_address');
|
|
$doAuthorize = $request->post->has('submit_authorize_gmail');
|
|
$doTest = $request->post->has('submit_testmail_gmail');
|
|
|
|
if (empty($email)) {
|
|
$this->app->Tpl->Add(
|
|
'MSG_NO_GMAILAPI',
|
|
'<div class="error">Fehler: Google E-Mail ist ein Pflichtfeld.</div>'
|
|
);
|
|
|
|
return;
|
|
}
|
|
/** @var GoogleAccountGateway $gateway */
|
|
$gateway = $this->app->Container->get('GoogleAccountGateway');
|
|
/** @var GoogleAccountService $service */
|
|
$service = $this->app->Container->get('GoogleAccountService');
|
|
try {
|
|
$account = $gateway->getAccountByUser((int)$this->app->User->GetID());
|
|
} catch (Exception $e) {
|
|
$account = $service->createAccount((int)$this->app->User->GetID(), null, null);
|
|
}
|
|
$props = $gateway->getAccountProperties($account->getId());
|
|
$props = $props->set('gmail_address', $email);
|
|
$service->saveAccountProperties($account->getId(), $props);
|
|
if ($doAuthorize && !$gateway->hasAccountScope($account->getId(), GoogleScope::MAIL)) {
|
|
/** @var Session $session */
|
|
$session = $this->app->Container->get('Session');
|
|
/** @var GoogleAuthorizationService $authorizer */
|
|
$authorizer = $this->app->Container->get('GoogleAuthorizationService');
|
|
$redirect = $authorizer->requestScopeAuthorization(
|
|
$session,
|
|
[GoogleScope::MAIL],
|
|
'index.php?module=welcome&action=settings'
|
|
);
|
|
SessionHandler::commitSession($session);
|
|
$redirect->send();
|
|
$this->app->ExitXentral();
|
|
}
|
|
if (!$doAuthorize && $doTest) {
|
|
$this->HandleGoogleMailTest();
|
|
}
|
|
|
|
RedirectResponse::createFromUrl('?module=welcome&action=settings')
|
|
->send();
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
protected function HandleGoogleMailTest()
|
|
{
|
|
/** @var Request $request */
|
|
$request = $this->app->Container->get('Request');
|
|
if (!$request->post->has('submit_testmail_gmail')) {
|
|
$redirect = RedirectResponse::createFromUrl('index.php?module=welcome&action=settings');
|
|
$redirect->send();
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
/** @var GoogleAccountGateway $gateway */
|
|
$gateway = $this->app->Container->get('GoogleAccountGateway');
|
|
$success = false;
|
|
$error = false;
|
|
$userId = (int)$this->app->User->GetID();
|
|
$msg = '';
|
|
try {
|
|
$account = $gateway->getAccountByUser($userId);
|
|
$email = $gateway->getAccountProperties($account->getId())->get('gmail_address');
|
|
if (empty($email)) {
|
|
throw new RuntimeException('Google Account has no email address');
|
|
}
|
|
} catch (Exception $e) {
|
|
$error = true;
|
|
$msg = '<div class="error">Google Account nicht gefunden.</div>';
|
|
}
|
|
|
|
if (!$error) {
|
|
try {
|
|
/** @var SystemMailer $mailer */
|
|
$mailer = $this->app->Container->get('SystemMailer');
|
|
$success = $mailer->composeAndSendEmail(
|
|
$email,
|
|
$this->app->User->GetName(),
|
|
[new EmailRecipient($email, $this->app->User->GetName())],
|
|
'Test Email Von Xentral',
|
|
'<p>Wenn Sie Diese Test-Email erhalten haben, hat die Verwendung von Google Mail funktioniert.</p>'
|
|
);
|
|
} catch (Exception $e) {
|
|
$success = false;
|
|
}
|
|
if (!$success) {
|
|
$msg = '<div class="error">Das Versenden der Test-Email ist fehlgeschlagen.
|
|
Bitte wiederholen Sie den Authorisierungsvorgang.</div>';
|
|
}
|
|
}
|
|
if (!$error && $success === true) {
|
|
$msg = sprintf(
|
|
'<div class="error2">Eine Test-Email wurde an "%s" verschickt. Bitte überprüfen Sie den Posteingang.</div>',
|
|
$email
|
|
);
|
|
}
|
|
|
|
$url = 'index.php?module=welcome&action=settings';
|
|
if (!empty($msg)) {
|
|
$url .= sprintf('%s&msg=%s', $url, base64_encode($msg));
|
|
}
|
|
$redirect = RedirectResponse::createFromUrl($url);
|
|
$redirect->send();
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
/**
|
|
* @return void
|
|
*/
|
|
protected function renderGoogleMailSettings()
|
|
{
|
|
if (!$this->app->Container->has('GoogleCredentialsService')) {
|
|
return;
|
|
}
|
|
/** @var GoogleCredentialsService $credService */
|
|
$credService = $this->app->Container->get('GoogleCredentialsService');
|
|
if (!$credService->existCredentials()) {
|
|
$this->app->Tpl->Add(
|
|
'MSG_NO_GMAILAPI',
|
|
'<div class="info">Die Google Schnittstelle ist im System nicht aktiv.'
|
|
);
|
|
$this->app->Tpl->Set('GMAIL_AUTH_DISABLE', 'disabled');
|
|
$this->app->Tpl->Set('GMAIL_ADDRESS_DISABLE', 'disabled');
|
|
$this->app->Tpl->Set('GMAIL_TESTMAIL_DISABLE', 'disabled');
|
|
return;
|
|
}
|
|
/** @var GoogleAccountGateway $gateway */
|
|
$gateway = $this->app->Container->get('GoogleAccountGateway');
|
|
try {
|
|
$account = $gateway->getAccountByUser((int)$this->app->User->GetID());
|
|
} catch (GoogleAccountNotFoundException $e) {
|
|
$this->app->Tpl->Set('GMAIL_AUTH_DISABLE', '');
|
|
$this->app->Tpl->Set('GMAIL_TESTMAIL_DISABLE', 'disabled');
|
|
return;
|
|
}
|
|
if (!$gateway->hasAccountScope($account->getId(), GoogleScope::MAIL)) {
|
|
$this->app->Tpl->Set('GMAIL_TESTMAIL_DISABLE', 'disabled');
|
|
}
|
|
$props = $gateway->getAccountProperties($account->getId());
|
|
if ($props->has('gmail_address')) {
|
|
$this->app->Tpl->Set('GMAIL_ADDRESS', $props->get('gmail_address'));
|
|
}
|
|
//try {
|
|
// $gmailUser = $googleApiGate->getGmailApiUserByUser($this->app->User->GetID());
|
|
// if ($gmailUser === null) {
|
|
// /** @var EmailAccountGateway $emailAccountGate */
|
|
// $emailAccountGate = $this->app->Container->get('EmailAccountGateway');
|
|
// /** @var EmailBackupAccount $emailAccount */
|
|
// $emailAccount = $emailAccountGate->findGmailAccountByUser($this->app->User->GetID());
|
|
// if ($emailAccount !== null) {
|
|
// /** @var GoogleAccountService $googleApiService */
|
|
// $googleApiService = $this->app->Container->get('GoogleApiService');
|
|
// try {
|
|
// $gmailUser = $googleApiService->createAccount(
|
|
// $this->app->User->GetID(),
|
|
// GoogleApiAccount::TYPE_MAIL,
|
|
// $emailAccount->smtpSenderEmail
|
|
// );
|
|
// }catch (Exception $e) {}
|
|
// }
|
|
// }
|
|
//} catch (Exception $e) {
|
|
// $gmailUser = null;
|
|
//}
|
|
}
|
|
|
|
protected function HandleGoogleCalendarSave()
|
|
{
|
|
/** @var Request $request */
|
|
$request = $this->app->Container->get('Request');
|
|
$doAuthorize = $request->post->has('authorize_google_calendar');
|
|
$doImport = $request->post->has('import_google_calendar');
|
|
/** @var GoogleAccountGateway $gateway */
|
|
$gateway = $this->app->Container->get('GoogleAccountGateway');
|
|
/** @var GoogleAccountService $service */
|
|
$service = $this->app->Container->get('GoogleAccountService');
|
|
try {
|
|
$account = $gateway->getAccountByUser((int)$this->app->User->GetID());
|
|
} catch (Exception $e) {
|
|
$account = $service->createAccount((int)$this->app->User->GetID(), null, null);
|
|
}
|
|
if ($doAuthorize && !$gateway->hasAccountScope($account->getId(), GoogleScope::CALENDAR)) {
|
|
/** @var Session $session */
|
|
$session = $this->app->Container->get('Session');
|
|
/** @var GoogleAuthorizationService $authorizer */
|
|
$authorizer = $this->app->Container->get('GoogleAuthorizationService');
|
|
$redirect = $authorizer->requestScopeAuthorization(
|
|
$session,
|
|
[GoogleScope::CALENDAR],
|
|
'index.php?module=welcome&action=settings&selectcalendar=1'
|
|
);
|
|
SessionHandler::commitSession($session);
|
|
$redirect->send();
|
|
$this->app->ExitXentral();
|
|
}
|
|
if (!$doAuthorize && $doImport) {
|
|
$this->HandleGoogleCalendarImport();
|
|
}
|
|
|
|
RedirectResponse::createFromUrl('?module=welcome&action=settings')
|
|
->send();
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
protected function HandleGoogleCalendarImport()
|
|
{
|
|
/** @var Request $request */
|
|
$request = $this->app->Container->get('Request');
|
|
if (!$request->post->has('import_google_calendar')) {
|
|
$redirect = RedirectResponse::createFromUrl('index.php?module=welcome&action=settings');
|
|
$redirect->send();
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
$msg = '';
|
|
$userId = (int)$this->app->User->GetID();
|
|
try{
|
|
/** @var GoogleCalendarClientFactory $factory */
|
|
$factory = $this->app->Container->get('GoogleCalendarClientFactory');
|
|
/** @var GoogleCalendarSynchronizer $synchronizer */
|
|
$synchronizer = $this->app->Container->get('GoogleCalendarSynchronizer');
|
|
$client = $factory->createClient($userId);
|
|
$synchronizer->importAbsoluteEvents($client);
|
|
$msg = '<div class="error2">Termine erfolgreich Importiert.</div>';
|
|
}
|
|
catch (GoogleAccountNotFoundException $e) {
|
|
$msg = '<div class="error">Fehler: Keine Verbindung zur Google-API</div>';
|
|
}
|
|
catch (GoogleCalendarSyncException $e) {
|
|
$msg = '<div class="error">Fehler beim Terminimport</div>';
|
|
}
|
|
catch (Exception $e) {
|
|
$msg = sprintf('<div class="error">Fehler: %s</div>', $e->getMessage());
|
|
}
|
|
|
|
$url = 'index.php?module=welcome&action=settings';
|
|
if (!empty($msg)) {
|
|
$url .= sprintf('&msg=%s', base64_encode($msg));
|
|
}
|
|
$redirect = RedirectResponse::createFromUrl($url);
|
|
$redirect->send();
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
protected function renderGoogleCalendarSettings()
|
|
{
|
|
if (!$this->app->Container->has('GoogleCredentialsService')) {
|
|
return;
|
|
}
|
|
/** @var GoogleCredentialsService $credService */
|
|
$credService = $this->app->Container->get('GoogleCredentialsService');
|
|
if (!$credService->existCredentials()) {
|
|
$this->app->Tpl->Add(
|
|
'MSG_GOOGLE_CALENDAR',
|
|
'<div class="info">Die Goolge Schnittstelle ist im System nicht aktiv.'
|
|
);
|
|
$this->app->Tpl->Set('GOOGLE_AUTH_DISABLE', 'disabled');
|
|
$this->app->Tpl->Set('GOOGLE_SYNC_DISABLE', 'disabled');
|
|
return;
|
|
}
|
|
/** @var GoogleAccountGateway $gateway */
|
|
$gateway = $this->app->Container->get('GoogleAccountGateway');
|
|
try {
|
|
$userId = (int)$this->app->User->GetID();
|
|
$account = $gateway->getAccountByUser($userId);
|
|
} catch (GoogleAccountNotFoundException $e) {
|
|
$this->app->Tpl->Set('GOOGLE_AUTH_DISABLE', 'disabled');
|
|
$this->app->Tpl->Set('GOOGLE_SYNC_DISABLE', 'disabled');
|
|
|
|
return;
|
|
}
|
|
$this->app->Tpl->Set('GOOGLE_AUTH_DISABLE', '');
|
|
$this->app->Tpl->Set('GOOGLE_SYNC_DISABLE', '');
|
|
if (!$gateway->hasAccountScope($account->getId(), GoogleScope::CALENDAR)) {
|
|
$this->app->Tpl->Set('GOOGLE_SYNC_DISABLE', 'disabled');
|
|
return;
|
|
}
|
|
$props = $gateway->getAccountProperties($account->getId());
|
|
$this->app->Tpl->Set('GOOGLE_CALENDAR', $props->get('selected_calendar'));
|
|
|
|
/** @var Request $request */
|
|
$request = $this->app->Container->get('Request');
|
|
if ($request->get->getInt('selectcalendar') !== 1) {
|
|
return;
|
|
}
|
|
/** @var GoogleCalendarClientFactory $factory */
|
|
$factory = $this->app->Container->get('GoogleCalendarClientFactory');
|
|
$client = $factory->createClient($userId);
|
|
$calendar = $client->getPrimaryCalendar();
|
|
$this->app->Tpl->Set('GOOGLE_CALENDAR', $calendar->getId());
|
|
/** @var GoogleAccountService $service */
|
|
$service = $this->app->Container->get('GoogleAccountService');
|
|
$props = $props->set('selected_calendar', $calendar->getId());
|
|
$service->saveAccountProperties($account->getId(), $props);
|
|
$redirect = RedirectResponse::createFromUrl('index.php?module=welcome&action=settings');
|
|
$redirect->send();
|
|
$this->app->ExitXentral();
|
|
}
|
|
|
|
/**
|
|
* @return NotificationService
|
|
*/
|
|
protected function GetNotificationService()
|
|
{
|
|
return $this->app->Container->get('NotificationService');
|
|
}
|
|
|
|
/**
|
|
* @return DownloadSpoolerService
|
|
*/
|
|
protected function GetDownloadSpoolerService()
|
|
{
|
|
return $this->app->Container->get('DownloadSpoolerService');
|
|
}
|
|
|
|
/**
|
|
* @return DownloadSpoolerGateway
|
|
*/
|
|
protected function GetDownloadSpoolerGateway()
|
|
{
|
|
return $this->app->Container->get('DownloadSpoolerGateway');
|
|
}
|
|
}
|