Software-Blog
  1. Aktuelle Seite:  
  2. Startseite

Home

composer und Norton

Details
Geschrieben von: Stefan Blum - joompiter.de
Kategorie: Uncategorised
Veröffentlicht: 05. Dezember 2025
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.

Norton

 

Geckodriver für Selenium starten

Details
Geschrieben von: Stefan Blum - joompiter.de
Kategorie: Uncategorised
Veröffentlicht: 30. November 2025
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
Veröffentlicht: 26. November 2025
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;
}

Main Menu

  • Home

Login Form

  • Passwort vergessen?
  • Benutzername vergessen?