Home
composer und Norton
- Details
- Geschrieben von: Stefan Blum - joompiter.de
- Kategorie: Uncategorised
- Zugriffe: 2
Beim Lauf vom composer muss in Norton das "sichere Netz" temporär (für z.B. 10 Minuten) außer Betrieb gesetzt werden, sonst kommt es intern wegen Zertifikatsfehlern zu cURL-Zertifikatsfehlern.

Geckodriver für Selenium starten
- Details
- Geschrieben von: Stefan Blum - joompiter.de
- Kategorie: Uncategorised
- Zugriffe: 2
Damit Selenoum lokal mit dem Firefox arbeiten kann, muss der geckodriver in einer cmd-Umgebung gestartet werden. Dieser hört standardmäßig auf Port 4444. Auf lled ist er unter C:\work\tools installiert.
cd C:\work\tools
geckodriver.exe
Test
- Details
- Geschrieben von: Stefan Blum - joompiter.de
- Kategorie: Uncategorised
- Zugriffe: 2
Test
<?php
defined( '_JEXEC' ) or die;
require_once JPATH_COMPONENT_SITE."/joompiter/dbquery.php";
require_once JPATH_COMPONENT_SITE."/helpers/logs.php";
JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR."/tables");
jimport("joomla.application.component.controller");
error_reporting(E_ALL);
class HungarianController extends JControllerLegacy {
function __construct() {
parent::__construct();
}
function display($mode='start',$workerid=0) {
$app = JFactory::getApplication();
$input = $app->input;
$input->set("view", "Hungarian");
$view = $this->getView('Hungarian','html');
//var_dump($view);
/*
$view->set('mode',$mode);
$view->set('workerid',$workerid);
*/
$view->mode = $mode;
$view->workerid = $workerid;
//var_dump($view);
//parent::display();
$model = $this->getModel('Hungarian');
// true = default model for the view
$view->setModel($model, true);
$view->display();
}
function updatedata() {
require_once JPATH_COMPONENT_ADMINISTRATOR."/models/hungarian.php";
$app = JFactory::getApplication();
$input = $app->input;
$model = new HungarianModelHungarian;
$parameters = $model->parameters;
foreach($parameters as $parametername => $parameter) {
if ($parameter != "--") {
$parametervalues[$parametername] = $input->getString($parametername)+0;
$query = "UPDATE #**configs SET `value` = '".$parametervalues[$parametername]."' WHERE `key` = '$parametername' LIMIT 1;";
//echoquery("", $query);
dbquery($query);
//jexit();
}
}
$app->enqueueMessage("Parameter und etwaige zu-/abgewählte Mitarbeiter*innen und Aufgaben wurden übernommen.");
$app->redirect(JUri::base(true) . "/index.php?option=com_joompiter_studentaworx&controller=hungarian");
}
function takeover($data = null, $workerid = 0) {
// workerid ist die Unterscheidung, ob Start- oder Nachfolgezuweisung (workerid > 0)
require_once JPATH_COMPONENT_ADMINISTRATOR."/models/hungarian.php";
$now = date("Y-m-d H:i:s");
$app = JFactory::getApplication();
$input = $app->input;
$model = new HungarianModelHungarian;
$workers = $model->workers($workerid);
if ($workerid == 0) {
$orders = $model->orders();
} else {
$orders = $model->nextorders();
}
// Nachrichten
$loginmessage = dbquerysinglethis("#**messagetemplates",JoompiterStudentaWorxConfigs::get("makedefault_messagetemplates_loginstart"))->message;
$continuemessage = dbquerysinglethis("#**messagetemplates",JoompiterStudentaWorxConfigs::get("makedefault_messagetemplates_ordertocontinue"))->message;
$rolemessage = dbquerysinglethis("#**messagetemplates",JoompiterStudentaWorxConfigs::get("makedefault_messagetemplates_role"))->message;
// Nachrichtenzusätze
$firstdaytext = dbquerysinglethis("#**messagetemplatemakros",JoompiterStudentaWorxConfigs::get("makedefault_messagetemplatemakros_firstday"))->thetext;
$seconddaytext = dbquerysinglethis("#**messagetemplatemakros",JoompiterStudentaWorxConfigs::get("makedefault_messagetemplatemakros_secondday"))->thetext;
$buddytext = dbquerysinglethis("#**messagetemplatemakros",JoompiterStudentaWorxConfigs::get("makedefault_messagetemplatemakros_buddy"))->thetext;
$newbietext = dbquerysinglethis("#**messagetemplatemakros",JoompiterStudentaWorxConfigs::get("makedefault_messagetemplatemakros_newbie"))->thetext;
// Backup der DB-Tabellen
$dbnow = date("Ymd_His_");
$tables = array("#**presentworkers","#**messages","#**recipients","#**preparedorders","#**assignments");
foreach ($tables as $table) {
$btable = $dbnow.substr($table,3);
dbquery("DROP TABLE IF EXISTS $btable");
dbquery("CREATE TABLE $btable LIKE $table;");
dbquery("INSERT INTO $btable SELECT * FROM $table;");
}
if ($data == null) {
$assignarray = json_decode(urldecode($input->getString("assignarray")));
$buddyassignarray = json_decode(urldecode($input->getString("buddyassignarray")));
} else {
$assignarray = $data->assignarray;
$buddyassignarray = $data->buddyassignarray;
}
/*
var_dump($model->oaf);
jexit();
*/
$assignedworkerids = array();
foreach($assignarray as $apair) {
$assignedworkerid = $apair->workerid;
$assignedworkerids[] = $apair->workerid;
$orderid = $apair->orderid;
$worker = $workers[$model->waf[$assignedworkerid]];
// Ist der Mitarbeiter Buddy für jemanden?
foreach ($buddyassignarray as $buddynewbiepair) {
if ($buddynewbiepair->buddyid == $worker->id) {
$worker->mynewbieid = $buddynewbiepair->newbieid;
$worker->newbieworkplacenumber = $buddynewbiepair->newbieworkplacenumber;
}
}
// Ist der Mitarbeiter Newbie mit Buddy?
foreach ($buddyassignarray as $buddynewbiepair) {
if ($buddynewbiepair->newbieid == $worker->id) {
$worker->mybuddyid = $buddynewbiepair->buddyid;
$worker->buddyworkplacenumber = $buddynewbiepair->buddyworkplacenumber;
}
}
//var_dump($worker);
$task = $orders[$model->oaf[$orderid]];
/*
var_dump($assignarray);
var_dump($buddyassignarray);
var_dump($worker);
//var_dump($order);
jexit();
*/
if ($orderid < $model->delimincompleteorders ) {
// neu vorbereite Aufgabe
$assignment = new stdclass;
$assignment->workingdayid = $model->nextworkingdayid;
$assignment->workerid = $assignedworkerid;
$assignment->assignmenttype = "start"; // "next"
$assignment->preparedorderid = $orderid;
$assignment->orderid = 0;
$assignment->roleinstanceid = 0;
$assignment->extraorderid = 0;
$assignment->newbieworkerid = 0;
$assignment->assignmentmode = $data == null?'manual':'auto';
$assignment->usagevalue = $apair->usagevalue;
$assignment->timestamp = $now;
dbinsert("#**assignments",$assignment);
} elseif ($orderid < $model->delimextraorders) {
// unvollständig abgeschlossene Aufgabe
$assignment = new stdclass;
$assignment->workingdayid = $model->nextworkingdayid;
$assignment->workerid = $assignedworkerid;
$assignment->assignmenttype = "startincomplete";
$assignment->preparedorderid = 0;
$assignment->orderid = $orderid - $model->delimincompleteorders;
$assignment->roleinstanceid = 0;
$assignment->extraorderid = 0;
$assignment->newbieworkerid = 0;
$assignment->assignmentmode = data == null?'manual':'auto';
$assignment->usagevalue = $apair->usagevalue;
$assignment->timestamp = $now;
dbinsert("#**assignments",$assignment);
} elseif ($orderid < $model->delimroles) {
// Sonderaufgabe
$assignment = new stdclass;
$assignment->workingdayid = $model->thisworkingdayid;
$assignment->workerid = $assignedworkerid;
$assignment->assignmenttype = "nextextraorder";
$assignment->preparedorderid = 0;
$assignment->orderid = 0;
$assignment->roleinstanceid = 0;
$assignment->extraorderid = $orderid - $model->delimextraorders;
$assignment->newbieworkerid = 0;
$assignment->assignmentmode = 'auto';
$assignment->usagevalue = $apair->usagevalue;
$assignment->timestamp = $now;
dbinsert("#**assignments",$assignment);
} else {
// Rollenverteilung speichern
dbquery("
UPDATE #**presentworkers
SET roleinstanceid = '".($orderid - $model->delimroles)."'
WHERE workingdayid = '$model->nextworkingdayid' AND workerid='$assignedworkerid'
LIMIT 1;
");
$assignment = new stdclass;
$assignment->workingdayid = $model->nextworkingdayid;
$assignment->workerid = $assignedworkerid;
$assignment->assignmenttype = "role";
$assignment->preparedorderid = 0;
$assignment->orderid = 0;
$assignment->roleinstanceid = $orderid - $model->delimroles;
$assignment->newbieworkerid = 0;
$assignment->assignmentmode = data == null?'manual':'auto';
$assignment->usagevalue = $apair->usagevalue;
$assignment->timestamp = $now;
dbinsert("#**assignments",$assignment);
}
$workplace = dbquerysinglethis("#**workplaces", $task->workplaceid);
if ($workplace)
$workplacenumber = $workplace->workplacenumber;
else
$workplacenumber = '';
$roleinstance = dbquerysinglethis("#**roleinstances", $task->workplaceid - $model->delimroles);
if ($roleinstance)
$roledesignation = $roleinstance->designation;
else
$roledesignation = '';
$wbknumber = $task->wbknumber;
$messagetext = $loginmessage;
if ($orderid > $model->delimincompleteorders) $messagetext = $continuemessage;
if ($orderid > $model->delimextraorders) {
$extraorder = dbquerysinglethis("#**extraorders",$orderid - $model->delimextraorders);
$messagetext = $extraorder->message;
}
if ($orderid > $model->delimroles) $messagetext = $rolemessage;
$messagetextstored = $messagetext;
$buddynewbie = '';
$welcome = '';
if (isset($worker->mybuddyid) && $worker->mybuddyid > 0) {
switch ($worker->workingdays) {
case 0 :
$welcome = $firstdaytext;
break;
case 1 :
$welcome = $seconddaytext;
break;
}
$buddynewbie = $newbietext;
$buddy = dbquerysinglethis("#**workers", $worker->mybuddyid);
$buddynewbie = str_replace("{buddy}", $buddy->first_name, $buddynewbie);
$buddynewbie = str_replace("{workplacenumber}", $worker->buddyworkplacenumber, $buddynewbie);
}
if (isset($worker->mynewbieid) && $worker->mynewbieid > 0) {
var_dump($worker);
$welcome = '';
$buddynewbie = $buddytext;
$newbie = dbquerysinglethis("#**workers", $worker->mynewbieid);
$buddynewbie = str_replace("{newbie}", $newbie->first_name, $buddynewbie);
$buddynewbie = str_replace("{workplacenumber}", $worker->newbieworkplacenumber, $buddynewbie);
}
$messagetext = str_replace(
array(
"{buddynewbie}",
"{welcome}",
"{workplacenumber}",
"{roleinstance}",
"{wbknumber}"
),array(
$buddynewbie,
$welcome,
$workplacenumber,
$roledesignation,
$wbknumber
),
$messagetext
);
$message = JTable::getInstance("Message","Table");
$message->timestamp = $now;
$message->senderworkerid = 0; // System
$message->message = cleantext($messagetext);
$message->mustbeconfirmed = true;
$message->messagetype = $workerid == 0? 'login' : 'postorder';
$loginmessagebreakhour = sprintf("%02d",JoompiterStudentaWorxConfigs::get("loginmessagebreakhour"));
$loginmessagestarthour = sprintf("%02d",JoompiterStudentaWorxConfigs::get("loginmessagestarthour"));
$hour = date("H");
if ($hour >= $loginmessagebreakhour) {
$notbefore = date('Y-m-d', strtotime('+1 day'))." ".$loginmessagestarthour.":00:00";
} else {
$notbefore = date('Y-m-d')." ".$loginmessagestarthour.":00:00";
}
$message->notbefore = $notbefore;
$message->store();
$messageid = $message->id;
$recipient = JTable::getInstance("Recipient","Table");
$recipient->messageid = $messageid;
$recipient->recipienttype = 'worker';
$recipient->recipientworkerid = $assignedworkerid;
$recipient->store();
dbquery("
UPDATE #**preparedorders SET
assignedworkerid = '$assignedworkerid',
assignedmessage='$messagetextstored',
assignedmessageid = '$messageid'
WHERE id='$orderid' LIMIT 1
");
}
// Startplätze nur bei Startzuweisung vergeben
$leftoverworkplaceids = array();
if ($workerid == 0) {
$leftoverworkplaceids = dbquerysinglecolumnlist("SELECT id FROM #**workplaces workplaces WHERE published = 1","id");
//var_dump($leftoverworkplaceids);
$usedworkplaceids = array();
foreach ($orders as $order) if ($order->workplaceid > 0) $usedworkplaceids[] = $order->workplaceid;
$usedworkplaceids = array_unique($usedworkplaceids);
//var_dump($usedworkplaceids);
$leftoverworkplaceids = array_values(array_diff($leftoverworkplaceids, $usedworkplaceids));
//var_dump($leftoverworkplaceids);
}
// Nachricht an "Übrigbleiber"
$leftovermessage = dbquerysinglethis("#**messagetemplates",JoompiterStudentaWorxConfigs::get("makedefault_messagetemplates_startleftoverfreeworkplace"))->message;
$finalleftovermessage = dbquerysinglethis("#**messagetemplates",JoompiterStudentaWorxConfigs::get("makedefault_messagetemplates_startleftover"))->message;
$counter = 0;
foreach ($model->workers as $worker) {
if ($worker->id >= $model->delimbuddy) continue;
if (!in_array($worker->id, $assignedworkerids)) {
if ($counter >= count($leftoverworkplaceids)) {
$messagetext = $finalleftovermessage;
} else {
$replace = dbquerysinglethis("#**workplaces",$leftoverworkplaceids[$counter])->workplacenumber;
//var_dump($counter,$leftoverworkplaceids[$counter],$replace);
$messagetext = str_replace("{workplacenumber}", $replace, $leftovermessage);
//var_dump($leftovermessage,$messagetext);
//jexit();
}
$now = date("Y-m-d H:i:s");
$message = JTable::getInstance("Message", "Table");
$message->timestamp = $now;
$message->senderworkerid = 0;
$message->message = cleantext($messagetext);
$message->mustbeconfirmed = true;
$message->messagetype = 'login';
$loginmessagebreakhour = sprintf("%02d", JoompiterStudentaWorxConfigs::get("loginmessagebreakhour"));
$loginmessagestarthour = sprintf("%02d", JoompiterStudentaWorxConfigs::get("loginmessagestarthour"));
$hour = date("H");
if ($hour >= $loginmessagebreakhour) {
$notbefore = date('Y-m-d', strtotime('+1 day'))." ".$loginmessagestarthour.":00:00";
} else {
$notbefore = date('Y-m-d')." ".$loginmessagestarthour.":00:00";
}
$message->notbefore = $notbefore;
$message->store();
$messageid = $message->id;
$recipient = JTable::getInstance("Recipient", "Table");
$recipient->messageid = $messageid;
$recipient->recipienttype = 'worker';
$recipient->recipientworkerid = $worker->id;
$recipient->store();
$counter++;
}
}
// buddy newbie Zuweisungen speichern
foreach ($buddyassignarray as $buddynewbiepair) {
$assignment = new stdclass;
$assignment->workingdayid = $model->nextworkingdayid;
$assignment->workerid = $buddynewbiepair->buddyid;
$assignment->assignmenttype = "buddynewbie";
$assignment->preparedorderid = 0;
$assignment->orderid = 0;
$assignment->roleinstanceid = 0;
$assignment->newbieworkerid = $buddynewbiepair->newbieid;
$assignment->assignmentmode = data == null?'manual':'auto';
$assignment->usagevalue = $buddynewbiepair->usagevalue;
$assignment->timestamp = $now;
dbinsert("#**assignments",$assignment);
}
// interactive mode?
if($data == null) {
$app->enqueueMessage("Start-Nachrichten erstellt");
$app->redirect(JUri::base(true)."/index.php?option=com_joompiter_studentaworx");
}
}
function restoretables() {
$db = JFactory::getDbo();
$app = JFactory::getApplication();
// Originaltabellen ohne Prefix
$suffixes = array("presentworkers", "messages", "recipients", "preparedorders", "assignments");
$prefix = "#**";
// 1. Alle Tabellennamen auslesen
$query = "SHOW TABLES";
$db->setQuery($query);
$allTables = $db->loadColumn();
// 2. Neueste Backupgruppe anhand Zeitstempel ermitteln
$backupGroups = array();
$matches = array();
foreach ($allTables as $table) {
if (preg_match("/^(\d{8}_\d{6})_(.+)$/", $table, $matches)) {
$timestamp = $matches[1];
$suffix = $matches[2];
$backupGroups[$timestamp][] = $suffix;
}
}
if (empty($backupGroups)) {
$app->enqueueMessage("Keine Backup-Tabellen gefunden.", 'error');
$app->redirect(JUri::base(true) . "/index.php?option=com_joompiter_studentaworx&controller=preparedorders");
return;
}
krsort($backupGroups); // neuester Zeitstempel zuerst
$latestTimestamp = array_key_first($backupGroups);
$backupPrefix = $latestTimestamp . "_";
// 3. Vergleich der Anzahl an Rows pro Tabelle
foreach ($suffixes as $suffix) {
$originalTable = $prefix . $suffix;
$backupTable = $backupPrefix . $suffix;
if (!in_array($backupTable, $allTables)) {
$app->enqueueMessage("Backup-Tabelle $backupTable nicht gefunden.", 'error');
$app->redirect(JUri::base(true) . "/index.php?option=com_joompiter_studentaworx&controller=preparedorders");
return;
}
/*
$originalCount = dbquerysingle("SELECT COUNT(*) AS cnt FROM `$originalTable`")->cnt;
$backupCount = dbquerysingle("SELECT COUNT(*) AS cnt FROM `$backupTable`")->cnt;
if ($backupCount > $originalCount) {
$app->enqueueMessage("Backup-Tabelle $backupTable enthält mehr Daten ($backupCount) als Original ($originalCount). Abbruch.", 'error');
$app->redirect(JUri::base(true) . "/index.php?option=com_joompiter_studentaworx&controller=preparedorders");
return;
}
*/
}
// 4. Restore durchführen
foreach ($suffixes as $suffix) {
$originalTable = $prefix . $suffix;
$backupTable = $backupPrefix . $suffix;
// Original löschen
dbquery("DROP TABLE IF EXISTS `$originalTable`");
// Backup umbenennen
dbquery("RENAME TABLE `$backupTable` TO `$originalTable`");
}
$app->enqueueMessage("Backup vom $latestTimestamp erfolgreich wiederhergestellt.", 'message');
$app->redirect(JUri::base(true) . "/index.php?option=com_joompiter_studentaworx");
}
// Testaufruf:
// http://localhost/studenta/administrator/index.php?option=com_joompiter_studentaworx&controller=hungarian&task=nextorderassignment&workerid=242
function nextorderassignment($workerid = -1) {
if ($workerid == -1) {
$workerid = JFactory::getApplication()->input->getInt("workerid");
}
require_once JPATH_COMPONENT_ADMINISTRATOR."/models/hungarian.php";
require_once JPATH_COMPONENT_ADMINISTRATOR."/views/hungarian/view.html.php";
JoompiterStudentaWorxLogs::log("Folgezuweisung","für Mitarbeiter*in ID $workerid");
$model = new HungarianModelHungarian;
JFactory::getApplication()->input->set("export",1);
/*
$view = $this->getView('Hungarian','html');
$view->set('mode','next');
$view->set('workerid',$workerid);
*/
$this->display('next',$workerid);
$view = $this->getView('Hungarian','html');
$data = $view->data;
//var_dump($data);
$this->takeover($data,$workerid);
}
}
function cleantext($text) {
// 1. Entfernt mehrfache Leerzeichen
$text = preg_replace('/[ \t]+/', ' ', $text);
// 2. Entfernt Leerzeichen vor Satzzeichen
$text = preg_replace('/\s+([.,!?;:])/', '$1', $text);
// 3. Fügt Leerzeichen nach Satzzeichen ein (wenn keins vorhanden)
$text = preg_replace('/([.!?])([^\s])/', '$1 $2', $text);
// 4. Reduziert mehrere Zeilenumbrüche auf maximal zwei
$text = preg_replace('/\n{3,}/', "\n\n", $text);
// 5. Kürzt führende und nachfolgende Leerzeichen
$text = trim($text);
return $text;
}