Navigieren in der backslash-Hilfe

faq

comet

DAM

Digital Asset Management: Datei Verwaltung (z.B.: Bilder, PDF-Dateien, etc.)

  • comet
  • dms3
Dokumente-Lebenszyklus

Das Content Management regelt den gesamten Dokumenten-Lebenszyklus. Jedes Dokument/Objekt, welches dem Dokumenten-Lebenszyklus untersteht, wird zunächst als Entwurf erstellt bevor es als eine Version freigegeben werden kann.

  • cdn
  • comet
Entwurf

Ein Dokument behält so lange den Status Entwurf, bis es freigegeben wird. Solange ein Entwurf nicht redaktionell bearbeitet wird, bleibt er auf dem Status Entwurf. Entwürfe können abgelehnt werden, bleiben jedoch immer noch Entwürfe, es sei denn, sie würden gelöscht bei der Ablehnung. Für ein Dokument können mehrere Entwürfe bestehen. Diese Entwurfsfassungen können von einem oder mehreren Benutzern erstellt worden sein.

  • cdn
  • dms3
Rendition

Eine Rendition ist eine andere Ausprägung eines Digitalen Assets.
D.h. bei einem Bild in der Auflösung 800 x 600 kann es eine Rendition in der Auflösung 320 x 480 geben, um diese beispielsweise bei der Anzeige auf einem Smartphone ausgeben zu können.

  • comet
Version

Zu allen Objekten (Bilder, Seiten-Elemente, …) die dem Dokumente Lebenszyklus unterstehen werden Versionen erstellt und abgelegt. Die Vorstufe einer Version ist ein Entwurf.

Code

Produktionsnotizen für Objekte integrieren

Damit ein Objekt Produktionsnotizen verwalten kann, muss das config.xml nachgerüstet werden. Das entsprechende «object» muss folgendes Attribute erhalten:

productionnote="true"

Damit der Reiter angezeigt werden kann, muss im Admin-Template folgender Wrapper integriert werden:

<!---PRODUCTION NOTE--->
<ext:productionnotepanel
    entity_type="#local.entityType#"
    entity_id="#local.entry#"
    border="false" />

Dabei müssen die Variablen für entity_type und entity_id korrekt befüllt werden.

Bei versionierbaren Objekten muss die PID verwendet.

Positioniert werden die Produktionsnotizen vor dem Versionen- und dem Info-Reiter.

Rollen mit bestimmten Funktionsberechtigungen suchen

Mit folgender Abfrage findet man Rollen mit einer gewünschten Funktionsberechtigung (Actionpermission):

SELECT
	*
FROM
	core_role a
	INNER JOIN linktable_actionpermissionrole b ON a.id = b.roleidfk
	INNER JOIN core_actionpermission c ON b.actionpermissionidfk = c.id
WHERE
	a.deleted = 0
	AND c."key" = 'messenger_contentblockcategory_shownavi'

 

Settings in der Datenbank suchen

Moduleinstellungen, Programmeinstellungen oder eben Settings lassen sich mit folgendem Query in der Datenbank finden:

SELECT * FROM public.setting where valuefield like '%flash%' and keyidfk in (select id from setting_key  where key like '%toolbar%')

 

Wie kann ein Eingabefeld von der Rechtsschreibprüfung ausgenommen werden?

Per default werden alle ein- und mehrzeiligen Textfelder sowie der CKEditor mit den Texttools (Rechtschreibprüfung und Autokorrektur) aktiviert. Ausnahmen werden direkt im Code beim entsprechenden Feld gemacht:

enable_writing_tools="false"

 

Allgemein

Comet Troubleshooting

Allgemein

Die Adresszeile im Browser nutzt auf einmal 'ID' statt 'page'

Beim Routes-Manager ist vermutlich eine neue Route hinzugefügt worden, ohne dass die bestehenden, d. h. die von «Alle Mandanten», in den neuen Client übernommen wurden.

Lösung:

  • Alle Routes aus «Alle Mandanten» in den Client übernehmen. (Reihenfolge beachten)
Gelöschte Importprozesse belegen immer noch Speicherplatz

Es kann vorkommen, dass Daten von alten oder gelöschten Importprozessen nicht automatisch gelöscht worden sind und dadurch immer noch Festplattenplatz belegen. Dieser Platz wird im Verbrauchs-Widget unter den temporären Dateien gelistet:

Neben E-Mail-Jobs befinden sich hauptsächlich Import-Daten in diesem Verzeichnis. Das Bereinigen von Importleichen kann nur mit folgender URL erfolgen im Kundenauftritt:

https://govis-kunde.backslash.ch/admin/?route=exchange/importconfig/clearDeletedJobs

 

Geschwindigkeit im Frontend ist zu langsam

Performance-Problem: Die Geschwindigkeit, mit der sich eine Seite aufbaut, ist zu langsam.

Folgende Optionen prüfen:

  • Sind die Caches aktiviert?
  • Ist die Applikation noch im Debug-Modus?
    Dies kann unter den Programm-Einstellungen eingerichtet werden. Parameter «Debug-Mode» muss auf «false» gesetzt werden.

 

 

 

Login eines Benutzers funktioniert auf einmal nicht mehr.

Dies kann folgende Ursachen haben:

  • Der Benutzer hat keine zugeordnete Rolle mehr.
  • Der Benutzer wurde deaktiviert.
  • Für den Benutzer wurde eine Gültigkeit hinterlegt. Das heisst, dass sein Account nur ab einem bestimmten Zeitpunkt oder bis zu einem bestimmten Zeitpunkt aktiv ist.
Neustart ist erforderlich

Jede Installation lässt sich separat neu initialisieren. Dies geschieht über eine URL:
https://meinkunde.ch/restart

Wir sehen nun 3 Optionen zur Aktualisierung:

  • restart: Diese Option aktualisiert sämtliche Daten und bereinigt Caches. Wenn gar nichts mehr funktioniert oder zur Installation eines neuen Moduls, ist diese Variante zu verwenden.
  • reinit: Wir aktualisieren Optionen und lesen ColdFusion-Files neu ein.
  • refreshBeans: Wir aktualisieren nur die ColdFusion-Dateien.

Das Passwort, das hierfür benötigt wird, entspricht dem Lucee/ColdFusion-Administrator Account. Dieses ist im Intranet dokumentiert.

 

Auto Newsletter

Editor

Ein Verzeichnis (Events, News, DAM,... ) wird angezeigt, obwohl der Benutzer oder die Rolle dort keine Rechte zugewiesen hat.

Prüfen, ob die Rolle die Funktionen «ignore object permissions» für das jeweilige Modul gesetzt hat. Dies muss deaktiviert sein, damit die Berechtigungen funktionieren können.

Format entfernen entfernt nur Klassen, aber nicht das Element

Der ckEditor entfernt im Standard nur gewisse Tags komplett. Diese sind in der Dokumentation aufgelistet. Derzeit werden folgende Tags entfernt: b,big,cite,code,del,dfn,em,font,i,ins,kbd,q,s,samp,small,span,strike,strong,sub,sup,tt,u,var

Weitere Tags können hinzugefügt werden, indem die Editor-Konfiguration erweitert wird. Dabei müssen alle Werte übergeben, also nicht nur die neuen Tags. Im Beispiel ist die Konfiguration, die zusätzlich  den mark-Tag enthält:

removeFormatTags:'b,big,cite,code,del,dfn,em,font,i,ins,kbd,mark,q,s,samp,small,span,strike,strong,sub,sup,tt,u,var'

Die Einstellung erfolgt in der Konfiguration.

Modul-Links

Modul-Links stehen trotz Einbaus nicht zur Verfügung

Stehen Modul-Links trotz korrektem Einbau in die CKEditor-Toolbars nicht zur Verfügung, so sind die WYSIWYG-Einstellungen in einer höheren Instanz höchstwahrscheinlich überschrieben.

Werden die Konfigurationen beispielsweise in den Programmeinstellungen unter Alle Mandanten vorgenommen, so sind höchstwahrscheinlich entweder die WYSIWYG-Einstellungen in den Programmeinstellungen des jeweiligen Mandanten oder die WYSIWYG-Einstellungen in den einzelnen Modulen überschrieben worden.

Suche

Suche auf der Webseite findet nichts

Wenn die Suche auf der Webseite keine Resultate ausgibt, kann dies mehrere Ursachen haben:

  • Im Such-Manager wurden keine Objekte freigegeben:
    Im Beispiel sind Betriebe für die Suche freigegeben, nicht aber Adressen und Aufgaben.
  • Im Suchformular wurden die Objekte eingeschränkt:
    Wenn keine Objekte im Suchformular hinterlegt werden, werden alle durchsucht. Sobald 1 Objekt ausgewählt ist, werden nur noch Treffer für dieses Objekt angezeigt.
  • Der Suchserver wurde nicht korrekt gestartet. Dies kann manuell im Suchmanager ausgeführt werden:
  • Erscheinen immer noch keine Resultate, ist bei der Initialisierung des Suchservers allenfalls etwas schiefgegangen. In diesem Fall kann im Buglog nach einer Fehlermeldung gesucht werden. Typischerweise findet man eine Fehlermeldung, die wie folgt beginnt: SOLR: Can't create core [Name des Objekts]. Normalerweise muss durch den Webmaster das Verzeichnis für das entsprechende Objekt gelöscht werden: /opt/solr8/server/govis_[kunde]/[Name des Objekts].
    Anschliessend muss die Konfiguration nochmals im Suchmanager initialisiert werden. Nun sollte kein Fehler mehr im Buglog erscheinen. Ist dies der Fall, muss das gewünschte Objekt, das eben neu angelegt worden ist, unter alle Mandanten frisch indexiert werden. Nun sollte die Suche wieder Resultate liefern.
    Das Vorgehen im Detail:
    1. Solr stoppen: systemctl stop solr-govis_[kunde]
    2. Defekten Core löschen: rm -rf /opt/solr8/server/govis_[kunde]/[Name des Objekts]
    3. Solr wieder starten: systemctl start solr-govis_[kunde]
    4. Unter alle Mandanten Konfiguration neu laden
    5. Unter alle Mandanten das entsprechende Objekt frisch indexieren.

Templates

Freigabe eines Templates wird nicht durchgeführt.

Wenn ein  comet-Template nicht freigegeben wird, wenn man den Freigabe-Button klickt, kann es daran liegen, dass es keine korrekte Zonen- oder Mainzonen Definition enthält.

Sie dazu: Templates

CMS

Benutzer haben trotz eingeschränkter Rechte Zugriff oder Sicht auf andere Verzeichnisse oder Objekte

Zugriffsrechte einer Rolle sind falsch gesetzt. Prüfen, ob dort bei den Funktionen der 'Zugriffsrechte'

  • Objectpermissions global
  • Objectpermissions ignoreall
  • Objectpermissions restricted

gesetzt sind. Dies darf nicht sein.

Cache-Einstellung für alle Seiten ändern

Wenn der Cache für alle Seiten deaktiviert werden muss, wird zuerst bei den Modul-Einstellungen das Seiten-Caching auf «nicht cachen» eingestellt.

Wenn nur 1 Mandant vorhanden ist, können die Einstellungen mit einem DB-Update bereinigt werden:

UPDATE cms_page SET cachetime = 0

Sind mehrere Mandanten vorhanden, müssen zuerst die entsprechenden Seiten-IDs ausgelesen werden. Dazu muss folgender Code in als Test-Controller eingefügt und ausgeführt werden:

public void function testAction() {      	
    var pages = getModel('cms/page').readData(returnAll=true, mandantId = x).data;
    var idArray = [];
    for(var page in pages){
        ArrayAppend(idArray, page.id);
    }
    
    writeDump(ArrayToList(idArray));
    abort;
}

Achtung: x muss durch die MandantenID ersetzt werden!

Anschliessen kann die Liste für die folgende Abfrage verwendet werden:

UPDATE cms_page SET cachetime = 0 WHERE id IN (Liste der Ids)

Im nächsten Schritt muss ein Restart der Applikation durchgeführt werden, damit alle Caches gelöscht werden.

Ist ein Webseiten-Template noch in Gebrauch?

Um herauszufinden, welche Template aktuell mit Seiten verknüpft sind, kann folgende Abfrage verwendet werden:

SELECT
	id, parentidfk, title, templateidfk, childtemplateidfk
FROM
	cms_page
WHERE
	(
		templateidfk IN (
			SELECT
				pid
			FROM
				public.cms_template
			WHERE
				deleted = 0
		)
		OR childtemplateidfk IN (
			SELECT
				pid
			FROM
				public.cms_template
			WHERE
				deleted = 0
		)
	)
	AND deleted = 0

 

Mustache-Dateien werden nicht benutzt

Obwohl Mustache-Dateien im Modulblock ausgewählt sind, scheint comet diese nicht zu benutzen.

Lösung:

  • prüfen, ob der Cache auf «unendlich cachen» steht
  • Das benutzte Template hat vielleicht nicht das Default-Schema aktiviert? Evtl. steht dieses auf «backslash»? Oder umgekehrt?
Nach Freigabe eines Objektes ist dieses immer noch im Status Entwurf

Das System hat bei dem Objekt einen Fehler entdeckt und erlaubt das Speichern nicht. Abhilfe schafft hier, den vorhergehenden Entwurf erneut zu speichern und diesen danach als Version freizugeben.

Renditions werden nicht ausgegeben

Bei der Ausgabe von Bildern über den Modulblock 'Asset Management' ->'Dateiliste' werden keine Renditions angezeigt. Die dumpParams-Ausgabe zeigt auch keinerlei Renditionstrukturen an.

Lösung: Im Modulblock 'Asset Management' ->'Dateiliste' müssen die Renditions, die ausgegeben werden, definiert werden. Parameter: 'Zugelassen Renditionstypen'

Stichworte: noRendition, hasRendition

 

 

  • comet
Seiten mit speziellem Inhalt finden

Wie kann ein spezifischer Begriff auf Seiten gefunden werden? Die Volltextsuche hilft oft nicht weiter, vor allem wenn es sich um Quellcode handelt.

Folgende Datenbank-Abfrage sucht nach dem Begriff «template_right» in allen aktiven Seitenelementen und Template-Zonen-Verknüpfungen und liefert die Seiten-IDs zurück:

SELECT
	tz.pid as templateId, tz.zoneid as zonetitle,
	pz.pageidfk,
	cb.ID,
	cb.pageelementlangidfk,
	DATA,
	pe.ID,
	pe.pid,
	pel.ID,
	pz.pageelementidfk
FROM
	cms_contentblock AS cb
	LEFT JOIN cms_pageelementlang AS pel ON pel.ID = cb.pageelementlangidfk AND pel.isactive = 1
	LEFT JOIN cms_pageelement AS pe ON pe.ID = pel.pageelementidfk
	LEFT JOIN cms_pagezone AS pz ON pz.pageelementidfk = pe.pid 
	LEFT JOIN cms_page AS p ON pz.pageidfk = p.id
	LEFT JOIN cms_templatezone AS tz ON tz.pageelementidfk = pe.pid 

WHERE
	pe.isactive = 1 
    AND (p.deleted is NULL or p.deleted = 0)
	AND cb.DATA LIKE ( '%template_right%' ) 
ORDER BY
	pz.pageidfk

Folgende Datenbank-Abfrage sucht nach dem Begriff «template_right» in allen aktiven Seitenelementen und liefert die Seiten-IDs zurück:

SELECT
	cb.id,
	cb.data,
	pz.pageidfk AS pageid,
	pz.zonename AS zonename
FROM
	cms_contentblock AS cb
	INNER JOIN cms_pageelementlang AS pel ON cb.pageelementlangidfk = pel.id
	AND isactive = 1
	INNER JOIN cms_pagezone AS pz ON pz.pageelementidfk = pel.mainpid
	INNER JOIN cms_page AS page ON page.id = pz.pageidfk
	AND page.deleted = 0
WHERE
	typeidfk = 2
	AND DATA ILIKE '%template_right%'

Folgende Abfrage würde alle Contentblöcke eines gewissen Blocktyps finden (core_logout):

SELECT
	cb.id,
	cb.data,
	pz.pageidfk AS pageid,
	pz.zonename AS zonename
FROM
	cms_contentblock AS cb
	INNER JOIN cms_pageelementlang AS pel ON cb.pageelementlangidfk = pel.id
	AND isactive = 1
	INNER JOIN cms_pagezone AS pz ON pz.pageelementidfk = pel.mainpid
	INNER JOIN cms_page AS page ON page.id = pz.pageidfk
	AND page.deleted = 0
WHERE typeidfk = 2 
	AND cast(data::json->>'moduleblock' AS integer) = (SELECT id FROM core_moduleblock WHERE block_key = 'core_logout')

Und so würde eine Kombination von Modulblock und einer Konfiguration aussehen:

SELECT
	cb.id,
	cb.data,
	pz.pageidfk AS pageid,
	pz.zonename AS zonename
FROM
	cms_contentblock AS cb
	INNER JOIN cms_pageelementlang AS pel ON cb.pageelementlangidfk = pel.id
	AND isactive = 1
	INNER JOIN cms_pagezone AS pz ON pz.pageelementidfk = pel.mainpid
	INNER JOIN cms_page AS page ON page.id = pz.pageidfk
	AND page.deleted = 0
WHERE
	typeidfk = 2
	AND cast(data::json->>'moduleblock' AS integer) = (SELECT id FROM core_moduleblock WHERE block_key = 'news_list')
	AND data ilike '%expose_assets":"1%'

Folgende Abfrage enthält eine Mandanten-Einschränkung:
 

WITH RECURSIVE cms_pageMandants AS (
	SELECT
		main.id,
		main.parentidfk,
		manRel.mandants
	FROM cms_page AS main
	LEFT JOIN core_mandant_relation AS manRel
		ON manRel.entity_type = (SELECT id FROM core_entity_type WHERE name = 'cms_page')
		AND manRel.entity_id = main.id

	UNION

	SELECT
		cms_pageMandants.id,
		parent.parentidfk,
		parentManRel.mandants
	FROM cms_page AS parent
		INNER JOIN cms_pageMandants
			ON cms_pageMandants.parentidfk = parent.id
			AND cms_pageMandants.mandants IS NULL
		LEFT JOIN core_mandant_relation AS parentManRel
			ON parentManRel.entity_type = (SELECT id FROM core_entity_type WHERE name = 'cms_page')
			AND parentManRel.entity_id = parent.id
)

SELECT
	pz.pageidfk,
	pz.zonename AS z_title,
	cb.ID AS b_id,
	cb.title AS b_title,
	pe.ID AS pe_id,
	pe.pid AS pe_pid,
	pel.ID AS pel_id,
	pel.langidfk AS pel_lang,
	pm.mandants AS mandants,
	cb.data
FROM
	cms_contentblock AS cb
	INNER JOIN cms_pageelementlang AS pel ON pel.ID = cb.pageelementlangidfk AND pel.isactive = 1
	INNER JOIN cms_pageelement AS pe ON pe.ID = pel.pageelementidfk
	INNER JOIN cms_pagezone AS pz ON pz.pageelementidfk = pe.pid 
	INNER JOIN cms_page AS p ON pz.pageidfk = p.id
	INNER JOIN cms_pageMandants AS pm ON pm.id = p.id
WHERE
	pe.isactive = 1 
    AND (p.deleted is NULL or p.deleted = 0)
	AND cb.DATA LIKE ( '%.mustache%' ) 
	AND mandants LIKE ('%1%')
ORDER BY
	pz.pageidfk

Folgende Abfrage ermöglicht die auf Mandanten eingeschränkte Suche von Seitenelementen, die Templates zugewiesen sind:
 

SELECT
	tz.zoneid AS z_title,
	tpl.title AS tpl_title,
	cb.ID AS b_id,
	cb.title AS b_title,
	pe.ID AS pe_id,
	pe.pid AS pe_pid,
	pel.ID AS pel_id,
	pel.langidfk AS pel_lang,
	tm.mandants AS mandants,
	cb.data
FROM
	cms_contentblock AS cb
	INNER JOIN cms_pageelementlang AS pel ON pel.ID = cb.pageelementlangidfk AND pel.isactive = 1
	INNER JOIN cms_pageelement AS pe ON pe.ID = pel.pageelementidfk
	INNER JOIN cms_templatezone AS tz ON tz.pageelementidfk = pe.pid 
	INNER JOIN cms_template AS tpl ON tpl.pid = tz.pid AND tpl.isactive = 1
	INNER JOIN core_mandant_relation AS tm
		ON tm.entity_type = (SELECT id FROM core_entity_type WHERE name = 'cms_template')
		AND tm.entity_id = tpl.pid
WHERE
	pe.isactive = 1 
	AND cb.DATA LIKE ( '%.mustache%' ) 
	AND mandants LIKE ('%1%')

 

  • comet
Zugewiesene Seitenelemente für eine Zone finden

Via Datenbank können aktive Seitenelemente gefunden werden, die einer Zone zugewiesen sind:

SELECT
	p.id AS seitenID,
	p.title AS Seitentitel,
	el.title AS sidebarTitel
FROM
	public.cms_pagezone z
	INNER JOIN cms_page p ON z.pageidfk = p.id
		AND p.deleted = 0
	INNER JOIN cms_pageelement e ON e.pid = z.pageelementidfk
		AND e.isactive = 1
		AND e.deleted = 0
	INNER JOIN cms_pageelementlang el ON e.id = el.pageelementidfk
		AND el.isactive = 1
WHERE
	z.zonename = 'sidebar'

 

Formulare

Admin-Mail wird nicht verschickt. Corrupt...

Ein mit dem Formmailer integriertes Formular wird nach dem Abschicken nicht an die angegebene Admin-Email-Adresse verschickt. Stattdessen findet man im ComAgent bei den 'fehlerhaften Jobs' einen Fehlereintrag 'Absender wurde nicht angegeben'.

Lösung: in den Modulsettings des Formular-Managers ist keine Absender E-Mail-Adresse eingetragen.

 

Nach dem Go-live reagieren die Formulare nicht bei Klick auf den Senden-Button

Typische Fehlermeldungen im Firebug: 

 

Lösung:

Die Formulare haben sind auf dem Server noch mit der integrierten "Arbeits-URL" govis-CLIENT.backslash.ch gespeichert. Hier muss der Formular-Cache bereinigt werden. Die kann in der Verwaltung der Modul-Templates gemacht werden. Wenn eine Vorlage geöffnet wird, erscheint die Funktion zum Löschen des Formular-Caches.

 

News

News Archiv: obwohl verschiedene News angewählt sind, wird immer nur eine News aus dem Archiv angezeigt.

Dies liegt vermutlich daran, dass ein Cache auf der Detail-Seite eingestellt ist.

Lösung: Cache entfernen.

Vereine

Export der Mitgliederdatei bricht ab

Im Vereinsmanager bricht das Exportieren der Mitgliederdatei via Button "Export" mit der Fehlermeldung "Getaway timed out ab" ab.

Lösung: Der Server wurde neu gestartet. Dies löst aber nciht das eigentliche Problem. Dazu sollte auf dem Server die Konfiguration geprüft und angepasst werden.

Online-Benutzer ist nicht erstellbar

Ein Online-Benutzer lässt sich nicht erstellen.

Dieser Fehler trat auf, als ein weiterer Online-Benutzer mit einer bereits im System existierenden E-Mail-Adresse erzeugt werden sollte.

Lösung: E-Mails wieder unique einrichten.

 

 

  • comet

Kampagnen Tool

Abonnenten einer Rubrik für weitere Rubrik eintragen

Wenn Abonnenten einer News-Rubrik auch für eine andere Rubrik eingetragen werden sollen, kann dies nur via Datenbank erfolgen. Dies sollte auch mit dem Kunden angesprochen werden, und ist aus Datenschutzgründen auch nur zu rechtfertigen, wenn der Inhalt der ursprünglichen Rubrik nun auch mehrere Rubriken aufgeteilt wird. Insofern erhalten Abonnenten keine neuen unerwünschten Meldungen.

Folgende Datenbank-Abfrage kann verwendet werden. Dabei sind mehrere Parameter anzupassen, bevor die Abfrage auf der Kunden-Datenbank ausgeführt wird:

  • _entityId → ID der alten News-Rubrik

  • _newEntityId → ID der neuen News-Rubrik

  • _mandantId → ID des Mandanten

  • _subscriptionTypeId = 1 für Auto-Newsletter, 2 für Reminder

Wichtig ist, dass vor dem Ausführen der Abfrage die neue Rubrik für den Versand freigegeben wird in der Abonnement-Konfiguration.

DO $$
    DECLARE 
	    _entityType character varying(255) := 'news_category';
    	_entityId integer := 0;
		_newEntityId integer := 0;
		_mandantId integer := 1;
		_subscriptionTypeId integer := 1/*1-auto, 2-reminder*/;
		_inserted_count integer;
    BEGIN
		INSERT INTO messenger_memberconfig (entitytypeidfk, entityid, lastsend, nextsend, memberidfk, mandantidfk, deleted, usercreated, datecreated, userupdated,
		  dateupdated, html, plain, sms, timeconfig, daterange, customdaterange, sendafterpublish, timezoneidfk, subscriptiontype, datesbefore)
		SELECT entitytypeidfk, _newEntityId AS entityid, lastsend, nextsend, memberidfk, mandantidfk, deleted, usercreated, datecreated, userupdated,
		  dateupdated, html, plain, sms, timeconfig, daterange, customdaterange, sendafterpublish, timezoneidfk, subscriptiontype, datesbefore
		FROM messenger_memberconfig
			WHERE memberidfk NOT IN (
				SELECT memberidfk
				FROM messenger_memberconfig
				WHERE
					entitytypeidfk = (SELECT entitytypeidfk FROM core_entity_type WHERE name = _entityType) AND
					entityid = _newEntityId AND
					mandantidfk = _mandantId AND
					subscriptiontype = _subscriptionTypeId AND
					deleted = 0
			) AND
			entitytypeidfk = (SELECT entitytypeidfk FROM core_entity_type WHERE name = _entityType) AND
			entityid = _entityId AND
			mandantidfk = _mandantId AND
			subscriptiontype = _subscriptionTypeId AND
			deleted = 0;
			
			GET DIAGNOSTICS _inserted_count = ROW_COUNT;
  			RAISE NOTICE 'Inserted records: %', _inserted_count;
END $$;

 

Abonnenten-Liste im 'Versand' und zeigt eine andere Anzahl Abonnenten an als in der eigentlichen Abonnenten-liste

Abonnenten-Liste im 'Versand' und zeigt eine andere Anzahl Abonnenten an als in der eigentlichen Abonnenten-Liste.

=> Nur die Abonnenten, die eine E-Mail-Adresse besitzen werden innerhalb der Versände angezeigt.

Abonnenten-Liste zeigt Mitglied nicht an.

Bei einer Abonnenten-Liste von Vereinsmitgliedern wird ein Benutzer nicht angezeigt, obwohl er gerade eben als Mitglied bei einem Verein eingefügt worden ist.

=> Die Synchronisierung der Abonnenten-Listen mit dern Mitgliederlisten findet mit einem Cron Job nur jede Stunde statt. Zur Zeit immer um 5 Minuten nach Voll….

  • comet
Formular 'Abonnieren' leitet nicht weiter

Das Newsletter-Abonnieren-Formualr leitet die ANfarge nicht weiter. Es sieht aus, als ob es eingefroren ist, beim Klick auf ^'Abonnieren'.

Lösung: 

- Routes im Routes-Manager checken:  ":shortcut" muss unterhalb route/:route" aufgeführt sein. Danach 'Erstellen' klicken. Kein restart der Applikation notwendig. Evtl. alle Caches löschen

Formular 'Abonnieren' leitet nicht weiter

Das Newsletter-Abonnieren-Formular leitet die Anfrage nicht weiter. Es sieht aus, als ob es eingefroren ist, beim Klick auf ^'Abonnieren'.

Lösung: Routes im Routes-Manager checken:  ":shortcut" muss unterhalb route/:route" aufgeführt sein. Danach 'Erstellen' klicken. Kein restart der Applikation notwendig. Evtl. alle Caches löschen

DAM

Dateien sind nicht mehr im Dateimanager vorhanden aber abrufbar

Es kann vorkommen, dass Dateien nicht mehr in der Datenbank geführt werden, aber trotzdem noch abgerufen werden können über die Webseite. Um solche Dateien zu finden, kann folgender Link in der Administration aufgerufen werden:  https://govis-[kunde].backslash.ch/admin/?route=/dam/file/findStuckFiles

Werden Dateien im Filesystem gefunden, sieht das Resultat folgendermassen aus:

Assets:

Die Verzeichnisse in den Verzeichnissen unter /private/upload/assets/ oder publik/upload/assets/ mit den gelisteten IDs können gelöscht werden.

wrongFolder:

Die Ordner mit den gelisteten IDs liegen im falschen Verzeichnis, also im private statt public und umgekehrt. 

Fehlermeldung beim Hochladen einer Datei: 'HTTP Error 200 undefined'

Nachdem eine Datei per Drag&Drop in im DAM zum hochladen abgelegt wurde, erscheint nach Klicken auf den Butten "Hochladen" die Fehlermeldung 'HTTP Error 200 undefined'.

 

Lösung: der Benutzer hat keine Schreibrechte in dem Verzeichnis.

 

Fehlermeldung beim Hochladen einer Datei: 'No action permission for updating imageformat'

Beim Hochladen einer Datei ins DAM erscheint die Fehlermeldung: 'No action permission for updating imageformat'.

Lösung: Benutzer hat kein Recht Renditions zu aktualisieren. Dieses Recht muss unter «Core» eingerichtet werden.

Online-Schalter

Abfrage der Rechnungsadresse erscheint trotz Deaktivierung im Produkt

Erscheint die Abfrage der Rechnungsadresse, obwohl diese im Produkt korrekt deaktiviert wurde, so liegt dies in der Regel an der Auswahl des Zahlungsproviders.
Beispielsweise ist beim Provider «SIX Saferpay» grundsätzlich die Abfrage der Rechnungsadresse hinterlegt. 

Der Artikel kann nicht in den Warenkorb gelegt werden.

Der Artikel (oder schon die Rubrik) sind nicht als «bestellbar deklariert. Hier muss das Häkchen gesetzt werden.

Der bestellbare Artikel liegt im Warenkorb, doch es erscheint kein Schritt zur Eingabe der Formularfelder.

Dem bestellbaren Artikel wurde kein Formular hinterlegt. Dieses muss im Artikel unter der Registerkarte «Deutsch (Schweiz)» zugewiesen werden.

Die angegebene Karte oder Währung wird nicht unterstützt.

Fehlermeldung von Six Saferpay: Die angegebene Karte oder Währung wird nicht unterstützt.

In den Einstellungen muss die Bezahlmethode eingestellt sein, die auch bei Six bestellt worden ist. Es kann auch sein, das Saferpay eingerichtet ist, aber zum Beispiel bei der PostFinance der Service noch nicht freigeschaltet worden sit.

Lt. Saferpay muss der Kunde (oder wir) bei der PostFinance anrufen und einmal nachfragen/auffordern, diesen Zugang nun freizuschalten und an Saferpay zu melden.

Die Kontakttelefonnummer ist: 0800 88 88 77 (Bitte mit der Vertragsaufschaltungs-Abteilung verbinden lassen)

iOS-Browser können keine Artikel in den Warenkorb legen

Wenn im comet iFrames von cms3 (Reservationen) oder in andere Auftritte comet-Inhalte (Shop, Tageskarten, etc) als IFrame eingebunden werden und die Domain von iFrame und übergeordneter Seite stimmen nicht überein, erhalten iOS-Geräte aus Sicherheitsgründen bei jedem Klick im iFrame eine neue Session / ein neues Cookie. Dies kann zwar in den Browser-Einstellungen angepasst werden – wird aber von Benutzern nicht gemacht und kann auch nicht erwartet werden.

Das Problem kann mit 2 Varianten vermieden werden:

  1. Das iFrame wird als Subdomain der übergeordneten Seite betrieben.
  2. Es wird ein JavaScript integriert, der zuerst automatisch auf die Seite im iFrame weiterleitet, wieder zurückspringt und dann die Seite normal lädt. Damit ist die Seite bereits einmal ausserhalb eines iFrames besucht worden und aus iOS-Security-Sicht nicht mehr gefährlich (hüstel, hüstel).

Wird Variante 2 gewählt, muss ins Template der Seite im iFrame folgender JavaScript-Code eingefügt werden. Am besten in den Head-Bereich. Der Script setzt jQuery voraus, kann aber auch leicht angepasst werden, damit er ohne jQuery funktioniert.

Tageskarten

Konfigurations-Icon im Backend ausblenden für Benutzer

Konfigurations-Icon im Backend ausblenden für Benutzer.

Recht: 'Verkaufsstelle aktualisieren'

Suche nach Bestellungen liefert keine Treffer

Wenn die Suche nach Bestellungen keine Treffer liefert, liegt es in der Regel daran, dass der Suchserver nicht korrekt initialisiert worden ist. Dies kann behoben werden, indem unter /Verwaltung/Such-Manager die Konfiguration reinitialisiert wird:

Data Exchange

cms3-Onlineuser wurden unter alle Mandanten importiert

Wenn der Import der cms3-Online-Benutzer irrtümlicherweise unter alle Mandanten ausgeführt wurde, können die Zuweisungen manuell korrigiert werden:

  1. Zuerst benötigen wir die entitytypeId der Objekte «user» und «exchange_importprocess». Diese sind aus der Tabelle core_entity_type herauszulesen, da sie bei jeder Installation einen anderen Wert haben können.
  2. Der Importprozess muss dem Mandanten zugewiesen werden. Die ID des Importprozess ist in der Tabelle «exchange_import_process» zu finden. Die Zuweisung geschieht in der Tabelle: core_mandant_relation
  3. Die eben importierten Benutzer müssen in der Tabelle eingetragen werden: core_mandant_relation. Die IDs der Benutzer sind in der Tabelle «core_user» abgelegt.
  4. Nun erfolgt ein Restart
  5. Jetzt kann der Importprozess unter dem Mandanten nochmals gestartet werden.

 

Logs von Import-Prozessen werden nicht automatisch gelöscht

Es kann vorkommen, dass das automatische Löschen von Import-Prozess-Logs nicht funktioniert, weil die Löschaktion zu lange dauert. In diesem Fall hilft nur das manuelle Bereinigen in der Datenbank. Dabei ist folgende Reihenfolge einzuhalten.

Achtung: bei den Abfragen ist das Datum zu ersetzen!

1. Import-Tasks bereinigen

delete FROM exchange_import_task WHERE jobidfk IN (
	SELECT id FROM exchange_import_job WHERE processjobidfk IN (
		SELECT id FROM exchange_import_processjob WHERE startdate < '2018-08-03' AND processidfk IN (
			SELECT id from exchange_import_process WHERE schedule=1
		)
	) LIMIT 10000
)

2. Import-Jobs bereinigen

ALTER TABLE exchange_import_job DISABLE TRIGGER ALL; 
delete FROM exchange_import_job WHERE id IN (
	SELECT id FROM exchange_import_job WHERE processjobidfk IN (
		SELECT id FROM exchange_import_processjob WHERE startdate < '2018-08-03' AND processidfk IN (
			SELECT id from exchange_import_process WHERE schedule=1
		)
	)
);
ALTER TABLE exchange_import_job Enable TRIGGER ALL; 

3. Prozess-Jobs bereinigen

ALTER TABLE exchange_import_processjob DISABLE TRIGGER ALL; 
delete FROM exchange_import_processjob WHERE startdate < '2018-08-03' AND processidfk IN (
			SELECT id from exchange_import_process WHERE schedule=1
		);
		
ALTER TABLE exchange_import_processjob ENABLE TRIGGER ALL;

4. Es wird ein Restart der Applikation benötigt.

5. Mit folgendem Link können auch noch alte Import-Files gelöscht werden: route=exchange/importconfig/clearDeletedJobs

Payment

BillingOnline

Kontakt BillingOnline Support

Der Support von BillingOnline ist wie folgt erreichbar:

Zahlungsseite wird nicht geladen

Wenn die Zahlungsseite von BillingOnline nicht geladen werden kann, ist die Ursache in der Regel bei einer fehlerhaften Konfiguration zu suchen.

Ansicht, wenn die Zahlungsmaske von Billing Online nicht korrekt geladen werden kann.

Normalerweise findet man im Buglog einen entsprechenden Eintrag mit dem Betreff: BillingOnline payment request

Die Fehlermeldung gibt Aufschluss auf die mögliche Ursache. Anbei verschiedene mögliche Fehler:

  • java.security.InvalidKeyException: invalid key format
  • java.security.InvalidKeyException: IOException : DER input, Integer tag error

In allen Fällen stimmt das zugewiesene Zertifikat nicht. Die Konfiguration muss überprüft werden.

SIX Saferpay

JSON API Anbindung verwenden

Bei allen Projekten setzen wir die JSON API Anbindung ein, wenn eine Kreditkartenzahlung mit dem Saferpay-Provider geplant ist. Damit diese Anbindung einwandfrei funktioniert, muss folgendes vorgenommen werden.

1. Als Erstes sollte man sicherstellen, dass die Saferpay-Logindaten aktiv sind.

                1.1 Ist das Konto gesperrt worden, kann man es wieder entsperren lassen, indem man sich bei Saferpay unter der Nummer +41 848 66 4444 meldet.

                1.2 Ist das Passwort falsch, sollte man beim Kunden das neue Passwort anfordern.

2. Im Mandant unter E-Commerce / Shop-Konfigurator / PSP / Saferpay müssen die Account-Einstellungen gemacht werden. z.B. wie bei Herrliberg

Die Account-ID ist die Kombination aus Kundennummer und Terminal.

Beispiel:   Account-ID(434337-17833517) = Kundennummer(434337) + Terminal(17833517)

3. Im Saferpay unter JSON API Basic Authentication muss noch ein API-Login erstellt werden. 

Achtung! Es können maximal 10 API-Logins erstellt werden. Deshalb kopiert man zuerst den Benutzernamen und erstellt ein Passwort, welches den Kriterien passt. Dieses Login muss man auch im Intranet eintragen werden.

Das generierte API-Login integriert man folglich noch im GOVIS unter E-Commerce / Shop-Konfigurator / PSP / Saferpay.
Besitzt der Kunde mehrere Shops (Online-Schalter und Tageskarten), so müssen diese Eintragungen für jeden Shop separat vorgenommen werden.

Bei Kunden, die noch keinen Account bei Saferpay bestellt haben, kann ein Testkonto erstellt werden, damit die Konfiguration fertiggestellt werden kann. Das Kunden-Konto muss der Kunde bei Saferpay abholen und uns mitteilen. Arbeitet man mit dem von uns erstellten Testkonto, ist der Testbetrieb im JSON API zu aktivieren, was aber bei Produktivkonten inaktiv sein muss. 

Nun kann die Kreditkartenzahlung geprüft werden. Kommt man im Bestellprozess bis zur Auswahl der Kreditkarte, kann man davon ausgehen, dass die Verbindung zu Saferpay problemlos funktioniert.

Mehrere E-Mail-Adressen hinterlegen bei Saferpay

Über eine PaymentPage Konfiguration, mit der das Verhalten und Aussehen, das Bezahlformulars angepasst werden kann, können auch mehrere E-Mail-Adressen definiert werden, an die eine Bestätigungsmail nach einer erfolgreichen Bezahlung geschickt werden sollen.

Die Konfiguration ist im Saferpay Backoffice unter Einstellungen / PaymentPage Konfiguration einzurichten:

Nachdem die Konfiguration eingerichtet ist, können unter dem Punkt JSON API mehrere E-Mail-Adressen eingetragen werden:

Damit die Konfiguration jedoch verwendet wird, muss Sie in der PaymentPage Konfigurations-Übersicht auf das Wort «Nein» unter «Default» klicken damit dieses sich zu «Ja» ändert:

 

Saferpay Zahlungsmaske wird nicht geladen

Wenn die Zahlungsmaske von Worldline / SIX / Saferpay nicht aufgerufen werden kann, kann liegt dies in den meisten Fällen daran, dass in der Administration von Saferpay IP-Freigabe erteilt worden sind. Sobald der Zugriff eingeschränkt wurde, müssen auch die backslash-IP-Adressen hinterlegt werden:

Falls der Zugriff nicht erfolgen kann, ist dies im Buglog ersichtlich mit diesem Betreff: Saferpay API Call error.
Im Inhalt der Fehlermeldung steht Folgendes:

{"ResponseHeader":{"SpecVersion":"1.22","RequestId":"64B1BB67-427D-4B07-8F15D7979C7D9709"},"Behavior":"ABORT","ErrorName":"PERMISSION_DENIED","ErrorMessage":"Permission denied"}

Im Standard setzt backslash keine IP-Freigaben. Diese dürfen nur gesetzt werden, wenn bereits IP-Freigaben vorhanden sind. In diesem Fall müssen sie hinterlegt werden!

Server

Sessionen werden nicht mehr bereinigt

Auf jedem Server befindet sich einen Datenbank client_storage, in der Sessionen verwaltet werden. ColdFusion/Lucee bereinigt nicht mehr aktive Sessionen automatisch jede Stunde. Wenn dieser Prozess nicht funktioniert, wächst die Datenbank und alle Zugriffe werden langsamer.

In diesem Fall werden als Sofortmassnahme alte Einträge gelöscht:

delete from cf_session_data where expires <= '[epochdatetime]'

Die Epochdatetime kann mit dem Convert von epochconverter.com ermittelt werden. Er sollte sicher einen halben Tag in der Vergangenheit liegen!

Allenfalls können die Einträge nicht bereinigt werden, weil keine Schlüssel für die Spalten cfid  und name vorhanden sind. In diesem Fall sind die Schlüssel neu zu setzen. Ist dies nicht möglich, liegt es wahrscheinlich an doppelten Einträgen in der Datenbank. Bei Postgres können diese mit folgender Abfrage entfernt werden:

DELETE FROM cf_session_data USING cf_session_data cf_session_data2
WHERE cf_session_data.cfid = cf_session_data2.cfid AND cf_session_data.expires < cf_session_data2.expires;

 

  • comet

Lucee

Doppelte Attribute

Beim Starten eines Auftrittes kann es zu folgendem Fehler kommen, der Name des Attributes kann variieren:

javax.servlet.ServletException: Attribute "proxyPassword" was already specified for element "task".
		at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
		at lucee.runtime.schedule.StorageUtil.loadDocument(StorageUtil.java:93)
		at lucee.runtime.schedule.SchedulerImpl.<init>(SchedulerImpl.java:73)
		at lucee.runtime.config.ConfigImpl.setScheduler(ConfigImpl.java:1525)
		at lucee.runtime.config.ConfigWebFactory.loadScheduler(ConfigWebFactory.java:3890)
		at lucee.runtime.config.ConfigWebFactory.load(ConfigWebFactory.java:398)
		at lucee.runtime.config.ConfigWebFactory.newInstance(ConfigWebFactory.java:271)
		at lucee.runtime.engine.CFMLEngineImpl.loadJSPFactory(CFMLEngineImpl.java:228)
		at lucee.runtime.engine.CFMLEngineImpl.addServletConfig(CFMLEngineImpl.java:182)
		at lucee.loader.engine.CFMLEngineFactory.getInstance(CFMLEngineFactory.java:164)
		at lucee.loader.servlet.CFMLServlet.init(CFMLServlet.java:41)
		at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1142)
		at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1089)
		at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:773)
		at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
		at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
		at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
		at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
		at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
		at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:679)
		at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
		at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
		at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
		at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
		at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)
		at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
		at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
		at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
		at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
		at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
		at java.lang.Thread.run(Thread.java:748)

Bei allen lucee-Servern gibt es ein schedulerfix.py im /root. Dieses Prüft alle scheduler.xml und gibt bei fehlerhaften einen Korrekturvorschlag aus. Diesen kann man kopieren und bei der angegebenen Datei einfügen, die bereits enthaltenen Einträgen muss man entfernen, ausser die oberste Zeile:

# /root/schedulerfix.py
Fehler in Datei: /var/www/lucee/geoservice.backslash.ch/WEB-INF/lucee/scheduler/scheduler.xml

Korrektur:

<schedule>
  <task autoDelete="false" hidden="false" interval="43200" name="{d '2019-08-07'}" port="80" proxyHost="" proxyPassword="" proxyPort="0" proxyUser="" publish="false" readonly="false" resolveUrl="false" startTime="{t '00:00:00'}" timeout="180000" url="http://geoservice.backslash.ch:80/services/update.cfm"/>
  <task autoDelete="false" hidden="false" interval="43200" name="geo_service_update" port="80" proxyHost="" proxyPassword="" proxyPort="0" proxyUser="" publish="false" readonly="false" resolveUrl="false" startDate="{d '2019-08-07'}" startTime="{t '00:00:00'}" timeout="180000" url="http://geoservice.backslash.ch:80/services/update.cfm"/>
</schedule>

# vi /var/www/lucee/geoservice.backslash.ch/WEB-INF/lucee/scheduler/scheduler.xml
<?xml version="1.0"?>
******* AB HIER LÖSCHEN UND ERSETZEN *******
<schedule>
    <task autoDelete="false" hidden="false" interval="43200"
        name="{d '2019-08-07'}" port="80" proxyHost="" proxyPassword=""
        proxyPort="0" proxyUser="" publish="false" readonly="false"
        resolveUrl="false" startTime="{t '00:00:00'}"
        startTime="{t '00:00:00'}" timeout="180000" url="http://geoservice.backslash.ch:80/services/update.cfm"/>
    <task autoDelete="false" hidden="false" interval="43200"
        name="geo_service_update" port="80" proxyHost=""
        proxyPassword="" proxyPort="0" proxyUser="" publish="false"
        readonly="false" resolveUrl="false" startDate="{d '2019-08-07'}"
        startTime="{t '00:00:00'}" timeout="180000" url="http://geoservice.backslash.ch:80/services/update.cfm"/>
</schedule>

 

Object Cache nicht vorhanden

Mit folgendem Script kann nach fehlenden Object Caches gesucht werden:

#!/bin/bash
: '
FileName        : check_object_cache.sh
Author          : maagf
Purpose         : Prüft das Vorhandensein der Object Cache pro Auftritt

Modification Log:

Name            Date            Description
================================================================================
maagf           03.05.2023      Erstellt
--------------------------------------------------------------------------------
'

for D in `find /var/www/lucee -maxdepth 1 -type d`
 do
   if [ -f ${D}/WEB-INF/lucee/lucee-web.xml.cfm ]
     then
       echo -e "\e[1;32m$D/WEB-INF/lucee/lucee-web.xml.cfm existiert\e[0m"
       dirname="${D%"${D##*[!/]}"}"
       dirname="${dirname##*/}"
       dirname=${dirname:-/}
       if [[ $(egrep -o 'default-object="[0-9A-Za-z_-]+"' ${D}/WEB-INF/lucee/lucee-web.xml.cfm) =~ .*(object_cache_${dirname}).* ]]
         then
           echo -e "\e[1;32mObject Cache object_cache_${dirname} gefunden\e[0m"
         else
           echo -e "\e[1;31mObject Cache object_cache_${dirname} existiert nicht. Folgende existieren:\e[0m"
           echo $(egrep -o 'default-object="[0-9A-Za-z_-]+"' ${D}/WEB-INF/lucee/lucee-web.xml.cfm)
       fi
     else
       echo -e "\e[1;31m$D/WEB-INF/lucee/lucee-web.xml.cfm existiert nicht.\e[0m"
     fi
  done

Wenn ein fehlender Object Cache gefunden wurde, muss nach der Erstellung über die Lucee-Admin der Auftritt über /restart mit «Refresh beans» neu initialisiert werden.

Premature end of File

Falls es ein nicht behebbarer Fehler wie dieser ist:

Zuerst kann beim entsprechenden Auftritt das scheduler.xml geprüft werden. «Premature end of File» deutet auf ein komplett leeres XML-File hin.
/var/www/lucee/[kunde]/WEB-INF/lucee/scheduler/scheduler.xml
Ist die Datei leer, kann folgender Code eingefügt werden:

<?xml version="1.0"?>
<schedule/>

Danach muss in der Regel ein restart des Kunden-Auftritts durchgeführt werden unter https://www.kunde.ch/restart

Allenfalls muss dieser Vorgang mehrfach durchgeführt werden.

Wenn auch nach mehrmaligen Restart des Auftritts das Problem weiterhin auftritt, hilft meist nur das Löschen des WEB-INF Verzeichnisses und neu einrichten.

systemctl stop lucee
mv /var/www/lucee/govis_kunde/WEB-INF ./
systemctl start lucee
vi WEB-INF/lucee/lucee-web.xml.cfm

Mit dem letzten Befehl sieht man, was alles konfiguriert war, ausser den Scheduled Tasks, die sind im WEB-INF/lucee/scheduler/scheduler.xml und meist leer. Wenn es gerade den geprüften Auftritt betroffen hat, muss man den Dienst maintenance_off wieder stoppen und im maintenance.inc auskommentieren und den nginx reloaden, ansonsten kann direkt die Lucee-Admin (/lucee/admin/web.cfm) aufgerufen und die Konfiguration wieder angepasst werden.

Wartungsseite bleibt ewig

Zuerst kann geprüft werden, ob beim Service maintenance_off ein Fehler ausgegeben wurde:

[root@srv-baden01 ~]# systemctl status maintenance_off
 maintenance_off.service - Turns Maintenance off
   Loaded: loaded (/etc/systemd/system/maintenance_off.service; disabled; vendor preset: disabled)
   Active: active (running) since Don 2019-03-21 07:33:06 CET; 8min ago
 Main PID: 20930 (maintenance_off)
   CGroup: /system.slice/maintenance_off.service
           20930 /bin/bash /opt/lucee/bin/maintenance_off.sh
           21582 sleep 10

Mär 21 07:41:29 srv-baden01.backslash.ch maintenance_off.sh[20930]: org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
Mär 21 07:41:29 srv-baden01.backslash.ch maintenance_off.sh[20930]: org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
Mär 21 07:41:29 srv-baden01.backslash.ch maintenance_off.sh[20930]: org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
Mär 21 07:41:29 srv-baden01.backslash.ch maintenance_off.sh[20930]: org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
Mär 21 07:41:29 srv-baden01.backslash.ch maintenance_off.sh[20930]: org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
Mär 21 07:41:29 srv-baden01.backslash.ch maintenance_off.sh[20930]: java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
Mär 21 07:41:29 srv-baden01.backslash.ch maintenance_off.sh[20930]: java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
Mär 21 07:41:29 srv-baden01.backslash.ch maintenance_off.sh[20930]: org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
Mär 21 07:41:29 srv-baden01.backslash.ch maintenance_off.sh[20930]: java.lang.Thread.run(Thread.java:748)
Mär 21 07:41:29 srv-baden01.backslash.ch maintenance_off.sh[20930]: </pre><p><b>Note</b> The full stack trace of the root cause is available in the server logs.</p><hr class="l.../html>500
Hint: Some lines were ellipsized, use -l to show in full.

Falls ein Fehler wie oben erscheint, folgendes ausführen:

systemctl stop maintenance_off
vi /etc/nginx/conf.d/maintenance.inc
# erste Zeile mit # auskommentieren und mit :wq speichern
systemctl reload nginx

Danach kann eine Ausgabeseite aufgerufen werden und möglicherweise auch die Lucee-Admin (/lucee/admin/web.cfm).

Postgres

FEHLER: ungültige Seite in Block

Wenn der Datenbank-Server nicht korrekt heruntergefahren wird, können Tabellen korrupt werden. In der Regel wird ein Buglog-Eintrag erstellt beim Zugriff auf die betroffene Tabelle. 
Beispiel:

FEHLER: ungültige Seite in Block 0 von Relation base/179719/478813

Im Buglog ist die Abfrage ersichtlich, wodurch die betroffene Tabelle herausgelesen werden kann.

Der Fehler lässt sich in der Regel mit folgenden Befehlen beheben:

set zero_damaged_pages=on;
VACUUM FULL ANALYSE;
REINDEX DATABASE 'Name der DB';
set zero_damaged_pages=off;

Die Tabellen sollten nun wieder lesbar sein. Dies kann mit einem einfachen SELECT auf die betroffene Tabelle geprüft werden.

SELECT COUNT(id) FROM korrupte_tabelle

 

Mandanten

Was muss beim Löschen von Mandanten beachtet werden, wenn Inhalte mit mehreren Mandanten geteilt werden?

Wenn Inhalte mandantenübergreifend  zur Verfügung gestellt werden, muss beim Löschen eines Mandanten in der Datenbank der Inhalt für den zu löschenden Mandanten manuell bereinigt werden. Dafür können die folgenden Datenbank-Abfragen verwendet werden.

UPDATE core_mandant_relation SET mandants = '0' WHERE mandants = 'X';
UPDATE core_mandant_relation SET mandants = REPLACE(mandants, ',X,', ',');
UPDATE core_mandant_relation SET mandants = REPLACE(mandants, 'X,', '') WHERE mandants ilike 'X,%';
UPDATE core_mandant_relation SET mandants = REPLACE(mandants, ',X', '') WHERE mandants ilike '%,X';

UPDATE core_mandant_deletedrelation SET mandants ='0' WHERE mandants = 'X';
UPDATE core_mandant_deletedrelation SET mandants = REPLACE(mandants, ',X,', ',');
UPDATE core_mandant_deletedrelation SET mandants = REPLACE(mandants, 'X,', '') WHERE mandants ilike 'X,%';
UPDATE core_mandant_deletedrelation SET mandants = REPLACE(mandants, ',X', '') WHERE mandants ilike '%,X';

Dabei ist X zu ersetzen mit der ID des zu löschenden Mandanten.

Events

Events-Rubriken hinzufügen

Das Erstellen neuer Rubriken ist in vielen Modulen an verschiedenen Punkte geknüpft, die berücksichtigt werden müssen. Doch gerade bei den Veranstaltungen können diese Anforderungen sehr vielschichtig sein. Bedacht werden muss beispielsweise:

  • das Setzen von Zugriffsrechten (vor allem mau Startebene)
  • Berücksichtigung in diversen Ausgaben
  • das Setzen von Lokalitäten- und Organisatorenmapping
  • abweichende Administrator-E-Mail-Adressen
  • spezielle Detailseiten
  • die Berücksichtigung in der Suche
  • das Setzen von Parametern für die Onlineerfassung
  • das Aktivieren für das Anmeldemanagement inklusive speziell abweichender Parameter hierfür
    • (unterschiedliche Message-Templates und/oder Formular-Sets)
  • die Berücksichtigung und Implementierung bei Eventletter und/oder Reminder

Aus diesen und noch weiteren Gründen sollten gerade neue Veranstaltungsrubriken immer zur Kontrolle und gegebenenfalls zur Nachkonfiguration zu den AEs.

Anmeldungen

Anmeldedaten sind teilweise leer

Wenn in der Auflistung der Anmeldungen nur teilweise Daten angezeigt werden, liegt das in der Regel daran, dass das Anmeldeformular angepasst worden ist oder gar ein anderes Formular verknüpft worden ist.

Mit folgender Abfrage kann dies herausgelesen werden:

SELECT
  formdataidfk,
  entityid,
  form_data.*,
  form_setrecord.sortorder
FROM
  linktable_entity_formdata
  JOIN form_data ON formdataidfk = form_data.id
  JOIN form_setrecord ON form_data.setrecordidfk = form_setrecord.id
WHERE
  entityid IN (
    SELECT
      id
    FROM
      public.event_participant
    WHERE
      eventidfk = 1011)
  AND entitytypeidfk IN (
    SELECT
      id
    FROM
      core_entity_type
    WHERE
      name = 'event_participant')

Im Beispiel angepasst werden muss die eventidfk (hier 1011).

Das Ergebnis sieht dann so aus und darin ist die Formular-Verknüpfung zu sehen:

Kanton Thurgau

GOViS

Files auf dem NFS-Share bearbeiten

Verschiedene Verzeichnisse der Comet-Installation sind auf dem Fileshare abgelegt. Daher hat man mit dem normalen extbslash Benutzer keinen Zugriff darauf. Betroffen ist vor allem das Verzeichnis /govis/www/lucee/govis_tg/theme.

Um Änderungen in diesem Verzeichnis vornehmen zu können, muss in der Konsole folgender Befehl abgesetzt werden: su -s /bin/bash nginx

Konfigurationssynchronisation

Mit dem govissync-Script lässt sich die Konfiguration vom Nginx und Lucee vom DMZGOVISP04 auf den NFS-Share und von dort auf den DMZGOVISP05/06 synchronisieren. Die Synchronisation muss immer zuerst auf dem DMZGOVISP04 gestartet werden und danach auf dem DMZGOVISP05/06. Es wird immer der Stand vom DMZGOVISP04 übernommen.

Nginx und Lucee Konfiguration synchronisieren:

# bash /home/extbslash/govissync

Nur Nginx Konfiguration synchronisieren:

# bash /home/extbslash/govissync nginx

Nur Lucee Konfiguration synchronisieren:

# bash /home/extblash/govissync lucee

 

Lucee-Server neustarten

Als Erstes öffnet man den FusionReactor auf allen drei Servern DMZGOVISP04 bis DMZGOVISP06:

Danach prüft man, ob der Cache viel Inhalt hat, da dieser zwischen den Servern synchronisiert wird. Zu sehen ist das am Heap:

Um den Lucee-Dienst neu zu starten, muss man sich via SSH auf den gewünschten Server verbinden:

In der Konsole müssen Root-Rechte für den Benutzer extbslash (Passwörter sind für alle Produktiv-Server gleich und stehen im Intranet) erlangt werden: sudo -s

Falls der Heap hoch ist, erst auf einem der noch reagierenden Servern folgendes ausführen: bash comet_restart_clients.sh clearCacheAll

Für den Neustart muss zuerst der nginx gestoppt werden: service nginx stop

Anschliessend kann der Lucee-Dienst gestoppt werden: service lucee stop

Danach muss der Dienst wieder gestartet werden: service lucee start.

Abschluss für govisp04

Auf dem Server dmzgovisp04 laufen alle Schedule-Tasks, deshalb wird hier GOViS automatisch initialisiert. Das bedeutet, wir geben top ein und schauen, wann sich der Java-Dienst wieder bei gemütlichen 10 bis 70% CPU Last einpendelt. Das dauert 1 bis 2 Minuten, nachdem der Lucee-Dienst gestartet wurde.

Nun kann der nginx wieder gestartet werden: service nginx start

Bitte noch die Restart-Anweisungen kontrollieren!

Abschluss für weitere govis-Server:

Auf den anderen Produktiv-Servern wird die Applikation nicht automatisch gestartet. Dadurch starten wir rasch den nginx-Dienst: service nginx start.
Nun schauen wir mit top die Auslastung und sobald der Java-Dienst über 180 % CPU benötigt, stoppen wir nginx wieder und schauen, wieder mit top, bis die CPU wieder normal bei 10 bis 70 % ist. Jetzt kann der nginx effektiv wieder gestartet werden.

Tipp, falls GOViS nicht startet

Prüfen, ob ll /govis/nfs_mount/govis_tg/ noch etwas ausgibt, in seltenen Fällen ist der NFS Share nicht mehr erreichbar und meist hilft dann ein Neustart mit reboot

Lucee-Server startet nicht mehr

Wenn der Lucee-Server nicht mehr startet, liegt es in aller Regel an einem Fehler in der Datei server.xml, in der die Auftritte definiert sind. Die Datei liegt unter:

/govis/lucee/conf/server.xml

Wenn der Server nicht startet, findet man den Grund meistens in der Log-Datei catalina.out. Diese befindet sich unter:

/var/log/lucee/catalina.20[jahr]-[monat]-[tag].log

 

News: Meldungen im Archiv sind nicht publiziert

Es kann vorkommen, dass Newsmeldung im Archiv nicht publiziert sind. Derzeit besteht noch keine Möglichkeit, diese über das Backend wieder zu publizieren. Dies kann nur auf Datenbank-Ebene erfolgen. Dies geschieht am besten pro Rubrik. Deshalb müssen zuerst die Rubrik-IDs herausgesucht werden. Anschliessend kann folgende Datenbank-Abfrage verwendet werden:

update news_newslang 
set published = 1, 
datepublished = dateupdated 
where id In (
	select a.id 
    from news_newslang a 
    	inner join news_news b 
        	on a.newsidfk = b.id 
    where  b.categoryidfk = [kategorieId] )

Danach muss der «allgemeine Lesecache» gelöscht werden.

Speichern oder Laden dauert ewig

Wenn Kunden-Meldungen eingehen, dass das Speichern oder Laden von Daten in der Administration ewig daure, liegt dies in der Regel an einem von der Firewall des Kantons blockierten Requests. Die Daten werden dann effektiv nie gespeichert oder geladen.
Wenn ein solcher Fall gemeldet wird, muss er reproduziert werden. In der Browser-Konsole kann schliesslich der fehlerhafte Request herausgelesen. Üblicherweise heisst es dann:

success is undefined in result

Nun kann die Antwort geöffnet werden und man findet darin eine TicketId.

Diese muss mit einer kurzen Erklärung per E-Mail an Stefan Bösch weitergeleitet werden:

afibos@tg.ch

Im CC:

  • peter.bruggmann@tg.ch
  • denise.bantli@tg.ch

In den meisten Fällen kann Stefan Bösch die Firewall-Regeln anpassen, dies kann aber schon dauern uns ist in der Regel nicht vor dem nächsten Tag behoben.

 

DSGVO

Auswirkung auf Kunden

Fallen Unternehmen, die Grenzgänger beschäftigen, in den Anwendungsbereich der DSGVO?

Es gibt hierzu unterschiedliche Auffassungen. Unserer Meinung nach fällt die Verarbeitung von personenbezogenen Daten von Grenzgängern, also Personen, die in der Schweiz angestellt sind und im Ausland Wohnsitz haben, nicht in den Anwendungsbereich der DSGVO, sofern die personenbezogenen Daten in der Schweiz verarbeitet werden. Wenn das Unternehmen allerdings das Verhalten von Grenzgängern in der EU beobachtet (zum Beispiel durch GPS, VPN in Verbindung bei Homeoffice), sind diese Tätigkeiten vom Anwendungsbereich der DSGVO erfasst.

Quelle: IT Magazine

Wann ist die Verordnung (EU) 2016/679 (Datenschutz- Grundverordnung; DSGVO) in räumlicher Hinsicht anwendbar?

Nach Artikel 3 hängt die Anwendung der DSGVO von den beiden folgenden Kriterien ab:

  1. dem Kriterium der Niederlassung:
    Das Unternehmen verarbeitet personenbezogene Daten im Rahmen der Tätigkeiten einer Niederlassung in der Europäischen Union (EU). In diesem Fall findet die DSGVO automatisch Anwendung, unabhängig davon, ob die Verarbeitung in der EU stattfindet oder nicht.
  2. dem Kriterium des Zielmarktes:
    Das Unternehmen hat keine Niederlassung in der EU, aber die Datenverarbeitung steht im Zusammenhang damit
    • betroffenen Personen in der EU Waren oder Dienstleistungen anzubieten, unabhängig davon, ob von diesen betroffenen Personen eine Zahlung zu leisten ist oder nicht;
    • das Verhalten betroffener Personen zu beobachten, soweit ihr Verhalten in der EU erfolgt. Bei Letzterem bezieht sich die DSGVO vor allem auf die Beobachtung des Verhaltens von Internetnutzerinnen und -nutzern.

Quelle: IT Magazine

Was geschieht mit Schweizer Unternehmen, die gegen die DSGVO verstossen?

Wenn eine Datenschutzbehörde einen Verstoss feststellt, kann eine Geldstrafe von bis zu maximal 20 Millionen Euro oder vier Prozent des weltweiten Jahresumsatzes drohen – je nachdem, welcher Betrag höher ist.

In einer ersten Stufe sind je nach Verstoss bis zu 10 Millionen Euro oder zwei Prozent des weltweiten Jahresumsatzes der Firma als Bussgeld vorgesehen. In einer zweiten Stufe wird das Doppelte angesetzt.

Quelle: IT Magazine, 4/2018

Was ist eine Datenschutz-Folgenabschätzung?

Sind die Verzeichnisse erstellt, muss geprüft werden, ob eine sogenannte Datenschutz-Folgenabschätzung (DSFA) durchgeführt werden muss. Dabei handelt es sich um eine risikobasierte Prüfung einer (geplanten) Datenverarbeitung, die voraussichtlich mit einem hohen Risiko für die betroffenen Personen verbunden Verantwortlichen, der Auftragsverarbeiter muss den Verantwortlichen dabei aber gegebenenfalls unterstützen. Die DSFA kann in 3 Schritte unterteilt werden:

In Schritt 1 wird geprüft, ob voraussichtlich ein hohes Risiko für die betroffenen Personen vorliegt. Dies ist beispielsweise der Fall, wenn sogenannte automatisierte Einzelfallentscheidungen gefällt werden, besonders sensible Daten in einem grossen Umfang bearbeitet werden oder öffentliche Bereiche systematisch überwacht werden. Diese Aufzählung ist nicht abschliessend, ein hohes Risiko kann sich auch aus den Umständen oder der Art der geplanten Datenverarbeitung ergeben, beispielsweise, weil neue Technologien verwendet werden, bei denen die Risiken noch nicht vollständig geklärt sind. Zudem können auch die Mitgliedsstaaten vorsehen, dass bei bestimmten Datenverarbeitungen immer (oder nie) eine DSFA durchgeführt werden muss. Diese sogenannte Schwellwertanalyse muss dokumentiert und aufbewahrt werden.

Ergibt die Schwellwertanalyse ein hohes Risiko für die betroffenen Personen, dann muss als Schritt 2 die DSFA durchgeführt werden. Diese beinhaltet insbesondere die Beschreibung der Datenverarbeitung, die Bewertung der in der Schwellwertanalyse identifizierten Risiken sowie die Festlegung der Massnahmen, mit denen diese Risiken verringert oder ausgeschlossen werden. So kann beispielsweise das Risiko, dass es bei einer Datenübermittlung in ein unsicheres Drittland zu Zugriffen unberechtigter Dritter kommt, dadurch reduziert werden, dass die Daten verschlüsselt werden. Können die Risiken mit den definierten Massnahmen auf ein akzeptables Mass gesenkt oder ausgeschlossen werden, dann sind keine weiteren Schritte erforderlich. Die DSFA sollte dokumentiert und in einer beweiskräftigen Form aufbewahrt werden.

Verbleibt auch nach Ergreifen der definierten Massnahmen immer noch ein hohes Risiko für die betroffenen Personen, dann muss als Schritt 3 die zuständige Aufsichtsbehörde kontaktiert werden. Diese hat bis zu zwölf Wochen Zeit, dazu Stellung zu nehmen. Diese Frist muss gegebenenfalls bei der Planung neuer Datenverarbeitungen mitberücksichtigt werden. Grundsätzlich wird aber jedes Unternehmen ein grosses Interesse daran haben, diese Konsultationspflicht durch das Ergreifen risikoreduzierender Massnahmen zu verhindern.

Die DSFA muss in einer dokumentierten Form erfolgen, die es dem Unternehmen ermöglicht nachzuweisen, dass es seinen Pflichten nachgekommen ist. Die Form der DSFA ist nicht vorgeschrieben, sie kann daher sowohl durch das Ausfüllen von physischen Fragebogen als auch elektronisch unter Verwendung einer entsprechenden Software erfolgen. Wichtig ist, dass die Dokumentation beweiskräftig ist, also nachträglich nicht unbemerkt verändert werden kann.

Quelle: IT Magazine, 4/2018

Was müssen die betroffenen Firmen unternehmen?

Schweizer Unternehmen, die von der neuen EU-Verordnung betroffen sind, müssen ab dem 25. Mai 2018 folgende Pflichten erfüllen: 

  1. informieren und die Einwilligung der Person einholen, deren Daten verarbeitet werden
  2. "Privacy by design" und "Privacy by default" garantieren
  3. einen Vertreter in der EU benennen
  4. ein Verzeichnis der Verarbeitungstätigkeiten erstellen
  5. Verletzungen des Datenschutzes an die Aufsichtsbehörde melden
  6. eine Datenschutz-Folgenabschätzung durchführen

Die Geldbusse, die Unternehmen im Fall einer Datenschutzverletzung zahlen müssen, kann bis zu 4% des weltweiten Jahresumsatzes im vergangenen Geschäftsjahr betragen. 

Wichtig ist auch zu wissen, dass gerade ein Schweizer Pendant zur DSGVO, ein neues Bundesgesetz über den Datenschutz, ausgearbeitet wird. Firmen, die sich schon auf die DSGVO eingestellt haben, dürften, wenn die Schweizer Version fertig ist, bei deren Umsetzung eine erhebliche Zeitersparnis haben. 

Dieser Artikel erhebt keinen Anspruch auf Vollständigkeit. Für weitere Informationen über die DSGVO nutzen Sie bitte die unten aufgeführten Links.

Quelle: KMU Portal des Bundes

Welche Behörde ist für uns als betroffenes Unternehmen (Belieferung von EU-Kunden) die federführende Aufsichtsbehörde?

Sofern das Unternehmen eine Hauptniederlassung oder eine einzige Niederlassung in der EU hat, ist nach Artikel 56 DSGVO die dortige zuständige Aufsichtsbehörde die federführende Aufsichtsbehörde für die von Ihrem Unternehmen durchgeführten grenzüberschreitende Verarbeitung personenbezogener Daten. Abweichend von diesem Grundsatz ist jede Aufsichtsbehörde dafür zuständig, sich mit einer bei ihr eingereichten Beschwerde oder einem etwaigen Verstoss gegen die DSGVO zu befassen, wenn der Gegenstand nur mit einer Niederlassung in ihrem Mitgliedstaat zusammenhängt oder betroffene Personen nur ihres Mitgliedstaats erheblich beeinträchtigt.

Für Unternehmen, die keine Niederlassung in der EU haben, auf die aber die DSGVO dennoch anwendbar ist, ist unklar, welche Aufsichtsbehörde zuständig sein wird. Es könnte argumentiert werden, dass die zuständige Aufsichtsbehörde diejenige ist, in welchem ein EU-Vertreter nach Artikel 27 DSGVO zu benennen ist. Klarheit hierzu werden künftige Entscheidungen der Aufsichtsbehörden und Gerichte bringen.

Quelle: IT Magazine, 4/2018

Welche Schweizer Unternehmen müssen einen Datenschutzbeauftragten in der EU benennen?

Sofern die DSGVO auf das Schweizer Unternehmen anwendbar ist, ist gemäss Artikel 37 Absatz 1 ein Datenschutzbeauftragter zu benennen, sofern:

  • die Kerntätigkeit des Unternehmens in der Durchführung von Verarbeitungsvorgängen besteht, welche aufgrund ihrer Art, ihres Umfangs und/oder ihrer Zwecke eine umfangreiche regelmässige und systematische Überwachung von betroffenen Personen erforderlich machen, oder
  • die Kerntätigkeit des Unternehmens in der umfangsreichen Verarbeitung besonderer Kategorien von Daten oder von personenbezogenen Daten über strafrechtliche Verurteilungen und Straftaten besteht.

Darüber hinaus gibt die DSGVO den EU-Mitgliedstaaten die Möglichkeit, strengere Regelungen in Bezug auf die Bestellung eines betrieblichen Datenschutzbeauftragten zu schaffen (so zum Beispiel in Deutschland).

Mittels der am 13. Dezember 2016 veröffentlichten Stellungnahme der Artikel- 29-Datenschutzgruppe (unabhängiges Beratungsgremium der Europäischen Kommission in Fragen des Datenschutzes) gibt es erste Klarstellungen was unter «Kerntätigkeit» im Sinne des Artikel 37 Absatz 1 b DSGVO zu verstehen ist. Demnach ist im Zusammenhang mit Erwägungsgrund 97 der DSGVO hierunter jede Tätigkeit zu verstehen, die essentiell für die Erreichung der Ziele des Unternehmens sind. Massgeblich für das Merkmal «umfangreiche Verarbeitung» sind die Anzahl der Betroffenen, die Menge der betroffenen Daten und/oder die Vielzahl der verschiedenen Datensätze und/oder die Dauer der Datenverarbeitung sowie die geographische Reichweite der Datenverarbeitung. Als Beispiel wird die Verarbeitung von personenbezogenen Daten für Werbezwecke durch Suchmaschinen für verhaltensbedingte Werbevorschläge genannt. Unter Berücksichtigung von Erwägungsgrund 24 der DSGVO können unter das Merkmal «umfangreiche regelmässige und systematische Überwachung» grundsätzlich alle Arten des Internet-Trackings und Profilings fallen.

Quelle: IT Magazine, 4/2018

Welche Unternehmen sind betroffen?

Schweizer Unternehmen müssen sich an die DSGVO halten, wenn sie personenbezogene Daten von natürlichen Personen verarbeiten, die sich in der EU befinden, und falls die Verarbeitung dazu dient:

  1. diesen Personen Waren oder Dienstleistungen anzubieten (gegen Bezahlung oder unentgeltlich), oder
  2. das Verhalten dieser Personen zu verfolgen, sofern dieses Verhalten in den Mitgliedstaaten der EU erfolgt (Art. 3 Abs. 2 Buchst. a und b DSGVO). 

Um zu bestimmen, ob die Aktivitäten eines Unternehmens, das seinen Sitz ausserhalb der EU hat, in den Anwendungsbereich der DSGVO fallen, müssen die Rechtsberater analysieren, ob eine Absicht besteht, Waren oder Dienstleistungen in die EU zu verkaufen. Hierbei können verschiedene Hinweise geprüft werden (z. B. die Erwähnung von Kunden, die sich in den Mitgliedstaaten befinden, oder von einer in der EU gängigen Währung). Im Fall von Art. 3 Abs. 2 Buchst. b DSGVO können die Experten analysieren, ob ein klarer Wille erkennbar ist, das Verhalten von natürlichen Personen im EU-Raum zu verfolgen (z. B. wenn sie die Nutzung von Profiling-Tools oder Google Analytics feststellen).

Quelle: KMU Portal des Bundes

Welche Verzeichnisse müssen geführt werden?

Zu den in der DSGVO ausdrücklich genannten Dokumentationspflichten gehört die Verpflichtung, sogenannte Verzeichnisse von Datenverarbeitungen zu erstellen. Dabei handelt es sich um eine kurze Beschreibung der wesentlichen Elemente der in einem Unternehmen vorhandenen Geschäftsprozesse, in denen Personendaten zu einem bestimmten Zweck bearbeitet werden. Zweck dieser Verzeichnisse ist der Nachweis der Einhaltung der DSGVO. Die Mindestangaben, die in dem Verzeichnis gemacht werden müssen, sind in Art. 30 DSGVO aufgelistet, wobei der sogenannte Verantwortliche und der Auftragsverarbeiter unterschiedliche Verzeichnisse erstellen müssen.

Greifen mehrere Unternehmen gemeinsam auf Daten zu und werden diese für gemeinsame Zwecke verarbeitet, dann sind sie «gemeinsam Verantwortliche» und müssen das Verzeichnis entsprechend gemeinsam ausfüllen und zusätzlich eine Vereinbarung schliessen, in der sie vereinbaren müssen, wer welche Pflichten gemäss DSGVO trägt (Art. 26 DSGVO).

Ist geklärt, welches Verzeichnis zu erstellen ist, muss definiert werden, für welche Geschäftsprozesse eines ausgefüllt werden muss. Es ist zu empfehlen, sich bei der Festlegung der zu dokumentierenden Geschäftsprozesse nach dem Bearbeitungszweck zu richten. Datenverarbeitungen, die zu einem bestimmten Zweck erfolgen, sollen in einem Verzeichnis dokumentiert werden. Am Beispiel der Verarbeitung von Mitarbeiterdaten können beispielsweise ein, zwei oder mehr Prozesse vorliegen. Es kann der gesamte Personalprozess von der Rekrutierung über die Anstellung, die Datenbearbeitung bei aktiven Arbeitsverhältnissen bis zur Beendigung des Arbeitsverhältnisses und der Archivierung und anschliessenden Löschung der Daten als ein Prozess bezeichnet und beschrieben werden. In der Praxis ist es üblich, den HR-Prozess auf zwei oder mehr Verzeichnisse zu verteilen – den Rekrutierungsprozess und den eigentlichen HR-Prozess ab Anstellung. Einige Unternehmen führen den Lohnprozess nochmals separat. Wichtig ist, dass eine Datenverarbeitung, die zwar mit denselben Daten, aber zu einem vollkommen anderen Zweck erfolgt, in einem separaten Verzeichnis dokumentiert wird.

Die gesetzlich geforderten Mindestangaben, die in Verzeichnissen von Verantwortlichen zu dokumentieren sind, können in Angaben zum verantwortlichen Unternehmen, Angaben zur Datenverarbeitung und Informationen zu den technischen und organisatorischen Massnahmen (sogenannte TOMs) unterteilt werden. Im Hinblick auf die Datenverarbeitung wird keine detaillierte Beschreibung einzelner Prozessschritte verlangt. Vielmehr sind neben der Bezeichnung der Datenverarbeitung (z.B. Rekrutierung neuer Mitarbeitender), Angaben zu den betroffenen Personen (z.B. Bewerber), zu den Kategorien von Personendaten (z.B. Name und Adresse, Telefon, E-Mail-Adresse, Arbeitszeugnisse, etc.) anzugeben. Zudem muss erfasst werden, ob und wenn ja welchen Kategorien von Empfängern Daten weitergeleitet werden (z.B. externer Dienstleister, der das Rekrutierungstool betreibt und hostet). Werden die Daten ins Ausland weitergeleitet (z.B. wenn das Rekrutierungstool in der Cloud gehostet wird und sich die Rechenzentren im Ausland befinden), müssen Informationen zum Empfängerland erfasst werden. Ist dieses ein Land, das aus der Sicht der EU über keinen angemessenen Datenschutz verfügt, muss zudem dokumentiert werden, mit welchen Massnahmen man den Schutz der Personendaten sicherstellt (z.B. durch Verwendung der sogenannten EU Model Clauses).

Sofern möglich, müssen zusätzlich die Aufbewahrungsdauer und die technischen und organisatorischen Massnahmen dokumentiert werden, die zum Schutz der Daten ergriffen werden. Die Formulierung «wenn möglich» soll nicht darüber hinwegtäuschen, dass erwartet wird, dass diese Informationen grundsätzlich dokumentiert werden müssen. Werden diese Informationen nicht erfasst, muss es gut begründet werden.

Quelle: IT Magazine, 4/2018

Wie kann ich gegen ein Unternehmen vorgehen, wenn sie mit einem Versand von Werbe- oder News-E-Mails meine E-Mail-Adresse öffentlich ersichtlich machen und sie dadurch kopiert und missbraucht werden könnte?

Jede betroffene Person hat nach Artikel 77 Absatz 1 DSGVO unbeschadet eines anderweitigen verwaltungsrechtlichen oder gerichtlichen Rechtsbehelfs das Recht auf Beschwerde bei einer Aufsichtsbehörde. Daneben hat die betroffene Person gemäss Artikel 17 DSGVO das Recht, von Unternehmen zu verlangen, dass betreffende personenbezogene Daten unverzüglich gelöscht werden, und das Unternehmen ist verpflichtet, personenbezogene Daten unverzüglich zu löschen.

Quelle: IT Magazine, 4/2018

technische Fragen

Müssen Kundendaten in einer Datenbank verschlüsselt gespeichert werden und auch der Verkehr über die Website nur via HTTPS laufen?

Nach Artikel 32 Absatz 1 DSGVO treffen Unternehmen unter Berücksichtigung des Stands der Technik, der Implementierungskosten, der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung sowie der unterschiedlichen Eintrittswahrscheinlichkeit und Schwere des Risikos für die Rechte und Freiheiten natürlicher Personen geeignete technische und organisatorische Massnahmen, um ein dem Risiko angemessenes Schutzniveau der personenbezogenen Daten zu gewährleisten. Beispiele hierzu sind etwa die die Pseudonymisierung und Verschlüsselung von personenbezogenen Daten.

Bei der Beurteilung des angemessenen Schutzniveaus sind nach Artikel 32 Absatz 2 DSGVO insbesondere die Risiken zu berücksichtigen, die mit der Verarbeitung – insbesondere durch Vernichtung, Verlust oder Veränderung, ob unbeabsichtigt, unrechtmässig oder unbefugte Offenlegung von oder unbefugten Zugang zu personenbezogenen Daten, die übermittelt, gespeichert oder auf andere Weise verarbeitet wurden – verbunden sind.

Die Verschlüsselung von Datenbanken sowie der Einsatz von HTTPS zur Übermittlung personenbezogener Daten entspricht der «good practice». Die Verschlüsselung der Daten einer Datenbank ist aus unserer Sicht bei der Verarbeitung besonderer Kategorien von personenbezogene Daten geboten.

Quelle: IT Magazine, 4/2018

Sind Webseitenbetreiber dazu verpflichtet, die Besucher über das Setzen von Cookies und die darin enthaltenen Daten zu informieren?

Die DSGVO findet auch auf die Verwendung von Cookies Anwendung, soweit sie personenbezogene Daten im Sinne der Artikel 4 Nr. 1 DSGVO enthalten, Anwendung. Der Besucher hinterlässt bei personenbezogenen Cookies auf der Webseite Identifikationsmerkmale wie zum Beispiel seine IP-Adresse. Diese Information kann durch den Cookie-Datensatz dem Benutzer zugeordnet werden (Erwägungsgrund 30 der DSGVO). Entsprechend gilt auch hier der Grundsatz der Transparenz und der Webseitenbetreiber, beziehungsweise das Unternehmen ist verpflichtet, den Besucher entsprechend darüber zu informieren.

Neben der DSGVO regelt auch die so genannte «Cookie-Richtlinie» (Richtlinie 2009/136/EG vom 25. November 2009) den Umgang mit Cookies. Diese Richtlinie soll in Zukunft durch die ePrivacy- Verordnung ersetzt werden. Wie genau der konkrete Inhalt dieser Verordnung aussehen wird und wann sie in Kraft treten wird, ist noch nicht klar.

Quelle: IT Magazine, 4/2018

backslash als Dienstleister

Welche rechtliche Rolle übernimmt backslash in Bezug auf seine Kunden?

Ein Online-Shop mit Kunden in der EU gilt gemäss DSGVO als Verantwortlicher. Speichert er seine Daten in einem externen Rechenzentrum, ist der Betreiber des Rechenzentrums der Auftragsverarbeiter. Zurzeit ist es zumindest umstritten, inwieweit ein Schweizer Auftragsverarbeiter direkt unter die DSGVO fällt, da er gemäss der Definition der DSGVO die Daten für den Verantwortlichen verarbeitet und daher seine Leistungen nicht direkt den betroffenen (natürlichen) Personen anbietet.

Quelle: IT Magazine, 4/2018

Daraus ergibt sich, dass backslash…

  • einen Auftragsverarbeitungsvertrag mit ihren Kunden haben sollte
  • keine Auskunftspflicht gegenüber natürlich Personen wahrnehmen muss

eCommerce

Artikel 13 DSGVO schreibt eine Informationspflicht vor. Muss ich jetzt jedem Kunden, der in meinem Online-Shop etwas bestellt, mitteilen, wer für die Datenverarbeitung verantwortlich ist usw? ?

Ein elementarer Grundsatz der DSGVO ist die Transparenz. Betroffene Personen sollen in die Lage versetzt werden, die Datenerhebung, -verarbeitung bzw. -nutzung zu prüfen. Die DSGVO regelt die Informationspflichten in den Artikeln 13 und 14 in zwei sehr umfangreichen Artikeln. Werden personenbezogene Daten bei betroffenen Personen erhoben, muss das Unternehmen gemäss Artikel 13 f. unter anderem immer auch seine Identität, die Verarbeitungszwecke und die Rechtsgrundlage mitteilen.

Nach Artikel 12 DSGVO sind die Informationen in präziser, transparenter, verständlicher und leicht zugänglicher Form zu erteilen. Dabei können sie schriftlich oder in elektronischer Form an die betroffene Person übermittelt werden. In elektronischer Form können sie beispielsweise auf einer Webseite bereitgestellt werden (Erwägungsgrund 30 der DSGVO). Empfehlenswert wäre unseres Erachtens, vor dem Abschicken der Bestellung in einem Online-Shop einen Link anzufügen, der direkt auf eine Datenschutzerklärung auf der Webseite des Unternehmens verweist.

Quelle: IT Magazine, 4/2018

Datenschutz-Empfehlungen des Bundes

Der Umgang einer E-Commerce-Site mit den von ihr gesammelten Kundendaten muss transparent und sicher sein.

Um das Vertrauen der Kunden zu gewinnen und die gesetzlichen Vorgaben zu erfüllen, muss ein Unternehmen, das eine E-Commerce-Site betreibt, eine strenge Politik zum Schutz der Privatsphäre betreiben.

Bundesgesetz über den Datenschutz

Von dem Moment an, wo sensible Kundendaten (Name, Adresse, Zahlungsinformationen) gesammelt werden, unterliegt eine E-Commerce-Site dem Bundesgesetz über den Datenschutz.

Das Gesetz sieht insbesondere Folgendes vor:

  • Personendaten dürfen nur zu dem Zweck bearbeitet werden, der bei der Beschaffung angegeben wurde.
  • Diese Informationen dürfen nicht ins Ausland übermittelt werden, es sei denn im Falle einer der im Gesetz geregelten Ausnahmen.
  • Personendaten müssen durch angemessene technische und organisatorische Massnahmen gegen unbefugtes Bearbeiten geschützt werden.

Bundesgesetz über den Datenschutz

Empfehlungen für den Datenschutz

Hinsichtlich des Datenschutzes wird dringend empfohlen, sich an folgende Vorgehensweisen zu halten:

  • Veröffentlichung einer Datenschutzerklärung auf der E-Commerce-Site (s. u.).
  • Einsatz von Techniken zur Nutzer-Authentifizierung (z. B. SuisseID) und zur Verschlüsselung der Daten (sichere https-Verbindung).
  • Beschränkung der Datensammlung auf die notwendigen Informationen. Fragen, die in diesem Zusammenhang nicht relevant sind, erzeugen Misstrauen.
  • Klare Angaben darüber, welche Personendaten zu welchem Zweck verwendet werden.
  • Berechtigung des Nutzers, die Verwendung und Weitergabe seiner Daten einzuschränken (Verbraucherprofil, Werbung).

Der Eidgenössische Datenschutz- und Öffentlichkeitsbeauftragte (EDÖB) hat die Aufgabe, das Datenschutzgesetz zu erläutern und auf diesem Gebiet Empfehlungen zu erlassen.

Eidg. Datenschutz- und Öffentlichkeitsbeauftragter: Beratung für E-Commerce-Anbieter

Datenschutzerklärung auf einer E-Commerce-Site

Auf einer E-Commerce-Site dient eine Datenschutzerklärung dazu, über die Methoden zu informieren, mit denen die Privatsphäre der Nutzer geschützt wird. Um das Vertrauen der Kunden zu gewinnen, ist es ratsam, ein solches Dokument zu erstellen und es an einer gut sichtbaren Stelle auf der Website zu veröffentlichen.

Die Datenschutzerklärung muss mindestens folgende Punkte enthalten:

  • Welchen gesetzlichen Bestimmungen unterliegt das Vorgehen des Anbieters im Bereich des Datenschutzes?
  • Welche Personendaten werden erhoben und zu welchem Zweck?
  • Welche Personendaten werden an Dritte weitergeleitet und zu welchem Zweck?
  • Welche Entscheidungen kann der Nutzer bezüglich der Bearbeitung seiner Daten treffen?
  • Über welche Rechte (insbesondere Auskunftsrecht und Widerspruchsrecht) verfügen die Nutzer?
  • Wer ist für die Beantwortung von Fragen zur Bearbeitung der Personendaten zuständig?
  • Welche Sicherheitsmassnahmen werden ergriffen, um die Personendaten zu schützen?

Quelle: KMU Portal des Bundes

Die Allgemeinen Geschäftsbedingungen

Allgemeine Geschäftsbedingungen

In den allgemeinen Geschäftsbedingungen fasst der Online-Verkäufer alle rechtlichen Aspekte des Geschäfts zusammen. Sobald der Kunde diesem Dokument zugestimmt hat, ist es integraler Bestandteil des Kaufvertrags.

In der Schweiz können die gesetzlichen Grundlagen für den Verkauf von Gütern oder Dienstleistungen über den Vertrag und die Vertragsbedingungen verändert werden. In der Regel fasst ein Händler alle seine Verkaufsbedingungen in einem als "AGB" bezeichneten Dokument zusammen. Dabei handelt es sich um eine Form der rechtlichen Absicherung. Genauere Informationen zu den gesetzlichen Verpflichtungen des Betreibers finden sich in dem entsprechenden Kapitel:

Die Gesetze der Schweiz und der EU

Damit die AGB Gültigkeit erlangen, müssen sie von beiden Parteien akzeptiert werden. Sie müssen dem Kunden vor dem Bestellvorgang zur Verfügung gestellt werden. Der Webshop kann zum Beispiel ein Kontrollkästchen für den Text "Ich habe die AGB gelesen und akzeptiert" enthalten, in dem während des Bestellvorgangs ein Häkchen zu setzen ist. In der Regel gilt: Je expliziter die Willenserklärung des Kunden ist, desto grösser ist die Wahrscheinlichkeit, dass ein Gericht im Streitfall die Übernahme der AGB bejaht. Da die AGB regelmässig aktualisiert werden können, sollte von jedem Vertrag eine vollständige Kopie aufbewahrt werden.

Inhalt der AGB

Um eine Auslegung der AGB zulasten des Betreibers zu vermeiden, wird dringend dazu geraten, dieses Dokument mit Unterstützung eines darauf spezialisierten Anwalts zu erstellen.

Beim Verfassen der AGB sollten alle Schritte des Verkaufsprozesses bedacht werden. Hier einige Punkte, die es zu berücksichtigen gilt:

  • Gewährleistung. Garantiebestimmungen für die bei der Transaktion verkauften Waren oder Dienstleistungen.
  • Datenschutz. Verwendung der gesammelten Daten, Verschlüsselungstechnik usw.
  • Bestellungen. Rechnungs- und Zahlungsbedingungen, Mehrwertsteuer usw.
  • Lieferung. Versandgebiete, Lieferfristen usw.
  • Haftung. Beispielsweise im Falle einer Beschädigung der Ware während des Versands.
  • Retouren. Umtausch- und Rücknahmeregelungen.
  • Anwendbares Recht und Gerichtsstand. Im Streitfall zuständiges Gericht und anwendbares Recht (Verweis auf schweizerisches Recht).

Missbräuchliche oder unangemessene Erklärungen in den AGB, z. B. "Das Versandrisiko trägt der Käufer", sind gesetzeswidrig. Klauseln, die für den Konsumenten ein erhöhtes Risiko bedeuten, müssen klar hervorgehoben werden.

Quelle: KMU Portal des Bundes

Die eCommerce-Gesetze der Schweiz und der EU

In der Schweiz sind für den Online-Handel (E-Commerce) insbesondere das Bundesgesetz gegen den unlauteren Wettbewerb (UWG; SR 241) sowie die Verordnung über die Bekanntgabe von Preisen (PBV; SR 942.211) zu beachten. In der Europäischen Union enthalten die Richtlinie über die Rechte der Verbraucher (Richtlinie 2011/83/EU) sowie die Richtlinie über den elektronischen Geschäftsverkehr (Richtlinie 2000/31/EG) Regeln zum Online-Handel.

Im Übrigen sind die Bestimmungen des Schweizerischen Obligationenrechts (OR; SR 220) anwendbar, welche auch bei den traditionellen Kaufverträgen zum Zug kommen.

Mit einem Klick zum Kaufvertrag

Ein Kaufvertrag gemäss Art. 184 ff. OR kann digital „per Klick“ abgeschlossen werden. So kann der Kunde eines Schweizer Webshops mit einem Klick auf den Button "Kaufen" einen Kaufvertrag eingehen. Voraussetzung ist, dass sich die beiden Vertragsparteien über die wesentlichen Punkte einig sind. Dies sind insbesondere der Kaufgegenstand, der Kaufpreis sowie der Abschluss des Kaufvertrags.

Im Übrigen können alle nicht zwingenden Bestimmungen zum Kaufvertrag innerhalb der Schranken der Rechtsordnung individuell angepasst werden. Diese Änderungen können vom Verkäufer als allgemeine Geschäftsbedingungen (AGB) formuliert werden. Die AGB werden Vertragsbestandteil, wenn der Käufer vor Abschluss des Vertrags auf die AGB hingewiesen wurde und die Möglichkeit hatte, diese zu lesen und ihnen zuzustimmen.

Hinsichtlich der Regelungen des Obligationenrechts sind folgende Punkte hervorzuheben:

  • Widerrufsrecht. Das Schweizer Recht sieht für den Online-Handel keine Rücknahmefrist oder ein anderes Rückgaberecht vor, nachdem die Bestellung abgeschickt wurde. Der Verkäufer kann sich für eine solche Klausel entscheiden, unterliegt auf diesem Gebiet aber keiner gesetzlichen Verpflichtung. Allerdings sieht der Ehrenkodex des Verbands des Schweizerischen Versandhandels ein Rückgaberecht von zehn Tagen vor, das aber nur die Verbandsmitglieder verpflichtet (www.vsv-versandhandel.ch).
  • Lieferfristen. Das Schweizer Recht sieht keine Maximalfrist für Lieferungen vor. Um den Kunden eine Sicherheit zu geben, kann der Verkäufer im Vertrag eine Frist festlegen. Allerdings wäre es unlauter und damit ein Verstoss gegen das UWG, zu kurze und unmöglich einzuhaltenden Lieferfristen anzugeben, nur um Kunden anzulocken.
  • Klare Angaben. Die Betreiber eines Webshops sind verpflichtet, auf ihrer Website alle Informationen gemäss Art. 3 Abs. 1 lit. s UWG anzugeben (vergleiche nächster Absatz).
  • Gewährleistung. Hat ein Produkt einen Fehler oder fehlt diesem eine zugesicherte Eigenschaft, kann der Käufer während zwei Jahren Gewährleistungsansprüche stellen. Das Gesetz sieht die Rückgängigmachung des Vertrags (Art. 208 OR) oder die Rückerstattung des Minderwertes des Kaufgegenstandes (Art. 205 OR) vor. Vertraglich kann zusätzlich oder stattdessen ein Garantieanspruch (Nachbesserung) vereinbart werden.

E-Commerce: Allgemeine Geschäftsbedingungen

Gesetz gegen den unlauteren Wettbewerb (UWG)

Art. 3 Abs. 1 lit. s UWG legt fest, welche Informationen bei einem Webshop zwingend angegeben werden müssen:

"Unlauter handelt insbesondere, wer Waren, Werke oder Leistungen im elektronischen Geschäftsverkehr anbietet und es dabei unterlässt:

  1. klare und vollständige Angaben über seine Identität und seine Kontaktadresse einschliesslich derjenigen der elektronischen Post zu machen,
  2. auf die einzelnen technischen Schritte, die zu einem Vertragsabschluss führen, hinzuweisen,
  3. angemessene technische Mittel zur Verfügung zu stellen, mit denen Eingabefehler vor Abgabe der Bestellung erkannt und korrigiert werden können,
  4. die Bestellung des Kunden unverzüglich auf elektronischem Wege zu bestätigen."

(1)  Im Impressum muss der Betreiber eines Webshops seinen Firmennamen gemäss Handelsregister, seine Postadresse sowie seine E-Mail Adresse angeben. Die Angabe einer Telefonnummer wird empfohlen. Ein blosses Kontaktformular reicht nicht aus.

(2)  Während des ganzen Bestellprozesses muss dem Kunden klar sein, in welchem Bestellstadium er sich befindet. Er muss wissen, wann er den Vertrag definitiv abschliesst. Es wird empfohlen, für den Vertragsschluss einen Button mit einer klaren Formulierung zu wählen wie z.B. „Kaufen“, „zahlungspflichtig Bestellen“. Nicht geeignet sind dagegen Formulierungen wie „Bestellen“, „Weiter“, „Abonnieren“.

(3)  Vor Abschluss des Vertrages müssen die Vertragsdetails vom Kunden überprüft werden können. Der Kunde muss sehen können, welchen Vertrag er abschliesst, insbesondere die Anzahl und die Art des Produkts, den Gesamtpreis der Bestellung und seine Rechnungs- / Lieferadresse.

(4)  Dem Kunden sind der Vertragsschluss und die wichtigsten Vertragsdetails elektronisch zu bestätigen.

Art. 8 UWG verbietet die Verwendung missbräuchlicher Geschäftsbedingungen:

"Unlauter handelt insbesondere, wer allgemeine Geschäftsbedingungen verwendet, die in Treu und Glauben verletzender Weise zum Nachteil der Konsumentinnen und Konsumenten ein erhebliches und ungerechtfertigtes Missverhältnis zwischen den vertraglichen Rechten und den vertraglichen Pflichten vorsehen."

Der Verkäufer darf die AGB nicht so gestalten, dass diese allein seinen eigenen Interessen nützen und die Konsumentinnen und Konsumenten einem erheblichen und ungerechtfertigten Missverhältnis aussetzen.

Verordnung über die Bekanntgabe von Preisen (PBV)

Die Verordnung über die Bekanntgabe von Preisen (PBV) ist bei Kauf- und kaufähnlichen-Angeboten an Konsumenten anwendbar, nicht aber bei Angeboten von Business to Business. Die Verordnung regelt, wie die Preise bekanntzugeben sind und was alles im Preis enthalten sein muss. Es wird hier nur auf spezielle Punkte im Zusammenhang mit dem Online-Handel eingegangen. Alle weiteren Informationen finden sich in der Broschüre Wegleitung für die Praxis 2012“. Für diverse Branchen gibt es zudem spezielle Informationsbroschüren.

WAREN

Für Waren ist der tatsächlich zu bezahlende Preis in Schweizerfrankeninklusive aller nicht frei wählbarer Zuschläge jeglicher Art bekanntzugeben (Art. 3 und 4 PBV). Der Preis und alle für den Preis relevanten Informationen müssen im Online-Handel leicht sichtbar und gut lesbar unmittelbar nebender abgebildeten / beschriebenen Ware angegeben werden (Art. 7 und 8 PBV).Der Preis muss in gut lesbarer Schriftgrösse und in einer leicht sichtbaren Darstellung gleich neben dem Produkt platziert sein. Er darf nichterst nach dem Scrollen der Webseite oder dem Anklicken eines Links erscheinen.

Nicht frei wählbare Zuschläge sind in den Preis einzuschliessen, weil sie mit dem Kauf der Ware zwingend einhergehen und nicht weggelassen werden können. Dies sind beispielweise die Mehrwertsteuer, Urheberrechtsvergütungen, die Recyclinggebühren für Elektrogeräte usw.

Die Versandkosten dürfen separat angegeben werden, da sie je nach Bestellumfang variieren können. Sie sind jedoch ebenfalls leicht sichtbar und gut lesbar bekanntzugeben. Dies ist beispielsweise mit einem Hinweis beim Preis möglich, welcher mit der Informationsseite für die Versandkosten verlinkt ist (z.B. zzgl. Versandkosten).

Freiwillige Zusatzkosten sind auf klare und transparente Art und Weise anzugeben. Sollen sie Teil des Vertrags werden, muss der Kunde dazu ausdrücklich sein Einverständnis geben.

Zuschläge für die Bezahlung mit Kreditkarte sind nur freiwillige Zusatzkosten, wenn ein anderes kostenloses und in der Schweiz handelsübliches Zahlungsmittel zur Verfügung steht. Ansonsten müssen auch diese Kosten im Preis inbegriffen sein.

DIENSTLEISTUNGEN

Die PBV ist auf die in Art. 10 Abs. 1 PBV genannten Dienstleistungen anwendbar. Für diese ausgewählten Dienstleistungen ist der tatsächlich zu bezahlende Preis in Schweizerfranken inklusive aller nicht frei wählbarer Zuschläge jeglicher Art bekanntzugeben (Art. 10 Abs. 1 und 2 PBV). Kurtaxen dürfen separat bekanntgegeben werden. Die Preise müssen leichtzugänglich und gut lesbar sein (Art. 11 PBV). Es muss klar sein, auf welche Art(Umschreibung) und Einheit (Anzahl Personen, Std., km, Stück usw.) der Dienstleistung oder auf welche Verrechnungssätze (Stundenansatz, Kilometeransatz, Prozentsatz usw.) sich der Preis bezieht.

Für diverse Dienstleistungen gibt es ausserdem Spezialbestimmungen in den Art. 11a bis Art. 12 PBV. Beachten Sie hierzu die branchenspezifischen Informationsbroschüren.

WERBUNG

Werden in der Werbung Preise aufgeführt oder bezifferte Hinweise auf Preisrahmen oder Preisgrenzen gemacht, muss für sämtliche Waren und sämtliche Dienstleistungen der tatsächlich zu bezahlende Preis inklusive aller nicht frei wählbaren Zuschläge bekanntgegeben werden.

Das Werbeangebot muss spezifiziert werden. Das heisst, es muss klar sein, worauf sich der Preis bezieht (Anzahl, Gewicht, Stundenansatz, Kilometeransatz usw.). Die Waren und Dienstleistungen sind nach den wesentlichen Kriterien (Marke, Typ, Sorte usw.) zu umschreiben. Sodann muss der Preis mit dem Produktbild oder dem beschriebenen Produkt übereinstimmen. Bei Werbung in elektronischer Form (z.B. Internet-Frontseiten, Werbebanner, E-Mails, Smartphones) kann für diese Spezifizierung auf eine Internetseite verwiesen werden, wenn das spezifizierte Angebot mit einem einzigen Klick sofort ersichtlich ist.

PREISVERGLEICHE

Preisvergleiche und Preisreduktionen sind nur unter bestimmten Voraussetzungen und nur während einer begrenzten Zeit zulässig. Beachten Sie dazu die Broschüre „Wegleitung für die Praxis 2012“.

Gesetz über den Datenschutz

Von dem Moment an, wo sensible Kundendaten gesammelt werden, unterliegt eine E-Commerce-Site dem Bundesgesetz über den Datenschutz:

E-Commerce: Schutz der personenbezogenen Daten

Gerichtsstand

Bei einer Streitigkeit aus einem Konsumentenvertrag, kann der Konsument wählen, ob er an seinem eigenen Wohnsitz oder am Sitz des Verkäufers klagen will. Auf dieses Recht kann der Konsument nicht im Voraus verzichten.

Online-Handel in der EU

Die Gesetzgebung der EU geht teilweise weiter als die Vorschriften in der Schweiz. Werden mit dem Webshop auch Konsumentinnen und Konsumenten in EU-Ländern angesprochen, müssen zusätzlich zu den bereits genannten Vorschriften insbesondere diese Themen beachtet werden:

  • Widerrufsrecht. Grundsätzlich kann der Kunde ein Produkt innert einer Frist von 14 Tagen nach Erhalt wieder zurückgeben.
  • Zahlungs-, Liefer- und Leistungsbedingungen sowie Liefertermin. Evtl. Laufzeit des Vertrags und Kündigungsbedingungen. Die entsprechenden Informationen müssen angegeben werden. Wurde keine andere Vereinbarung getroffen, beträgt die Lieferfrist maximal 30 Tage.
  • Klare Angaben. Neben den Kontaktdaten des Verkäufers müssen die wichtigsten Eigenschaften des Produktes oder der Dienstleistung bekanntgegeben werden. Ebenso ist der Gesamtpreis einschliesslich aller Steuern und Abgaben zu nennen. Auf Kosten, welche nicht im Voraus berechnet werden können, ist hinzuweisen und die Art der Preisberechnung zu erklären.
  • Gewährleistung. Die gesetzliche Gewährleistung beträgt mindestens zwei Jahren. Während dieser Zeit kann der Konsument die Reparatur oder den Ersatz des mangelhaften Produkts fordern. Sollte dies fehlschlagen, ist grundsätzlich der Rücktritt vom Vertrag oder die Rückerstattung des Minderwertes möglich.
  •  AGB. Der Konsument muss die AGB bei Vertragsschluss abrufen und speichern können.
  • Bestell-Button. Die Schaltfläche für die abschliessende Bestellbestätigung muss mit den Worten „zahlungspflichtig bestellen“ oder einer anderen eindeutigen Formulierung beschriftet sein.

"Das neue "Button-Gesetz" in Deutschland betrifft auch Schweizer E-Commerce-Unternehmen", soweit sie  auf den deutschen Markt ausgerichtet sind.

Quelle: KMU Portal des Bundes

Newsletter

Dürfen Unternehmen Werbe- oder News-E-Mail mit öffentlich ersichtlichen Adressen versenden (d.h. alle Empfängeradressen sind ersichtlich)?

Auch E-Mail-Adressen sind personenbezogene Daten im Sinne von Artikel 4 DSGVO. Personenbezogene Daten dürfen an Dritte nur dann offengelegt werden, wenn ein Rechtfertigungsgrund gemäss Artikel 6 DSGVO vorliegt (Einwilligung, gesetzliche Grundlage, Vertrag, berechtigtes Interesses etc.). Ein solcher Rechtfertigungsgrund dürfte in der Regel hier nicht vorliegen, weshalb dieses Vorgehen unzulässig ist.

Quelle: IT Magazine, 4/2018

Hosting

DNS

Welche IP muss der Kunde für SPF-Einträge hinterlegen?

Wenn der Kunde über eine backslash-Applikation E-Mails versendet, muss der communication.backslash.ch für SPF eingetragen werden: 193.135.56.6

cms3

Formulare lassen sich nicht versenden
  1. Wenn die Seite gecacht wird, lässt sie sich aufgrund der Spamschutzmassnahmen nur beim ersten Versuch absenden.
  2. Bei Seiten, die via https aufgerufen werden, kann ein Problem mit Sonderzeichen und Umlauten auftreten. Wenn nach dem Absenden die allgemeine Fehlermeldungs-Seite kommt, wird in der Regel ein Bugreport-Eintrag erstellt mit dem Titel «Resetting to invalid mark». In diesem Fall kann im Formular ein zusätzlichen hidden-Field ergänzt werden:
    <input type="hidden" name="ignoreCharset" value="1">
Shop-Bestellungen werden nicht verarbeitet

Es kann vorkommen, dass Shop-Bestellungen nicht in die Administration eingelesen werden können. Bestätigungs-E-Mails werden zwar noch versendet, in der Administration erscheinen die Bestellungen jedoch nicht. Damit diese manuell eingelesen werden können, geht man wie folgt vor:

  1. Im Kundenauftritt liegen die Bestelldaten als XML-Dateien im folgenden Verzeichnis vor: /xml_[1-9]/internet/de/file/xmlsafe/shop/order/
  2. Die XML-Dateien werden als Backup in ein anderes Verzeichnis kopiert. Dies ist wichtig, da beim Einlesen alte Dateien gelöscht werden. Das bedeutet, dass nach dem Einlesen der ersten Bestellung alle anderen Bestellungen, die älter als einen Tag sind, gelöscht werden.
  3. Nun beginnt man mit dem manuellen Einlesen. Und zwar wird der Prozess mit dem Aufruf nach diesem Schema gemacht: https://kunde.ch//MainScheduler2.cfm?DomainId=[1-9]&strService=Shop&strLanguage=DE&strVersion=3_1&clientID=[Name des XLM-Files]
    Parameter:
    • DomainID: effektive ID der Domain
    • Language: Sprachkürzel
    • clientID: die ID entspricht dem Dateinamen (ohne .xml)
  4. Wurde der Import korrekt abgeschlossen, wird das Bestell-XML gelöscht (und alle älteren Dateien ebenfalls). Die Bestellung ist nun in der Administration ersichtlich.
  5. Der Vorgang muss mit jeder einzelnen Datei wiederholt werden.

HR

Krankheit

Ab wann muss ein Arztzeugnis eingereicht werden?

Der Arbeitgeber kann dies frei entscheiden, es geht auch erst nach 2 Wochen. Im Arbeitsvertrag respektive dem Reglement sollte dies festgehalten sein.

In der Richtlinie «Feiertage, Abwesenheiten und Urlaub» der backslash AG ist dies wie folgt geregelt:

Sind Mitarbeitende mehr als drei Arbeitstage krank, müssen sie unaufgefordert ein Arztzeugnis vorlegen, das Dauer und Grad der Arbeitsunfähigkeit bescheinigt. Von fremdsprachigen Arztzeugnissen muss eine beglaubigte Übersetzung vorliegen. Die Arbeitgeberin kann im Einzelfall eine Untersuchung durch einen Vertrauensarzt oder eine Vertrauensärztin verlangen.

Darf ich an meinen Arbeitsplatz zurückkehren, obwohl ich noch krankgeschrieben bin?

Grundsätzlich dürfen Sie Ihre Arbeit aus freien Stücken wieder aufnehmen, wenn Sie sich gesund fühlen, auch wenn Sie noch krankgeschrieben sind. Um sicherzugehen, dass Sie damit Ihre Gesundheit nicht gefährden, ist ein erneuter Besuch bei Ihrem Arzt anzuraten, der Ihre Arbeitsfähigkeit bestätigen und Ihre Krankschreibung entsprechend verkürzen kann. Fordert Sie hingegen Ihr Arbeitgeber auf, früher Ihre Tätigkeit wieder aufzunehmen, obwohl Ihre Genesungszeit noch andauert, ist dies rechtswidrig.

Ich bin während den Ferien krank. Kann ich die Ferien nachbeziehen?

In der Richtlinie «Feiertage, Abwesenheiten und Urlaub» der backslash AG ist dies wie folgt geregelt:

Ärztlich bescheinigte Krankheiten oder Unfälle während den Ferien berechtigen zum Nachbezug der entsprechenden Ferientage. Von fremdsprachigen Arztzeugnissen muss eine beglaubigte Übersetzung vorliegen. Der Zeitpunkt des Nachbezugs bedarf der Zustimmung des Vorgesetzten.

Ist es rechtlich zugelassen, dass der Arbeitgeber vom 1. Tag an ein Arbeitsunfähigkeitszeugnis verlangen darf?

Ab wann ein Zeugnis notwendig ist, regelt der Arbeitsvertrag, unter Umständen der Gesamtarbeitsvertrag der Branche. Im Anstellungsvertrag kann also festgehalten werden, dass ab dem 1. Tag ein Zeugnis beigebracht werden muss. Ebenso kann der Arbeitgeber in speziellen Fällen verlangen, dass ab dem 1. Tag ein Zeugnis einzuholen ist.

Krankschreibung und Kündigung: Besonderer Kündigungsschutz bei Krankheit und Unfall

Gemäss Artikel 336c OR sind Arbeitnehmer nach Ablauf der Probezeit in besonderem Masse vor einer Kündigung während Krankheit oder Unfall geschützt. So beläuft sich die Sperrfrist, in der eine Kündigung ausgeschlossen ist, im ersten Dienstjahr bereits auf 30 Tage. Vom zweiten bis zum fünften Jahr geniessen sie diesen Schutz 90 Tage lang, anschliessend erhöht sich die Anzahl auf 180 Tage. Ausgenommen von diesem Schutz ist eine arbeitsplatzbezogene Arbeitsunfähigkeit mit physischem Zusammenhang. Trotzdem kann ein Arbeitgeber nur in seltenen Ausnahmefällen kündigen, etwa bei vorsätzlichem Vortäuschen von Arbeitsunfähigkeit.

Krankschreibung: Welche inhaltlichen Angaben muss ein Arztzeugnis enthalten?

Bestimmte rechtliche Voraussetzungen an Form und Inhalt eines Arztzeugnisses werden grundsätzlich nicht gestellt, allerdings muss es klar und unmissverständlich formuliert sein. Für den Arbeitgeber muss ersichtlich sein, ob Sie voll oder teilweise krankgeschrieben sind. Sind Sie von Ihrer Ärztin als teilweise arbeitsunfähig erklärt worden, muss im Arztzeugnis angeben sein, wie viele Stunden Sie aufgrund ihrer medizinischen Empfehlung arbeiten dürfen oder welche Tätigkeiten Sie nicht ausführen sollen. Ist ein Arztzeugnis unklar, darf der Arbeitgeber eine neues anfordern oder Sie ersuchen, einen Vertrauensarzt seiner Wahl aufzusuchen.

Kündigungsgrund: Vortäuschen der Arbeitsunfähigkeit

Wenn Sie krankgeschrieben sind, sollten Sie bei Ihren Freizeitaktivitäten dennoch vorsichtig sein. Die Durchsetzung einer fristlosen Kündigung aufgrund genesungswidrigen Verhaltens ist für den Arbeitgeber zwar schwierig, bei vorgetäuschter Arbeitsunfähigkeit sieht die Sachlage allerdings anders aus. Sollten Sie diesbezüglich beschuldigt werden, ist es in der Regel empfehlenswert, sich von einem Anwalt beraten zu lassen.

Verreisen trotz Krankheit?

Die Frage, ob Sie eine geplante Urlaubsreise antreten dürfen, obgleich Sie krankgeschrieben sind, kommt auf den Einzelfall und die Art der Erkrankung an. Grundsätzlich gilt, dass Ihre Ärztin dies befürworten muss. In einigen Fällen kann eine Reise sogar als genesungsfördernd anerkannt werden, zum Beispiel bei einem Burnout. Haben Sie lediglich eine leichte Erkrankung und treten Ihre Reise an, ist es möglich, dass Ihnen die entsprechenden Tage jedoch nicht gutgeschrieben werden, da sich in diesem Fall Krankheit und Erholung nicht mehr grundsätzlich ausschliessen.

Was bedeutet es, krankgeschrieben zu sein?

Hat Sie ein Arzt krankgeschrieben, bedeutet dies, dass Sie aus medizinischer Sicht als vorübergehend arbeitsunfähig eingestuft wurden. Ihre gesundheitliche Genesung steht an erster Stelle. Die Dauer einer Krankschreibung hängt zum einen von der Art Ihrer Krankheit, zum anderen von der Art Ihrer Arbeit ab. Bei einem gebrochenen Bein müssen Sie bis zu Ihrem Einsatz in der Gastronomie sicherlich länger warten, als wenn Sie einem sitzenden Bürojob nachgehen. Dazu wird eine Ärztin auch stets das Infektionsrisiko berücksichtigen. Krankschreiben kann Sie sowohl ein Haus- als auch ein Facharzt.

Was darf ich laut Schweizer Arbeitsrecht tun, wenn ich krankgeschrieben bin?

Wenn Sie krankgeschrieben sind, heisst das nicht zwangsläufig, dass Sie nur im Bett bleiben müssen. Wenn Sie nicht unter Quarantäne stehen oder Ihnen strenge Bettruhe verordnet wurde, dürfen Sie das Haus verlassen. Das angemessene Verhalten kommt stets auf den Einzelfall an. Der Einkauf im Supermarkt oder ein Spaziergang ist mit einer Erkältung beispielsweise erlaubt. Der Besuch eines Restaurants mit gebrochenem Bein ist nicht empfehlenswert, führt aber nicht sofort zu einer Kündigung. Auch leichte sportliche Tätigkeiten dürfen Sie ausüben, wenn diese «genesungsförderlich» sind, insbesondere wenn Ihnen Ihr Arzt diese etwa im Rahmen einer Reha-Massnahme empfiehlt.

Was heisst 50 % Arbeitsunfähigkeit bei einem Beschäftigungsgrad von 80%?

Die Arbeitsunfähigkeit bezieht sich auf das aktuelle Pensum in der aktuellen Tätigkeit. 50% arbeitsunfähig auf dem Zeugnis heisst bei einem 80% Pensum 40% Arbeitsfähigkeit. Je nach betrieblichen Umständen sollte der Arbeitseinsatz mit dem Arbeitgeber abgesprochen werden.

Was ist nicht erlaubt, wenn ich krankgeschrieben bin?

Sie dürfen nichts machen, das als «genesungswidriges Verhalten» gilt. Bei dieser Vorgabe kommt es auch auf die Umstände an. Das Treffen mit einem Freund im Café ist nicht zwangsläufig als genesungswidriges Verhalten einzustufen, der Besuch eines Clubs inklusive exzessivem Alkoholkonsum jedoch schon. Gehen Sie mit einer Grippe kurz spazieren, dürfte dies in Ordnung sein. Wollen Sie jedoch an einem Marathon teilnehmen, sollten Sie warten, bis Sie wieder vollständig genesen sind. Bevor Ihr Arbeitgeber Sie aufgrund genesungswidrigen Verhaltens kündigen kann, muss er Sie zuerst abmahnen. Eine Kündigung ohne Abmahnung ist nur dann zulässig, wenn Sie sich in extremer Weise genesungswidrig verhalten, zum Beispiel, wenn Sie einer Extremsportart mit einer physischen Verletzung nachgehen.

Was passiert, wenn ich bei der Arbeit fehle, ohne mich krankschreiben zu lassen?

In diesem Fall können Ihnen Konsequenzen aufgrund eines Verstosses gegen die betriebliche Ordnungsvorschrift drohen. In der Regel erfolgt dann zuerst eine Abmahnung und eine Aufforderung zur Vorlage eines Arztzeugnisses. Einen Einfluss auf die Lohnfortzahlung hat dies jedoch erst dann, wenn Sie nicht auf anderem Weg beweisen können, dass Sie tatsächlich krank sind. Auch die Verweigerung, sich einer ärztlichen Untersuchung zu unterziehen und ein Arztzeugnis einzuholen, kann die Einstellung einer Lohnfortzahlung bei Krankheit bedeuten. Die Vorlage eines Arbeitszeugnisses steht jedoch nicht im direkten Zusammenhang mit einer Lohnfortzahlung. Diese kann von Ihrem Arbeitgeber jedoch aufgrund eines Verstosses gegen die Betriebsvorschrift abgelehnt werden.

Zuletzt geändert: Mi, 20.12.2023, ms

open positions