<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.bergau.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Prakti</id>
	<title>OBS Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.bergau.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Prakti"/>
	<link rel="alternate" type="text/html" href="https://wiki.bergau.de/Spezial:Beitr%C3%A4ge/Prakti"/>
	<updated>2026-09-11T21:08:27Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62866</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62866"/>
		<updated>2024-03-01T13:22:09Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration (Stammdaten - Schnittstellen - Internetshop - F10 - Konfiguration)   &lt;br /&gt;
&lt;br /&gt;
des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop  &lt;br /&gt;
&lt;br /&gt;
inklusive Platzhalter in der Form &amp;quot;$REFERENZ&amp;quot; eingetragen werden (siehe Bild 1). Ebenso kann unter &amp;quot;Stammdaten - Textbausteine&amp;quot; ein Textbaustein inklusive Link &lt;br /&gt;
&lt;br /&gt;
mit Platzhalter hinterlegt werden (siehe Bild 2 u. 3). Hier kann statt eines Textes auch ein Bild eingefügt werden. Wichtig ist,   &lt;br /&gt;
&lt;br /&gt;
dass hinter das Bild ein Zeichen, z.B. ein Leerzeichen, eingefügt wird.  &lt;br /&gt;
&lt;br /&gt;
In der Shop-Konfiguration unter &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; muss dann die entsprechende laufende Nummer eingetragen werden.  &lt;br /&gt;
&lt;br /&gt;
In Bild 2 des Beispiels ist dies die &amp;quot;084&amp;quot; (markierter Einrag &amp;quot;Kurzlink BR Shop&amp;quot;).   {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird (siehe Bild 4).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
[[Datei:Textbaustein.png|links|mini|Bild 2]]&lt;br /&gt;
[[Datei:Link einfügen.png|links|mini|Bild 3]]&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|links|mini|Bild 4]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62865</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62865"/>
		<updated>2024-03-01T13:20:47Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration (Stammdaten - Schnittstellen - Internetshop - F10 - Konfiguration)   &lt;br /&gt;
&lt;br /&gt;
des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop  &lt;br /&gt;
&lt;br /&gt;
inklusive Platzhalter in der Form &amp;quot;$REFERENZ&amp;quot; eingetragen werden (siehe Bild 1). Ebenso kann unter &amp;quot;Stammdaten - Textbausteine&amp;quot; ein Textbaustein inklusive Link &lt;br /&gt;
&lt;br /&gt;
mit Platzhalter hinterlegt werden (siehe Bild 2 u. 3). Hier kann statt eines Textes auch ein Bild eingefügt werden. Wichtig ist,   &lt;br /&gt;
&lt;br /&gt;
dass hinter das Bild ein Zeichen, z.B. ein Leerzeichen, eingefügt werden muss, da es sonst zu Darstellungsfehlern kommen kann.  &lt;br /&gt;
&lt;br /&gt;
In der Shop-Konfiguration unter &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; muss dann die entsprechende laufende Nummer eingetragen werden.  &lt;br /&gt;
&lt;br /&gt;
In Bild 2 des Beispiels ist dies die &amp;quot;084&amp;quot; (markierter Einrag &amp;quot;Kurzlink BR Shop&amp;quot;).   {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird (siehe Bild 4).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
[[Datei:Textbaustein.png|links|mini|Bild 2]]&lt;br /&gt;
[[Datei:Link einfügen.png|links|mini|Bild 3]]&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|links|mini|Bild 4]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62864</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62864"/>
		<updated>2024-03-01T12:35:47Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration (Stammdaten - Schnittstellen - Internetshop - F10 - Konfiguration)   &lt;br /&gt;
&lt;br /&gt;
des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop  &lt;br /&gt;
&lt;br /&gt;
inklusive Platzhalter in der Form &amp;quot;$REFERENZ&amp;quot; eingetragen werden (siehe Bild 1). Ebenso kann unter &amp;quot;Stammdaten - Textbausteine&amp;quot; ein Textbaustein inklusive Link &lt;br /&gt;
&lt;br /&gt;
mit Platzhalter hinterlegt werden (siehe Bild 2 u. 3).  &lt;br /&gt;
&lt;br /&gt;
In der Shop-Konfiguration unter &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; muss dann die entsprechende laufende Nummer eingetragen werden.  &lt;br /&gt;
&lt;br /&gt;
In Bild 2 des Beispiels ist dies die &amp;quot;084&amp;quot; (markierter Einrag &amp;quot;Kurzlink BR Shop&amp;quot;).   {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird (siehe Bild 4).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
[[Datei:Textbaustein.png|links|mini|Bild 2]]&lt;br /&gt;
[[Datei:Link einfügen.png|links|mini|Bild 3]]&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|links|mini|Bild 4]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62861</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62861"/>
		<updated>2024-02-29T15:43:50Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration (Stammdaten - Schnittstellen - Internetshop - F10 - Konfiguration)   &lt;br /&gt;
&lt;br /&gt;
des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop  &lt;br /&gt;
&lt;br /&gt;
inklusive Platzhalter in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe Bild 1). Ebenso kann unter &amp;quot;Stammdaten - Textbausteine&amp;quot; ein Textbaustein inklusive Link &lt;br /&gt;
&lt;br /&gt;
mit Platzhalter hinterlegt werden (siehe Bild 2 u. 3).  &lt;br /&gt;
&lt;br /&gt;
In der Shop-Konfiguration unter &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; muss dann die entsprechende laufende Nummer eingetragen werden.  &lt;br /&gt;
&lt;br /&gt;
In Bild 2 des Beispiels ist dies die &amp;quot;084&amp;quot; (markierter Einrag &amp;quot;Kurzlink BR Shop&amp;quot;).   {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird (siehe Bild 4).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
[[Datei:Textbaustein.png|links|mini|Bild 2]]&lt;br /&gt;
[[Datei:Link einfügen.png|links|mini|Bild 3]]&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|links|mini|Bild 4]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62860</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62860"/>
		<updated>2024-02-29T15:43:02Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration (Stammdaten - Schnittstellen - Internetshop - F10 - Konfiguration)   &lt;br /&gt;
&lt;br /&gt;
des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop  &lt;br /&gt;
&lt;br /&gt;
inklusive Platzhalter in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe Bild 1). Ebenso kann unter &amp;quot;Stammdaten - Textbausteine&amp;quot; ein Textbaustein inklusive Link &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mit Platzhalter hinterlegt werden (siehe Bild 2 u. 3).  &lt;br /&gt;
&lt;br /&gt;
In der Shop-Konfiguration unter &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; muss dann die entsprechende laufende Nummer eingetragen werden.  &lt;br /&gt;
&lt;br /&gt;
In Bild 2 des Beispiels ist dies die &amp;quot;084&amp;quot;.   {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird (siehe Bild 4).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
[[Datei:Textbaustein.png|links|mini|Bild 2]]&lt;br /&gt;
[[Datei:Link einfügen.png|links|mini|Bild 3]]&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|links|mini|Bild 4]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62859</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62859"/>
		<updated>2024-02-29T15:41:19Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration (Stammdaten - Schnittstellen - Internetshop - F10 - Konfiguration)   &lt;br /&gt;
&lt;br /&gt;
des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop  &lt;br /&gt;
&lt;br /&gt;
inklusive Platzhalter in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe Bild 1). Ebenso kann unter &amp;quot;Stammdaten - Textbausteine&amp;quot; ein Textbaustein inklusive Link &lt;br /&gt;
&lt;br /&gt;
mit Platzhalter hinterlegt werden (siehe Bild 2 u. 3).  {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird (siehe Bild 4).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
[[Datei:Textbaustein.png|links|mini|Bild 2]]&lt;br /&gt;
[[Datei:Link einfügen.png|links|mini|Bild 3]]&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|links|mini|Bild 4]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62858</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62858"/>
		<updated>2024-02-29T15:39:06Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration (Stammdaten - Schnittstellen - Internetshop - F10 - Konfiguration)   &lt;br /&gt;
&lt;br /&gt;
des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop  &lt;br /&gt;
&lt;br /&gt;
inklusive Platzhalter in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe Bild 1). Ebenso kann unter &amp;quot;Stammdaten - Textbausteine&amp;quot; ein Textbaustein inklusive Link &lt;br /&gt;
&lt;br /&gt;
mit Platzhalter hinterlegt werden (siehe Bild 2 u. 3).  {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird (siehe Bild 4).&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Datei:Textbaustein.png&amp;diff=62857</id>
		<title>Datei:Textbaustein.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Datei:Textbaustein.png&amp;diff=62857"/>
		<updated>2024-02-29T15:37:05Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Textbaustein einfügen&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Datei:Link_einf%C3%BCgen.png&amp;diff=62856</id>
		<title>Datei:Link einfügen.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Datei:Link_einf%C3%BCgen.png&amp;diff=62856"/>
		<updated>2024-02-29T15:36:38Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Link einfügen&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62855</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62855"/>
		<updated>2024-02-29T15:35:47Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration (Stammdaten - Schnittstellen - Internetshop - F10 - Konfiguration)   &lt;br /&gt;
&lt;br /&gt;
des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop  &lt;br /&gt;
&lt;br /&gt;
inklusive Platzhalter in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe Bild 1). Ebenso kann unter &amp;quot;Stammdaten - Textbausteine&amp;quot; ein Textbaustein inklusive Link &lt;br /&gt;
&lt;br /&gt;
mit Platzhalter hinterlegt werden (siehe Bild 2 u. 3).  {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird (siehe Bild 4).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|mini|links|Bild 4]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62854</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62854"/>
		<updated>2024-02-29T15:29:05Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration (Stammdaten - Schnittstellen - Internetshop - F10 - Konfiguration)   &lt;br /&gt;
&lt;br /&gt;
des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop  &lt;br /&gt;
&lt;br /&gt;
inklusive Platzhalter in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe Bild 1). {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird (siehe Bild 2).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|mini|links|Bild 2]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62803</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62803"/>
		<updated>2024-02-09T08:33:50Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop  &lt;br /&gt;
&lt;br /&gt;
inklusive Platzhalter in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe Bild 1). {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird (siehe Bild 2).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini|Bild 1]]&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|mini|links|Bild 2]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62802</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62802"/>
		<updated>2024-02-09T08:32:05Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden. {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini]]&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|mini|links]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62801</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62801"/>
		<updated>2024-02-09T08:31:46Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden. {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini]]&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|zentriert|mini]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62800</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62800"/>
		<updated>2024-02-09T08:31:25Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden. {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|mini]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62799</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62799"/>
		<updated>2024-02-09T08:28:56Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden. {{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird.&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62798</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62798"/>
		<updated>2024-02-09T08:28:37Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden.{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird.&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62797</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62797"/>
		<updated>2024-02-09T08:28:18Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden.{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird.&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62796</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62796"/>
		<updated>2024-02-09T08:27:57Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden.{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Einzelne Artikel können außerdem von dieser Funktionalität ausgenommen werden, indem unter Artikelstamm&lt;br /&gt;
&lt;br /&gt;
die Artikeleigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; gesetzt wird.&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62795</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62795"/>
		<updated>2024-02-09T08:26:41Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62794</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62794"/>
		<updated>2024-02-09T08:26:17Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|rahmenlos|534x534px]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62793</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62793"/>
		<updated>2024-02-09T08:25:46Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|rahmenlos|534x534px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
Einzelne Artikel können von dieser Funktionalität auch ausgeschlossen werden. Dazu setzt man unter Artikelstamm für &lt;br /&gt;
&lt;br /&gt;
jeden auszuschließenden Artikel die Eigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; (siehe untenstehendes Beispiel).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|links|rahmenlos]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62792</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62792"/>
		<updated>2024-02-09T08:25:31Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|rahmenlos|534x534px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Einzelne Artikel können von dieser Funktionalität auch ausgeschlossen werden. Dazu setzt man unter Artikelstamm für &lt;br /&gt;
&lt;br /&gt;
jeden auszuschließenden Artikel die Eigenschaft &amp;quot;SHOP Keinen Link setzen&amp;quot; (siehe untenstehendes Beispiel).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|links|rahmenlos]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62791</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62791"/>
		<updated>2024-02-09T08:24:18Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|rahmenlos|534x534px]]&lt;br /&gt;
&lt;br /&gt;
Einzelne Artikel können von dieser Funktionalität auch ausgeschlossen werden. Dazu setzt man&lt;br /&gt;
unter Artikelstamm für jeden auszuschließenden Artikel die Eigenschaft&lt;br /&gt;
&amp;quot;SHOP Keinen Link setzen&amp;quot; (siehe untenstehendes Beispiel).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Artikeleigenschaften.png|mini]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Datei:Artikeleigenschaften.png&amp;diff=62790</id>
		<title>Datei:Artikeleigenschaften.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Datei:Artikeleigenschaften.png&amp;diff=62790"/>
		<updated>2024-02-09T08:24:05Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eigenschaften eines Artikels&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Vorlage:Kostenpflichtige_Module&amp;diff=62789</id>
		<title>Vorlage:Kostenpflichtige Module</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Vorlage:Kostenpflichtige_Module&amp;diff=62789"/>
		<updated>2024-02-08T13:28:48Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right; clear:both; margin-left:2px; padding:0px; background:#FFFFFF; width:19em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:none;margin-top:0pt;padding:0pt;&amp;quot; id=&amp;quot;navigation&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:relative;top:-20pt;color:#000000;background:#ffffff; border: 3pt double #cfcfcf; padding: 5pt; margin: 0pt;margin-bottom:-20pt; z-index:1;border-top-right-radius:7pt;-moz-border-radius-topright:7pt;-webkit-border-top-right-radius:7pt;border-bottom-left-radius:7pt;-moz-border-radius-bottomleft:7pt;-webkit-border-bottom-left-radius:7pt;box-shadow: 3px 3px 4px #c0c0c0;-webkit-box-shadow: 3px 3px 4px #c0c0c0;-moz-box-shadow: 3px 3px 4px #c0c0c0;&amp;quot;&amp;gt;[[Hauptseite|Wiki]] » [[Kostenpflichtige Module|Kostenpflichtige Module]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Textbox-Blau|1=Kostenpflichtige Module|2=&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Internet-Shop&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop| OBS Schnittstelle Internet Shop]]&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Der modified ECommerce Shop&#039;&#039;&#039;|inhalt=&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop-xtcModified/FAQs|FAQs]]&lt;br /&gt;
*[[OBS/Internet-Shop/modified-eCommerce|Überblick zum modified ECommerce Shop]]&lt;br /&gt;
{{Vorlage:Klapptext|kopf=Shop-Menü|inhalt=&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce/A Preise aktualisieren|A Preise aktualisieren]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce/C Personen übertragen|C Personen übertragen]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce/E Kategorien verwalten|E Kategorien verwalten]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce/G Kataloge verwalten|G Kataloge verwalten]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop-xtcModified/I Merkliste übertragen|I Merkliste übertragen]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce/K Varianten übertragen|K Varianten übertragen]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce/L Artikelvarianten übertragen|L Artikelvarianten übertragen]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce/M Referenzarten übertragen|M Referenzarten übertragen]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce/N Lagerbestände verwalten|N Lagerbestände verwalten]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop#Bestellungen_einlesen|U Bestellungen einlesen]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce/V leere Passworte füllen|V leere Passworte füllen]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce/W Update-Informationen zurücksetzen|W Update-Informationen zurücksetzen]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop/Konfiguration/modified_eCommerce|X Konfiguration]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop#Protokoll|Z Protokoll]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=Automatische Vorgänge|inhalt=&lt;br /&gt;
* [[OBS/Internet-Shop/modified-eCommerce/Scheduler/Bestellungen einlesen|Bestellungen einlesen]]&lt;br /&gt;
* [[OBS/Internet-Shop/modified-eCommerce/Scheduler/Verfügbarkeitsdateien erstellen|Verfügbarkeitsdateien erstellen]]&lt;br /&gt;
* [[OBS/Internet-Shop/modified-eCommerce/Scheduler/Verfügbarkeitsdateien hochladen|Verfügbarkeitsdateien hochladen]]&lt;br /&gt;
*[[OBS/Internet-Shop/modified-eCommerce/Scheduler/Änderungsautomatik|geänderte Artikel übertragen]]&lt;br /&gt;
*[[OBS/Internet-Shop/modified-eCommerce/Scheduler/Preise aktualisieren|Preise aktualisieren]]&lt;br /&gt;
*[[OBS/Internet-Shop/modified-eCommerce/Scheduler/Anlage Shopkategorien|Anlage der Shopkategorien auf Grundlage der OBS-Warengruppen]]&lt;br /&gt;
}}&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop-xtcModified/besondere Funktionen|Besondere Anpassungen im xtcModified Shop]]&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=[[Kostenpflichtige_Module/Internet-Shop/modified_eCommerce_2|modified eCommerce 2.0]]|inhalt=&lt;br /&gt;
*[[OBS/Internet-Shop/modified_eCommerce_2.0|Funktionen und FAQ]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=[[OBS/Internet-Shop/ShopV4|Der Büroring-ShopV4]]|inhalt=&lt;br /&gt;
*[[OBS/Internet-Shop/ShopV4/FAQs|FAQs]]&lt;br /&gt;
{{Vorlage:Klapptext|kopf=Einrichtung|inhalt=&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/1.1_Einstellungen_im_Shop|Einstellungen im Shop]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/1.2_Einstellungen_in_OBS|Einstellungen in OBS]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Erste_Schritte|Erste Schritte]]&lt;br /&gt;
}}&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Shop-Menu|Shop-Menü]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Shop-Lieferanten|Shop-Lieferanten]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Import_von_Bestellungen|Import von Bestellungen]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Personen_/_Kundengruppen|Personen / Kundengruppe]]&lt;br /&gt;
{{Vorlage:Klapptext|kopf=Eigene Artikel|inhalt=&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/6.1_Artikel_übertragen|Artikel übertragen]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/6.2_Shop-Warengruppen|Shop-Warengruppen]]&lt;br /&gt;
}}&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Preislisten|Preislisten]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Katalogvorlagen|Katalogvorlagen]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Bestellvorlagen|Bestellvorlagen]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Sortiment|Sortiment]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Kostenstellen|Kostenstellen]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Personen-Einstellungen|Personen-Einstellungen]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=[[Kostenpflichtige_Module/Internet-Shop/brShop24|brShop24]]|inhalt=&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24|Übersicht]]&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|Einrichtung]]&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24#Bekannte_Probleme|Bekannte Probleme]]&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24#H.C3.A4ufig_gestellte_Fragen_.28FAQ.29|Häufig gestellte Fragen (FAQ)]]&lt;br /&gt;
{{Vorlage:Klapptext|kopf=[[Kostenpflichtige_Module/Internet-Shop/brShop24|Einstellungen und Automatiken]]|inhalt=&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/Konfiguration|Konfiguration]]&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24#Zuordnungen|Zuordnungen/Datenverknüpfung OBS und Shop]]&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken|Automatiken einrichten]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=[[Kostenpflichtige_Module/Internet-Shop/brShop24#Erkl.C3.A4rungen.2FFunktionen|Funktionen]]|inhalt=&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24/Kundengruppen_verwalten|Kundengruppen verwalten]]&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24/Personen_übertragen|Personen übertragen]]&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen|Preise übertragen]]&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24/Eigene_Artikel_übertragen|Eigene Artikel übertragen]]&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24/Shoppinglisten_übertragen|Shoppinglisten übertragen]]&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24/Jobinformationen|Jobinformationen]]&lt;br /&gt;
* [[Kostenpflichtige_Module/Internet-Shop/brShop24/Migration|Migration]]&lt;br /&gt;
* [[Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink|PDF-Druck Artikellink]]&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* [[Kostenpflichtige Module/Internet-Shop/soCONNECT|so.CONNECT (Soennecken)]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Preislisten&#039;&#039;&#039;|inhalt=&lt;br /&gt;
{{Vorlage:Klapptext|kopf=[[OBS/Kostenpflichtige_Module/Preislisten|Preislistenverwaltung]]|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige_Module/Preislisten/Preislisten-Artikel|Preislisten-Artikel]]&lt;br /&gt;
* [[OBS/Kostenpflichtige_Module/Preislisten/Preislistengruppen|Preislistengruppen]]&lt;br /&gt;
}}&lt;br /&gt;
* [[OBS/Preislisten/FAQ_Preislisten|FAQ Preislisten]]&lt;br /&gt;
* [[OBS/Häufig gestellte Fragen/Vorgehensweise für Preislisten ohne Server|Vorgehen für Preislisten ohne Server]]&lt;br /&gt;
* [[OBS/Häufig gestellte Fragen/Vorgehensweise mit Server/Client Installation für Preislisten|Vorgehen für Preislisten mit Server]]&lt;br /&gt;
{{Vorlage:Klapptext|kopf=[[OBS/Stammdaten/Artikel/Preislistenverwaltung/Weitere Funktionen|F10 Weitere Funktionen]]|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige_Module/Preislisten/Formeln|D Formelverwaltung]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=[[OBS/Stammdaten/Artikel/Preislistenverwaltung/AutoPflege|Automatiken Kommandos]]|inhalt=&lt;br /&gt;
* [[OBS/Preislisten/Preislisten per Macro füllen|Preislisten per Macro füllen]]&lt;br /&gt;
* [[OBS/Preislisten/Preislisten per Macro kopieren|Preislisten per Macro kopieren]]&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;ZUGFeRD&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/ZUGFeRD|ZUGFeRD]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Factoring&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Was ist Factoring?|Was ist Factoring?]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Factoring in OBS| Factoring in OBS]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Erstellen und Verwenden von Factoring Rechnungen|Erstellen und Verwenden von Factoring Rechnungen]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Auswertung und Übermittlung von Factoring Rechnungen|Auswertung und Übermittlung von Factoring Rechnungen]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Factoring Fibu|Factoring Fibu]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;UPS&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/kostenpflichtige Module/UPS|UPS Modul]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;DHL&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/kostenpflichtige Module/DHL|DHL Schnittstelle]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;IMS Professional&#039;&#039;&#039;|inhalt=&lt;br /&gt;
;&lt;br /&gt;
* [[OBS/kostenpflichtige Module/IMSPro|IMS-Professional]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;TAPI&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/TAPI|TAPI]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/TAPI Voraussetzungen|Voraussetzungen]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/TAPI Konfiguration|Konfiguration]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/TAPI Externe Telefonanbindungen|Externe Telefonanbindungen]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;SMS&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/SMS|SMS]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=[[OBS/Kostenpflichtige_Module/Fleet_Management|&#039;&#039;&#039;Fleet Management&#039;&#039;&#039;]]|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Fleet Management/FMAudit|FMAudit]]&lt;br /&gt;
* [[FRMFMZENTRALE_MELDUNGEN|FMAudit Pro]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Fleet Management/UTAX E-mail|UTAX E-Mail]]&lt;br /&gt;
* [[OBS/Kostenpflichtige_Module/Fleet_Management/Brother_XML|Brother XML]]&lt;br /&gt;
* [[OBS/Kostenpflichtige_Module/Fleet_Management/KonicaMinolta_E-Mail|Konica Minolta E-Mail]]&lt;br /&gt;
* [[OBS/Kostenpflichtige_Module/Fleet_Management/docuFORM|docuFORM XML]]&lt;br /&gt;
* [[OBS/Kostenpflichtige_Module/Fleet_Management/KyoceraFleetServices|KFS XML]]&lt;br /&gt;
* [[OBS/Kostenpflichtige_Module/Fleet_Management/SimpleClicksXML|SimpleClicks XML]]&lt;br /&gt;
* [[OBS/Kostenpflichtige_Module/Fleet_Management/Brother_PPPB_xlsx|Brother PPPB Xlsx]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Mehrlager-Verwaltung&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Mehrlager-Verwaltung|Mehrlager-Verwaltung]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Mehrsprachen Modul&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Mehrsprachen Modul|Mehrsprachen Modul]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Multilanguage Modul&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Multilanguage Modul|Multilanguage Modul]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Einfache Produktionsnachverfolgung&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Einfache Produktionsnachverfolgung/Was ist|Was ist die Einfache Produktionsnachverfolgung]]&lt;br /&gt;
* [[OBS/Einfache Produktionsnachverfolgung/FRMEDITPRODMENGE|Scannen der Auftragspositionen]]&lt;br /&gt;
* [[OBS/Einfache Produktionsnachverfolgung/Sammellieferschein|Sammellieferschein]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;DMS - Dokumenten Management System&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS|DMS]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Konfiguration|Konfiguration]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/Scannen von Dokumenten|Einscannen von Dokumenten im Stapelbetrieb]]&lt;br /&gt;
{{Vorlage:Klapptext|kopf=DMS Dokumente|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Dokumente|Liste]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/Versionierung|Dokumentenversionierung]]&lt;br /&gt;
{{Vorlage:Klapptext|kopf=Tasten und Schaltflächen|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Dokumente/F2 Filter|F2 Filter]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Dokumente/F5 Markieren|F5 Mark]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Verknüpfung|F6 Verknü.]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Dokumente/F7 Suche|F7 Suche]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Dokumente/F8 Info|F8 Info]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Dokumente/F9 Gruppe|F9 Gruppe]]&lt;br /&gt;
{{Vorlage:Klapptext|kopf=F10 Weit.|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Dokumente/F10 Weitere Funktionen|F10 Weit.]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Stammdaten|DMS Stammdaten]]&lt;br /&gt;
{{Vorlage:Klapptext|kopf=E DMS Definitionen|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Definitionen|Liste]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Definitionen Eingabemaske|Eingabemaske]]&lt;br /&gt;
}}&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/QR Etiketten|M QR Etiketten drucken]]&lt;br /&gt;
}}&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Viewer|Dokument]]&lt;br /&gt;
}}&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DMS/DMS Eingabemaske|Eingabemaske]]&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;QR Zeiterfassung&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/QR Zeiterfassung|QR Zeiterfassung]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/QR Einrichtung Checkliste|QR Einrichtung Checkliste]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;EVA Marketing Tool&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/EVA]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Technikersteuerung&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Technikersteuerung/Ziel der Technikersteuerung|Ziel der Technikersteuerung]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Technikersteuerung/Konfiguration|Konfiguration]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Technikersteuerung/Terminvorschläge erstellen|Terminvorschläge für Techniker erstellen]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Technikersteuerung/Liste|Liste]]&lt;br /&gt;
** [[OBS/Kostenpflichtige Module/Technikersteuerung/Definition Terminvorschlagslisten|Definition Terminvorschlagslisten/T-Def]]&lt;br /&gt;
** [[OBS/Kostenpflichtige Module/Technikersteuerung/Terminvorschläge bearbeiten|Terminvorschläge für Techniker bearbeiten]]&lt;br /&gt;
** [[OBS/Kostenpflichtige Module/Technikersteuerung/Terminvorschlagsliste aktualisieren|Terminvorschlagsliste akt./T-Liste]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Termin-Projekte&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Termin-Projekte|Termin-Projekte]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Edifact-Schnittstelle&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Edifact|Edifact Schnittstelle]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Backup Überwachung Email&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Backup Überwachung Email|Backup Überwachung Email]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Anlagenbuchhaltung&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Anlagenbuchhaltung|Anlagenbuchhaltung]]&lt;br /&gt;
** [[OBS/Kostenpflichtige Module/Anlagenbuchhaltung/Auswertungen|Auswertungsdrucke]]&lt;br /&gt;
** [[OBS/Kostenpflichtige Module/Anlagenbuchhaltung/Anlagengüter|Anlagegüterübersicht]]&lt;br /&gt;
** [[OBS/Kostenpflichtige Module/Anlagenbuchhaltung/Abschreibungsarten|Abschreibungsarten]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Anlagenbuchhaltung/Anlagekonten|Anlagekonten]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Anlagenbuchhaltung/Bewegung|Anlagebewegungen]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Anlagenbuchhaltung/Anlagenstapel|Anlagenstapel]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;OBS Geo Daten&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/OBS Geo Daten|OBS Geo Daten]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;DeliSprint / DPD&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige_Module/Delisprint|DeliSprint / DPD]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Filialen&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Filialen|Filialen]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Auto-Waagen&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Auto-Waagen|Auto-Waagen]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Auto-Waagen/Installation|Installation]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Cashback&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Cashback|Cashback]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Moebelschnittstelle&#039;&#039;&#039;|inhalt=&lt;br /&gt;
*[[OBS/Kostenpflichtige Module/Moebelschnittstelle|Moebelschnittstelle]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;OBS-Waage&#039;&#039;&#039;|inhalt=&lt;br /&gt;
*[[FRMWAAGE|Liste]]&lt;br /&gt;
*[[FRMEDITWAAGE|Erstellen eines neuen Wiegesatzes ]]&lt;br /&gt;
*[[OBS/Kostenpflichtige Module/WAAGE.INI|WAAGE.INI]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Tourenplanung&#039;&#039;&#039;|inhalt=&lt;br /&gt;
{{Vorlage:Klapptext|kopf=[[OBS/Kostenpflichtige Module/Tourenplanung|Tourenplanung]]|inhalt=&lt;br /&gt;
*[[OBS/Kostenpflichtige Module/Tourenplanung/TourVG|Vorgänge]]&lt;br /&gt;
*[[OBS/Kostenpflichtige Module/Tourenplanung/TourTouren|Touren]]&lt;br /&gt;
*[[OBS/Kostenpflichtige Module/Tourenplanung/TourTourPos|Positionen]]&lt;br /&gt;
}}&lt;br /&gt;
*[[OBS/Kostenpflichtige Module/Tourenplanung/Stammdaten|Stammdaten]]&lt;br /&gt;
*[[OBS/Kostenpflichtige Module/Tourenplanung/Einrichtung|Einrichtung]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Dokumenten Manager&#039;&#039;&#039;|inhalt=&lt;br /&gt;
*[[OBS/Kostenpflichtige_Module/Dokumenten_Manager|Dokumenten Manager]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;DocuWare-Schnittstelle&#039;&#039;&#039;|inhalt=&lt;br /&gt;
*[[OBS/Kostenpflichtige_Module/DocuWare|DocuWare-Schnittstelle]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;OFML-Kalkulation&#039;&#039;&#039;|inhalt=&lt;br /&gt;
*[[OBS/Kostenpflichtige_Module/OFML-Kalkulation|OFML-Kalkulation]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Pascom&#039;&#039;&#039;|inhalt=&lt;br /&gt;
*[[OBS/Kostenpflichtige_Module/Pascom|Pascom]]&lt;br /&gt;
*[[OBS/Kostenpflichtige_Module/Pascom_Einrichtung|Einrichtung]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Versicherungsschaden&#039;&#039;&#039;|inhalt=&lt;br /&gt;
*[[OBS/Kostenpflichtige_Module/Versicherungsschaden|Versicherungsschaden]]&lt;br /&gt;
*[[OBS/Kostenpflichtige_Module/Energienachweise|Energienachweise]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Gutschriftsanzeigen&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Gutschriftsanzeigen|Gutschriftsanzeigen]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;OCPP Ladestationen&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/OCPP_Ladestationen|OCPP Wallboxen Abrechnung (Ladesäulen)]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/SteVe|SteVe]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Kameraverwaltung&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Kameraverwaltung|Kameraverwaltung]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;DataInOut&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/DataInOut|DataInOut]]&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;REST-Schnittstelle&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/RESTServer|REST-Server]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/RESTServer/Einrichtung|Einrichtung]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/RESTServer/Scripting|Scripting]]&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Beispiele&#039;&#039;&#039;|inhalt=&lt;br /&gt;
*[[OBS/Kostenpflichtige Module/RESTServer/Beispiel1|PHP-Abruf von Steuerungsdaten]]&lt;br /&gt;
*[[OBS/Kostenpflichtige Module/RESTServer/Beispiel2|Zeiterfassung]]&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&#039;&#039;&#039;Sammelverträge&#039;&#039;&#039;|inhalt=&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Sammelvertrag|Sammelvertrag]]&lt;br /&gt;
* [[OBS/Kostenpflichtige Module/Sammelvertrag/Container|Container-Stammdaten]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgender Code muss in die jeweils gewünschte Seite hinzugefügt werden:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Kostenpflichtige Module}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Kategorie:Templates/Navigationen]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
[[Kategorie:OBS/Module]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62788</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62788"/>
		<updated>2024-02-08T13:16:35Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|rahmenlos|534x534px]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62787</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62787"/>
		<updated>2024-02-08T13:16:02Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|rahmenlos|589x589px]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62786</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62786"/>
		<updated>2024-02-08T13:15:11Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|rahmenlos|589x589px]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62785</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62785"/>
		<updated>2024-02-08T13:14:08Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|links|gerahmt]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62784</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62784"/>
		<updated>2024-02-08T13:13:03Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Link Einstellungen.png|mini]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Datei:Link_Einstellungen.png&amp;diff=62783</id>
		<title>Datei:Link Einstellungen.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Datei:Link_Einstellungen.png&amp;diff=62783"/>
		<updated>2024-02-08T13:12:55Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Konfiguartion Artikellink&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62782</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62782"/>
		<updated>2024-02-08T13:09:08Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Linkkonfiguration.png|gerahmt|links]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62781</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62781"/>
		<updated>2024-02-08T13:08:42Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Linkkonfiguration.png|gerahmt]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62780</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62780"/>
		<updated>2024-02-08T13:05:42Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Datei:Linkkonfiguration.png|mini]]&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Datei:Linkkonfiguration.png&amp;diff=62779</id>
		<title>Datei:Linkkonfiguration.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Datei:Linkkonfiguration.png&amp;diff=62779"/>
		<updated>2024-02-08T13:05:32Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Konfiguration&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62778</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62778"/>
		<updated>2024-02-08T13:03:43Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In Angebotsdrucken kann in PDF-Exporten und E-Mails zu jedem aufgeführten Artikel ein Link zum Webshop gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Damit dies funktioniert, muss in der Konfiguration des Internetshops in OBS unter dem Punkt &amp;quot;Allgemein.Kurzlink.Artikel&amp;quot; die URL zum Shop inklusive Platzhalter &lt;br /&gt;
&lt;br /&gt;
in der Form &amp;quot;#REFERENZ&amp;quot; eingetragen werden (siehe untenstehendes Beispiel).{{Vorlage:Kostenpflichtige Module}}&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=OBS/Stammdaten/Schnittstellen/Internet-Shop&amp;diff=62777</id>
		<title>OBS/Stammdaten/Schnittstellen/Internet-Shop</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=OBS/Stammdaten/Schnittstellen/Internet-Shop&amp;diff=62777"/>
		<updated>2024-02-08T12:51:40Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Vorlage:Kostenpflichtige Module}}&lt;br /&gt;
Eine eigene Webpräsenz ist für viele Händler in Zeiten von Tablets und Smartphones eine gute Alternative zum Ladengeschäft. Ein eigener Web-Shop verursacht jedoch auch eine Menge Arbeit. OBS kann die Pflege eines eigenen Shops unterstützen. Im folgenden finden Sie eine Auflisteung aller Shop-Schnittstellen mit dem jeweiligen Funktionsumfang und Links zu weiterführenden Beschreibungen. OBS ist in der Lage mehrere Schnittstellen zu verwalten.&lt;br /&gt;
{{Hinweis|Beachten Sie für eigene Webseiten wie Homepage oder Online-Shops die Pflege rechtssicherer Texte. Sieh dazu auch [[Sonstiges/web/rechtstexte|&#039;&#039;&#039;Pflege rechtssicherer Texte in eigener Internetpräsenz (Homepage/Online-Shop)&#039;&#039;&#039;]]}}&lt;br /&gt;
=Internet-Shop=&lt;br /&gt;
{{Hinweis|Um dieses Modul verwenden zu können, muss dieses mit Programmparameter 633 &#039;Internet-Shop vorhanden&#039; aktiviert werden.}}&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Menüeintrag öffnet die Liste &#039;&#039;Internet-Shops&#039;&#039;. Alle eingerichteten Schnittstellen werden hier aufgelistet. Das Menü für die Verwaltung einer Schnittstelle finden Sie unter {{F10}} &#039;&#039;Menü&#039;&#039;. Entsprechend des Shop-Typs und dessen Funktionsumfang finden Sie hier unterschiedliche Menüpunkte. Einzig die [[FRMSHOPEINSTELLUNGEN|Konfigurationseinstellungen]] finden Sie im Menü jedes Shop-Typs unter &#039;&#039;[[FRMSHOPEINSTELLUNGEN|X Konfiguration]]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=Schittstellen-Typen=&lt;br /&gt;
Es werden derzeit acht verschiedene Schnittstellen-Typen unterstützt. Diese unterscheiden sich stark im Funktionsumfang. Die Schnittstellen-Typen sind:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Typ!! Import!! Export&lt;br /&gt;
|-&lt;br /&gt;
| [[#VShop 3.2|VShop 3.2]]|| Ja|| Nein&lt;br /&gt;
|-&lt;br /&gt;
| [[#VShop 4.0|VShop 4.0]]|| Ja|| Ja&lt;br /&gt;
|-&lt;br /&gt;
| [[#Alka|Alka]]|| Ja|| Nein&lt;br /&gt;
|-&lt;br /&gt;
| [[#Adveo|Adveo]]|| Ja|| Nein&lt;br /&gt;
|-&lt;br /&gt;
| [[#modified eCommerce|modified eCommerce]]|| Ja|| Ja&lt;br /&gt;
|-&lt;br /&gt;
| [[#amazon Marketplace|amazon Marketplace]]|| Ja|| Ja&lt;br /&gt;
|-&lt;br /&gt;
| [[#individuell OpenTRANS|individuell OpenTRANS]]|| Ja|| Nein&lt;br /&gt;
|-&lt;br /&gt;
| [[#DoubleM|DoubleM]]|| Nein|| Ja&lt;br /&gt;
|-&lt;br /&gt;
| [[#VIA_eBay|VIA eBay]]|| Ja|| Ja&lt;br /&gt;
|-&lt;br /&gt;
| [[#brShop24|brShop24]]|| n/a|| n/a&lt;br /&gt;
|-&lt;br /&gt;
| [[#VendoSys|VendoSys]]|| Ja|| Ja&lt;br /&gt;
|}&lt;br /&gt;
Weitere Informationen, welche Daten im- und exportiert werden können, finden Sie unter den allgemeinen Informationen der einzelnen Typen.&lt;br /&gt;
==VShop 3.2==&lt;br /&gt;
===Allgemein VShop 3.2===&lt;br /&gt;
{{Hinweis|Vom Büroring wird zur Zeit nur noch die [[#VShop_4.0|Version 4.0]] angeboten.}}&amp;lt;br /&amp;gt;&lt;br /&gt;
Diese Schnittstelle unterstützt nur den Import von Shop-Bestellungen.&lt;br /&gt;
&lt;br /&gt;
===Einrichtung VShop 3.2===&lt;br /&gt;
Diese Schnittstelle funktioniert über eine direkte Datenbankverbindung. Bestellungen werden aus Dateien importiert, welche von OBS von einem FTP-Server herunterzuladen sind. Für eine Einrichtung benötigt der Support die Zugangsdaten für den FTP-Server und die Datenbank.&lt;br /&gt;
===Menü VShop 3.2===&lt;br /&gt;
* [[#Bestellungen einlesen|U Bestellungen einlesen]]&lt;br /&gt;
* [[FRMSHOPEINSTELLUNGEN|X Konfiguration]]&lt;br /&gt;
* Y FTP-Protokoll&lt;br /&gt;
* [[#Protokoll|Z Protokoll]]&lt;br /&gt;
&lt;br /&gt;
==VShop 4.0==&lt;br /&gt;
===Allgemein VShop 4.0===&lt;br /&gt;
Diese Schnittstelle unterstützt den Im- und Export von Daten wie folgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Import!! Export&lt;br /&gt;
|-&lt;br /&gt;
| Bestellungen (Format OpenTRANS 1.0)|| Personen&lt;br /&gt;
|-&lt;br /&gt;
| Shop-Warengruppen|| Artikel&lt;br /&gt;
|-&lt;br /&gt;
| Kundengruppen|| Preise&lt;br /&gt;
|-&lt;br /&gt;
| || Bestellvorlagen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Einrichtung VShop 4.0===&lt;br /&gt;
Diese Schnittstelle funktioniert über eine direkte Datenbankverbindung. Bestellungen werden aus Dateien importiert, welche von OBS von einem FTP-Server herunterzuladen sind. Für eine Einrichtung benötigt der Support die Zugangsdaten für den FTP-Server und die Datenbank.&lt;br /&gt;
&lt;br /&gt;
===Menü VShop 4.0===&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Preise_aktualisieren|A Preise aktualisieren]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Preislisten|B Preislisten verwalten]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Personen_übertragen|C Personen übertragen]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/6.1_Artikel_übertragen|D eigene Artikel übertragen]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/6.2_Shop-Warengruppen|E Warengruppen verwalten]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Personen_/_Kundengruppen|F Kundengruppen]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Katalogvorlagen|H Kataloge für Personen einer Auswertung übertragen]]&lt;br /&gt;
* [[OBS/Internet-Shop/ShopV4/Bestellvorlagen|I Bestellvorlagen übertragen]]&lt;br /&gt;
* [[#Bestellungen einlesen|U Bestellungen einlesen]]&lt;br /&gt;
* [[#leere Passworte füllen|V leere Passworte füllen]]&lt;br /&gt;
* [[FRMSHOPEINSTELLUNGEN|X Konfiguration]]&lt;br /&gt;
* Y FTP-Protokoll&lt;br /&gt;
* [[#Protokoll|Z Protokoll]]&lt;br /&gt;
&lt;br /&gt;
==Alka==&lt;br /&gt;
===Allgemein Alka===&lt;br /&gt;
Diese Schnittstelle unterstützt nur den Import von Shop-Bestellungen (Format OpenTRANS 1.0).&lt;br /&gt;
&lt;br /&gt;
===Einrichtung Alka===&lt;br /&gt;
Bestellungen werden aus Dateien importiert, welche von OBS von einem FTP-Server herunterzuladen sind. Für eine Einrichtung benötigt der Support die Zugangsdaten für den FTP-Server.&lt;br /&gt;
===Menü Alka===&lt;br /&gt;
* [[#Bestellungen einlesen|U Bestellungen einlesen]]&lt;br /&gt;
* [[FRMSHOPEINSTELLUNGEN|X Konfiguration]]&lt;br /&gt;
* [[#Protokoll|Z Protokoll]]&lt;br /&gt;
&lt;br /&gt;
==Adveo==&lt;br /&gt;
===Allgemein Adveo===&lt;br /&gt;
Diese Schnittstelle unterstützt nur den Import von Shop-Bestellungen.&lt;br /&gt;
===Einrichtung Adveo===&lt;br /&gt;
Die Bestellungen werden aus Dateien importiert, welche Adveo per E-Mail verschickt. Für eine automatische Verarbeitung benötigt OBS ein eingerichtetes E-Mail-Konto, welches die E-Mails von Adveo empfängt.&lt;br /&gt;
===Menü Adveo===&lt;br /&gt;
* [[#Bestellungen einlesen|U Bestellungen einlesen]]&lt;br /&gt;
* [[FRMSHOPEINSTELLUNGEN|X Konfiguration]]&lt;br /&gt;
* [[#Protokoll|Z Protokoll]]&lt;br /&gt;
&lt;br /&gt;
==modified eCommerce==&lt;br /&gt;
===Allgemein modified eCommerce===&lt;br /&gt;
Diese Schnittstelle unterstützt den Im- und Export von Daten wie folgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Import!! Export&lt;br /&gt;
|-&lt;br /&gt;
| Bestellungen|| Personen&lt;br /&gt;
|-&lt;br /&gt;
| Shop-Warengruppen|| Artikel&lt;br /&gt;
|-&lt;br /&gt;
| Versandmodule|| Preise&lt;br /&gt;
|-&lt;br /&gt;
| Zahlungsmodule|| Shop-Warengruppen&lt;br /&gt;
|-&lt;br /&gt;
| Kundengruppen|| Bestellvorlagen/Merklisten&lt;br /&gt;
|-&lt;br /&gt;
| || Kataloge&lt;br /&gt;
|-&lt;br /&gt;
| || Lagerbestände&lt;br /&gt;
|-&lt;br /&gt;
| || Artikelvarianten&lt;br /&gt;
|}&lt;br /&gt;
Weitere allgemeine Hinweise zum modified eCommerce Shop finden Sie &#039;&#039;&#039;[[OBS/Internet-Shop/modified-eCommerce|hier]]&#039;&#039;&#039;.&lt;br /&gt;
===Einrichtung modified eCommerce===&lt;br /&gt;
Für die Einrichtung wird ein Webserver oder Webspace mit MySQL-Datenbank und FTP-Zugang benötigt.&lt;br /&gt;
===Menü modified eCommerce===&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified_eCommerce/A_Preise_aktualisieren|A Preise aktualisieren]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified_eCommerce/B_Preislisten_verwalten|B Preislisten verwalten]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified_eCommerce/C_Personen_übertragen|C Personen übertragen]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified_eCommerce/E_Kategorien_verwalten|E Kategorien verwalten]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified_eCommerce/G_Kataloge_verwalten|G Kataloge verwalten]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified_eCommerce/I_Merkliste_übertragen|I Merkliste übertragen]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified_eCommerce/J_Verfügbarkeit_übertragen|J Verfügbarkeit übertragen]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified_eCommerce/K_Varianten_übertragen|K Varianten übertragen]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified_eCommerce/L_Artikelvarianten_übertragen|L Artikelvarianten übertragen]]&lt;br /&gt;
* M Referenzarten übertragen&lt;br /&gt;
* [[FRMSHOPLAGER|N Lagerbestände verwalten]]&lt;br /&gt;
* [[#Bestellungen einlesen|U Bestellungen einlesen]]&lt;br /&gt;
* [[#leere Passworte füllen|V leere Passworte füllen]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified_eCommerce/W_Update-Informationen_zurücksetzen|W Update-Informationen zurücksetzen]]&lt;br /&gt;
* [[FRMSHOPEINSTELLUNGEN|X Konfiguration]]&lt;br /&gt;
* [[#Protokoll|Z Protokoll]]&lt;br /&gt;
&lt;br /&gt;
===Automatiken modified eCommerce===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Automatik!! Erklärung&lt;br /&gt;
|-&lt;br /&gt;
| ExecShopJob|| Führt im Hintergrund die vom OBS-Benutzer bestimmten [[#Offene Shop-Jobs|Shop-Jobs]] aus. Die aktiven [[#Offene Shop-Jobs|Shop-Jobs]] lassen sich in einem [[OBS/Widgets/Offene Shop Jobs|Widget]] anzeigen.&lt;br /&gt;
|-&lt;br /&gt;
| XTCArtikelAenderungAutomatik|| Aktualisierung der Artikeldaten, wenn Änderungen vorhanden sind.&lt;br /&gt;
|-&lt;br /&gt;
| XTCShopArtikelCheck|| Prüft die gewählten Kriterien aller Shopartikel. Mögliche Kriterien sind derzeit Shopstatus (aktiv/inaktiv), Warengruppenzuordnung und Katalogzuordnung.&lt;br /&gt;
|-&lt;br /&gt;
| ShopSetPreise|| Aktualisierung der Preislisten basierend auf den im Shop verfügbaren Personen und Artikel.&lt;br /&gt;
|-&lt;br /&gt;
| ShopGetBestellungen|| Importieren neuer Shop-Bestellungen als Aufträge zur weiteren Verarbeitung im OBS.&lt;br /&gt;
|-&lt;br /&gt;
| ShopSetBestand|| Übertragen der Artikelbestände. Wenn kein [[FRMSHOPLAGER|Shop-Lager]] eingetragen ist, wird der OBS-Artikelbestand übertragen.&lt;br /&gt;
|}&lt;br /&gt;
==modified eCommerce 2.0==&lt;br /&gt;
===Allgemein modified eCommerce===&lt;br /&gt;
Diese Schnittstelle unterstützt den Im- und Export von Daten wie folgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Import!! Export&lt;br /&gt;
|-&lt;br /&gt;
| Bestellungen|| Kategorien&lt;br /&gt;
|-&lt;br /&gt;
| Kategorien|| Artikel&lt;br /&gt;
|-&lt;br /&gt;
| Versandmodule|| Preise ([[OBS/Preislisten/FAQ_Preislisten|Preislisten]])&lt;br /&gt;
|-&lt;br /&gt;
| Zahlungsmodule|| Artikelmerkmale&lt;br /&gt;
|-&lt;br /&gt;
| Kundengruppen|| Artikel Cross Selling / Referenzen&lt;br /&gt;
|-&lt;br /&gt;
| Bestellstatus|| ebenfalls gekaufte Artikel&lt;br /&gt;
|-&lt;br /&gt;
| Versanddienstleister|| Lagerbestände&lt;br /&gt;
|-&lt;br /&gt;
| || Tracking-Daten&lt;br /&gt;
|-&lt;br /&gt;
| || Kataloge&lt;br /&gt;
|-&lt;br /&gt;
| || Personen&lt;br /&gt;
|-&lt;br /&gt;
| || Merkzettel&lt;br /&gt;
|}&lt;br /&gt;
Weitere allgemeine Hinweise zum modified eCommerce Shop finden Sie &#039;&#039;&#039;[[OBS/Internet-Shop/modified eCommerce 2.0|hier]]&#039;&#039;&#039;.&lt;br /&gt;
===Einrichtung modified eCommerce===&lt;br /&gt;
Für die Einrichtung wird ein Webserver oder Webspace mit MySQL-Datenbank und FTP-Zugang benötigt.&lt;br /&gt;
===Menü modified eCommerce===&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce 2.0/A_Preise_aktualisieren|A Preise aktualisieren]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce 2.0/B_Preislisten_verwalten|B Preislisten verwalten]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce 2.0/C_Personen_übertragen|C Personen übertragen]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce 2.0/E_Kategorien_verwalten|E Kategorien verwalten]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce 2.0/G_Kataloge_verwalten|G Kataloge verwalten]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce 2.0/I_Merkliste_übertragen|I Merkliste übertragen]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce 2.0/K_Varianten_übertragen|K Varianten übertragen]]&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/modified eCommerce 2.0/L_Artikelvarianten_übertragen|L Artikelvarianten übertragen]]&lt;br /&gt;
* M Referenzarten übertragen&lt;br /&gt;
* [[FRMSHOPLAGER|N Lagerbestände verwalten]]&lt;br /&gt;
* [[#Bestellungen einlesen|U Bestellungen einlesen]]&lt;br /&gt;
* [[#leere Passworte füllen|V leere Passworte füllen]]&lt;br /&gt;
* [[FRMSHOPEINSTELLUNGEN|X Konfiguration]]&lt;br /&gt;
* [[#Protokoll|Z Protokoll]]&lt;br /&gt;
&lt;br /&gt;
==amazon Marketplace==&lt;br /&gt;
siehe [[OBS/Amazon/Auftrag|Amazon]]&lt;br /&gt;
&lt;br /&gt;
==individuell OpenTRANS==&lt;br /&gt;
===Allgemein individuell OpenTRANS===&lt;br /&gt;
Diese Schnittstelle unterstützt den Import von Shop-Bestellungen im Format OpenTRANS 1.0.&lt;br /&gt;
===Einrichtung individuell OpenTRANS===&lt;br /&gt;
Je nach Übertragungsart der Bestelldateien, benötigen wir entweder Zugangsdaten für einen FTP-Server oder ein E-Mail-Konto, um eine automatische Verarbeitung einrichten zu können.&lt;br /&gt;
===Menü individuell OpenTRANS===&lt;br /&gt;
* [[#Bestellungen_einlesen|U Bestellungen einlesen]]&lt;br /&gt;
* [[FRMSHOPEINSTELLUNGEN|X Konfiguration]]&lt;br /&gt;
* [[#Protokoll|Z Protokoll]]&lt;br /&gt;
&lt;br /&gt;
==DoubleM==&lt;br /&gt;
===Allgemein DoubleM===&lt;br /&gt;
Diese Schnittstelle unterstützt den Export von folgenden Daten:&lt;br /&gt;
* Personen&lt;br /&gt;
* Artikel&lt;br /&gt;
* Artikelvarianten&lt;br /&gt;
* Warengruppen&lt;br /&gt;
* Preise&lt;br /&gt;
* Bestellvorlagen&lt;br /&gt;
* Tracking&lt;br /&gt;
===Einrichtung DoubleM===&lt;br /&gt;
Bedarf einer expliziten Freigabe im OBS durch den Support.&lt;br /&gt;
===Menü DoubleM===&lt;br /&gt;
* E Warengruppen verwalten&lt;br /&gt;
* W DoubleM-Export&lt;br /&gt;
* [[FRMSHOPEINSTELLUNGEN|X Konfiguration]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==VIA eBay==&lt;br /&gt;
siehe [[OBS/Kostenpflichtige_Module/eBay-Schnittstelle_(VIA-eBay)|eBay-Schnittstelle]].&lt;br /&gt;
==brShop24==&lt;br /&gt;
{{Achtung|&#039;&#039;Der Nachfolger des VShop 4.0 ist derzeit von Büroring in der Entwicklung. Die Umsetzung einer Schnittstelle ist bereits eingeplant und wird voraussichtlich in der zweiten Jahreshälfte 2018 beginnen.&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
==VendoSys==&lt;br /&gt;
{{Achtung|Die Funktionalitäten sind noch nicht vollständig umgesetzt!}}&lt;br /&gt;
===Allgemein VendoSys===&lt;br /&gt;
Diese Schnittstelle unterstützt den Im- und Export von Daten wie folgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Import!! Export&lt;br /&gt;
|-&lt;br /&gt;
| Bestellungen (Format OpenTRANS 2.1)|| Preise&lt;br /&gt;
|}&lt;br /&gt;
===Einrichtung VendoSys===&lt;br /&gt;
Für die Einrichtung wird ein FTP-Zugang benötigt.&lt;br /&gt;
===Menü VendoSys===&lt;br /&gt;
* [[OBS/Stammdaten/Schnittstellen/Internet-Shop/VendoSys/B_Preislisten_verwalten|B Preislisten verwalten]]&lt;br /&gt;
* [[#Bestellungen einlesen|U Bestellungen einlesen]]&lt;br /&gt;
* [[FRMSHOPEINSTELLUNGEN|X Konfiguration]]&lt;br /&gt;
* [[#Protokoll|Z Protokoll]]&lt;br /&gt;
&lt;br /&gt;
=Shop-Schnittstellen-Verwaltung=&lt;br /&gt;
Als Verwaltung der Shop-Schnittstellen dient die Liste &#039;&#039;Internet-Shops&#039;&#039;, welche über die Schnittstellen (unter Stammdaten) erreicht werden kann. Hier können neue Schnittstellen eingerichtet und vorhandene gelöscht, geändert oder umkonfiguriert werden. Der Umfang des Zugriffs ist jedoch vom Level des Benutzers abhängig.[[file:SchnittstellenShopListe.png|frame|Liste &#039;&#039;Internet-Shops&#039;&#039;]]&lt;br /&gt;
==Neue Shop-Schnittstelle einrichten==&lt;br /&gt;
Eine neue Schnittstelle muss in der Liste Internet-Shops&lt;br /&gt;
Neue Schnittstellen können nur von Benutzern mit Adminrechten (Level 9) für die Shop-Schnittstellen angelegt werden. Ebenso ist eine Änderung des Typs nur für Benutzer mit Adminrechten erlaubt. Die Bezeichnung/Beschreibung der Schnittstelle kann jedoch von jedem Benutzer mit {{F6}} geändert werden.&lt;br /&gt;
==Shop-Schnittstelle konfigurieren==&lt;br /&gt;
Die Einstellungen einer Shop-Schnittstelle sind im Shop-Menü unter &#039;&#039;[[FRMSHOPEINSTELLUNGEN|X Konfiguration]]&#039;&#039; zu finden. Damit eine Schnittstelle reibungslos funktionieren kann, sind je nach Typ verschiedene Einstellungen zu setzen.&lt;br /&gt;
springe zu&lt;br /&gt;
*[[FRMSHOPEINSTELLUNGEN#Konfiguration VShop 3.2|Übersicht für VShop 3.2]]&lt;br /&gt;
*[[FRMSHOPEINSTELLUNGEN#Konfiguration VShop 4.0|Übersicht für VShop 4.0]]&lt;br /&gt;
*[[FRMSHOPEINSTELLUNGEN#Konfiguration Alka|Übersicht für Alka]]&lt;br /&gt;
*[[FRMSHOPEINSTELLUNGEN#Konfiguration Adveo|Übersicht für Adveo]]&lt;br /&gt;
*[[FRMSHOPEINSTELLUNGEN#Konfiguration modified eCommerce|Übersicht für modified eCommerce]]&lt;br /&gt;
*[[FRMSHOPEINSTELLUNGEN#Konfiguration amazon Marketplace|Übersicht für amazon Marketplace]]&lt;br /&gt;
*[[FRMSHOPEINSTELLUNGEN#Konfiguration individuell OpenTRANS|Übersicht für individuell OpenTRANS]]&lt;br /&gt;
*[[FRMSHOPEINSTELLUNGEN#Konfiguration DoubleM|Übersicht für DoubleM]]&lt;br /&gt;
=Allgemeine Menü-Funktionen=&lt;br /&gt;
==Bestellungen einlesen==&lt;br /&gt;
Über diesen Menüpunkt können Sie den Import von Shop-Bestellungen manuell ausführen. Bei erfolgreichem Import finden Sie in der [[OBS/Auftragsbearbeitung/Aufträge/Aufträge|Auftragsliste]] neue Aufträge. Diese Aufträge werden als &#039;&#039;Shop-Aufträge&#039;&#039; markiert und können so über den [[FRMEDITAUFTRAGSBEARBEITUNGFILTER|Listen-Filter]] schnell gefunden werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
{{Hinweis|Nicht alle Schnittstellen unterstützen den Import von Bestellung. Nähere Informationen finden Sie unter den Funktionsumfängen der jeweiligen Schnittstelle.}}&lt;br /&gt;
&lt;br /&gt;
==leere Passworte füllen==&lt;br /&gt;
Dieser Menüpunkt gibt Ihnen die Möglichkeit Passwörter ([[OBS/Stammdaten/Registerkarte:_Kundenumsatz|siehe Feld Internet-Passwort im Personenstamm]]) für Ihre [[OBS/Stammdaten/Personen|Kunden]] zu generieren. Als Grundlage dient dabei eine [[OBS/AUSWERTUNG/Auswertung|Personenauswertung]]. Die Generierung der Passwörter startet, nachdem Sie die [[OBS/AUSWERTUNG/Auswertung|Personenauswertung]] ausgewählt haben.&lt;br /&gt;
{{Hinweis|Es werden keine vorhandenen Passwörter überschrieben!}}&amp;lt;br /&amp;gt;&lt;br /&gt;
==Protokoll==&lt;br /&gt;
Über den Menüpunkt &#039;&#039;Z Protokoll&#039;&#039; des Shops-Menüs erhalten Sie Zugriff auf das Shop-Protokoll. Es werden vorrangig Hinweise zu Fehlern oder Problemen (z. B. eine Bilddatei, die nicht gefunden werden kann) bei Im- und Exporten protokolliert. Über die Konfiguration kann mit Aktivierung des Debugmodus (Schlüssel &#039;&#039;Shop.Debug&#039;&#039;) eine erweiterte Protokollierung aktiviert werden.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Shop-Menü finden Sie über das Menü &#039;&#039;Stammdaten&#039;&#039; unter &#039;&#039;I Schnittstellen&#039;&#039;, &#039;&#039; I - Internet-Shop&#039;&#039; und {{F10}} auf der gewünschten Shop-Schnittstellen.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{{Hinweis|Bitte prüfen Sie das Protokoll regelmäßig! Der Debugmodus ist nicht für jeden Shop-Typ verfügbar und lässt sich standardmäßig nur mit Administrationsrechten aktivieren. Um das Protokoll nicht unnötig zu füllen, sollte der Debugmodus nur aktiviert werden, wenn Datenübertragungen ohne Fehlerprotokollierung unterbrochen wird.}}&lt;br /&gt;
&lt;br /&gt;
=Widgets=&lt;br /&gt;
==Offene Shop-Jobs==&lt;br /&gt;
Manche Funktionen zum Übertragen von Daten lassen sich auch im &amp;quot;Hintergrund&amp;quot;, d. h. durch den OBS-Service, als sogenannte Shop-Jobs ausführen. Dies kann bei der Übertragung größerer Datenmengen hilfreich sein, da Sie so ungestört weiterarbeiten können, während der OBS-Service die Datenübertragung durchführt. Die offenen Shop-Jobs lassen sich mit dem Widget [[OBS/Widgets/Offene Shop Jobs|Offene Shop Jobs]] anzeigen/überwachen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die derzeit möglichen Shop-Jobs sind:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Job!! verfügbare Schnittstellen&lt;br /&gt;
|-&lt;br /&gt;
| Preise aktualisieren|| modified eCommerce, VShop 4.0&lt;br /&gt;
|-&lt;br /&gt;
| Shop-Warengruppen hochladen|| modified eCommerce&lt;br /&gt;
|-&lt;br /&gt;
| Artikel hochladen|| modified eCommerce&lt;br /&gt;
|-&lt;br /&gt;
| Artikelcheck|| modified eCommerce&lt;br /&gt;
|}&lt;br /&gt;
=Automatische Vorgänge=&lt;br /&gt;
Manche Funktionalitäten der Schnittstellen können automatisiert werden. Nicht alle Schnittstellen verfügen jedoch über eine Unterstützung automatischer Vorgänge. Eine Übersicht aller Vorgänge und Erklärungen für die Einrichtung finden Sie [[OBS/Internet-Shop/Einrichtung/Automatiken|&#039;&#039;&#039;hier&#039;&#039;&#039;]].&lt;br /&gt;
&lt;br /&gt;
=Häufig gestellte Fragen=&lt;br /&gt;
Im folgenden finden Sie häufig gestellte Fragen (auch &#039;&#039;&#039;FAQ&#039;&#039;&#039;; kurz aus dem englischen für &amp;quot;&#039;&#039;&#039;frequently asked questions&#039;&#039;&#039;&amp;quot;) mit allgemeinen Themen zu den Shop-Schnittstellen. Zu ein paar sehr spezifische Fragen finden Sie zudem Informationen auf den Seiten der jeweiligen Schnittstelle:&lt;br /&gt;
*[[OBS/Internet-Shop/ShopV4/FAQs|VShop 4.0]]&lt;br /&gt;
*[[OBS/Stammdaten/Schnittstellen/Internet-Shop-xtcModified/FAQs|modified eComerce 1.06]]&lt;br /&gt;
Sollte hier ein Punkt fehlen oder Sie finden zu Ihrer Problemstellung keine Lösung, kontaktieren Sie uns einfach über das [[OBS/System/Ticket-System|OBS Ticketsystem]].&lt;br /&gt;
{{Hinweis|Antworten zu Fragen werden nach Möglichkeit soweit für Schnittstellen zusammengefasst. Im Antwortbereich können Sie daher in der Regel noch zusätzlich die Schnittstelle wählen.}}&lt;br /&gt;
&lt;br /&gt;
==Import Shop-Aufträge==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_shop_auimporteinrichten&lt;br /&gt;
|Wie werden Bestellungen automatisch importiert?&lt;br /&gt;
|Dieser Punkt erklärt Ihnen, wie Sie selbst den Import für eine Schnittstelle einrichten können. Dies ist jedoch relativ allgemein gehalten. Für detaillierte Beschreibungen zu einer Schnittstelle, prüfen Sie bitte die Erklärungen auf der jeweiligen Hilfeseite zur jeweiligen Schnittstelle.&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24#Automatiken|Automatiken brShop24]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;Allgemeine Erklärung:&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Für den Import gibt es eine [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken#Bestellungen_einlesen|Automatik]] für den Scheduler. Dieser wird abhängig von den Einstellungen von den OBS-Diensten &#039;&#039;OBS&#039;&#039; und &#039;&#039;Shop&#039;&#039; regelmäßig ausgeführt.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
In den meisten Schnittstellen wird der Import auf Dateibasis ausgefürt. Das heißt OBS schaut im Shop-Verzeichnis innerhalb der OBS-Verzeichnisstruktur nach, ob Dateien für den Import vorhanden sind und importiert diese. Die Dateien werden in der Verzeichnisstruktur von OBS unter &#039;&#039;&#039;..\data\shop\&amp;lt;Schnittstelle-Nr.&amp;gt;\xml&#039;&#039;&#039; oder &#039;&#039;&#039;..\data\shop\&amp;lt;Schnittstelle-Nr.&amp;gt;\txt&#039;&#039;&#039; erwartet. Falls Sie sich nicht sicher sind, können Sie das Verzeichnis mit der dreistelligen Schnittstellennummer prüfen. Aktuell gibt es nur &#039;&#039;xml&#039;&#039; oder &#039;&#039;txt&#039;&#039; aber niemals beide Verzeichnisse gleichzeitig.&amp;lt;br /&amp;gt;&lt;br /&gt;
{{Hinweis|Die Angabe &#039;&#039;&#039;&amp;lt;Schnittstelle-Nr.&amp;gt;&#039;&#039;&#039; im Pfad muss mit der dreistelligen Nummer aus der Liste der Shop-Schnittstellen (Menü: Stammdaten -&amp;gt; I Schnittstellen -&amp;gt; I Internet-Shop) ersetzt werden.}}&amp;lt;br /&amp;gt;&lt;br /&gt;
Dann wäre noch zu klären, wie die Dateien überhaupt in das Verzeichnis kommen. Abhängig vom Shop-System werden die Dateien in der Regel per E-Mail oder FTP bzw. SFTP zur Verfügung gestellt. Fragen Sie bei Bedarf Ihren Shop-Anbieter, wie Sie die Dateien bekommen (können).&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|abholung_ftp&lt;br /&gt;
|Abholung per FTP&lt;br /&gt;
|Für die Einrichtung benötigen Sie mindestens die Host-URL oder IP des FTP-Servers sowie Benutzername und Passwort. Wie Sie einen FTP-Job einrichten erfahren Sie auf unserer Wiki-Seite [[OBS/Zusatzprogramme/FTP_Jobliste|&#039;&#039;FTP Jobliste&#039;&#039;]].&amp;lt;br /&amp;gt;&lt;br /&gt;
{{Hinweis|Abhängig von der Einrichtung sollte in &#039;&#039;Source-File&#039;&#039; mit einer Maske gearbeitet werden. Bei OpenTRANS-Dateien werden gerne die Typen im Namen verwendet, z. B. Bei Auftragsdateien die englische Bezeichnung &#039;&#039;order&#039;&#039;. Die Dateien erhalten dann oftmals eine laufende Nummer oder eine Zeitstempel für einen eindeutigen Namen. Als Beispiel für eine OpenTRANS-Datei könnten wir also den Namen &#039;&#039;order-12345678.xml annehmen. Als Maske sollte in &#039;&#039;Source-File&#039;&#039; dann &#039;&#039;order-*.xml&#039;&#039; eingetragen werden. Das Sternchen ist dabei ein Platzhalter für beliebige Zeichen.}}&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|abholung_email&lt;br /&gt;
|Abholung per E-Mail&lt;br /&gt;
|Für den Empfang von Dateien per E-Mail muss das Konto im OBS eingerichtet sein und eine Filter-Regel für das Speichern des Anhangs in einem Verzeichnis (&amp;quot;Anhang speichern unter&amp;quot;) eingerichtet werden.&lt;br /&gt;
*[[OBS/Stammdaten/Weitere_Stammdaten/E-Mail_Konten|Einrichten eines E-Mail-Kontos]]&lt;br /&gt;
*[[OBS/Stammdaten/E-Mail/Regeln|Filter-Regel einrichten]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_shop_artikelnichtgefunden&lt;br /&gt;
|Warum kann ein Artikel nicht gefunden werden?&lt;br /&gt;
|{{Vorlage:Klapptext|kopf=&amp;lt;u&amp;gt;modified eCommerce&amp;lt;/u&amp;gt;|inhalt=&lt;br /&gt;
In den modified-Schnittstellen gilt Shop-Artikelnummer gleich OBS-Artikelnummer. Sollte eine Artikelnummer nicht mehr gefunden werden können, dann wurde diese entweder im Shop manuell geändert oder der Artikel im OBS gelöscht.&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&amp;lt;u&amp;gt;andere&amp;lt;/u&amp;gt;|inhalt=&lt;br /&gt;
Für alle anderen Schnittstellen gilt bei der Zuordnung der Artikel in den Auftragspositionen folgende Priorität:&lt;br /&gt;
#[[OBS/Stammdaten/Personen#C1_-_Personenbezogene_Artikel|personenbezogene Artikelnummern]] (Kundennummer muss hierfür gesetzt sein)&lt;br /&gt;
#[[OBS/Weitere_Stammdaten/F10_EK_Lieferanten_für_Artikel|Bestellnummer]] per [[OBS/Stammdaten/Schnittstellen/Internet-Shop/Konfiguration/VShop_4.0#Shop.Lagerlieferant.1|Shop-Lagerlieferanten]]; höchste Prio (Shop.Lagerlieferant.1 &amp;gt; Shop.Lagerlieferant.5) gewinnt&lt;br /&gt;
#OBS-Artikelnummer&lt;br /&gt;
#alternative OBS-Artikelnummer&lt;br /&gt;
Kann eine Artikelnummer aus dem Shop über keinen der vier Wege zugeordnet werden, so wird die übermittelte Artikelbezeichnung in die Positionsbezeichnung 1 übernommen. In Positionsbezeichnung 2 wird &amp;quot;Artikel-Nr. nicht gefunden!&amp;quot; mit der übermittelten Artikelnummer eingetragen.&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_shop_preisefalsch&lt;br /&gt;
|Warum sind die Preise nach dem Import nicht korrekt im Auftrag?&lt;br /&gt;
|Zunächst ist hierfür interessant, welches System die Priorität bei der Bestimmung des Preises hat. Dies wird in der Schnittstelle selbst mit der Einstellung &#039;&#039;&#039;Import.AU.Pos.Preis.Prioritaet&#039;&#039;&#039; festgelegt. Die Einstellung finden Sie für jede Shop-Schnittstelle im Shop-Menü unter &#039;&#039;X Konfiguration&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[image:Faq_shop_preisprio.png]]&lt;br /&gt;
{{Hinweis|Beachten Sie bei mehreren Schnittstelle, auf welcher Schnittstelle (1) Sie sich befinden, wenn Sie mit {{F10}} das Menü öffnen. Zu welcher Schnittstelle ein geöffnetes Menü gehört können Sie in der Überschrift des Fensters (2) sehen.}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&amp;lt;u&amp;gt;Shop hat Preispriorität (Import.AU.Pos.Preis.Prioritaet = J)&amp;lt;/u&amp;gt;|inhalt=&lt;br /&gt;
Der Preis wird aus der Datei übernommen. Ist der Preis im Auftrag nicht korrekt, so sollte geprüft werden, was vom Shop übermittelt wurde. Die Dateien finden Sie im Shop-Verzeichnis in der OBS-Struktur. Unter ..\data\shop\ befinden sich für jede Schnittstelle ein eigener Ordner mit der Schnittstellennummer. In den Ordner gibt es ein Archiv-Verzeichnis (z. B. xml_archiv). In den darin enthaltenen Zip-Archiven werden die Dateien abgelegt.&lt;br /&gt;
}}&lt;br /&gt;
{{Vorlage:Klapptext|kopf=&amp;lt;u&amp;gt;OBS hat Preispriorität (Import.AU.Pos.Preis.Prioritaet = N)&amp;lt;/u&amp;gt;|inhalt=&lt;br /&gt;
Hat OBS die Preispriorität, so führt OBS beim Import eine Preisfindung aus, um den aktuellen Preis für den Kunden zu bestimmen. Hier ist ihr verwendetes Preissystem spannend, denn für das Preissystem &#039;&#039;Preislisten&#039;&#039; gilt, dass nur Preislisten in der Preisfindung beachtet werden, die auch für die jeweilige Schnittstelle freigegeben sind. Das Standard-Preissystem hat diese Möglichkeit der Einschränkung nicht.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Ob eine Preisliste für eine Shop-Schnittstelle freigegeben ist, finden Sie über die Preislistenverwaltung heraus. Zunächst muss die Preisliste selbst in Gültigkeit (Eingabemaske unter Datum Von/Bis) den Wert &#039;&#039;Shop&#039;&#039; vorweisen. Standardmäßig ist für Preislisten &#039;&#039;Shop &amp;amp; Kasse &amp;amp; WaWi&#039;&#039; bei der Anlage vorbelegt. In den weiteren Einstellungen der Liste ({{F10}}) finden Sie den Punkt &#039;&#039;S3 Preislisten für Shop(s) freigeben&#039;&#039;. Wenn Sie diesen Punkt auswählen öffnet sich eine kleines Auswahlfenster mit allen Shop-Schnittstellen. Am Häkchen lässt sich erkennen, ob eine Preisliste einer Schnittstelle zugeordnet ist (Häkchen vorhanden) oder nicht (Häkchen fehlt). Hier können Sie auch entsprechend Häkchen setzen und/oder entfernen. Mit {{F2}} speichern Sie dann die Einstellungen. In den meisten Fällen von falschen Preisen beim Auftragsimport mit Preisfindung ist die fehlende Zuordnung das Problem. Mit dem Preissystem &#039;&#039;Preislisten&#039;&#039; ist nämlich die Preisliste auch für Staffelpreise ausschlaggebend. Ohne eine Preisliste fällt OBS auf den Einzelpreis des Artikels im Artikelstamm zurück. Es wird keine weitere Preisfindung über den Artikelstamm und dort definierten staffelpreisen oder hinterlegten Ek-Lieferanteninformationen ausgeführt.&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Nützliches=&lt;br /&gt;
Im folgenden finden Sie einige nützliche Informationen zum Thema Web-Shop.&lt;br /&gt;
==Änderungen Online-Recht==&lt;br /&gt;
Im folgenden finden Sie Informationen zu Änderungen im Online-Recht. Sollten Sie einen Web-Shop betreiben, raten wir Ihnen sich regelmäßig über anstehende Änderungen zu infomieren, um rechtzeitig nötige Änderungen vornehmen zu können. Andernfalls drohen möglicherweise kostspielige Abmahnungen. Aktuelle Informationen finden Sie im Internet auf diversen Seiten.&amp;lt;br /&amp;gt;&lt;br /&gt;
Linksammlung:&lt;br /&gt;
*[https://www.it-recht-kanzlei.de/ it-recht-kanzlei.de]&lt;br /&gt;
*[http://shopbetreiber-blog.de/ shopbetreiber-blog.de]&lt;br /&gt;
{{Hinweis|Sie werden hier keine Ausführlichen Informationen finden. Entsprechende Quellen werden verlinkt.}}&lt;br /&gt;
{{Achtung|Der Online-Handel birgt im Vergleich zum normalen Einzelhandel einige Tücken. Um hier bei Fragen auf der sicheren Seite zu sein, sollten Sie Kontakt mit einem Anwalt suchen. Die Firma Ernst Bergau GmbH bietet &#039;&#039;&#039;keine&#039;&#039;&#039; Rechtsberatung an!}}&lt;br /&gt;
===Datenschutzgrundverordnung (DSGVO)===&lt;br /&gt;
[[Datei:IT-KANZ_Logo_2015.png|thumb|[https://www.it-recht-kanzlei.de/faq-datenschutz-grundverordnung-e-commerce.html IT-Recht Kanzlei]]]&lt;br /&gt;
Ab dem 25.05.2018 ist die neue Datenschutzgrundverordnung (kurz DSGVO) bindend. Dabei handelt es sich um eine Verordnung der Europäischen Union, um Regeln für die Verarbeitung personenbezogener Daten durch Unternehmen in der EU zu vereinheitlichen. EU-weit soll so der Schutz personenbezogener Daten gewährleistet werden. Die neue Verordnung löst eine alte Verordnung aus dem Jahr 1995 ab. Informationen zur neuen Verordnung finden Sie unter [https://dsgvo-gesetz.de/ dsgvo-gesetz.de].&lt;br /&gt;
&lt;br /&gt;
Eine Übersicht der wichtigsten und gängigsten Fragen im Zusammenhang mit den neuen datenschutzrechtlichen Regelungen finden Sie auf der Seite der [https://www.it-recht-kanzlei.de/faq-datenschutz-grundverordnung-e-commerce.html IT-Recht Kanzlei].&amp;lt;br /&amp;gt;&lt;br /&gt;
Inhalt:&lt;br /&gt;
*Muss ich meine Datenschutzerklärung ändern?&lt;br /&gt;
*Was leistet die künftige Datenschutzerklärung der IT-Recht Kanzlei?&lt;br /&gt;
*Welche Vorgaben der Datenschutz-Grundverordnung sind zusätzlich zur Datenschutzerklärung zu erfüllen?&lt;br /&gt;
*Können Kontaktformulare zukünftig weiter genutzt werden?&lt;br /&gt;
*Können in Zukunft weiterhin Cookies eingesetzt werden?&lt;br /&gt;
*Können Social-Plugins in Zukunft weiter verwendet werden?&lt;br /&gt;
*Was ist zu beachten, wenn Sie Einwilligungen (z.B. für den Newsletterversand) einholen möchten?&lt;br /&gt;
*Bleiben alte Einwilligungen wirksam?&lt;br /&gt;
*Können Daten in Drittländer (= außerhalb der EU) übermittelt werden?&lt;br /&gt;
*Brauchen Online-Händler einen Datenschutzbeauftragten?&lt;br /&gt;
*Was versteht man unter den sog. &amp;quot;Betroffenenrechten“?&lt;br /&gt;
*Können künftig Bonitätsprüfungen durchgeführt werden?&lt;br /&gt;
*Was gilt im Falle einer Zuwiderhandlung gegen die datenschutzrechtlichen Vorschriften der DSGVO?&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62776</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62776"/>
		<updated>2024-02-08T12:50:11Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Vorlage:Kostenpflichtige Module}}&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24&amp;diff=62775</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24&amp;diff=62775"/>
		<updated>2024-02-08T11:53:35Z</updated>

		<summary type="html">&lt;p&gt;Prakti: /* Erklärungen/Funktionen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Kostenpflichtige Module}}&lt;br /&gt;
{{Aktuelles|Die Schnittstelle brShop24 wird 60 Euro monatlich kosten.}}&lt;br /&gt;
Der brShop24 wird von der Genossenschaft [https://www.bueroring.de Büroring eG] entwickelt und angeboten. Diese ECommerce-Lösung soll langfristig den bisher angebotenen VShop 4 Pro ablösen. Für die Anbindung an den brShop24 steht Ihnen eine Schnittstelle basierend auf [https://de.wikipedia.org/wiki/GraphQL GraphQL] zur Verfügung.&lt;br /&gt;
{{Achtung|Für die Preisübertragung wird das kostenpflichtige Modul [[OBS/Kostenpflichtige_Module/Preislisten|Preislisten]] vorausgesetzt!}}&lt;br /&gt;
{{Achtung|Die Schnittstellen für VShop 4 Pro und brShop24 sind nicht kompatibel! Sollten Sie sich also für eine Umstellung Ihres VShop 4 Pro auf das neue System brShop24 entscheiden, so muss dies im OBS ebenfalls umgestellt werden!&amp;lt;br/&amp;gt;Siehe auch die Punkte [[#Umstellung.2FMigration_VShop_4|Umstellung/Migration VShop 4]] und [[#faq_brshop24_allg_parallelbetrieb|FAQ Parallelbetrieb]].}}&lt;br /&gt;
=Funktionsumfang=&lt;br /&gt;
{{Achtung|Die hier aufgeführten Funktionen sind unter Vorbehalt in der aktuellen Version von OBS enthalten, da sich die Funktionalitäten in API und OBS noch ändern können.}}&lt;br /&gt;
Diese Schnittstelle unterstützt den Im- und Export von Daten wie folgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Import!! Export&lt;br /&gt;
|-&lt;br /&gt;
| Auftragsimport (OpenTRANS 1.0)|| Preislisten&lt;br /&gt;
|-&lt;br /&gt;
| Depots + Partner|| Kundengruppen&lt;br /&gt;
|-&lt;br /&gt;
| Anreden|| Ansprechpartner (Benutzer und Personen)&lt;br /&gt;
|-&lt;br /&gt;
| Kundentypen|| Kostenstellen&lt;br /&gt;
|-&lt;br /&gt;
| Kundenqualifikation|| Adressen (Personenstamm)&lt;br /&gt;
|-&lt;br /&gt;
| Job-Informationen (Ergebnis/Protokoll Preispflege)|| Shopping-Listen (Meistgekaufte Artikel/Top-Artikel)&lt;br /&gt;
|-&lt;br /&gt;
| Kundengruppen (Migration)|| &lt;br /&gt;
|-&lt;br /&gt;
| Benutzer (Migration)|| &lt;br /&gt;
|-&lt;br /&gt;
| Kostenstellen (Migration)|| &lt;br /&gt;
|}&lt;br /&gt;
{{Hinweis|Zu Beginn wird es nur Bestelldateien im Format OpenTRANS 1.0 geben. Das neuere Format 2.1 ist aber bereits eingeplant und soll zu einem späteren Zeitpunkt folgen.}}&lt;br /&gt;
==Vergleich zur Schnittstelle VShop 4==&lt;br /&gt;
Stand: 13.10.2022&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!|&lt;br /&gt;
|&#039;&#039;&#039;VShop 4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;brShop24&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Bestellungen importieren&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Kundendaten abfragen&#039;&#039;&#039;&lt;br /&gt;
|ja (&amp;quot;Kunde vorhanden?&amp;quot;)&lt;br /&gt;
|ja (&amp;quot;Kunde vorhanden?&amp;quot; und Migration)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Kundendaten übertragen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|(Kunden-)Gruppe&lt;br /&gt;
|Aus Personennummer (Hauptperson)&lt;br /&gt;
|eigene Verwaltung&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Benutzerkonto&lt;br /&gt;
|aus Person und Ansprechpartner&lt;br /&gt;
|aus Ansprechpartner&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kostenstellen&lt;br /&gt;
|nur als Kostenstelle (mit Budget)&lt;br /&gt;
|Kostenstelle (noch ohne Budget; fehlt im Shop bisher) und Versandadresse&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Shopping-Listen&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Adressen/Adressbuch&lt;br /&gt;
|nein (nur Standardadresse im Benutzerkonto)&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Anreden&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kundentyp&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kundenqualifikation&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Artikelvorlage setzen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Preise übertragen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja (nur Preislisten)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Lager&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Partner&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Warengruppen/Kategorien&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Artikel&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|übertragen&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Abgleich (eigene Artikel)&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Sterne&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;monatliche Kosten&#039;&#039;&#039;&lt;br /&gt;
|20 Euro&lt;br /&gt;
|60 Euro&lt;br /&gt;
|}&lt;br /&gt;
{{Hinweis|Für eine Beschreibung der einzelnen Funktionen siehe [[#Erklärungen/Funktionen|Erklärungen/Funktionen]].}}&lt;br /&gt;
&lt;br /&gt;
==Bekannte Probleme==&lt;br /&gt;
{{Hinweis|Die hier aufgeführten Probleme sollen einen Überblick zum Stand einzelner Funktionen geben, sollten Sie sich dazu entscheiden mit der Schnittstelle zu arbeiten.}}&lt;br /&gt;
{{Achtung|Bei den letzten Tests kam es zu einem Fehler innerhalb der API, durch den die übermittelten Daten nicht korrekt verarbeitet wurden. Der Fehler trat an verschiedenen Stellen auf und konnte nicht reproduziert werden. Aktuell ist dies unter Beobachtung seitens Büroring. Von OBS aus können Sie aktuell die Datenübertragung nur ein zweites Mal ausführen, bis eine Lösung für das Problem gefunden wurde. Bei Preislisten hatte das Problem jedoch noch die Auswirkung, dass die Preislisten danach doppelt vorhanden war (siehe &amp;quot;doppelte Preislisten bei Fehler in Preislistenupdate&amp;quot;).}}&lt;br /&gt;
===Import Bestellungen===&lt;br /&gt;
*;eindeutige Identifikation von Artikeln&lt;br /&gt;
:Nach aktuellem Stand wird nur der aktuelle Katalog von Büroring eingespielt. Sollten jedoch auch von anderen Lieferanten Artikel im Shop verkauft werden, kann es bei den Artikelnummern zu &amp;quot;doppelten&amp;quot; Artikeln kommen. Derzeit fehlt noch die Möglichkeit dies beim Import unterscheiden zu können.&lt;br /&gt;
*;fehlende Kostenstellen&lt;br /&gt;
:In der Auftragsdatei werden nach aktuellem Stand keine Kostenstellen geliefert. Somit kann OBS diese bei der Auftragsgenerierung hinterlegen.&amp;lt;br /&amp;gt;&#039;&#039;Die Kostenstellen werden nach Informationen von Büroring jetzt in die openTRANS-Order übernommen (Stand 25.02.2021).&#039;&#039;&lt;br /&gt;
*;Anzeige in FTP-Eingang&lt;br /&gt;
:Bei aktivierter Anzeige von importierten Bestellungen im FTP-Eingang, wird bisher in der Spalte &#039;&#039;Typ&#039;&#039; nichts angezeigt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003663 (Info 005482).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Personendaten===&lt;br /&gt;
*;Export Kostenstellen Budgets&lt;br /&gt;
:Die Budgetverwaltung wurde bisher noch nicht im brShop24 umgesetzt und steht daher auch in der API noch nicht zur Verfügung.&lt;br /&gt;
*;Anzeige Webshop-Einstellungen&lt;br /&gt;
:Die Anzeige des Kundenstatus funktioniert aktuell nur, wenn die Kundennummer auch in einer Kundengruppe steht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003591 (Info 005378).&#039;&#039;&lt;br /&gt;
*;Übertragung Adressen&lt;br /&gt;
:Die Adressen werden nicht angelegt, weil der Typ mit einem ungültigen Wert an die API übergeben wird.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003587 (Info 005365).&#039;&#039;&lt;br /&gt;
*;Zuordnung Adressen Kundengruppe&lt;br /&gt;
:Adressen werden bei Übertragung auch in der Kundengruppe zugeordnet, obwohl es sich um eine System-Gruppe handelt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003600.&#039;&#039;&lt;br /&gt;
*;Zuordnung Adressen Benutzer&lt;br /&gt;
:Im Benutzer wird eine übertragene Adresse nicht zugeordnet.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003665 (Info 005483).&#039;&#039;&lt;br /&gt;
*;Einfügen neuer Kundengruppen&lt;br /&gt;
:Die Datensätze werden im OBS nicht korrekt angelegt und können daher nicht exportiert werden.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003594 (Infos 005375 und 005393).&#039;&#039;&lt;br /&gt;
*;Adressen aus Kostenstellen&lt;br /&gt;
:Werden bisher nicht übertragen.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003606 (Info 005398). Adressen aus Kostenstellen werden jetzt als Versandadressen hinterlegt&#039;&#039;&lt;br /&gt;
*;Zuordnung Kostenstellen&lt;br /&gt;
:Kostenstellen werden bei Übertragung auch in der Kundengruppe zugeordnet, wenn es sich um eine System-Gruppe handelt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003600. Kostenstellen werden bei Systemgruppen nicht mehr exportiert. Benutzer erhalten einen Hinweis bei Export der Personendaten aus den Webshop-Einstellungen und werden gefragt, ob die Personedaten trotzdem exportiert werden sollen.&#039;&#039;&lt;br /&gt;
*;Im Shop ist der Adresstyp vertauscht&lt;br /&gt;
:Adressen die eigentlich &amp;quot;Postanschrift&amp;quot; haben sollten, bekommen &amp;quot;Postfach Anschrift&amp;quot; und umgekehrt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003684 (Info 005494).&#039;&#039;&lt;br /&gt;
*;Benutzer ist immer Admin&lt;br /&gt;
:Die Funktionalität über Eigenschaft 9011 wurde noch nicht übernommen aus der VShop-Schnittstelle übernommen, da sie dort problembehaftet ist. Die Fehlerhafte Übertragung in dieser Schnittstelle wurde somit vorerst vollständig entfernt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003735 (Info 005548).&#039;&#039;&lt;br /&gt;
*;Benutzer wird nicht angelegt&lt;br /&gt;
:Während des Exports kommt es zu einem Abbruch im OBS und der Export wird nicht vollständig ausgeführt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004061 (Info 005911).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Preise/Preislisten===&lt;br /&gt;
*;Keine Aktualisierung für Kunden mit Kundennummer im Benutzer&lt;br /&gt;
:Preislisten werden nicht erkannt, wenn die Kundennummer nur im Benutzer vorkommt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003592 (Info 005384).&#039;&#039;&lt;br /&gt;
*;doppelte Preislisten bei Fehler in Preislistenupdate&lt;br /&gt;
:Tritt in der Aktualisierung der Preislistenkopfdaten ein Fehler auf, so wird die Preisliste ein weitere Mal angelegt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003630 (Info 005452).&#039;&#039;&lt;br /&gt;
*;Keine Aktualisierung der Kopfdaten&lt;br /&gt;
:Wurden im OBS Änderungen an den Kopfdaten (Name, Prio, Gültigkeitszeitraum) vorgenommen, konnte es passieren, dass diese nicht in den Shop übertragen wurden.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003703 (Info 005515).&#039;&#039;&lt;br /&gt;
*;Preise löschen verlängert die Laufzeit der Preispflege&lt;br /&gt;
:Beim Löschen von Preisen könnte es vorkommen, dass sich die zu löschenden Datensätze nicht korrekt aus der Liste genommen wurden, auch wenn der Datensatz aus dem Shop entfernt wurde. Dadurch versucht OBS diese Datensätze bei jedem folgenden Durchlauf der Preispflege zu löschen, was fehlschlägt, da die Datensätze ja schon gelöscht sind.&amp;lt;br /&amp;gt;&#039;&#039;Behoben voraussichtlich mit Version 003833 (Info 005664).&#039;&#039;&lt;br /&gt;
*;Preise werden nicht bei allen Preislisten aktualisiert&lt;br /&gt;
:Eine Prüfung war fehlerhaft und konnte die Aktualisierung der Preise für eine Preisliste verhindern.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003911 (Info 005733).&#039;&#039;&lt;br /&gt;
*;Preislisten, welche über Preisgruppen einem Kunden zugeordnet sind, werden im Shop nicht in Kundengruppen und Benutzern hinterlegt&lt;br /&gt;
:An einer Stelle in der Abfrage der Zuordnungen sind die Nummern für Preisgruppe und Preisliste vertauscht. Der Fehler betrifft eigene Preislisten, welche über Preisgruppen zugeordnet sind. Für die Standard-Preislisten VK1 bis VK9 kommt es nicht zu diesem Fehler, da hier die Nummern identisch sind.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003959 (Info 005785).&#039;&#039;&lt;br /&gt;
*;Zuordnungen von Preislisten sind fehlerhaft&lt;br /&gt;
:Unter bestimmten Umständen (Löschen ganzer Preislisten oder Kunde ohne verbleibende Preisliste) kann es im OBS zu einem Problem mit der Verwaltung der Zuordnungen im Shop kommen. Zuordnungen können dabei erhalten bleiben oder werden nicht angelegt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005847).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bestellvorlagen/Shoppinglisten===&lt;br /&gt;
*;Anzeige im Shop&lt;br /&gt;
:Nach aktuellem Stand können die Bestellvorlagen, die es auch schon für den VShop 4 exportiert werden konnten, in den brShop24 übertragen werden. Die Anzeige im Frontend (Ansicht für den Kunden) ist jedoch noch nicht umgesetzt. Sie können aktuell nur über den Admibereich prüfen, ob die Bestellvorlagen im Shop angekommen sind.&amp;lt;br /&amp;gt;&#039;&#039;Im Frontend werden die Listen jetzt angezeigt (Stand: 09.11.2021).&#039;&#039;&lt;br /&gt;
*;Generierung Shoppinglisten&lt;br /&gt;
:Durch einen Fehler in der Erkennung des Brüroring Zentrallagers konnte die falsche Lager-ID gezogen werden. Dadurch wurden die Artikel nicht korrekt identifiziert und die Shoppinglisten wurden nicht generiert.&amp;lt;br /&amp;gt;&#039;&#039;Behoben vorraussichtlich mit Version 003815 (Info 005654).&#039;&#039;&lt;br /&gt;
*;Zuordnung Shoppinglisten&lt;br /&gt;
:In der Übertragung wurden Shoppinglisten nicht in Benutzern zugeordnet. Dadurch sehen insbesondere bei allgemeinen Kundengruppen (z. B. registrierte Kunden) Benutzer die von OBS für eine Kundennummer erstellten und übertragenen Shoppinglisten nicht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003832 (Info 005663).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Migration===&lt;br /&gt;
*;Auswahl eines vorhandenen Ansprechpartner für Zuordnung zu einem Shop-Benutzer schlägt fehlt&lt;br /&gt;
:Die Auswahl verhält sich als würde keine Datensatz ausgewählt werden und setzt daher die Zuordnung nicht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005845).&#039;&#039;&lt;br /&gt;
*;Aus einem Benutzerkonto kann kein Ansprechpartner angelegt werden&lt;br /&gt;
:Es kann bei der Übernahme der Daten zu einem SQL-Fehler im OBS kommen, welcher die Anlage der Daten verhindert.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005844).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Kosten=&lt;br /&gt;
*;Einrichtung&lt;br /&gt;
:Sie können die Schnittstelle vom OBS-Support einrichten lassen oder dies selbst erledigen. Informationen zu den nötigen Daten/Angaben für eine Einrichtung finden Sie im nächsten Punkt [[#Installation.2FEinrichtung|Installation/Einrichtung]].&amp;lt;br /&amp;gt;Wenn Sie eine Einrichtung durch den OBS-Support wünschen, wird dies &#039;&#039;&#039;einmalig nach Aufwand&#039;&#039;&#039; abgerechnet.&lt;br /&gt;
*;Nutzung Schnittstelle&lt;br /&gt;
:Für den Einsatz wird pro aktiver brShop24-Schnittstelle &#039;&#039;&#039;monatlich 60 Euro&#039;&#039;&#039; berechnet.&lt;br /&gt;
&lt;br /&gt;
=Installation/Einrichtung=&lt;br /&gt;
Für die Einrichtung werden Angaben zur API-Anbindung und FTP-Zugangsdaten für die Abholung der Auftragsdateien benötigt. Außerdem muss OBS für die Preispflege auf das kostenpflichtige [[OBS/Kostenpflichtige_Module/Preislisten|OBS-Modul Preislisten]] umgestellt worden sein.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Für eine genaue Auflistung der benötigten Informationen und eine Beschreibung der Einrichtung lesen Sie bitte die Seite zur [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|&amp;lt;u&amp;gt;Einrichtung einer brShop24-Schnittstelle&amp;lt;/u&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
=Mit der Schnittstelle Starten=&lt;br /&gt;
==Daten migrieren==&lt;br /&gt;
Sofern Sie in der Vergangenheit einen VShop 4 verwendet haben und die Daten vom Büroring in den neuen brShop24 migriert wurden, empfehlen wir nach Abschluss der Einrichtung eine [[Kostenpflichtige_Module/Internet-Shop/brShop24/Migration|Datenmigration im OBS]] durchzuführen (siehe auch [[#Umstellung.2FMigration_VShop_4|Umstellung/Migration VShop 4]]). Dabei werden die vom VShop 4 migrierten Kundendaten aus dem Shop ausgelesen und in OBS importiert. OBS versucht die importierten Daten anschließend mit den Stammdaten zu verknüpfen und erstellt für die Kunden die Webshop-Einstellungen und gibt die Ansprechpartner frei.&amp;lt;br /&amp;gt;&lt;br /&gt;
Nach den Kundengruppen und Benutzern werden die Kostenstellen eingelesen und versucht den Einträgen im OBS zuzuordnen. Der Anzeigename (Shop) einer Kostenstelle muss dabei mit der Bezeichnung der Kostenstelle übereinstimmen und innerhalb der Kundengruppe eindeutig sein.&lt;br /&gt;
{{Achtung|Die Zuordnung läuft automatisiert und kann einige Minuten in Anspruch nehmen! Sollte der Vorgang abbrechen, können Sie die Migration erneut starten. Die Zuordnung erfolgt nur für Daten, die eindeutig identifiziert werden konnten!}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Außerdem werden die Preislisten aus den im Shop vorhandenen Preislisten ermittelt und für die Schnittstelle freigegeben. Die Preislisten werden stattdessen nach erfolgreicher Zuordnung im Shop geleert und neu befüllt. So sind die Preisdaten auch gleich auf dem aktuellen Stand und für die spätere Aktualisierung sind die Daten im OBS entsprechend vorbereitet.&lt;br /&gt;
{{Achtung|Es findet &#039;&#039;&#039;keine&#039;&#039;&#039; Verknüpfung mit den Preisdaten im OBS statt, da der vollständige Abgleich aller einzelnen Preisdaten zu lange dauern würde!}}&lt;br /&gt;
&lt;br /&gt;
==Datenhoheit==&lt;br /&gt;
Es gibt einige spezifische Daten im Shop, die von OBS nicht angefasst werden (dürfen). Das betrifft z. B. die Standard-Kundengruppen des brShop24. Für OBS-Daten hat jedoch OBS die Datenhoheit. Im Shop können Sie dies an den verfügbaren Funktionen (Bild 1) erkennen. Die von OBS gepflegten Daten werden über die API (Bild 2) angelegt und haben bei den Funktionen statt dem Stift-Symbol (Daten bearbeiten) nur ein Auge-Symbol (Daten ansehen).&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;200px&amp;quot;&amp;gt;&lt;br /&gt;
File:Br24_admin_datenoptionen.jpg|Bild 1: Funktionen|alt=Funktionen&lt;br /&gt;
File:Br24_admin_letzte_aend.jpg|Bild 2: Letzte Änderung|alt=letzte Änderung&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Umstellung/Migration VShop 4=&lt;br /&gt;
Nach aktuellem Stand wird für Kunden mit VShop 4 vom Büroring eine Migration des bestehenden VShop 4 auf den neuen brShop24 durchgeführt. Dabei soll auch gewählt werden können, welche Daten bei der Migration übernommen werden. Wie dies genau aussieht, müssen Sie jedoch mit dem Büroring klären. Es gibt jedoch auch einige Punkte, die Sie bei der Migration für die Umstellung im OBS bedenken müssen.&lt;br /&gt;
*;Neue API&lt;br /&gt;
:Im Unterschied zum VShop 4 läuft die Schnittstelle zum brShop24 über eine API. OBS dies bringt ein paar Einschränkungen für die migrierten Daten mit sich. Es ist OBS nicht möglich die Daten wiederzufinden, die von OBS zuvor in den VShop 4 übertragen wurden. Wie sich dies auf die Pflege von Daten auswirkt, muss noch in Erfahrung gebracht werden, da im Testsystem keine migrierten Daten zur Verfügung stehen.&lt;br /&gt;
*;Besonderheit Preisdaten&lt;br /&gt;
:OBS arbeitet in Schnittstelle über eine sogenannte API-ID, also eine Identifikationsnnummer speziell für die neue API. OBS kann nur Preisdaten verändern, die auch über die API in den Shop übertragen wurden. Wir empfehlen daher die Preisdaten möglichst über OBS zu pflegen und nicht migrieren zu lassen.&lt;br /&gt;
*;Schnittstelle im OBS&lt;br /&gt;
:Die Schnittstelle muss im OBS freigeschaltet und eingerichtet werden (siehe dazu [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|Einrichtung]]). Dies kann bereits vor der Migration geschehen. Bedenken Sie jedoch, dass die Aufträge erst importiert werden können, nachdem die Schnittstelle eingerichtet wurde. Gebe Sie uns also rechtzeitig Bescheid, damit wir die Schnittstelle freigeben können. Die Einrichtung kann auf Wunsch von uns kostenpflichtig übernommen werden.{{Hinweis|Die Freischaltung der Schnittstelle hat auch eine Anpassung des Vertrags zur Folge. Bitte beachten Sie, dass die Schnittstelle brShop24 mit 60 Euro statt 20 Euro berechnet wird.}}&lt;br /&gt;
*;Modul Preislisten&lt;br /&gt;
:Für den brShop24 wird das Modul [[OBS/Kostenpflichtige_Module/Preislisten|Preislisten]] für die Pflege von Preisen über die Schnittstelle vorrausgesetzt. Sollten Sie dieses Modul noch nicht nutzen, so müsste dies zuvor eingerichtet werden, wenn Sie Preise aus OBS in den Shop übertragen möchten. Die Einrichtung des Moduls kann mehrere Stunden in Anspruch nehmen. Wir empfehlen die Umstellung vor der Migration durchzuführen, da dies die Arbeitsweise mit Artikelpreisen verändert. Eine Schulung wird ebenfalls empfohlen.&lt;br /&gt;
*;Migration Freigaben OBS VShop 4 nach brShop24 (siehe [[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]])&lt;br /&gt;
:Über das Shop-Menü können Kundengruppen und Benutzer mit dem OBS-Personenstamm abgeglichen werden. Im Personenstamm werden dann für gefundene Datensätze Webshop-Einstelungen angelegt. Ansprechpartnern, welchen ein Benutzer eindeutig zugeordnet werden konnten, erhalten die Eigenschaft 9013 und die Zuordnung zur Schnittstelle. Sollte die eindeutige Zuordnung ohne Benutzername erfolgt sein, so wird auch der Benutzername im Ansprechpartner hinterlegt. Außerdem werden die Preislisten mit dem Shop abgeglichen, freigegeben und übertragen.{{Hinweis|Es ist nicht möglich die Passwörter auszulesen. Diese können also nicht im Ansprechpartner hinterlegt werden. Sollten Sie zu einem späteren Zeitpunkt die den Benutzer im Shop aktualisieren wollen, müssten diesen zuvor ein Passwort gegeben werden, sollte noch keines vorhanden sein.}}{{Achtung|Damit die Migration auch die Kundendaten verknüpfen kann, muss diese Funktionalität im Shop freigeschaltet sein. Wenden Sie sich hierzu an den Support des Büroring.}}&lt;br /&gt;
==Ablauf einer Umstellung==&lt;br /&gt;
Für gewöhnlich richtet Büroring zunächst einen Shop zu Testzwecken ein. Sie erhalten danach die API-Daten, mit denen die Schnittstelle eingerichtet werden kann (siehe dazu [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|Einrichtung]]). Sie können jetzt die Schnittstelle testen und wenn Fragen oder Probleme geklärt sind, dem Büroring die Freigabe für den Live-Betrieb erteilen. Der Shop wird daraufhin zurückgesetzt. Dies muss im OBS ebenfalls passieren. Informieren Sie dazu den Support per Ticket oder E-Mail (siehe dazu auch [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung#Vorwort|Vorwort Einrichtung]]).&lt;br /&gt;
&lt;br /&gt;
=Menü=&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_b&lt;br /&gt;
|B Preislisten verwalten&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen#Preislisten_verwalten|Preislistenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_f&lt;br /&gt;
|F Kundengruppen&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Kundengruppen_verwalten|Kundengruppenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_i&lt;br /&gt;
|I Bestellvorlagen verwalten&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Shoppinglisten_übertragen|Shoplistenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_m&lt;br /&gt;
|M Migration&lt;br /&gt;
|Startet die [[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]] der Daten. Dabei werden die aktuellen Kudnendaten (Gruppen und Benutzer) eingelesen und im Personestamm, sofern automatisiert möglich, Webshop-Einstellungen angelegt und Ansprechpartner zugeordnet.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_t&lt;br /&gt;
|T Jobinformationen&lt;br /&gt;
|Die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Jobinformationen|Jobinformationen]] sind ein Protokoll des Shops für die Preispflege-Jobs. Diese werden beim Exportieren der Preise angelegt. Über diesen Menüpunkt können Sie die bisherigen Job-Protokolle einsehen. Beim Einlesen der Jobinformationen werden aufgetretene Fehler verarbeitet.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_u&lt;br /&gt;
|U Bestellungen einlesen&lt;br /&gt;
|Liest die vorhanden Bestelldateien aus dem Shop-Verzeichnis ein. Für den automatischen Import siehe [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken#Bestellungen_einlesen|Automatiken: Bestellungen einlesen]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_w&lt;br /&gt;
|W Definitionen importieren&lt;br /&gt;
|Über diesen Menüpunkt können Sie alle für OBS-Relevanten Definitionen zur Vorbereitung der Datenexporte importieren. Dies umfasst aktuell folgende Definitionen:&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/DepotPartner|Depots/Lager mit Partner]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Anreden#brShop24|Anreden]]&lt;br /&gt;
*Kundentypen (u. a. B2B, B2C)&lt;br /&gt;
*Kundenqualifikation (u. a. neuer Kunden, Stammkunde)&lt;br /&gt;
Für den automatischen Import siehe [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken#Definitionen_importieren|Automatiken: Definitionen importieren]].&lt;br /&gt;
{{Hinweis|Diese Definitionen spielen an verschiedenen Stellen eine wichtige Rolle. Sollten Sie die Definitionen noch nicht importiert und vor einem Datenexport zugeordnet haben, funktionert entweder der Datenexport nicht oder es werden Standardwerte verwendet.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_x&lt;br /&gt;
|X Konfiguration&lt;br /&gt;
|Öffnet die [[OBS/Stammdaten/Schnittstellen/Internet-Shop/Konfiguration|Konfiguration]] der Schnittstellen. Hier können die Einstellungen der Schnittstelle angepasst werden.{{Hinweis|Um Anpassungen vorzunehmen wird für die meisten Einstellungen ein Level von 3 oder 5 benötigt. Es ist möglich dieses Level anzupassen, auch kann ein Benutzer für die Schnittstelle ein abweichendes Benutzerlevel erhalten. Melden Sie sich bei Bedarf per [[OBS/System/Ticket-System|OBS Ticketsystem]] beim OBS-Support.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_y&lt;br /&gt;
|Y Testumgebung&lt;br /&gt;
|Öffnet eine Testumgebung, um die Anbindung zu testen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_z&lt;br /&gt;
|Z Protokoll&lt;br /&gt;
|Über den Menüpunkt &#039;&#039;Z Protokoll&#039;&#039; des Shops-Menüs erhalten Sie Zugriff auf das Shop-Protokoll. Es werden vorrangig Hinweise zu Fehlern oder Problemen bei Im- und Exporten protokolliert. Über die Konfiguration kann mit Aktivierung des Debugmodus (Schlüssel &#039;&#039;Shop.Debug&#039;&#039;) eine erweiterte Protokollierung aktiviert werden. Dafür benötigt ein Benutzer jedoch Administrationsrechte (Level 9) für die Schnittstelle.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Zuordnungen=&lt;br /&gt;
Zuordnungen von Stammdaten wie Lieferanten und Mengeneinheiten nehmen Sie über den Shop-Menüpunkt &#039;&#039;X Konfiguration&#039;&#039; vor. In der Kofigurationsliste gelangen Sie über {{Key|F8 Zuord}} ins Zuordnungsmenü.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Aktuelle Menüpunkte:&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Anreden#brShop24|A Anreden]]&lt;br /&gt;
:Liste für im Shop definierte Anreden. Hier können Sie die OBS-Anreden mit den Shop-Anreden verknüpfen. Relevant für den Export von Personen. Ohne Zuordnung werden Personen ohne Anrede exportiert.&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Einheiten#brShop24|E Einheiten]]&lt;br /&gt;
:Liste für im Shop definierte Mengeneinheiten. Ordenen Sie hier die im OBS verwendeten Mengeneinheiten zu. {{Hinweis|Relevant für eigene Artikel. Ist eine verwendete OBS-Mengeneinheit nicht zugeordnet, so wird beim Export die Einheit &amp;quot;ST&amp;quot; (Stück) für den jeweiligen Artikel verwendet.}}&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/DepotPartner|L Lager und Lagerlieferanten]]&lt;br /&gt;
:Definierte Depots und Partner des Shops. Partnern können Sie einem OBS-Lieferanten zuordnen und die Lager entsprechend auf Pflege Büroring oder als eigene Artikel definieren. Relevant für den Export von Preisen, Shoppinglisten (Bestellvorlagen) und eigene Artikel.&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Zusatz/Artikeltausch|T Artikeltausch]]&lt;br /&gt;
:Greift beim Auftragsimport. Austauschen bestimmter Referenznummern gegen einen festgeschrieben Artikel z. B. für Pauschalen.&lt;br /&gt;
&lt;br /&gt;
=Erklärungen/Funktionen=&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Kundengruppen_verwalten|Kundengruppen verwalten]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Personen_übertragen|Kunden übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen|Preise übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Eigene_Artikel_übertragen|eigene Artikel übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Shoppinglisten_übertragen|Shoppinglisten übertragen (z. B. Bestellvorlagen)]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Jobinformationen|Jobinformationen]]&lt;br /&gt;
*[[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]]&lt;br /&gt;
*[[Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink|PDF-Druck Artikellink]]&lt;br /&gt;
&lt;br /&gt;
=Häufig gestellte Fragen (FAQ)=&lt;br /&gt;
==Daten Allgemein==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_alg_datennichtangezeigt&lt;br /&gt;
|Ich habe Daten aus OBS übertragen, diese werden jedoch nicht angezeigt?&lt;br /&gt;
|Je nach Art der Daten gelten verschiedene Voraussetzungen. Prüfen Sie daher, ob die Voraussetzungen gegeben sind oder bereits der Export scheitert. Entsprechende Hinweise finden Sie in den Hilfetexten zum jeweiligen Datenexport oder im Protokoll.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Sind die Daten im Shop angelegt dort jedoch z. B. über den Adminbereich gelöscht worden, so können die Daten dort wiederhergestellt werden. Prüfen Sie daher auch, ob dies auf die Daten zutrifft.&amp;lt;br /&amp;gt;Dazu sei noch angemerkt, dass es im brShop24 zwei Varianten zum Löschen von Daten gibt:&lt;br /&gt;
#Soft-Delete&amp;lt;br /&amp;gt;d.h. ein Datensatz kann mit einem Löschkennzeichen markiert werden, so dass dieser zur Not auch wieder hergestellt werden kann (ähnlich dem Papierkorb unter Windows). Dies wird so z. B. im Adminbereich angewendet.&lt;br /&gt;
#Hard-Delete&amp;lt;br /&amp;gt;d.h. der Datensatz wird auch physikalisch vom Datenträger gelöscht, ist somit aus dem System entfernt und kann nicht wieder hergestellt werden. Dies gilt für die API.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_alg_apisuperadmin&lt;br /&gt;
|Kann ich die Datensätze aus der API im Adminbereich ändern/editieren?&lt;br /&gt;
|Standardmäßig wird eine Bearbeitung von Datensätzen, welche per API gepflegt werden, im Shop gesperrt. Sie haben jedoch die Möglichkeit die Bearbeitung in Ihrem Adminbenutzer freizugeben. Die Administratoren finden Sie im Menü des Adminbereichs unter &#039;&#039;Administration&#039;&#039; im Unterpunkt &#039;&#039;Administratoren&#039;&#039;. Suchen Sie in der Liste Ihren Benutzer (Benutzername steht oben rechts) und öffnen Sie die Eingabemaske. Im Reiter &#039;&#039;Einstellungen&#039;&#039; setzen Sie dann as Häkchen bei &#039;&#039;API Super-Administrator?&#039;&#039;.&lt;br /&gt;
{{Hinweis|Da es Daten/Felder gibt, welche OBS nicht über die API pflegen kann. Kann es durchaus sinnvoll sein, dies zu aktivieren. Dies betrifft z. B. Berechtigungen für Kundengruppen wie die Sortimentsfreigabe.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Preise/Preislisten==&lt;br /&gt;
Siehe [[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen#Häufig_gestellt_Fragen_(FAQ)|FAQ Preisexport brShop24]].&lt;br /&gt;
&lt;br /&gt;
==Import Auftragsdateien (OpenTRANS)==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_imp_auftrag&lt;br /&gt;
|Warum wird die Kostenstelle nicht übernommen?&lt;br /&gt;
|Die Referenz auf die Kostenestelle muss in der Auftragsdatei im Element COST_CATEGORY_ID enthalten sein. OBS erwartet hier die vollständige Bezeichnung der [[OBS/Stammdaten/Personen#B2_-_Kostenstellen|Kostenstelle]]. Ist die Kostenstelle in der Auftragsdatei nicht enthalten oder die Referenz stimmt mit keiner Kostenstelle überein, so wird im Import keine Kostenstelle übernommen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Migration VShop4==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_allg_parallelbetrieb&lt;br /&gt;
|Können im OBS brShop24 und VShop4 parallel betrieben werden?&lt;br /&gt;
|Ja, es ist mögliche beide Shops im OBS zu verwalten. OBS ist in der Lage mehrere Schnittstellen, auch des gleichen Typs, zu verwalten. Die Schnittstellen arbeiten unabhängig voneinander. Nach unseren Informationen ist ein Parallelbetrieb seitens Büroring jedoch nicht gewünscht, da die Daten des VShop 4 nachträglich nicht oder nur mit deutlich größerem Aufwand in den brShop24 migriert werden könnten. Eventuell gehen Ihnen hier also Daten verloren, wenn der VShop4 abgeschaltet wird. Der brShop24 würde nach der Migration also Ihren aktuellen VShop 4 ersetzen. Bei Fragen zu dem Thema wenden Sie sich bitte an den Support des Büroring.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24&amp;diff=62774</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24&amp;diff=62774"/>
		<updated>2024-02-08T11:52:58Z</updated>

		<summary type="html">&lt;p&gt;Prakti: /* Erklärungen/Funktionen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Kostenpflichtige Module}}&lt;br /&gt;
{{Aktuelles|Die Schnittstelle brShop24 wird 60 Euro monatlich kosten.}}&lt;br /&gt;
Der brShop24 wird von der Genossenschaft [https://www.bueroring.de Büroring eG] entwickelt und angeboten. Diese ECommerce-Lösung soll langfristig den bisher angebotenen VShop 4 Pro ablösen. Für die Anbindung an den brShop24 steht Ihnen eine Schnittstelle basierend auf [https://de.wikipedia.org/wiki/GraphQL GraphQL] zur Verfügung.&lt;br /&gt;
{{Achtung|Für die Preisübertragung wird das kostenpflichtige Modul [[OBS/Kostenpflichtige_Module/Preislisten|Preislisten]] vorausgesetzt!}}&lt;br /&gt;
{{Achtung|Die Schnittstellen für VShop 4 Pro und brShop24 sind nicht kompatibel! Sollten Sie sich also für eine Umstellung Ihres VShop 4 Pro auf das neue System brShop24 entscheiden, so muss dies im OBS ebenfalls umgestellt werden!&amp;lt;br/&amp;gt;Siehe auch die Punkte [[#Umstellung.2FMigration_VShop_4|Umstellung/Migration VShop 4]] und [[#faq_brshop24_allg_parallelbetrieb|FAQ Parallelbetrieb]].}}&lt;br /&gt;
=Funktionsumfang=&lt;br /&gt;
{{Achtung|Die hier aufgeführten Funktionen sind unter Vorbehalt in der aktuellen Version von OBS enthalten, da sich die Funktionalitäten in API und OBS noch ändern können.}}&lt;br /&gt;
Diese Schnittstelle unterstützt den Im- und Export von Daten wie folgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Import!! Export&lt;br /&gt;
|-&lt;br /&gt;
| Auftragsimport (OpenTRANS 1.0)|| Preislisten&lt;br /&gt;
|-&lt;br /&gt;
| Depots + Partner|| Kundengruppen&lt;br /&gt;
|-&lt;br /&gt;
| Anreden|| Ansprechpartner (Benutzer und Personen)&lt;br /&gt;
|-&lt;br /&gt;
| Kundentypen|| Kostenstellen&lt;br /&gt;
|-&lt;br /&gt;
| Kundenqualifikation|| Adressen (Personenstamm)&lt;br /&gt;
|-&lt;br /&gt;
| Job-Informationen (Ergebnis/Protokoll Preispflege)|| Shopping-Listen (Meistgekaufte Artikel/Top-Artikel)&lt;br /&gt;
|-&lt;br /&gt;
| Kundengruppen (Migration)|| &lt;br /&gt;
|-&lt;br /&gt;
| Benutzer (Migration)|| &lt;br /&gt;
|-&lt;br /&gt;
| Kostenstellen (Migration)|| &lt;br /&gt;
|}&lt;br /&gt;
{{Hinweis|Zu Beginn wird es nur Bestelldateien im Format OpenTRANS 1.0 geben. Das neuere Format 2.1 ist aber bereits eingeplant und soll zu einem späteren Zeitpunkt folgen.}}&lt;br /&gt;
==Vergleich zur Schnittstelle VShop 4==&lt;br /&gt;
Stand: 13.10.2022&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!|&lt;br /&gt;
|&#039;&#039;&#039;VShop 4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;brShop24&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Bestellungen importieren&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Kundendaten abfragen&#039;&#039;&#039;&lt;br /&gt;
|ja (&amp;quot;Kunde vorhanden?&amp;quot;)&lt;br /&gt;
|ja (&amp;quot;Kunde vorhanden?&amp;quot; und Migration)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Kundendaten übertragen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|(Kunden-)Gruppe&lt;br /&gt;
|Aus Personennummer (Hauptperson)&lt;br /&gt;
|eigene Verwaltung&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Benutzerkonto&lt;br /&gt;
|aus Person und Ansprechpartner&lt;br /&gt;
|aus Ansprechpartner&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kostenstellen&lt;br /&gt;
|nur als Kostenstelle (mit Budget)&lt;br /&gt;
|Kostenstelle (noch ohne Budget; fehlt im Shop bisher) und Versandadresse&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Shopping-Listen&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Adressen/Adressbuch&lt;br /&gt;
|nein (nur Standardadresse im Benutzerkonto)&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Anreden&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kundentyp&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kundenqualifikation&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Artikelvorlage setzen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Preise übertragen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja (nur Preislisten)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Lager&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Partner&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Warengruppen/Kategorien&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Artikel&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|übertragen&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Abgleich (eigene Artikel)&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Sterne&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;monatliche Kosten&#039;&#039;&#039;&lt;br /&gt;
|20 Euro&lt;br /&gt;
|60 Euro&lt;br /&gt;
|}&lt;br /&gt;
{{Hinweis|Für eine Beschreibung der einzelnen Funktionen siehe [[#Erklärungen/Funktionen|Erklärungen/Funktionen]].}}&lt;br /&gt;
&lt;br /&gt;
==Bekannte Probleme==&lt;br /&gt;
{{Hinweis|Die hier aufgeführten Probleme sollen einen Überblick zum Stand einzelner Funktionen geben, sollten Sie sich dazu entscheiden mit der Schnittstelle zu arbeiten.}}&lt;br /&gt;
{{Achtung|Bei den letzten Tests kam es zu einem Fehler innerhalb der API, durch den die übermittelten Daten nicht korrekt verarbeitet wurden. Der Fehler trat an verschiedenen Stellen auf und konnte nicht reproduziert werden. Aktuell ist dies unter Beobachtung seitens Büroring. Von OBS aus können Sie aktuell die Datenübertragung nur ein zweites Mal ausführen, bis eine Lösung für das Problem gefunden wurde. Bei Preislisten hatte das Problem jedoch noch die Auswirkung, dass die Preislisten danach doppelt vorhanden war (siehe &amp;quot;doppelte Preislisten bei Fehler in Preislistenupdate&amp;quot;).}}&lt;br /&gt;
===Import Bestellungen===&lt;br /&gt;
*;eindeutige Identifikation von Artikeln&lt;br /&gt;
:Nach aktuellem Stand wird nur der aktuelle Katalog von Büroring eingespielt. Sollten jedoch auch von anderen Lieferanten Artikel im Shop verkauft werden, kann es bei den Artikelnummern zu &amp;quot;doppelten&amp;quot; Artikeln kommen. Derzeit fehlt noch die Möglichkeit dies beim Import unterscheiden zu können.&lt;br /&gt;
*;fehlende Kostenstellen&lt;br /&gt;
:In der Auftragsdatei werden nach aktuellem Stand keine Kostenstellen geliefert. Somit kann OBS diese bei der Auftragsgenerierung hinterlegen.&amp;lt;br /&amp;gt;&#039;&#039;Die Kostenstellen werden nach Informationen von Büroring jetzt in die openTRANS-Order übernommen (Stand 25.02.2021).&#039;&#039;&lt;br /&gt;
*;Anzeige in FTP-Eingang&lt;br /&gt;
:Bei aktivierter Anzeige von importierten Bestellungen im FTP-Eingang, wird bisher in der Spalte &#039;&#039;Typ&#039;&#039; nichts angezeigt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003663 (Info 005482).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Personendaten===&lt;br /&gt;
*;Export Kostenstellen Budgets&lt;br /&gt;
:Die Budgetverwaltung wurde bisher noch nicht im brShop24 umgesetzt und steht daher auch in der API noch nicht zur Verfügung.&lt;br /&gt;
*;Anzeige Webshop-Einstellungen&lt;br /&gt;
:Die Anzeige des Kundenstatus funktioniert aktuell nur, wenn die Kundennummer auch in einer Kundengruppe steht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003591 (Info 005378).&#039;&#039;&lt;br /&gt;
*;Übertragung Adressen&lt;br /&gt;
:Die Adressen werden nicht angelegt, weil der Typ mit einem ungültigen Wert an die API übergeben wird.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003587 (Info 005365).&#039;&#039;&lt;br /&gt;
*;Zuordnung Adressen Kundengruppe&lt;br /&gt;
:Adressen werden bei Übertragung auch in der Kundengruppe zugeordnet, obwohl es sich um eine System-Gruppe handelt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003600.&#039;&#039;&lt;br /&gt;
*;Zuordnung Adressen Benutzer&lt;br /&gt;
:Im Benutzer wird eine übertragene Adresse nicht zugeordnet.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003665 (Info 005483).&#039;&#039;&lt;br /&gt;
*;Einfügen neuer Kundengruppen&lt;br /&gt;
:Die Datensätze werden im OBS nicht korrekt angelegt und können daher nicht exportiert werden.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003594 (Infos 005375 und 005393).&#039;&#039;&lt;br /&gt;
*;Adressen aus Kostenstellen&lt;br /&gt;
:Werden bisher nicht übertragen.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003606 (Info 005398). Adressen aus Kostenstellen werden jetzt als Versandadressen hinterlegt&#039;&#039;&lt;br /&gt;
*;Zuordnung Kostenstellen&lt;br /&gt;
:Kostenstellen werden bei Übertragung auch in der Kundengruppe zugeordnet, wenn es sich um eine System-Gruppe handelt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003600. Kostenstellen werden bei Systemgruppen nicht mehr exportiert. Benutzer erhalten einen Hinweis bei Export der Personendaten aus den Webshop-Einstellungen und werden gefragt, ob die Personedaten trotzdem exportiert werden sollen.&#039;&#039;&lt;br /&gt;
*;Im Shop ist der Adresstyp vertauscht&lt;br /&gt;
:Adressen die eigentlich &amp;quot;Postanschrift&amp;quot; haben sollten, bekommen &amp;quot;Postfach Anschrift&amp;quot; und umgekehrt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003684 (Info 005494).&#039;&#039;&lt;br /&gt;
*;Benutzer ist immer Admin&lt;br /&gt;
:Die Funktionalität über Eigenschaft 9011 wurde noch nicht übernommen aus der VShop-Schnittstelle übernommen, da sie dort problembehaftet ist. Die Fehlerhafte Übertragung in dieser Schnittstelle wurde somit vorerst vollständig entfernt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003735 (Info 005548).&#039;&#039;&lt;br /&gt;
*;Benutzer wird nicht angelegt&lt;br /&gt;
:Während des Exports kommt es zu einem Abbruch im OBS und der Export wird nicht vollständig ausgeführt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004061 (Info 005911).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Preise/Preislisten===&lt;br /&gt;
*;Keine Aktualisierung für Kunden mit Kundennummer im Benutzer&lt;br /&gt;
:Preislisten werden nicht erkannt, wenn die Kundennummer nur im Benutzer vorkommt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003592 (Info 005384).&#039;&#039;&lt;br /&gt;
*;doppelte Preislisten bei Fehler in Preislistenupdate&lt;br /&gt;
:Tritt in der Aktualisierung der Preislistenkopfdaten ein Fehler auf, so wird die Preisliste ein weitere Mal angelegt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003630 (Info 005452).&#039;&#039;&lt;br /&gt;
*;Keine Aktualisierung der Kopfdaten&lt;br /&gt;
:Wurden im OBS Änderungen an den Kopfdaten (Name, Prio, Gültigkeitszeitraum) vorgenommen, konnte es passieren, dass diese nicht in den Shop übertragen wurden.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003703 (Info 005515).&#039;&#039;&lt;br /&gt;
*;Preise löschen verlängert die Laufzeit der Preispflege&lt;br /&gt;
:Beim Löschen von Preisen könnte es vorkommen, dass sich die zu löschenden Datensätze nicht korrekt aus der Liste genommen wurden, auch wenn der Datensatz aus dem Shop entfernt wurde. Dadurch versucht OBS diese Datensätze bei jedem folgenden Durchlauf der Preispflege zu löschen, was fehlschlägt, da die Datensätze ja schon gelöscht sind.&amp;lt;br /&amp;gt;&#039;&#039;Behoben voraussichtlich mit Version 003833 (Info 005664).&#039;&#039;&lt;br /&gt;
*;Preise werden nicht bei allen Preislisten aktualisiert&lt;br /&gt;
:Eine Prüfung war fehlerhaft und konnte die Aktualisierung der Preise für eine Preisliste verhindern.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003911 (Info 005733).&#039;&#039;&lt;br /&gt;
*;Preislisten, welche über Preisgruppen einem Kunden zugeordnet sind, werden im Shop nicht in Kundengruppen und Benutzern hinterlegt&lt;br /&gt;
:An einer Stelle in der Abfrage der Zuordnungen sind die Nummern für Preisgruppe und Preisliste vertauscht. Der Fehler betrifft eigene Preislisten, welche über Preisgruppen zugeordnet sind. Für die Standard-Preislisten VK1 bis VK9 kommt es nicht zu diesem Fehler, da hier die Nummern identisch sind.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003959 (Info 005785).&#039;&#039;&lt;br /&gt;
*;Zuordnungen von Preislisten sind fehlerhaft&lt;br /&gt;
:Unter bestimmten Umständen (Löschen ganzer Preislisten oder Kunde ohne verbleibende Preisliste) kann es im OBS zu einem Problem mit der Verwaltung der Zuordnungen im Shop kommen. Zuordnungen können dabei erhalten bleiben oder werden nicht angelegt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005847).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bestellvorlagen/Shoppinglisten===&lt;br /&gt;
*;Anzeige im Shop&lt;br /&gt;
:Nach aktuellem Stand können die Bestellvorlagen, die es auch schon für den VShop 4 exportiert werden konnten, in den brShop24 übertragen werden. Die Anzeige im Frontend (Ansicht für den Kunden) ist jedoch noch nicht umgesetzt. Sie können aktuell nur über den Admibereich prüfen, ob die Bestellvorlagen im Shop angekommen sind.&amp;lt;br /&amp;gt;&#039;&#039;Im Frontend werden die Listen jetzt angezeigt (Stand: 09.11.2021).&#039;&#039;&lt;br /&gt;
*;Generierung Shoppinglisten&lt;br /&gt;
:Durch einen Fehler in der Erkennung des Brüroring Zentrallagers konnte die falsche Lager-ID gezogen werden. Dadurch wurden die Artikel nicht korrekt identifiziert und die Shoppinglisten wurden nicht generiert.&amp;lt;br /&amp;gt;&#039;&#039;Behoben vorraussichtlich mit Version 003815 (Info 005654).&#039;&#039;&lt;br /&gt;
*;Zuordnung Shoppinglisten&lt;br /&gt;
:In der Übertragung wurden Shoppinglisten nicht in Benutzern zugeordnet. Dadurch sehen insbesondere bei allgemeinen Kundengruppen (z. B. registrierte Kunden) Benutzer die von OBS für eine Kundennummer erstellten und übertragenen Shoppinglisten nicht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003832 (Info 005663).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Migration===&lt;br /&gt;
*;Auswahl eines vorhandenen Ansprechpartner für Zuordnung zu einem Shop-Benutzer schlägt fehlt&lt;br /&gt;
:Die Auswahl verhält sich als würde keine Datensatz ausgewählt werden und setzt daher die Zuordnung nicht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005845).&#039;&#039;&lt;br /&gt;
*;Aus einem Benutzerkonto kann kein Ansprechpartner angelegt werden&lt;br /&gt;
:Es kann bei der Übernahme der Daten zu einem SQL-Fehler im OBS kommen, welcher die Anlage der Daten verhindert.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005844).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Kosten=&lt;br /&gt;
*;Einrichtung&lt;br /&gt;
:Sie können die Schnittstelle vom OBS-Support einrichten lassen oder dies selbst erledigen. Informationen zu den nötigen Daten/Angaben für eine Einrichtung finden Sie im nächsten Punkt [[#Installation.2FEinrichtung|Installation/Einrichtung]].&amp;lt;br /&amp;gt;Wenn Sie eine Einrichtung durch den OBS-Support wünschen, wird dies &#039;&#039;&#039;einmalig nach Aufwand&#039;&#039;&#039; abgerechnet.&lt;br /&gt;
*;Nutzung Schnittstelle&lt;br /&gt;
:Für den Einsatz wird pro aktiver brShop24-Schnittstelle &#039;&#039;&#039;monatlich 60 Euro&#039;&#039;&#039; berechnet.&lt;br /&gt;
&lt;br /&gt;
=Installation/Einrichtung=&lt;br /&gt;
Für die Einrichtung werden Angaben zur API-Anbindung und FTP-Zugangsdaten für die Abholung der Auftragsdateien benötigt. Außerdem muss OBS für die Preispflege auf das kostenpflichtige [[OBS/Kostenpflichtige_Module/Preislisten|OBS-Modul Preislisten]] umgestellt worden sein.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Für eine genaue Auflistung der benötigten Informationen und eine Beschreibung der Einrichtung lesen Sie bitte die Seite zur [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|&amp;lt;u&amp;gt;Einrichtung einer brShop24-Schnittstelle&amp;lt;/u&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
=Mit der Schnittstelle Starten=&lt;br /&gt;
==Daten migrieren==&lt;br /&gt;
Sofern Sie in der Vergangenheit einen VShop 4 verwendet haben und die Daten vom Büroring in den neuen brShop24 migriert wurden, empfehlen wir nach Abschluss der Einrichtung eine [[Kostenpflichtige_Module/Internet-Shop/brShop24/Migration|Datenmigration im OBS]] durchzuführen (siehe auch [[#Umstellung.2FMigration_VShop_4|Umstellung/Migration VShop 4]]). Dabei werden die vom VShop 4 migrierten Kundendaten aus dem Shop ausgelesen und in OBS importiert. OBS versucht die importierten Daten anschließend mit den Stammdaten zu verknüpfen und erstellt für die Kunden die Webshop-Einstellungen und gibt die Ansprechpartner frei.&amp;lt;br /&amp;gt;&lt;br /&gt;
Nach den Kundengruppen und Benutzern werden die Kostenstellen eingelesen und versucht den Einträgen im OBS zuzuordnen. Der Anzeigename (Shop) einer Kostenstelle muss dabei mit der Bezeichnung der Kostenstelle übereinstimmen und innerhalb der Kundengruppe eindeutig sein.&lt;br /&gt;
{{Achtung|Die Zuordnung läuft automatisiert und kann einige Minuten in Anspruch nehmen! Sollte der Vorgang abbrechen, können Sie die Migration erneut starten. Die Zuordnung erfolgt nur für Daten, die eindeutig identifiziert werden konnten!}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Außerdem werden die Preislisten aus den im Shop vorhandenen Preislisten ermittelt und für die Schnittstelle freigegeben. Die Preislisten werden stattdessen nach erfolgreicher Zuordnung im Shop geleert und neu befüllt. So sind die Preisdaten auch gleich auf dem aktuellen Stand und für die spätere Aktualisierung sind die Daten im OBS entsprechend vorbereitet.&lt;br /&gt;
{{Achtung|Es findet &#039;&#039;&#039;keine&#039;&#039;&#039; Verknüpfung mit den Preisdaten im OBS statt, da der vollständige Abgleich aller einzelnen Preisdaten zu lange dauern würde!}}&lt;br /&gt;
&lt;br /&gt;
==Datenhoheit==&lt;br /&gt;
Es gibt einige spezifische Daten im Shop, die von OBS nicht angefasst werden (dürfen). Das betrifft z. B. die Standard-Kundengruppen des brShop24. Für OBS-Daten hat jedoch OBS die Datenhoheit. Im Shop können Sie dies an den verfügbaren Funktionen (Bild 1) erkennen. Die von OBS gepflegten Daten werden über die API (Bild 2) angelegt und haben bei den Funktionen statt dem Stift-Symbol (Daten bearbeiten) nur ein Auge-Symbol (Daten ansehen).&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;200px&amp;quot;&amp;gt;&lt;br /&gt;
File:Br24_admin_datenoptionen.jpg|Bild 1: Funktionen|alt=Funktionen&lt;br /&gt;
File:Br24_admin_letzte_aend.jpg|Bild 2: Letzte Änderung|alt=letzte Änderung&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Umstellung/Migration VShop 4=&lt;br /&gt;
Nach aktuellem Stand wird für Kunden mit VShop 4 vom Büroring eine Migration des bestehenden VShop 4 auf den neuen brShop24 durchgeführt. Dabei soll auch gewählt werden können, welche Daten bei der Migration übernommen werden. Wie dies genau aussieht, müssen Sie jedoch mit dem Büroring klären. Es gibt jedoch auch einige Punkte, die Sie bei der Migration für die Umstellung im OBS bedenken müssen.&lt;br /&gt;
*;Neue API&lt;br /&gt;
:Im Unterschied zum VShop 4 läuft die Schnittstelle zum brShop24 über eine API. OBS dies bringt ein paar Einschränkungen für die migrierten Daten mit sich. Es ist OBS nicht möglich die Daten wiederzufinden, die von OBS zuvor in den VShop 4 übertragen wurden. Wie sich dies auf die Pflege von Daten auswirkt, muss noch in Erfahrung gebracht werden, da im Testsystem keine migrierten Daten zur Verfügung stehen.&lt;br /&gt;
*;Besonderheit Preisdaten&lt;br /&gt;
:OBS arbeitet in Schnittstelle über eine sogenannte API-ID, also eine Identifikationsnnummer speziell für die neue API. OBS kann nur Preisdaten verändern, die auch über die API in den Shop übertragen wurden. Wir empfehlen daher die Preisdaten möglichst über OBS zu pflegen und nicht migrieren zu lassen.&lt;br /&gt;
*;Schnittstelle im OBS&lt;br /&gt;
:Die Schnittstelle muss im OBS freigeschaltet und eingerichtet werden (siehe dazu [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|Einrichtung]]). Dies kann bereits vor der Migration geschehen. Bedenken Sie jedoch, dass die Aufträge erst importiert werden können, nachdem die Schnittstelle eingerichtet wurde. Gebe Sie uns also rechtzeitig Bescheid, damit wir die Schnittstelle freigeben können. Die Einrichtung kann auf Wunsch von uns kostenpflichtig übernommen werden.{{Hinweis|Die Freischaltung der Schnittstelle hat auch eine Anpassung des Vertrags zur Folge. Bitte beachten Sie, dass die Schnittstelle brShop24 mit 60 Euro statt 20 Euro berechnet wird.}}&lt;br /&gt;
*;Modul Preislisten&lt;br /&gt;
:Für den brShop24 wird das Modul [[OBS/Kostenpflichtige_Module/Preislisten|Preislisten]] für die Pflege von Preisen über die Schnittstelle vorrausgesetzt. Sollten Sie dieses Modul noch nicht nutzen, so müsste dies zuvor eingerichtet werden, wenn Sie Preise aus OBS in den Shop übertragen möchten. Die Einrichtung des Moduls kann mehrere Stunden in Anspruch nehmen. Wir empfehlen die Umstellung vor der Migration durchzuführen, da dies die Arbeitsweise mit Artikelpreisen verändert. Eine Schulung wird ebenfalls empfohlen.&lt;br /&gt;
*;Migration Freigaben OBS VShop 4 nach brShop24 (siehe [[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]])&lt;br /&gt;
:Über das Shop-Menü können Kundengruppen und Benutzer mit dem OBS-Personenstamm abgeglichen werden. Im Personenstamm werden dann für gefundene Datensätze Webshop-Einstelungen angelegt. Ansprechpartnern, welchen ein Benutzer eindeutig zugeordnet werden konnten, erhalten die Eigenschaft 9013 und die Zuordnung zur Schnittstelle. Sollte die eindeutige Zuordnung ohne Benutzername erfolgt sein, so wird auch der Benutzername im Ansprechpartner hinterlegt. Außerdem werden die Preislisten mit dem Shop abgeglichen, freigegeben und übertragen.{{Hinweis|Es ist nicht möglich die Passwörter auszulesen. Diese können also nicht im Ansprechpartner hinterlegt werden. Sollten Sie zu einem späteren Zeitpunkt die den Benutzer im Shop aktualisieren wollen, müssten diesen zuvor ein Passwort gegeben werden, sollte noch keines vorhanden sein.}}{{Achtung|Damit die Migration auch die Kundendaten verknüpfen kann, muss diese Funktionalität im Shop freigeschaltet sein. Wenden Sie sich hierzu an den Support des Büroring.}}&lt;br /&gt;
==Ablauf einer Umstellung==&lt;br /&gt;
Für gewöhnlich richtet Büroring zunächst einen Shop zu Testzwecken ein. Sie erhalten danach die API-Daten, mit denen die Schnittstelle eingerichtet werden kann (siehe dazu [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|Einrichtung]]). Sie können jetzt die Schnittstelle testen und wenn Fragen oder Probleme geklärt sind, dem Büroring die Freigabe für den Live-Betrieb erteilen. Der Shop wird daraufhin zurückgesetzt. Dies muss im OBS ebenfalls passieren. Informieren Sie dazu den Support per Ticket oder E-Mail (siehe dazu auch [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung#Vorwort|Vorwort Einrichtung]]).&lt;br /&gt;
&lt;br /&gt;
=Menü=&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_b&lt;br /&gt;
|B Preislisten verwalten&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen#Preislisten_verwalten|Preislistenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_f&lt;br /&gt;
|F Kundengruppen&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Kundengruppen_verwalten|Kundengruppenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_i&lt;br /&gt;
|I Bestellvorlagen verwalten&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Shoppinglisten_übertragen|Shoplistenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_m&lt;br /&gt;
|M Migration&lt;br /&gt;
|Startet die [[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]] der Daten. Dabei werden die aktuellen Kudnendaten (Gruppen und Benutzer) eingelesen und im Personestamm, sofern automatisiert möglich, Webshop-Einstellungen angelegt und Ansprechpartner zugeordnet.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_t&lt;br /&gt;
|T Jobinformationen&lt;br /&gt;
|Die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Jobinformationen|Jobinformationen]] sind ein Protokoll des Shops für die Preispflege-Jobs. Diese werden beim Exportieren der Preise angelegt. Über diesen Menüpunkt können Sie die bisherigen Job-Protokolle einsehen. Beim Einlesen der Jobinformationen werden aufgetretene Fehler verarbeitet.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_u&lt;br /&gt;
|U Bestellungen einlesen&lt;br /&gt;
|Liest die vorhanden Bestelldateien aus dem Shop-Verzeichnis ein. Für den automatischen Import siehe [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken#Bestellungen_einlesen|Automatiken: Bestellungen einlesen]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_w&lt;br /&gt;
|W Definitionen importieren&lt;br /&gt;
|Über diesen Menüpunkt können Sie alle für OBS-Relevanten Definitionen zur Vorbereitung der Datenexporte importieren. Dies umfasst aktuell folgende Definitionen:&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/DepotPartner|Depots/Lager mit Partner]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Anreden#brShop24|Anreden]]&lt;br /&gt;
*Kundentypen (u. a. B2B, B2C)&lt;br /&gt;
*Kundenqualifikation (u. a. neuer Kunden, Stammkunde)&lt;br /&gt;
Für den automatischen Import siehe [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken#Definitionen_importieren|Automatiken: Definitionen importieren]].&lt;br /&gt;
{{Hinweis|Diese Definitionen spielen an verschiedenen Stellen eine wichtige Rolle. Sollten Sie die Definitionen noch nicht importiert und vor einem Datenexport zugeordnet haben, funktionert entweder der Datenexport nicht oder es werden Standardwerte verwendet.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_x&lt;br /&gt;
|X Konfiguration&lt;br /&gt;
|Öffnet die [[OBS/Stammdaten/Schnittstellen/Internet-Shop/Konfiguration|Konfiguration]] der Schnittstellen. Hier können die Einstellungen der Schnittstelle angepasst werden.{{Hinweis|Um Anpassungen vorzunehmen wird für die meisten Einstellungen ein Level von 3 oder 5 benötigt. Es ist möglich dieses Level anzupassen, auch kann ein Benutzer für die Schnittstelle ein abweichendes Benutzerlevel erhalten. Melden Sie sich bei Bedarf per [[OBS/System/Ticket-System|OBS Ticketsystem]] beim OBS-Support.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_y&lt;br /&gt;
|Y Testumgebung&lt;br /&gt;
|Öffnet eine Testumgebung, um die Anbindung zu testen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_z&lt;br /&gt;
|Z Protokoll&lt;br /&gt;
|Über den Menüpunkt &#039;&#039;Z Protokoll&#039;&#039; des Shops-Menüs erhalten Sie Zugriff auf das Shop-Protokoll. Es werden vorrangig Hinweise zu Fehlern oder Problemen bei Im- und Exporten protokolliert. Über die Konfiguration kann mit Aktivierung des Debugmodus (Schlüssel &#039;&#039;Shop.Debug&#039;&#039;) eine erweiterte Protokollierung aktiviert werden. Dafür benötigt ein Benutzer jedoch Administrationsrechte (Level 9) für die Schnittstelle.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Zuordnungen=&lt;br /&gt;
Zuordnungen von Stammdaten wie Lieferanten und Mengeneinheiten nehmen Sie über den Shop-Menüpunkt &#039;&#039;X Konfiguration&#039;&#039; vor. In der Kofigurationsliste gelangen Sie über {{Key|F8 Zuord}} ins Zuordnungsmenü.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Aktuelle Menüpunkte:&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Anreden#brShop24|A Anreden]]&lt;br /&gt;
:Liste für im Shop definierte Anreden. Hier können Sie die OBS-Anreden mit den Shop-Anreden verknüpfen. Relevant für den Export von Personen. Ohne Zuordnung werden Personen ohne Anrede exportiert.&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Einheiten#brShop24|E Einheiten]]&lt;br /&gt;
:Liste für im Shop definierte Mengeneinheiten. Ordenen Sie hier die im OBS verwendeten Mengeneinheiten zu. {{Hinweis|Relevant für eigene Artikel. Ist eine verwendete OBS-Mengeneinheit nicht zugeordnet, so wird beim Export die Einheit &amp;quot;ST&amp;quot; (Stück) für den jeweiligen Artikel verwendet.}}&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/DepotPartner|L Lager und Lagerlieferanten]]&lt;br /&gt;
:Definierte Depots und Partner des Shops. Partnern können Sie einem OBS-Lieferanten zuordnen und die Lager entsprechend auf Pflege Büroring oder als eigene Artikel definieren. Relevant für den Export von Preisen, Shoppinglisten (Bestellvorlagen) und eigene Artikel.&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Zusatz/Artikeltausch|T Artikeltausch]]&lt;br /&gt;
:Greift beim Auftragsimport. Austauschen bestimmter Referenznummern gegen einen festgeschrieben Artikel z. B. für Pauschalen.&lt;br /&gt;
&lt;br /&gt;
=Erklärungen/Funktionen=&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Kundengruppen_verwalten|Kundengruppen verwalten]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Personen_übertragen|Kunden übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen|Preise übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Eigene_Artikel_übertragen|eigene Artikel übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Shoppinglisten_übertragen|Shoppinglisten übertragen (z. B. Bestellvorlagen)]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Jobinformationen|Jobinformationen]]&lt;br /&gt;
*[[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]]&lt;br /&gt;
&lt;br /&gt;
=Häufig gestellte Fragen (FAQ)=&lt;br /&gt;
==Daten Allgemein==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_alg_datennichtangezeigt&lt;br /&gt;
|Ich habe Daten aus OBS übertragen, diese werden jedoch nicht angezeigt?&lt;br /&gt;
|Je nach Art der Daten gelten verschiedene Voraussetzungen. Prüfen Sie daher, ob die Voraussetzungen gegeben sind oder bereits der Export scheitert. Entsprechende Hinweise finden Sie in den Hilfetexten zum jeweiligen Datenexport oder im Protokoll.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Sind die Daten im Shop angelegt dort jedoch z. B. über den Adminbereich gelöscht worden, so können die Daten dort wiederhergestellt werden. Prüfen Sie daher auch, ob dies auf die Daten zutrifft.&amp;lt;br /&amp;gt;Dazu sei noch angemerkt, dass es im brShop24 zwei Varianten zum Löschen von Daten gibt:&lt;br /&gt;
#Soft-Delete&amp;lt;br /&amp;gt;d.h. ein Datensatz kann mit einem Löschkennzeichen markiert werden, so dass dieser zur Not auch wieder hergestellt werden kann (ähnlich dem Papierkorb unter Windows). Dies wird so z. B. im Adminbereich angewendet.&lt;br /&gt;
#Hard-Delete&amp;lt;br /&amp;gt;d.h. der Datensatz wird auch physikalisch vom Datenträger gelöscht, ist somit aus dem System entfernt und kann nicht wieder hergestellt werden. Dies gilt für die API.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_alg_apisuperadmin&lt;br /&gt;
|Kann ich die Datensätze aus der API im Adminbereich ändern/editieren?&lt;br /&gt;
|Standardmäßig wird eine Bearbeitung von Datensätzen, welche per API gepflegt werden, im Shop gesperrt. Sie haben jedoch die Möglichkeit die Bearbeitung in Ihrem Adminbenutzer freizugeben. Die Administratoren finden Sie im Menü des Adminbereichs unter &#039;&#039;Administration&#039;&#039; im Unterpunkt &#039;&#039;Administratoren&#039;&#039;. Suchen Sie in der Liste Ihren Benutzer (Benutzername steht oben rechts) und öffnen Sie die Eingabemaske. Im Reiter &#039;&#039;Einstellungen&#039;&#039; setzen Sie dann as Häkchen bei &#039;&#039;API Super-Administrator?&#039;&#039;.&lt;br /&gt;
{{Hinweis|Da es Daten/Felder gibt, welche OBS nicht über die API pflegen kann. Kann es durchaus sinnvoll sein, dies zu aktivieren. Dies betrifft z. B. Berechtigungen für Kundengruppen wie die Sortimentsfreigabe.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Preise/Preislisten==&lt;br /&gt;
Siehe [[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen#Häufig_gestellt_Fragen_(FAQ)|FAQ Preisexport brShop24]].&lt;br /&gt;
&lt;br /&gt;
==Import Auftragsdateien (OpenTRANS)==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_imp_auftrag&lt;br /&gt;
|Warum wird die Kostenstelle nicht übernommen?&lt;br /&gt;
|Die Referenz auf die Kostenestelle muss in der Auftragsdatei im Element COST_CATEGORY_ID enthalten sein. OBS erwartet hier die vollständige Bezeichnung der [[OBS/Stammdaten/Personen#B2_-_Kostenstellen|Kostenstelle]]. Ist die Kostenstelle in der Auftragsdatei nicht enthalten oder die Referenz stimmt mit keiner Kostenstelle überein, so wird im Import keine Kostenstelle übernommen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Migration VShop4==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_allg_parallelbetrieb&lt;br /&gt;
|Können im OBS brShop24 und VShop4 parallel betrieben werden?&lt;br /&gt;
|Ja, es ist mögliche beide Shops im OBS zu verwalten. OBS ist in der Lage mehrere Schnittstellen, auch des gleichen Typs, zu verwalten. Die Schnittstellen arbeiten unabhängig voneinander. Nach unseren Informationen ist ein Parallelbetrieb seitens Büroring jedoch nicht gewünscht, da die Daten des VShop 4 nachträglich nicht oder nur mit deutlich größerem Aufwand in den brShop24 migriert werden könnten. Eventuell gehen Ihnen hier also Daten verloren, wenn der VShop4 abgeschaltet wird. Der brShop24 würde nach der Migration also Ihren aktuellen VShop 4 ersetzen. Bei Fragen zu dem Thema wenden Sie sich bitte an den Support des Büroring.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62773</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62773"/>
		<updated>2024-02-08T11:48:57Z</updated>

		<summary type="html">&lt;p&gt;Prakti: Die Seite wurde geleert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62772</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24/PDF-Druck_Artikellink&amp;diff=62772"/>
		<updated>2024-02-08T11:48:36Z</updated>

		<summary type="html">&lt;p&gt;Prakti: Die Seite wurde neu angelegt: „Erklärung PDF-Druck Artikellink“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Erklärung PDF-Druck Artikellink&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24&amp;diff=62771</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24&amp;diff=62771"/>
		<updated>2024-02-08T11:47:36Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Kostenpflichtige Module}}&lt;br /&gt;
{{Aktuelles|Die Schnittstelle brShop24 wird 60 Euro monatlich kosten.}}&lt;br /&gt;
Der brShop24 wird von der Genossenschaft [https://www.bueroring.de Büroring eG] entwickelt und angeboten. Diese ECommerce-Lösung soll langfristig den bisher angebotenen VShop 4 Pro ablösen. Für die Anbindung an den brShop24 steht Ihnen eine Schnittstelle basierend auf [https://de.wikipedia.org/wiki/GraphQL GraphQL] zur Verfügung.&lt;br /&gt;
{{Achtung|Für die Preisübertragung wird das kostenpflichtige Modul [[OBS/Kostenpflichtige_Module/Preislisten|Preislisten]] vorausgesetzt!}}&lt;br /&gt;
{{Achtung|Die Schnittstellen für VShop 4 Pro und brShop24 sind nicht kompatibel! Sollten Sie sich also für eine Umstellung Ihres VShop 4 Pro auf das neue System brShop24 entscheiden, so muss dies im OBS ebenfalls umgestellt werden!&amp;lt;br/&amp;gt;Siehe auch die Punkte [[#Umstellung.2FMigration_VShop_4|Umstellung/Migration VShop 4]] und [[#faq_brshop24_allg_parallelbetrieb|FAQ Parallelbetrieb]].}}&lt;br /&gt;
=Funktionsumfang=&lt;br /&gt;
{{Achtung|Die hier aufgeführten Funktionen sind unter Vorbehalt in der aktuellen Version von OBS enthalten, da sich die Funktionalitäten in API und OBS noch ändern können.}}&lt;br /&gt;
Diese Schnittstelle unterstützt den Im- und Export von Daten wie folgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Import!! Export&lt;br /&gt;
|-&lt;br /&gt;
| Auftragsimport (OpenTRANS 1.0)|| Preislisten&lt;br /&gt;
|-&lt;br /&gt;
| Depots + Partner|| Kundengruppen&lt;br /&gt;
|-&lt;br /&gt;
| Anreden|| Ansprechpartner (Benutzer und Personen)&lt;br /&gt;
|-&lt;br /&gt;
| Kundentypen|| Kostenstellen&lt;br /&gt;
|-&lt;br /&gt;
| Kundenqualifikation|| Adressen (Personenstamm)&lt;br /&gt;
|-&lt;br /&gt;
| Job-Informationen (Ergebnis/Protokoll Preispflege)|| Shopping-Listen (Meistgekaufte Artikel/Top-Artikel)&lt;br /&gt;
|-&lt;br /&gt;
| Kundengruppen (Migration)|| &lt;br /&gt;
|-&lt;br /&gt;
| Benutzer (Migration)|| &lt;br /&gt;
|-&lt;br /&gt;
| Kostenstellen (Migration)|| &lt;br /&gt;
|}&lt;br /&gt;
{{Hinweis|Zu Beginn wird es nur Bestelldateien im Format OpenTRANS 1.0 geben. Das neuere Format 2.1 ist aber bereits eingeplant und soll zu einem späteren Zeitpunkt folgen.}}&lt;br /&gt;
==Vergleich zur Schnittstelle VShop 4==&lt;br /&gt;
Stand: 13.10.2022&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!|&lt;br /&gt;
|&#039;&#039;&#039;VShop 4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;brShop24&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Bestellungen importieren&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Kundendaten abfragen&#039;&#039;&#039;&lt;br /&gt;
|ja (&amp;quot;Kunde vorhanden?&amp;quot;)&lt;br /&gt;
|ja (&amp;quot;Kunde vorhanden?&amp;quot; und Migration)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Kundendaten übertragen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|(Kunden-)Gruppe&lt;br /&gt;
|Aus Personennummer (Hauptperson)&lt;br /&gt;
|eigene Verwaltung&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Benutzerkonto&lt;br /&gt;
|aus Person und Ansprechpartner&lt;br /&gt;
|aus Ansprechpartner&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kostenstellen&lt;br /&gt;
|nur als Kostenstelle (mit Budget)&lt;br /&gt;
|Kostenstelle (noch ohne Budget; fehlt im Shop bisher) und Versandadresse&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Shopping-Listen&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Adressen/Adressbuch&lt;br /&gt;
|nein (nur Standardadresse im Benutzerkonto)&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Anreden&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kundentyp&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kundenqualifikation&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Artikelvorlage setzen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Preise übertragen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja (nur Preislisten)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Lager&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Partner&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Warengruppen/Kategorien&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Artikel&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|übertragen&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Abgleich (eigene Artikel)&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Sterne&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;monatliche Kosten&#039;&#039;&#039;&lt;br /&gt;
|20 Euro&lt;br /&gt;
|60 Euro&lt;br /&gt;
|}&lt;br /&gt;
{{Hinweis|Für eine Beschreibung der einzelnen Funktionen siehe [[#Erklärungen/Funktionen|Erklärungen/Funktionen]].}}&lt;br /&gt;
&lt;br /&gt;
==Bekannte Probleme==&lt;br /&gt;
{{Hinweis|Die hier aufgeführten Probleme sollen einen Überblick zum Stand einzelner Funktionen geben, sollten Sie sich dazu entscheiden mit der Schnittstelle zu arbeiten.}}&lt;br /&gt;
{{Achtung|Bei den letzten Tests kam es zu einem Fehler innerhalb der API, durch den die übermittelten Daten nicht korrekt verarbeitet wurden. Der Fehler trat an verschiedenen Stellen auf und konnte nicht reproduziert werden. Aktuell ist dies unter Beobachtung seitens Büroring. Von OBS aus können Sie aktuell die Datenübertragung nur ein zweites Mal ausführen, bis eine Lösung für das Problem gefunden wurde. Bei Preislisten hatte das Problem jedoch noch die Auswirkung, dass die Preislisten danach doppelt vorhanden war (siehe &amp;quot;doppelte Preislisten bei Fehler in Preislistenupdate&amp;quot;).}}&lt;br /&gt;
===Import Bestellungen===&lt;br /&gt;
*;eindeutige Identifikation von Artikeln&lt;br /&gt;
:Nach aktuellem Stand wird nur der aktuelle Katalog von Büroring eingespielt. Sollten jedoch auch von anderen Lieferanten Artikel im Shop verkauft werden, kann es bei den Artikelnummern zu &amp;quot;doppelten&amp;quot; Artikeln kommen. Derzeit fehlt noch die Möglichkeit dies beim Import unterscheiden zu können.&lt;br /&gt;
*;fehlende Kostenstellen&lt;br /&gt;
:In der Auftragsdatei werden nach aktuellem Stand keine Kostenstellen geliefert. Somit kann OBS diese bei der Auftragsgenerierung hinterlegen.&amp;lt;br /&amp;gt;&#039;&#039;Die Kostenstellen werden nach Informationen von Büroring jetzt in die openTRANS-Order übernommen (Stand 25.02.2021).&#039;&#039;&lt;br /&gt;
*;Anzeige in FTP-Eingang&lt;br /&gt;
:Bei aktivierter Anzeige von importierten Bestellungen im FTP-Eingang, wird bisher in der Spalte &#039;&#039;Typ&#039;&#039; nichts angezeigt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003663 (Info 005482).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Personendaten===&lt;br /&gt;
*;Export Kostenstellen Budgets&lt;br /&gt;
:Die Budgetverwaltung wurde bisher noch nicht im brShop24 umgesetzt und steht daher auch in der API noch nicht zur Verfügung.&lt;br /&gt;
*;Anzeige Webshop-Einstellungen&lt;br /&gt;
:Die Anzeige des Kundenstatus funktioniert aktuell nur, wenn die Kundennummer auch in einer Kundengruppe steht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003591 (Info 005378).&#039;&#039;&lt;br /&gt;
*;Übertragung Adressen&lt;br /&gt;
:Die Adressen werden nicht angelegt, weil der Typ mit einem ungültigen Wert an die API übergeben wird.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003587 (Info 005365).&#039;&#039;&lt;br /&gt;
*;Zuordnung Adressen Kundengruppe&lt;br /&gt;
:Adressen werden bei Übertragung auch in der Kundengruppe zugeordnet, obwohl es sich um eine System-Gruppe handelt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003600.&#039;&#039;&lt;br /&gt;
*;Zuordnung Adressen Benutzer&lt;br /&gt;
:Im Benutzer wird eine übertragene Adresse nicht zugeordnet.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003665 (Info 005483).&#039;&#039;&lt;br /&gt;
*;Einfügen neuer Kundengruppen&lt;br /&gt;
:Die Datensätze werden im OBS nicht korrekt angelegt und können daher nicht exportiert werden.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003594 (Infos 005375 und 005393).&#039;&#039;&lt;br /&gt;
*;Adressen aus Kostenstellen&lt;br /&gt;
:Werden bisher nicht übertragen.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003606 (Info 005398). Adressen aus Kostenstellen werden jetzt als Versandadressen hinterlegt&#039;&#039;&lt;br /&gt;
*;Zuordnung Kostenstellen&lt;br /&gt;
:Kostenstellen werden bei Übertragung auch in der Kundengruppe zugeordnet, wenn es sich um eine System-Gruppe handelt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003600. Kostenstellen werden bei Systemgruppen nicht mehr exportiert. Benutzer erhalten einen Hinweis bei Export der Personendaten aus den Webshop-Einstellungen und werden gefragt, ob die Personedaten trotzdem exportiert werden sollen.&#039;&#039;&lt;br /&gt;
*;Im Shop ist der Adresstyp vertauscht&lt;br /&gt;
:Adressen die eigentlich &amp;quot;Postanschrift&amp;quot; haben sollten, bekommen &amp;quot;Postfach Anschrift&amp;quot; und umgekehrt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003684 (Info 005494).&#039;&#039;&lt;br /&gt;
*;Benutzer ist immer Admin&lt;br /&gt;
:Die Funktionalität über Eigenschaft 9011 wurde noch nicht übernommen aus der VShop-Schnittstelle übernommen, da sie dort problembehaftet ist. Die Fehlerhafte Übertragung in dieser Schnittstelle wurde somit vorerst vollständig entfernt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003735 (Info 005548).&#039;&#039;&lt;br /&gt;
*;Benutzer wird nicht angelegt&lt;br /&gt;
:Während des Exports kommt es zu einem Abbruch im OBS und der Export wird nicht vollständig ausgeführt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004061 (Info 005911).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Preise/Preislisten===&lt;br /&gt;
*;Keine Aktualisierung für Kunden mit Kundennummer im Benutzer&lt;br /&gt;
:Preislisten werden nicht erkannt, wenn die Kundennummer nur im Benutzer vorkommt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003592 (Info 005384).&#039;&#039;&lt;br /&gt;
*;doppelte Preislisten bei Fehler in Preislistenupdate&lt;br /&gt;
:Tritt in der Aktualisierung der Preislistenkopfdaten ein Fehler auf, so wird die Preisliste ein weitere Mal angelegt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003630 (Info 005452).&#039;&#039;&lt;br /&gt;
*;Keine Aktualisierung der Kopfdaten&lt;br /&gt;
:Wurden im OBS Änderungen an den Kopfdaten (Name, Prio, Gültigkeitszeitraum) vorgenommen, konnte es passieren, dass diese nicht in den Shop übertragen wurden.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003703 (Info 005515).&#039;&#039;&lt;br /&gt;
*;Preise löschen verlängert die Laufzeit der Preispflege&lt;br /&gt;
:Beim Löschen von Preisen könnte es vorkommen, dass sich die zu löschenden Datensätze nicht korrekt aus der Liste genommen wurden, auch wenn der Datensatz aus dem Shop entfernt wurde. Dadurch versucht OBS diese Datensätze bei jedem folgenden Durchlauf der Preispflege zu löschen, was fehlschlägt, da die Datensätze ja schon gelöscht sind.&amp;lt;br /&amp;gt;&#039;&#039;Behoben voraussichtlich mit Version 003833 (Info 005664).&#039;&#039;&lt;br /&gt;
*;Preise werden nicht bei allen Preislisten aktualisiert&lt;br /&gt;
:Eine Prüfung war fehlerhaft und konnte die Aktualisierung der Preise für eine Preisliste verhindern.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003911 (Info 005733).&#039;&#039;&lt;br /&gt;
*;Preislisten, welche über Preisgruppen einem Kunden zugeordnet sind, werden im Shop nicht in Kundengruppen und Benutzern hinterlegt&lt;br /&gt;
:An einer Stelle in der Abfrage der Zuordnungen sind die Nummern für Preisgruppe und Preisliste vertauscht. Der Fehler betrifft eigene Preislisten, welche über Preisgruppen zugeordnet sind. Für die Standard-Preislisten VK1 bis VK9 kommt es nicht zu diesem Fehler, da hier die Nummern identisch sind.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003959 (Info 005785).&#039;&#039;&lt;br /&gt;
*;Zuordnungen von Preislisten sind fehlerhaft&lt;br /&gt;
:Unter bestimmten Umständen (Löschen ganzer Preislisten oder Kunde ohne verbleibende Preisliste) kann es im OBS zu einem Problem mit der Verwaltung der Zuordnungen im Shop kommen. Zuordnungen können dabei erhalten bleiben oder werden nicht angelegt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005847).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bestellvorlagen/Shoppinglisten===&lt;br /&gt;
*;Anzeige im Shop&lt;br /&gt;
:Nach aktuellem Stand können die Bestellvorlagen, die es auch schon für den VShop 4 exportiert werden konnten, in den brShop24 übertragen werden. Die Anzeige im Frontend (Ansicht für den Kunden) ist jedoch noch nicht umgesetzt. Sie können aktuell nur über den Admibereich prüfen, ob die Bestellvorlagen im Shop angekommen sind.&amp;lt;br /&amp;gt;&#039;&#039;Im Frontend werden die Listen jetzt angezeigt (Stand: 09.11.2021).&#039;&#039;&lt;br /&gt;
*;Generierung Shoppinglisten&lt;br /&gt;
:Durch einen Fehler in der Erkennung des Brüroring Zentrallagers konnte die falsche Lager-ID gezogen werden. Dadurch wurden die Artikel nicht korrekt identifiziert und die Shoppinglisten wurden nicht generiert.&amp;lt;br /&amp;gt;&#039;&#039;Behoben vorraussichtlich mit Version 003815 (Info 005654).&#039;&#039;&lt;br /&gt;
*;Zuordnung Shoppinglisten&lt;br /&gt;
:In der Übertragung wurden Shoppinglisten nicht in Benutzern zugeordnet. Dadurch sehen insbesondere bei allgemeinen Kundengruppen (z. B. registrierte Kunden) Benutzer die von OBS für eine Kundennummer erstellten und übertragenen Shoppinglisten nicht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003832 (Info 005663).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Migration===&lt;br /&gt;
*;Auswahl eines vorhandenen Ansprechpartner für Zuordnung zu einem Shop-Benutzer schlägt fehlt&lt;br /&gt;
:Die Auswahl verhält sich als würde keine Datensatz ausgewählt werden und setzt daher die Zuordnung nicht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005845).&#039;&#039;&lt;br /&gt;
*;Aus einem Benutzerkonto kann kein Ansprechpartner angelegt werden&lt;br /&gt;
:Es kann bei der Übernahme der Daten zu einem SQL-Fehler im OBS kommen, welcher die Anlage der Daten verhindert.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005844).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Kosten=&lt;br /&gt;
*;Einrichtung&lt;br /&gt;
:Sie können die Schnittstelle vom OBS-Support einrichten lassen oder dies selbst erledigen. Informationen zu den nötigen Daten/Angaben für eine Einrichtung finden Sie im nächsten Punkt [[#Installation.2FEinrichtung|Installation/Einrichtung]].&amp;lt;br /&amp;gt;Wenn Sie eine Einrichtung durch den OBS-Support wünschen, wird dies &#039;&#039;&#039;einmalig nach Aufwand&#039;&#039;&#039; abgerechnet.&lt;br /&gt;
*;Nutzung Schnittstelle&lt;br /&gt;
:Für den Einsatz wird pro aktiver brShop24-Schnittstelle &#039;&#039;&#039;monatlich 60 Euro&#039;&#039;&#039; berechnet.&lt;br /&gt;
&lt;br /&gt;
=Installation/Einrichtung=&lt;br /&gt;
Für die Einrichtung werden Angaben zur API-Anbindung und FTP-Zugangsdaten für die Abholung der Auftragsdateien benötigt. Außerdem muss OBS für die Preispflege auf das kostenpflichtige [[OBS/Kostenpflichtige_Module/Preislisten|OBS-Modul Preislisten]] umgestellt worden sein.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Für eine genaue Auflistung der benötigten Informationen und eine Beschreibung der Einrichtung lesen Sie bitte die Seite zur [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|&amp;lt;u&amp;gt;Einrichtung einer brShop24-Schnittstelle&amp;lt;/u&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
=Mit der Schnittstelle Starten=&lt;br /&gt;
==Daten migrieren==&lt;br /&gt;
Sofern Sie in der Vergangenheit einen VShop 4 verwendet haben und die Daten vom Büroring in den neuen brShop24 migriert wurden, empfehlen wir nach Abschluss der Einrichtung eine [[Kostenpflichtige_Module/Internet-Shop/brShop24/Migration|Datenmigration im OBS]] durchzuführen (siehe auch [[#Umstellung.2FMigration_VShop_4|Umstellung/Migration VShop 4]]). Dabei werden die vom VShop 4 migrierten Kundendaten aus dem Shop ausgelesen und in OBS importiert. OBS versucht die importierten Daten anschließend mit den Stammdaten zu verknüpfen und erstellt für die Kunden die Webshop-Einstellungen und gibt die Ansprechpartner frei.&amp;lt;br /&amp;gt;&lt;br /&gt;
Nach den Kundengruppen und Benutzern werden die Kostenstellen eingelesen und versucht den Einträgen im OBS zuzuordnen. Der Anzeigename (Shop) einer Kostenstelle muss dabei mit der Bezeichnung der Kostenstelle übereinstimmen und innerhalb der Kundengruppe eindeutig sein.&lt;br /&gt;
{{Achtung|Die Zuordnung läuft automatisiert und kann einige Minuten in Anspruch nehmen! Sollte der Vorgang abbrechen, können Sie die Migration erneut starten. Die Zuordnung erfolgt nur für Daten, die eindeutig identifiziert werden konnten!}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Außerdem werden die Preislisten aus den im Shop vorhandenen Preislisten ermittelt und für die Schnittstelle freigegeben. Die Preislisten werden stattdessen nach erfolgreicher Zuordnung im Shop geleert und neu befüllt. So sind die Preisdaten auch gleich auf dem aktuellen Stand und für die spätere Aktualisierung sind die Daten im OBS entsprechend vorbereitet.&lt;br /&gt;
{{Achtung|Es findet &#039;&#039;&#039;keine&#039;&#039;&#039; Verknüpfung mit den Preisdaten im OBS statt, da der vollständige Abgleich aller einzelnen Preisdaten zu lange dauern würde!}}&lt;br /&gt;
&lt;br /&gt;
==Datenhoheit==&lt;br /&gt;
Es gibt einige spezifische Daten im Shop, die von OBS nicht angefasst werden (dürfen). Das betrifft z. B. die Standard-Kundengruppen des brShop24. Für OBS-Daten hat jedoch OBS die Datenhoheit. Im Shop können Sie dies an den verfügbaren Funktionen (Bild 1) erkennen. Die von OBS gepflegten Daten werden über die API (Bild 2) angelegt und haben bei den Funktionen statt dem Stift-Symbol (Daten bearbeiten) nur ein Auge-Symbol (Daten ansehen).&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;200px&amp;quot;&amp;gt;&lt;br /&gt;
File:Br24_admin_datenoptionen.jpg|Bild 1: Funktionen|alt=Funktionen&lt;br /&gt;
File:Br24_admin_letzte_aend.jpg|Bild 2: Letzte Änderung|alt=letzte Änderung&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Umstellung/Migration VShop 4=&lt;br /&gt;
Nach aktuellem Stand wird für Kunden mit VShop 4 vom Büroring eine Migration des bestehenden VShop 4 auf den neuen brShop24 durchgeführt. Dabei soll auch gewählt werden können, welche Daten bei der Migration übernommen werden. Wie dies genau aussieht, müssen Sie jedoch mit dem Büroring klären. Es gibt jedoch auch einige Punkte, die Sie bei der Migration für die Umstellung im OBS bedenken müssen.&lt;br /&gt;
*;Neue API&lt;br /&gt;
:Im Unterschied zum VShop 4 läuft die Schnittstelle zum brShop24 über eine API. OBS dies bringt ein paar Einschränkungen für die migrierten Daten mit sich. Es ist OBS nicht möglich die Daten wiederzufinden, die von OBS zuvor in den VShop 4 übertragen wurden. Wie sich dies auf die Pflege von Daten auswirkt, muss noch in Erfahrung gebracht werden, da im Testsystem keine migrierten Daten zur Verfügung stehen.&lt;br /&gt;
*;Besonderheit Preisdaten&lt;br /&gt;
:OBS arbeitet in Schnittstelle über eine sogenannte API-ID, also eine Identifikationsnnummer speziell für die neue API. OBS kann nur Preisdaten verändern, die auch über die API in den Shop übertragen wurden. Wir empfehlen daher die Preisdaten möglichst über OBS zu pflegen und nicht migrieren zu lassen.&lt;br /&gt;
*;Schnittstelle im OBS&lt;br /&gt;
:Die Schnittstelle muss im OBS freigeschaltet und eingerichtet werden (siehe dazu [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|Einrichtung]]). Dies kann bereits vor der Migration geschehen. Bedenken Sie jedoch, dass die Aufträge erst importiert werden können, nachdem die Schnittstelle eingerichtet wurde. Gebe Sie uns also rechtzeitig Bescheid, damit wir die Schnittstelle freigeben können. Die Einrichtung kann auf Wunsch von uns kostenpflichtig übernommen werden.{{Hinweis|Die Freischaltung der Schnittstelle hat auch eine Anpassung des Vertrags zur Folge. Bitte beachten Sie, dass die Schnittstelle brShop24 mit 60 Euro statt 20 Euro berechnet wird.}}&lt;br /&gt;
*;Modul Preislisten&lt;br /&gt;
:Für den brShop24 wird das Modul [[OBS/Kostenpflichtige_Module/Preislisten|Preislisten]] für die Pflege von Preisen über die Schnittstelle vorrausgesetzt. Sollten Sie dieses Modul noch nicht nutzen, so müsste dies zuvor eingerichtet werden, wenn Sie Preise aus OBS in den Shop übertragen möchten. Die Einrichtung des Moduls kann mehrere Stunden in Anspruch nehmen. Wir empfehlen die Umstellung vor der Migration durchzuführen, da dies die Arbeitsweise mit Artikelpreisen verändert. Eine Schulung wird ebenfalls empfohlen.&lt;br /&gt;
*;Migration Freigaben OBS VShop 4 nach brShop24 (siehe [[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]])&lt;br /&gt;
:Über das Shop-Menü können Kundengruppen und Benutzer mit dem OBS-Personenstamm abgeglichen werden. Im Personenstamm werden dann für gefundene Datensätze Webshop-Einstelungen angelegt. Ansprechpartnern, welchen ein Benutzer eindeutig zugeordnet werden konnten, erhalten die Eigenschaft 9013 und die Zuordnung zur Schnittstelle. Sollte die eindeutige Zuordnung ohne Benutzername erfolgt sein, so wird auch der Benutzername im Ansprechpartner hinterlegt. Außerdem werden die Preislisten mit dem Shop abgeglichen, freigegeben und übertragen.{{Hinweis|Es ist nicht möglich die Passwörter auszulesen. Diese können also nicht im Ansprechpartner hinterlegt werden. Sollten Sie zu einem späteren Zeitpunkt die den Benutzer im Shop aktualisieren wollen, müssten diesen zuvor ein Passwort gegeben werden, sollte noch keines vorhanden sein.}}{{Achtung|Damit die Migration auch die Kundendaten verknüpfen kann, muss diese Funktionalität im Shop freigeschaltet sein. Wenden Sie sich hierzu an den Support des Büroring.}}&lt;br /&gt;
==Ablauf einer Umstellung==&lt;br /&gt;
Für gewöhnlich richtet Büroring zunächst einen Shop zu Testzwecken ein. Sie erhalten danach die API-Daten, mit denen die Schnittstelle eingerichtet werden kann (siehe dazu [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|Einrichtung]]). Sie können jetzt die Schnittstelle testen und wenn Fragen oder Probleme geklärt sind, dem Büroring die Freigabe für den Live-Betrieb erteilen. Der Shop wird daraufhin zurückgesetzt. Dies muss im OBS ebenfalls passieren. Informieren Sie dazu den Support per Ticket oder E-Mail (siehe dazu auch [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung#Vorwort|Vorwort Einrichtung]]).&lt;br /&gt;
&lt;br /&gt;
=Menü=&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_b&lt;br /&gt;
|B Preislisten verwalten&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen#Preislisten_verwalten|Preislistenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_f&lt;br /&gt;
|F Kundengruppen&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Kundengruppen_verwalten|Kundengruppenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_i&lt;br /&gt;
|I Bestellvorlagen verwalten&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Shoppinglisten_übertragen|Shoplistenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_m&lt;br /&gt;
|M Migration&lt;br /&gt;
|Startet die [[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]] der Daten. Dabei werden die aktuellen Kudnendaten (Gruppen und Benutzer) eingelesen und im Personestamm, sofern automatisiert möglich, Webshop-Einstellungen angelegt und Ansprechpartner zugeordnet.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_t&lt;br /&gt;
|T Jobinformationen&lt;br /&gt;
|Die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Jobinformationen|Jobinformationen]] sind ein Protokoll des Shops für die Preispflege-Jobs. Diese werden beim Exportieren der Preise angelegt. Über diesen Menüpunkt können Sie die bisherigen Job-Protokolle einsehen. Beim Einlesen der Jobinformationen werden aufgetretene Fehler verarbeitet.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_u&lt;br /&gt;
|U Bestellungen einlesen&lt;br /&gt;
|Liest die vorhanden Bestelldateien aus dem Shop-Verzeichnis ein. Für den automatischen Import siehe [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken#Bestellungen_einlesen|Automatiken: Bestellungen einlesen]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_w&lt;br /&gt;
|W Definitionen importieren&lt;br /&gt;
|Über diesen Menüpunkt können Sie alle für OBS-Relevanten Definitionen zur Vorbereitung der Datenexporte importieren. Dies umfasst aktuell folgende Definitionen:&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/DepotPartner|Depots/Lager mit Partner]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Anreden#brShop24|Anreden]]&lt;br /&gt;
*Kundentypen (u. a. B2B, B2C)&lt;br /&gt;
*Kundenqualifikation (u. a. neuer Kunden, Stammkunde)&lt;br /&gt;
Für den automatischen Import siehe [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken#Definitionen_importieren|Automatiken: Definitionen importieren]].&lt;br /&gt;
{{Hinweis|Diese Definitionen spielen an verschiedenen Stellen eine wichtige Rolle. Sollten Sie die Definitionen noch nicht importiert und vor einem Datenexport zugeordnet haben, funktionert entweder der Datenexport nicht oder es werden Standardwerte verwendet.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_x&lt;br /&gt;
|X Konfiguration&lt;br /&gt;
|Öffnet die [[OBS/Stammdaten/Schnittstellen/Internet-Shop/Konfiguration|Konfiguration]] der Schnittstellen. Hier können die Einstellungen der Schnittstelle angepasst werden.{{Hinweis|Um Anpassungen vorzunehmen wird für die meisten Einstellungen ein Level von 3 oder 5 benötigt. Es ist möglich dieses Level anzupassen, auch kann ein Benutzer für die Schnittstelle ein abweichendes Benutzerlevel erhalten. Melden Sie sich bei Bedarf per [[OBS/System/Ticket-System|OBS Ticketsystem]] beim OBS-Support.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_y&lt;br /&gt;
|Y Testumgebung&lt;br /&gt;
|Öffnet eine Testumgebung, um die Anbindung zu testen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_z&lt;br /&gt;
|Z Protokoll&lt;br /&gt;
|Über den Menüpunkt &#039;&#039;Z Protokoll&#039;&#039; des Shops-Menüs erhalten Sie Zugriff auf das Shop-Protokoll. Es werden vorrangig Hinweise zu Fehlern oder Problemen bei Im- und Exporten protokolliert. Über die Konfiguration kann mit Aktivierung des Debugmodus (Schlüssel &#039;&#039;Shop.Debug&#039;&#039;) eine erweiterte Protokollierung aktiviert werden. Dafür benötigt ein Benutzer jedoch Administrationsrechte (Level 9) für die Schnittstelle.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Zuordnungen=&lt;br /&gt;
Zuordnungen von Stammdaten wie Lieferanten und Mengeneinheiten nehmen Sie über den Shop-Menüpunkt &#039;&#039;X Konfiguration&#039;&#039; vor. In der Kofigurationsliste gelangen Sie über {{Key|F8 Zuord}} ins Zuordnungsmenü.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Aktuelle Menüpunkte:&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Anreden#brShop24|A Anreden]]&lt;br /&gt;
:Liste für im Shop definierte Anreden. Hier können Sie die OBS-Anreden mit den Shop-Anreden verknüpfen. Relevant für den Export von Personen. Ohne Zuordnung werden Personen ohne Anrede exportiert.&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Einheiten#brShop24|E Einheiten]]&lt;br /&gt;
:Liste für im Shop definierte Mengeneinheiten. Ordenen Sie hier die im OBS verwendeten Mengeneinheiten zu. {{Hinweis|Relevant für eigene Artikel. Ist eine verwendete OBS-Mengeneinheit nicht zugeordnet, so wird beim Export die Einheit &amp;quot;ST&amp;quot; (Stück) für den jeweiligen Artikel verwendet.}}&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/DepotPartner|L Lager und Lagerlieferanten]]&lt;br /&gt;
:Definierte Depots und Partner des Shops. Partnern können Sie einem OBS-Lieferanten zuordnen und die Lager entsprechend auf Pflege Büroring oder als eigene Artikel definieren. Relevant für den Export von Preisen, Shoppinglisten (Bestellvorlagen) und eigene Artikel.&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Zusatz/Artikeltausch|T Artikeltausch]]&lt;br /&gt;
:Greift beim Auftragsimport. Austauschen bestimmter Referenznummern gegen einen festgeschrieben Artikel z. B. für Pauschalen.&lt;br /&gt;
&lt;br /&gt;
=Erklärungen/Funktionen=&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Kundengruppen_verwalten|Kundengruppen verwalten]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Personen_übertragen|Kunden übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen|Preise übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Eigene_Artikel_übertragen|eigene Artikel übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Shoppinglisten_übertragen|Shoppinglisten übertragen (z. B. Bestellvorlagen)]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Jobinformationen|Jobinformationen]]&lt;br /&gt;
*[[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]]&lt;br /&gt;
*[[Kostenpflichtige Module/Internet-Shop/brShop24/PDF-Druck Artikellink|PDF-Druck Artikellink]]&lt;br /&gt;
&lt;br /&gt;
=Häufig gestellte Fragen (FAQ)=&lt;br /&gt;
==Daten Allgemein==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_alg_datennichtangezeigt&lt;br /&gt;
|Ich habe Daten aus OBS übertragen, diese werden jedoch nicht angezeigt?&lt;br /&gt;
|Je nach Art der Daten gelten verschiedene Voraussetzungen. Prüfen Sie daher, ob die Voraussetzungen gegeben sind oder bereits der Export scheitert. Entsprechende Hinweise finden Sie in den Hilfetexten zum jeweiligen Datenexport oder im Protokoll.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Sind die Daten im Shop angelegt dort jedoch z. B. über den Adminbereich gelöscht worden, so können die Daten dort wiederhergestellt werden. Prüfen Sie daher auch, ob dies auf die Daten zutrifft.&amp;lt;br /&amp;gt;Dazu sei noch angemerkt, dass es im brShop24 zwei Varianten zum Löschen von Daten gibt:&lt;br /&gt;
#Soft-Delete&amp;lt;br /&amp;gt;d.h. ein Datensatz kann mit einem Löschkennzeichen markiert werden, so dass dieser zur Not auch wieder hergestellt werden kann (ähnlich dem Papierkorb unter Windows). Dies wird so z. B. im Adminbereich angewendet.&lt;br /&gt;
#Hard-Delete&amp;lt;br /&amp;gt;d.h. der Datensatz wird auch physikalisch vom Datenträger gelöscht, ist somit aus dem System entfernt und kann nicht wieder hergestellt werden. Dies gilt für die API.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_alg_apisuperadmin&lt;br /&gt;
|Kann ich die Datensätze aus der API im Adminbereich ändern/editieren?&lt;br /&gt;
|Standardmäßig wird eine Bearbeitung von Datensätzen, welche per API gepflegt werden, im Shop gesperrt. Sie haben jedoch die Möglichkeit die Bearbeitung in Ihrem Adminbenutzer freizugeben. Die Administratoren finden Sie im Menü des Adminbereichs unter &#039;&#039;Administration&#039;&#039; im Unterpunkt &#039;&#039;Administratoren&#039;&#039;. Suchen Sie in der Liste Ihren Benutzer (Benutzername steht oben rechts) und öffnen Sie die Eingabemaske. Im Reiter &#039;&#039;Einstellungen&#039;&#039; setzen Sie dann as Häkchen bei &#039;&#039;API Super-Administrator?&#039;&#039;.&lt;br /&gt;
{{Hinweis|Da es Daten/Felder gibt, welche OBS nicht über die API pflegen kann. Kann es durchaus sinnvoll sein, dies zu aktivieren. Dies betrifft z. B. Berechtigungen für Kundengruppen wie die Sortimentsfreigabe.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Preise/Preislisten==&lt;br /&gt;
Siehe [[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen#Häufig_gestellt_Fragen_(FAQ)|FAQ Preisexport brShop24]].&lt;br /&gt;
&lt;br /&gt;
==Import Auftragsdateien (OpenTRANS)==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_imp_auftrag&lt;br /&gt;
|Warum wird die Kostenstelle nicht übernommen?&lt;br /&gt;
|Die Referenz auf die Kostenestelle muss in der Auftragsdatei im Element COST_CATEGORY_ID enthalten sein. OBS erwartet hier die vollständige Bezeichnung der [[OBS/Stammdaten/Personen#B2_-_Kostenstellen|Kostenstelle]]. Ist die Kostenstelle in der Auftragsdatei nicht enthalten oder die Referenz stimmt mit keiner Kostenstelle überein, so wird im Import keine Kostenstelle übernommen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Migration VShop4==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_allg_parallelbetrieb&lt;br /&gt;
|Können im OBS brShop24 und VShop4 parallel betrieben werden?&lt;br /&gt;
|Ja, es ist mögliche beide Shops im OBS zu verwalten. OBS ist in der Lage mehrere Schnittstellen, auch des gleichen Typs, zu verwalten. Die Schnittstellen arbeiten unabhängig voneinander. Nach unseren Informationen ist ein Parallelbetrieb seitens Büroring jedoch nicht gewünscht, da die Daten des VShop 4 nachträglich nicht oder nur mit deutlich größerem Aufwand in den brShop24 migriert werden könnten. Eventuell gehen Ihnen hier also Daten verloren, wenn der VShop4 abgeschaltet wird. Der brShop24 würde nach der Migration also Ihren aktuellen VShop 4 ersetzen. Bei Fragen zu dem Thema wenden Sie sich bitte an den Support des Büroring.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24&amp;diff=62767</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24&amp;diff=62767"/>
		<updated>2024-02-08T11:25:33Z</updated>

		<summary type="html">&lt;p&gt;Prakti: /* Erklärungen/Funktionen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Kostenpflichtige Module}}&lt;br /&gt;
{{Aktuelles|Die Schnittstelle brShop24 wird 60 Euro monatlich kosten.}}&lt;br /&gt;
Der brShop24 wird von der Genossenschaft [https://www.bueroring.de Büroring eG] entwickelt und angeboten. Diese ECommerce-Lösung soll langfristig den bisher angebotenen VShop 4 Pro ablösen. Für die Anbindung an den brShop24 steht Ihnen eine Schnittstelle basierend auf [https://de.wikipedia.org/wiki/GraphQL GraphQL] zur Verfügung.&lt;br /&gt;
{{Achtung|Für die Preisübertragung wird das kostenpflichtige Modul [[OBS/Kostenpflichtige_Module/Preislisten|Preislisten]] vorausgesetzt!}}&lt;br /&gt;
{{Achtung|Die Schnittstellen für VShop 4 Pro und brShop24 sind nicht kompatibel! Sollten Sie sich also für eine Umstellung Ihres VShop 4 Pro auf das neue System brShop24 entscheiden, so muss dies im OBS ebenfalls umgestellt werden!&amp;lt;br/&amp;gt;Siehe auch die Punkte [[#Umstellung.2FMigration_VShop_4|Umstellung/Migration VShop 4]] und [[#faq_brshop24_allg_parallelbetrieb|FAQ Parallelbetrieb]].}}&lt;br /&gt;
=Funktionsumfang=&lt;br /&gt;
{{Achtung|Die hier aufgeführten Funktionen sind unter Vorbehalt in der aktuellen Version von OBS enthalten, da sich die Funktionalitäten in API und OBS noch ändern können.}}&lt;br /&gt;
Diese Schnittstelle unterstützt den Im- und Export von Daten wie folgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Import!! Export&lt;br /&gt;
|-&lt;br /&gt;
| Auftragsimport (OpenTRANS 1.0)|| Preislisten&lt;br /&gt;
|-&lt;br /&gt;
| Depots + Partner|| Kundengruppen&lt;br /&gt;
|-&lt;br /&gt;
| Anreden|| Ansprechpartner (Benutzer und Personen)&lt;br /&gt;
|-&lt;br /&gt;
| Kundentypen|| Kostenstellen&lt;br /&gt;
|-&lt;br /&gt;
| Kundenqualifikation|| Adressen (Personenstamm)&lt;br /&gt;
|-&lt;br /&gt;
| Job-Informationen (Ergebnis/Protokoll Preispflege)|| Shopping-Listen (Meistgekaufte Artikel/Top-Artikel)&lt;br /&gt;
|-&lt;br /&gt;
| Kundengruppen (Migration)|| &lt;br /&gt;
|-&lt;br /&gt;
| Benutzer (Migration)|| &lt;br /&gt;
|-&lt;br /&gt;
| Kostenstellen (Migration)|| &lt;br /&gt;
|}&lt;br /&gt;
{{Hinweis|Zu Beginn wird es nur Bestelldateien im Format OpenTRANS 1.0 geben. Das neuere Format 2.1 ist aber bereits eingeplant und soll zu einem späteren Zeitpunkt folgen.}}&lt;br /&gt;
==Vergleich zur Schnittstelle VShop 4==&lt;br /&gt;
Stand: 13.10.2022&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!|&lt;br /&gt;
|&#039;&#039;&#039;VShop 4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;brShop24&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Bestellungen importieren&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Kundendaten abfragen&#039;&#039;&#039;&lt;br /&gt;
|ja (&amp;quot;Kunde vorhanden?&amp;quot;)&lt;br /&gt;
|ja (&amp;quot;Kunde vorhanden?&amp;quot; und Migration)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Kundendaten übertragen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|(Kunden-)Gruppe&lt;br /&gt;
|Aus Personennummer (Hauptperson)&lt;br /&gt;
|eigene Verwaltung&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Benutzerkonto&lt;br /&gt;
|aus Person und Ansprechpartner&lt;br /&gt;
|aus Ansprechpartner&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kostenstellen&lt;br /&gt;
|nur als Kostenstelle (mit Budget)&lt;br /&gt;
|Kostenstelle (noch ohne Budget; fehlt im Shop bisher) und Versandadresse&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Shopping-Listen&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Adressen/Adressbuch&lt;br /&gt;
|nein (nur Standardadresse im Benutzerkonto)&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Anreden&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kundentyp&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kundenqualifikation&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Artikelvorlage setzen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Preise übertragen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja (nur Preislisten)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Lager&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Partner&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Warengruppen/Kategorien&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Artikel&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|übertragen&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Abgleich (eigene Artikel)&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Sterne&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;monatliche Kosten&#039;&#039;&#039;&lt;br /&gt;
|20 Euro&lt;br /&gt;
|60 Euro&lt;br /&gt;
|}&lt;br /&gt;
{{Hinweis|Für eine Beschreibung der einzelnen Funktionen siehe [[#Erklärungen/Funktionen|Erklärungen/Funktionen]].}}&lt;br /&gt;
&lt;br /&gt;
==Bekannte Probleme==&lt;br /&gt;
{{Hinweis|Die hier aufgeführten Probleme sollen einen Überblick zum Stand einzelner Funktionen geben, sollten Sie sich dazu entscheiden mit der Schnittstelle zu arbeiten.}}&lt;br /&gt;
{{Achtung|Bei den letzten Tests kam es zu einem Fehler innerhalb der API, durch den die übermittelten Daten nicht korrekt verarbeitet wurden. Der Fehler trat an verschiedenen Stellen auf und konnte nicht reproduziert werden. Aktuell ist dies unter Beobachtung seitens Büroring. Von OBS aus können Sie aktuell die Datenübertragung nur ein zweites Mal ausführen, bis eine Lösung für das Problem gefunden wurde. Bei Preislisten hatte das Problem jedoch noch die Auswirkung, dass die Preislisten danach doppelt vorhanden war (siehe &amp;quot;doppelte Preislisten bei Fehler in Preislistenupdate&amp;quot;).}}&lt;br /&gt;
===Import Bestellungen===&lt;br /&gt;
*;eindeutige Identifikation von Artikeln&lt;br /&gt;
:Nach aktuellem Stand wird nur der aktuelle Katalog von Büroring eingespielt. Sollten jedoch auch von anderen Lieferanten Artikel im Shop verkauft werden, kann es bei den Artikelnummern zu &amp;quot;doppelten&amp;quot; Artikeln kommen. Derzeit fehlt noch die Möglichkeit dies beim Import unterscheiden zu können.&lt;br /&gt;
*;fehlende Kostenstellen&lt;br /&gt;
:In der Auftragsdatei werden nach aktuellem Stand keine Kostenstellen geliefert. Somit kann OBS diese bei der Auftragsgenerierung hinterlegen.&amp;lt;br /&amp;gt;&#039;&#039;Die Kostenstellen werden nach Informationen von Büroring jetzt in die openTRANS-Order übernommen (Stand 25.02.2021).&#039;&#039;&lt;br /&gt;
*;Anzeige in FTP-Eingang&lt;br /&gt;
:Bei aktivierter Anzeige von importierten Bestellungen im FTP-Eingang, wird bisher in der Spalte &#039;&#039;Typ&#039;&#039; nichts angezeigt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003663 (Info 005482).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Personendaten===&lt;br /&gt;
*;Export Kostenstellen Budgets&lt;br /&gt;
:Die Budgetverwaltung wurde bisher noch nicht im brShop24 umgesetzt und steht daher auch in der API noch nicht zur Verfügung.&lt;br /&gt;
*;Anzeige Webshop-Einstellungen&lt;br /&gt;
:Die Anzeige des Kundenstatus funktioniert aktuell nur, wenn die Kundennummer auch in einer Kundengruppe steht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003591 (Info 005378).&#039;&#039;&lt;br /&gt;
*;Übertragung Adressen&lt;br /&gt;
:Die Adressen werden nicht angelegt, weil der Typ mit einem ungültigen Wert an die API übergeben wird.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003587 (Info 005365).&#039;&#039;&lt;br /&gt;
*;Zuordnung Adressen Kundengruppe&lt;br /&gt;
:Adressen werden bei Übertragung auch in der Kundengruppe zugeordnet, obwohl es sich um eine System-Gruppe handelt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003600.&#039;&#039;&lt;br /&gt;
*;Zuordnung Adressen Benutzer&lt;br /&gt;
:Im Benutzer wird eine übertragene Adresse nicht zugeordnet.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003665 (Info 005483).&#039;&#039;&lt;br /&gt;
*;Einfügen neuer Kundengruppen&lt;br /&gt;
:Die Datensätze werden im OBS nicht korrekt angelegt und können daher nicht exportiert werden.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003594 (Infos 005375 und 005393).&#039;&#039;&lt;br /&gt;
*;Adressen aus Kostenstellen&lt;br /&gt;
:Werden bisher nicht übertragen.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003606 (Info 005398). Adressen aus Kostenstellen werden jetzt als Versandadressen hinterlegt&#039;&#039;&lt;br /&gt;
*;Zuordnung Kostenstellen&lt;br /&gt;
:Kostenstellen werden bei Übertragung auch in der Kundengruppe zugeordnet, wenn es sich um eine System-Gruppe handelt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003600. Kostenstellen werden bei Systemgruppen nicht mehr exportiert. Benutzer erhalten einen Hinweis bei Export der Personendaten aus den Webshop-Einstellungen und werden gefragt, ob die Personedaten trotzdem exportiert werden sollen.&#039;&#039;&lt;br /&gt;
*;Im Shop ist der Adresstyp vertauscht&lt;br /&gt;
:Adressen die eigentlich &amp;quot;Postanschrift&amp;quot; haben sollten, bekommen &amp;quot;Postfach Anschrift&amp;quot; und umgekehrt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003684 (Info 005494).&#039;&#039;&lt;br /&gt;
*;Benutzer ist immer Admin&lt;br /&gt;
:Die Funktionalität über Eigenschaft 9011 wurde noch nicht übernommen aus der VShop-Schnittstelle übernommen, da sie dort problembehaftet ist. Die Fehlerhafte Übertragung in dieser Schnittstelle wurde somit vorerst vollständig entfernt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003735 (Info 005548).&#039;&#039;&lt;br /&gt;
*;Benutzer wird nicht angelegt&lt;br /&gt;
:Während des Exports kommt es zu einem Abbruch im OBS und der Export wird nicht vollständig ausgeführt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004061 (Info 005911).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Preise/Preislisten===&lt;br /&gt;
*;Keine Aktualisierung für Kunden mit Kundennummer im Benutzer&lt;br /&gt;
:Preislisten werden nicht erkannt, wenn die Kundennummer nur im Benutzer vorkommt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003592 (Info 005384).&#039;&#039;&lt;br /&gt;
*;doppelte Preislisten bei Fehler in Preislistenupdate&lt;br /&gt;
:Tritt in der Aktualisierung der Preislistenkopfdaten ein Fehler auf, so wird die Preisliste ein weitere Mal angelegt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003630 (Info 005452).&#039;&#039;&lt;br /&gt;
*;Keine Aktualisierung der Kopfdaten&lt;br /&gt;
:Wurden im OBS Änderungen an den Kopfdaten (Name, Prio, Gültigkeitszeitraum) vorgenommen, konnte es passieren, dass diese nicht in den Shop übertragen wurden.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003703 (Info 005515).&#039;&#039;&lt;br /&gt;
*;Preise löschen verlängert die Laufzeit der Preispflege&lt;br /&gt;
:Beim Löschen von Preisen könnte es vorkommen, dass sich die zu löschenden Datensätze nicht korrekt aus der Liste genommen wurden, auch wenn der Datensatz aus dem Shop entfernt wurde. Dadurch versucht OBS diese Datensätze bei jedem folgenden Durchlauf der Preispflege zu löschen, was fehlschlägt, da die Datensätze ja schon gelöscht sind.&amp;lt;br /&amp;gt;&#039;&#039;Behoben voraussichtlich mit Version 003833 (Info 005664).&#039;&#039;&lt;br /&gt;
*;Preise werden nicht bei allen Preislisten aktualisiert&lt;br /&gt;
:Eine Prüfung war fehlerhaft und konnte die Aktualisierung der Preise für eine Preisliste verhindern.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003911 (Info 005733).&#039;&#039;&lt;br /&gt;
*;Preislisten, welche über Preisgruppen einem Kunden zugeordnet sind, werden im Shop nicht in Kundengruppen und Benutzern hinterlegt&lt;br /&gt;
:An einer Stelle in der Abfrage der Zuordnungen sind die Nummern für Preisgruppe und Preisliste vertauscht. Der Fehler betrifft eigene Preislisten, welche über Preisgruppen zugeordnet sind. Für die Standard-Preislisten VK1 bis VK9 kommt es nicht zu diesem Fehler, da hier die Nummern identisch sind.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003959 (Info 005785).&#039;&#039;&lt;br /&gt;
*;Zuordnungen von Preislisten sind fehlerhaft&lt;br /&gt;
:Unter bestimmten Umständen (Löschen ganzer Preislisten oder Kunde ohne verbleibende Preisliste) kann es im OBS zu einem Problem mit der Verwaltung der Zuordnungen im Shop kommen. Zuordnungen können dabei erhalten bleiben oder werden nicht angelegt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005847).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bestellvorlagen/Shoppinglisten===&lt;br /&gt;
*;Anzeige im Shop&lt;br /&gt;
:Nach aktuellem Stand können die Bestellvorlagen, die es auch schon für den VShop 4 exportiert werden konnten, in den brShop24 übertragen werden. Die Anzeige im Frontend (Ansicht für den Kunden) ist jedoch noch nicht umgesetzt. Sie können aktuell nur über den Admibereich prüfen, ob die Bestellvorlagen im Shop angekommen sind.&amp;lt;br /&amp;gt;&#039;&#039;Im Frontend werden die Listen jetzt angezeigt (Stand: 09.11.2021).&#039;&#039;&lt;br /&gt;
*;Generierung Shoppinglisten&lt;br /&gt;
:Durch einen Fehler in der Erkennung des Brüroring Zentrallagers konnte die falsche Lager-ID gezogen werden. Dadurch wurden die Artikel nicht korrekt identifiziert und die Shoppinglisten wurden nicht generiert.&amp;lt;br /&amp;gt;&#039;&#039;Behoben vorraussichtlich mit Version 003815 (Info 005654).&#039;&#039;&lt;br /&gt;
*;Zuordnung Shoppinglisten&lt;br /&gt;
:In der Übertragung wurden Shoppinglisten nicht in Benutzern zugeordnet. Dadurch sehen insbesondere bei allgemeinen Kundengruppen (z. B. registrierte Kunden) Benutzer die von OBS für eine Kundennummer erstellten und übertragenen Shoppinglisten nicht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003832 (Info 005663).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Migration===&lt;br /&gt;
*;Auswahl eines vorhandenen Ansprechpartner für Zuordnung zu einem Shop-Benutzer schlägt fehlt&lt;br /&gt;
:Die Auswahl verhält sich als würde keine Datensatz ausgewählt werden und setzt daher die Zuordnung nicht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005845).&#039;&#039;&lt;br /&gt;
*;Aus einem Benutzerkonto kann kein Ansprechpartner angelegt werden&lt;br /&gt;
:Es kann bei der Übernahme der Daten zu einem SQL-Fehler im OBS kommen, welcher die Anlage der Daten verhindert.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005844).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Kosten=&lt;br /&gt;
*;Einrichtung&lt;br /&gt;
:Sie können die Schnittstelle vom OBS-Support einrichten lassen oder dies selbst erledigen. Informationen zu den nötigen Daten/Angaben für eine Einrichtung finden Sie im nächsten Punkt [[#Installation.2FEinrichtung|Installation/Einrichtung]].&amp;lt;br /&amp;gt;Wenn Sie eine Einrichtung durch den OBS-Support wünschen, wird dies &#039;&#039;&#039;einmalig nach Aufwand&#039;&#039;&#039; abgerechnet.&lt;br /&gt;
*;Nutzung Schnittstelle&lt;br /&gt;
:Für den Einsatz wird pro aktiver brShop24-Schnittstelle &#039;&#039;&#039;monatlich 60 Euro&#039;&#039;&#039; berechnet.&lt;br /&gt;
&lt;br /&gt;
=Installation/Einrichtung=&lt;br /&gt;
Für die Einrichtung werden Angaben zur API-Anbindung und FTP-Zugangsdaten für die Abholung der Auftragsdateien benötigt. Außerdem muss OBS für die Preispflege auf das kostenpflichtige [[OBS/Kostenpflichtige_Module/Preislisten|OBS-Modul Preislisten]] umgestellt worden sein.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Für eine genaue Auflistung der benötigten Informationen und eine Beschreibung der Einrichtung lesen Sie bitte die Seite zur [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|&amp;lt;u&amp;gt;Einrichtung einer brShop24-Schnittstelle&amp;lt;/u&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
=Mit der Schnittstelle Starten=&lt;br /&gt;
==Daten migrieren==&lt;br /&gt;
Sofern Sie in der Vergangenheit einen VShop 4 verwendet haben und die Daten vom Büroring in den neuen brShop24 migriert wurden, empfehlen wir nach Abschluss der Einrichtung eine [[Kostenpflichtige_Module/Internet-Shop/brShop24/Migration|Datenmigration im OBS]] durchzuführen (siehe auch [[#Umstellung.2FMigration_VShop_4|Umstellung/Migration VShop 4]]). Dabei werden die vom VShop 4 migrierten Kundendaten aus dem Shop ausgelesen und in OBS importiert. OBS versucht die importierten Daten anschließend mit den Stammdaten zu verknüpfen und erstellt für die Kunden die Webshop-Einstellungen und gibt die Ansprechpartner frei.&amp;lt;br /&amp;gt;&lt;br /&gt;
Nach den Kundengruppen und Benutzern werden die Kostenstellen eingelesen und versucht den Einträgen im OBS zuzuordnen. Der Anzeigename (Shop) einer Kostenstelle muss dabei mit der Bezeichnung der Kostenstelle übereinstimmen und innerhalb der Kundengruppe eindeutig sein.&lt;br /&gt;
{{Achtung|Die Zuordnung läuft automatisiert und kann einige Minuten in Anspruch nehmen! Sollte der Vorgang abbrechen, können Sie die Migration erneut starten. Die Zuordnung erfolgt nur für Daten, die eindeutig identifiziert werden konnten!}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Außerdem werden die Preislisten aus den im Shop vorhandenen Preislisten ermittelt und für die Schnittstelle freigegeben. Die Preislisten werden stattdessen nach erfolgreicher Zuordnung im Shop geleert und neu befüllt. So sind die Preisdaten auch gleich auf dem aktuellen Stand und für die spätere Aktualisierung sind die Daten im OBS entsprechend vorbereitet.&lt;br /&gt;
{{Achtung|Es findet &#039;&#039;&#039;keine&#039;&#039;&#039; Verknüpfung mit den Preisdaten im OBS statt, da der vollständige Abgleich aller einzelnen Preisdaten zu lange dauern würde!}}&lt;br /&gt;
&lt;br /&gt;
==Datenhoheit==&lt;br /&gt;
Es gibt einige spezifische Daten im Shop, die von OBS nicht angefasst werden (dürfen). Das betrifft z. B. die Standard-Kundengruppen des brShop24. Für OBS-Daten hat jedoch OBS die Datenhoheit. Im Shop können Sie dies an den verfügbaren Funktionen (Bild 1) erkennen. Die von OBS gepflegten Daten werden über die API (Bild 2) angelegt und haben bei den Funktionen statt dem Stift-Symbol (Daten bearbeiten) nur ein Auge-Symbol (Daten ansehen).&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;200px&amp;quot;&amp;gt;&lt;br /&gt;
File:Br24_admin_datenoptionen.jpg|Bild 1: Funktionen|alt=Funktionen&lt;br /&gt;
File:Br24_admin_letzte_aend.jpg|Bild 2: Letzte Änderung|alt=letzte Änderung&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Umstellung/Migration VShop 4=&lt;br /&gt;
Nach aktuellem Stand wird für Kunden mit VShop 4 vom Büroring eine Migration des bestehenden VShop 4 auf den neuen brShop24 durchgeführt. Dabei soll auch gewählt werden können, welche Daten bei der Migration übernommen werden. Wie dies genau aussieht, müssen Sie jedoch mit dem Büroring klären. Es gibt jedoch auch einige Punkte, die Sie bei der Migration für die Umstellung im OBS bedenken müssen.&lt;br /&gt;
*;Neue API&lt;br /&gt;
:Im Unterschied zum VShop 4 läuft die Schnittstelle zum brShop24 über eine API. OBS dies bringt ein paar Einschränkungen für die migrierten Daten mit sich. Es ist OBS nicht möglich die Daten wiederzufinden, die von OBS zuvor in den VShop 4 übertragen wurden. Wie sich dies auf die Pflege von Daten auswirkt, muss noch in Erfahrung gebracht werden, da im Testsystem keine migrierten Daten zur Verfügung stehen.&lt;br /&gt;
*;Besonderheit Preisdaten&lt;br /&gt;
:OBS arbeitet in Schnittstelle über eine sogenannte API-ID, also eine Identifikationsnnummer speziell für die neue API. OBS kann nur Preisdaten verändern, die auch über die API in den Shop übertragen wurden. Wir empfehlen daher die Preisdaten möglichst über OBS zu pflegen und nicht migrieren zu lassen.&lt;br /&gt;
*;Schnittstelle im OBS&lt;br /&gt;
:Die Schnittstelle muss im OBS freigeschaltet und eingerichtet werden (siehe dazu [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|Einrichtung]]). Dies kann bereits vor der Migration geschehen. Bedenken Sie jedoch, dass die Aufträge erst importiert werden können, nachdem die Schnittstelle eingerichtet wurde. Gebe Sie uns also rechtzeitig Bescheid, damit wir die Schnittstelle freigeben können. Die Einrichtung kann auf Wunsch von uns kostenpflichtig übernommen werden.{{Hinweis|Die Freischaltung der Schnittstelle hat auch eine Anpassung des Vertrags zur Folge. Bitte beachten Sie, dass die Schnittstelle brShop24 mit 60 Euro statt 20 Euro berechnet wird.}}&lt;br /&gt;
*;Modul Preislisten&lt;br /&gt;
:Für den brShop24 wird das Modul [[OBS/Kostenpflichtige_Module/Preislisten|Preislisten]] für die Pflege von Preisen über die Schnittstelle vorrausgesetzt. Sollten Sie dieses Modul noch nicht nutzen, so müsste dies zuvor eingerichtet werden, wenn Sie Preise aus OBS in den Shop übertragen möchten. Die Einrichtung des Moduls kann mehrere Stunden in Anspruch nehmen. Wir empfehlen die Umstellung vor der Migration durchzuführen, da dies die Arbeitsweise mit Artikelpreisen verändert. Eine Schulung wird ebenfalls empfohlen.&lt;br /&gt;
*;Migration Freigaben OBS VShop 4 nach brShop24 (siehe [[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]])&lt;br /&gt;
:Über das Shop-Menü können Kundengruppen und Benutzer mit dem OBS-Personenstamm abgeglichen werden. Im Personenstamm werden dann für gefundene Datensätze Webshop-Einstelungen angelegt. Ansprechpartnern, welchen ein Benutzer eindeutig zugeordnet werden konnten, erhalten die Eigenschaft 9013 und die Zuordnung zur Schnittstelle. Sollte die eindeutige Zuordnung ohne Benutzername erfolgt sein, so wird auch der Benutzername im Ansprechpartner hinterlegt. Außerdem werden die Preislisten mit dem Shop abgeglichen, freigegeben und übertragen.{{Hinweis|Es ist nicht möglich die Passwörter auszulesen. Diese können also nicht im Ansprechpartner hinterlegt werden. Sollten Sie zu einem späteren Zeitpunkt die den Benutzer im Shop aktualisieren wollen, müssten diesen zuvor ein Passwort gegeben werden, sollte noch keines vorhanden sein.}}{{Achtung|Damit die Migration auch die Kundendaten verknüpfen kann, muss diese Funktionalität im Shop freigeschaltet sein. Wenden Sie sich hierzu an den Support des Büroring.}}&lt;br /&gt;
==Ablauf einer Umstellung==&lt;br /&gt;
Für gewöhnlich richtet Büroring zunächst einen Shop zu Testzwecken ein. Sie erhalten danach die API-Daten, mit denen die Schnittstelle eingerichtet werden kann (siehe dazu [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|Einrichtung]]). Sie können jetzt die Schnittstelle testen und wenn Fragen oder Probleme geklärt sind, dem Büroring die Freigabe für den Live-Betrieb erteilen. Der Shop wird daraufhin zurückgesetzt. Dies muss im OBS ebenfalls passieren. Informieren Sie dazu den Support per Ticket oder E-Mail (siehe dazu auch [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung#Vorwort|Vorwort Einrichtung]]).&lt;br /&gt;
&lt;br /&gt;
=Menü=&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_b&lt;br /&gt;
|B Preislisten verwalten&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen#Preislisten_verwalten|Preislistenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_f&lt;br /&gt;
|F Kundengruppen&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Kundengruppen_verwalten|Kundengruppenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_i&lt;br /&gt;
|I Bestellvorlagen verwalten&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Shoppinglisten_übertragen|Shoplistenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_m&lt;br /&gt;
|M Migration&lt;br /&gt;
|Startet die [[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]] der Daten. Dabei werden die aktuellen Kudnendaten (Gruppen und Benutzer) eingelesen und im Personestamm, sofern automatisiert möglich, Webshop-Einstellungen angelegt und Ansprechpartner zugeordnet.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_t&lt;br /&gt;
|T Jobinformationen&lt;br /&gt;
|Die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Jobinformationen|Jobinformationen]] sind ein Protokoll des Shops für die Preispflege-Jobs. Diese werden beim Exportieren der Preise angelegt. Über diesen Menüpunkt können Sie die bisherigen Job-Protokolle einsehen. Beim Einlesen der Jobinformationen werden aufgetretene Fehler verarbeitet.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_u&lt;br /&gt;
|U Bestellungen einlesen&lt;br /&gt;
|Liest die vorhanden Bestelldateien aus dem Shop-Verzeichnis ein. Für den automatischen Import siehe [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken#Bestellungen_einlesen|Automatiken: Bestellungen einlesen]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_w&lt;br /&gt;
|W Definitionen importieren&lt;br /&gt;
|Über diesen Menüpunkt können Sie alle für OBS-Relevanten Definitionen zur Vorbereitung der Datenexporte importieren. Dies umfasst aktuell folgende Definitionen:&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/DepotPartner|Depots/Lager mit Partner]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Anreden#brShop24|Anreden]]&lt;br /&gt;
*Kundentypen (u. a. B2B, B2C)&lt;br /&gt;
*Kundenqualifikation (u. a. neuer Kunden, Stammkunde)&lt;br /&gt;
Für den automatischen Import siehe [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken#Definitionen_importieren|Automatiken: Definitionen importieren]].&lt;br /&gt;
{{Hinweis|Diese Definitionen spielen an verschiedenen Stellen eine wichtige Rolle. Sollten Sie die Definitionen noch nicht importiert und vor einem Datenexport zugeordnet haben, funktionert entweder der Datenexport nicht oder es werden Standardwerte verwendet.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_x&lt;br /&gt;
|X Konfiguration&lt;br /&gt;
|Öffnet die [[OBS/Stammdaten/Schnittstellen/Internet-Shop/Konfiguration|Konfiguration]] der Schnittstellen. Hier können die Einstellungen der Schnittstelle angepasst werden.{{Hinweis|Um Anpassungen vorzunehmen wird für die meisten Einstellungen ein Level von 3 oder 5 benötigt. Es ist möglich dieses Level anzupassen, auch kann ein Benutzer für die Schnittstelle ein abweichendes Benutzerlevel erhalten. Melden Sie sich bei Bedarf per [[OBS/System/Ticket-System|OBS Ticketsystem]] beim OBS-Support.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_y&lt;br /&gt;
|Y Testumgebung&lt;br /&gt;
|Öffnet eine Testumgebung, um die Anbindung zu testen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_z&lt;br /&gt;
|Z Protokoll&lt;br /&gt;
|Über den Menüpunkt &#039;&#039;Z Protokoll&#039;&#039; des Shops-Menüs erhalten Sie Zugriff auf das Shop-Protokoll. Es werden vorrangig Hinweise zu Fehlern oder Problemen bei Im- und Exporten protokolliert. Über die Konfiguration kann mit Aktivierung des Debugmodus (Schlüssel &#039;&#039;Shop.Debug&#039;&#039;) eine erweiterte Protokollierung aktiviert werden. Dafür benötigt ein Benutzer jedoch Administrationsrechte (Level 9) für die Schnittstelle.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Zuordnungen=&lt;br /&gt;
Zuordnungen von Stammdaten wie Lieferanten und Mengeneinheiten nehmen Sie über den Shop-Menüpunkt &#039;&#039;X Konfiguration&#039;&#039; vor. In der Kofigurationsliste gelangen Sie über {{Key|F8 Zuord}} ins Zuordnungsmenü.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Aktuelle Menüpunkte:&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Anreden#brShop24|A Anreden]]&lt;br /&gt;
:Liste für im Shop definierte Anreden. Hier können Sie die OBS-Anreden mit den Shop-Anreden verknüpfen. Relevant für den Export von Personen. Ohne Zuordnung werden Personen ohne Anrede exportiert.&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Einheiten#brShop24|E Einheiten]]&lt;br /&gt;
:Liste für im Shop definierte Mengeneinheiten. Ordenen Sie hier die im OBS verwendeten Mengeneinheiten zu. {{Hinweis|Relevant für eigene Artikel. Ist eine verwendete OBS-Mengeneinheit nicht zugeordnet, so wird beim Export die Einheit &amp;quot;ST&amp;quot; (Stück) für den jeweiligen Artikel verwendet.}}&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/DepotPartner|L Lager und Lagerlieferanten]]&lt;br /&gt;
:Definierte Depots und Partner des Shops. Partnern können Sie einem OBS-Lieferanten zuordnen und die Lager entsprechend auf Pflege Büroring oder als eigene Artikel definieren. Relevant für den Export von Preisen, Shoppinglisten (Bestellvorlagen) und eigene Artikel.&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Zusatz/Artikeltausch|T Artikeltausch]]&lt;br /&gt;
:Greift beim Auftragsimport. Austauschen bestimmter Referenznummern gegen einen festgeschrieben Artikel z. B. für Pauschalen.&lt;br /&gt;
&lt;br /&gt;
=Erklärungen/Funktionen=&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Kundengruppen_verwalten|Kundengruppen verwalten]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Personen_übertragen|Kunden übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen|Preise übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Eigene_Artikel_übertragen|eigene Artikel übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Shoppinglisten_übertragen|Shoppinglisten übertragen (z. B. Bestellvorlagen)]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Jobinformationen|Jobinformationen]]&lt;br /&gt;
*[[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]]&lt;br /&gt;
*[[PDF-Druck Artikellink]]&lt;br /&gt;
&lt;br /&gt;
=Häufig gestellte Fragen (FAQ)=&lt;br /&gt;
==Daten Allgemein==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_alg_datennichtangezeigt&lt;br /&gt;
|Ich habe Daten aus OBS übertragen, diese werden jedoch nicht angezeigt?&lt;br /&gt;
|Je nach Art der Daten gelten verschiedene Voraussetzungen. Prüfen Sie daher, ob die Voraussetzungen gegeben sind oder bereits der Export scheitert. Entsprechende Hinweise finden Sie in den Hilfetexten zum jeweiligen Datenexport oder im Protokoll.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Sind die Daten im Shop angelegt dort jedoch z. B. über den Adminbereich gelöscht worden, so können die Daten dort wiederhergestellt werden. Prüfen Sie daher auch, ob dies auf die Daten zutrifft.&amp;lt;br /&amp;gt;Dazu sei noch angemerkt, dass es im brShop24 zwei Varianten zum Löschen von Daten gibt:&lt;br /&gt;
#Soft-Delete&amp;lt;br /&amp;gt;d.h. ein Datensatz kann mit einem Löschkennzeichen markiert werden, so dass dieser zur Not auch wieder hergestellt werden kann (ähnlich dem Papierkorb unter Windows). Dies wird so z. B. im Adminbereich angewendet.&lt;br /&gt;
#Hard-Delete&amp;lt;br /&amp;gt;d.h. der Datensatz wird auch physikalisch vom Datenträger gelöscht, ist somit aus dem System entfernt und kann nicht wieder hergestellt werden. Dies gilt für die API.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_alg_apisuperadmin&lt;br /&gt;
|Kann ich die Datensätze aus der API im Adminbereich ändern/editieren?&lt;br /&gt;
|Standardmäßig wird eine Bearbeitung von Datensätzen, welche per API gepflegt werden, im Shop gesperrt. Sie haben jedoch die Möglichkeit die Bearbeitung in Ihrem Adminbenutzer freizugeben. Die Administratoren finden Sie im Menü des Adminbereichs unter &#039;&#039;Administration&#039;&#039; im Unterpunkt &#039;&#039;Administratoren&#039;&#039;. Suchen Sie in der Liste Ihren Benutzer (Benutzername steht oben rechts) und öffnen Sie die Eingabemaske. Im Reiter &#039;&#039;Einstellungen&#039;&#039; setzen Sie dann as Häkchen bei &#039;&#039;API Super-Administrator?&#039;&#039;.&lt;br /&gt;
{{Hinweis|Da es Daten/Felder gibt, welche OBS nicht über die API pflegen kann. Kann es durchaus sinnvoll sein, dies zu aktivieren. Dies betrifft z. B. Berechtigungen für Kundengruppen wie die Sortimentsfreigabe.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Preise/Preislisten==&lt;br /&gt;
Siehe [[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen#Häufig_gestellt_Fragen_(FAQ)|FAQ Preisexport brShop24]].&lt;br /&gt;
&lt;br /&gt;
==Import Auftragsdateien (OpenTRANS)==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_imp_auftrag&lt;br /&gt;
|Warum wird die Kostenstelle nicht übernommen?&lt;br /&gt;
|Die Referenz auf die Kostenestelle muss in der Auftragsdatei im Element COST_CATEGORY_ID enthalten sein. OBS erwartet hier die vollständige Bezeichnung der [[OBS/Stammdaten/Personen#B2_-_Kostenstellen|Kostenstelle]]. Ist die Kostenstelle in der Auftragsdatei nicht enthalten oder die Referenz stimmt mit keiner Kostenstelle überein, so wird im Import keine Kostenstelle übernommen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Migration VShop4==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_allg_parallelbetrieb&lt;br /&gt;
|Können im OBS brShop24 und VShop4 parallel betrieben werden?&lt;br /&gt;
|Ja, es ist mögliche beide Shops im OBS zu verwalten. OBS ist in der Lage mehrere Schnittstellen, auch des gleichen Typs, zu verwalten. Die Schnittstellen arbeiten unabhängig voneinander. Nach unseren Informationen ist ein Parallelbetrieb seitens Büroring jedoch nicht gewünscht, da die Daten des VShop 4 nachträglich nicht oder nur mit deutlich größerem Aufwand in den brShop24 migriert werden könnten. Eventuell gehen Ihnen hier also Daten verloren, wenn der VShop4 abgeschaltet wird. Der brShop24 würde nach der Migration also Ihren aktuellen VShop 4 ersetzen. Bei Fragen zu dem Thema wenden Sie sich bitte an den Support des Büroring.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24&amp;diff=62766</id>
		<title>Kostenpflichtige Module/Internet-Shop/brShop24</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=Kostenpflichtige_Module/Internet-Shop/brShop24&amp;diff=62766"/>
		<updated>2024-02-08T11:23:27Z</updated>

		<summary type="html">&lt;p&gt;Prakti: Unterpunkt Funktionen Artikellink&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Kostenpflichtige Module}}&lt;br /&gt;
{{Aktuelles|Die Schnittstelle brShop24 wird 60 Euro monatlich kosten.}}&lt;br /&gt;
Der brShop24 wird von der Genossenschaft [https://www.bueroring.de Büroring eG] entwickelt und angeboten. Diese ECommerce-Lösung soll langfristig den bisher angebotenen VShop 4 Pro ablösen. Für die Anbindung an den brShop24 steht Ihnen eine Schnittstelle basierend auf [https://de.wikipedia.org/wiki/GraphQL GraphQL] zur Verfügung.&lt;br /&gt;
{{Achtung|Für die Preisübertragung wird das kostenpflichtige Modul [[OBS/Kostenpflichtige_Module/Preislisten|Preislisten]] vorausgesetzt!}}&lt;br /&gt;
{{Achtung|Die Schnittstellen für VShop 4 Pro und brShop24 sind nicht kompatibel! Sollten Sie sich also für eine Umstellung Ihres VShop 4 Pro auf das neue System brShop24 entscheiden, so muss dies im OBS ebenfalls umgestellt werden!&amp;lt;br/&amp;gt;Siehe auch die Punkte [[#Umstellung.2FMigration_VShop_4|Umstellung/Migration VShop 4]] und [[#faq_brshop24_allg_parallelbetrieb|FAQ Parallelbetrieb]].}}&lt;br /&gt;
=Funktionsumfang=&lt;br /&gt;
{{Achtung|Die hier aufgeführten Funktionen sind unter Vorbehalt in der aktuellen Version von OBS enthalten, da sich die Funktionalitäten in API und OBS noch ändern können.}}&lt;br /&gt;
Diese Schnittstelle unterstützt den Im- und Export von Daten wie folgt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Import!! Export&lt;br /&gt;
|-&lt;br /&gt;
| Auftragsimport (OpenTRANS 1.0)|| Preislisten&lt;br /&gt;
|-&lt;br /&gt;
| Depots + Partner|| Kundengruppen&lt;br /&gt;
|-&lt;br /&gt;
| Anreden|| Ansprechpartner (Benutzer und Personen)&lt;br /&gt;
|-&lt;br /&gt;
| Kundentypen|| Kostenstellen&lt;br /&gt;
|-&lt;br /&gt;
| Kundenqualifikation|| Adressen (Personenstamm)&lt;br /&gt;
|-&lt;br /&gt;
| Job-Informationen (Ergebnis/Protokoll Preispflege)|| Shopping-Listen (Meistgekaufte Artikel/Top-Artikel)&lt;br /&gt;
|-&lt;br /&gt;
| Kundengruppen (Migration)|| &lt;br /&gt;
|-&lt;br /&gt;
| Benutzer (Migration)|| &lt;br /&gt;
|-&lt;br /&gt;
| Kostenstellen (Migration)|| &lt;br /&gt;
|}&lt;br /&gt;
{{Hinweis|Zu Beginn wird es nur Bestelldateien im Format OpenTRANS 1.0 geben. Das neuere Format 2.1 ist aber bereits eingeplant und soll zu einem späteren Zeitpunkt folgen.}}&lt;br /&gt;
==Vergleich zur Schnittstelle VShop 4==&lt;br /&gt;
Stand: 13.10.2022&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!|&lt;br /&gt;
|&#039;&#039;&#039;VShop 4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;brShop24&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Bestellungen importieren&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Kundendaten abfragen&#039;&#039;&#039;&lt;br /&gt;
|ja (&amp;quot;Kunde vorhanden?&amp;quot;)&lt;br /&gt;
|ja (&amp;quot;Kunde vorhanden?&amp;quot; und Migration)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Kundendaten übertragen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|(Kunden-)Gruppe&lt;br /&gt;
|Aus Personennummer (Hauptperson)&lt;br /&gt;
|eigene Verwaltung&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Benutzerkonto&lt;br /&gt;
|aus Person und Ansprechpartner&lt;br /&gt;
|aus Ansprechpartner&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kostenstellen&lt;br /&gt;
|nur als Kostenstelle (mit Budget)&lt;br /&gt;
|Kostenstelle (noch ohne Budget; fehlt im Shop bisher) und Versandadresse&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Shopping-Listen&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Adressen/Adressbuch&lt;br /&gt;
|nein (nur Standardadresse im Benutzerkonto)&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Anreden&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kundentyp&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Kundenqualifikation&lt;br /&gt;
|nein&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Artikelvorlage setzen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Preise übertragen&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja (nur Preislisten)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Lager&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Partner&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Warengruppen/Kategorien&#039;&#039;&#039;&lt;br /&gt;
|Import (Definition/Zuordnung)&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Artikel&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|übertragen&lt;br /&gt;
|ja&lt;br /&gt;
|ja&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;padding-left: 100px&amp;quot;|Abgleich (eigene Artikel)&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Sterne&#039;&#039;&#039;&lt;br /&gt;
|ja&lt;br /&gt;
|nein&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;monatliche Kosten&#039;&#039;&#039;&lt;br /&gt;
|20 Euro&lt;br /&gt;
|60 Euro&lt;br /&gt;
|}&lt;br /&gt;
{{Hinweis|Für eine Beschreibung der einzelnen Funktionen siehe [[#Erklärungen/Funktionen|Erklärungen/Funktionen]].}}&lt;br /&gt;
&lt;br /&gt;
==Bekannte Probleme==&lt;br /&gt;
{{Hinweis|Die hier aufgeführten Probleme sollen einen Überblick zum Stand einzelner Funktionen geben, sollten Sie sich dazu entscheiden mit der Schnittstelle zu arbeiten.}}&lt;br /&gt;
{{Achtung|Bei den letzten Tests kam es zu einem Fehler innerhalb der API, durch den die übermittelten Daten nicht korrekt verarbeitet wurden. Der Fehler trat an verschiedenen Stellen auf und konnte nicht reproduziert werden. Aktuell ist dies unter Beobachtung seitens Büroring. Von OBS aus können Sie aktuell die Datenübertragung nur ein zweites Mal ausführen, bis eine Lösung für das Problem gefunden wurde. Bei Preislisten hatte das Problem jedoch noch die Auswirkung, dass die Preislisten danach doppelt vorhanden war (siehe &amp;quot;doppelte Preislisten bei Fehler in Preislistenupdate&amp;quot;).}}&lt;br /&gt;
===Import Bestellungen===&lt;br /&gt;
*;eindeutige Identifikation von Artikeln&lt;br /&gt;
:Nach aktuellem Stand wird nur der aktuelle Katalog von Büroring eingespielt. Sollten jedoch auch von anderen Lieferanten Artikel im Shop verkauft werden, kann es bei den Artikelnummern zu &amp;quot;doppelten&amp;quot; Artikeln kommen. Derzeit fehlt noch die Möglichkeit dies beim Import unterscheiden zu können.&lt;br /&gt;
*;fehlende Kostenstellen&lt;br /&gt;
:In der Auftragsdatei werden nach aktuellem Stand keine Kostenstellen geliefert. Somit kann OBS diese bei der Auftragsgenerierung hinterlegen.&amp;lt;br /&amp;gt;&#039;&#039;Die Kostenstellen werden nach Informationen von Büroring jetzt in die openTRANS-Order übernommen (Stand 25.02.2021).&#039;&#039;&lt;br /&gt;
*;Anzeige in FTP-Eingang&lt;br /&gt;
:Bei aktivierter Anzeige von importierten Bestellungen im FTP-Eingang, wird bisher in der Spalte &#039;&#039;Typ&#039;&#039; nichts angezeigt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003663 (Info 005482).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Personendaten===&lt;br /&gt;
*;Export Kostenstellen Budgets&lt;br /&gt;
:Die Budgetverwaltung wurde bisher noch nicht im brShop24 umgesetzt und steht daher auch in der API noch nicht zur Verfügung.&lt;br /&gt;
*;Anzeige Webshop-Einstellungen&lt;br /&gt;
:Die Anzeige des Kundenstatus funktioniert aktuell nur, wenn die Kundennummer auch in einer Kundengruppe steht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003591 (Info 005378).&#039;&#039;&lt;br /&gt;
*;Übertragung Adressen&lt;br /&gt;
:Die Adressen werden nicht angelegt, weil der Typ mit einem ungültigen Wert an die API übergeben wird.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003587 (Info 005365).&#039;&#039;&lt;br /&gt;
*;Zuordnung Adressen Kundengruppe&lt;br /&gt;
:Adressen werden bei Übertragung auch in der Kundengruppe zugeordnet, obwohl es sich um eine System-Gruppe handelt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003600.&#039;&#039;&lt;br /&gt;
*;Zuordnung Adressen Benutzer&lt;br /&gt;
:Im Benutzer wird eine übertragene Adresse nicht zugeordnet.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003665 (Info 005483).&#039;&#039;&lt;br /&gt;
*;Einfügen neuer Kundengruppen&lt;br /&gt;
:Die Datensätze werden im OBS nicht korrekt angelegt und können daher nicht exportiert werden.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003594 (Infos 005375 und 005393).&#039;&#039;&lt;br /&gt;
*;Adressen aus Kostenstellen&lt;br /&gt;
:Werden bisher nicht übertragen.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003606 (Info 005398). Adressen aus Kostenstellen werden jetzt als Versandadressen hinterlegt&#039;&#039;&lt;br /&gt;
*;Zuordnung Kostenstellen&lt;br /&gt;
:Kostenstellen werden bei Übertragung auch in der Kundengruppe zugeordnet, wenn es sich um eine System-Gruppe handelt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003600. Kostenstellen werden bei Systemgruppen nicht mehr exportiert. Benutzer erhalten einen Hinweis bei Export der Personendaten aus den Webshop-Einstellungen und werden gefragt, ob die Personedaten trotzdem exportiert werden sollen.&#039;&#039;&lt;br /&gt;
*;Im Shop ist der Adresstyp vertauscht&lt;br /&gt;
:Adressen die eigentlich &amp;quot;Postanschrift&amp;quot; haben sollten, bekommen &amp;quot;Postfach Anschrift&amp;quot; und umgekehrt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003684 (Info 005494).&#039;&#039;&lt;br /&gt;
*;Benutzer ist immer Admin&lt;br /&gt;
:Die Funktionalität über Eigenschaft 9011 wurde noch nicht übernommen aus der VShop-Schnittstelle übernommen, da sie dort problembehaftet ist. Die Fehlerhafte Übertragung in dieser Schnittstelle wurde somit vorerst vollständig entfernt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003735 (Info 005548).&#039;&#039;&lt;br /&gt;
*;Benutzer wird nicht angelegt&lt;br /&gt;
:Während des Exports kommt es zu einem Abbruch im OBS und der Export wird nicht vollständig ausgeführt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004061 (Info 005911).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Preise/Preislisten===&lt;br /&gt;
*;Keine Aktualisierung für Kunden mit Kundennummer im Benutzer&lt;br /&gt;
:Preislisten werden nicht erkannt, wenn die Kundennummer nur im Benutzer vorkommt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003592 (Info 005384).&#039;&#039;&lt;br /&gt;
*;doppelte Preislisten bei Fehler in Preislistenupdate&lt;br /&gt;
:Tritt in der Aktualisierung der Preislistenkopfdaten ein Fehler auf, so wird die Preisliste ein weitere Mal angelegt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003630 (Info 005452).&#039;&#039;&lt;br /&gt;
*;Keine Aktualisierung der Kopfdaten&lt;br /&gt;
:Wurden im OBS Änderungen an den Kopfdaten (Name, Prio, Gültigkeitszeitraum) vorgenommen, konnte es passieren, dass diese nicht in den Shop übertragen wurden.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003703 (Info 005515).&#039;&#039;&lt;br /&gt;
*;Preise löschen verlängert die Laufzeit der Preispflege&lt;br /&gt;
:Beim Löschen von Preisen könnte es vorkommen, dass sich die zu löschenden Datensätze nicht korrekt aus der Liste genommen wurden, auch wenn der Datensatz aus dem Shop entfernt wurde. Dadurch versucht OBS diese Datensätze bei jedem folgenden Durchlauf der Preispflege zu löschen, was fehlschlägt, da die Datensätze ja schon gelöscht sind.&amp;lt;br /&amp;gt;&#039;&#039;Behoben voraussichtlich mit Version 003833 (Info 005664).&#039;&#039;&lt;br /&gt;
*;Preise werden nicht bei allen Preislisten aktualisiert&lt;br /&gt;
:Eine Prüfung war fehlerhaft und konnte die Aktualisierung der Preise für eine Preisliste verhindern.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003911 (Info 005733).&#039;&#039;&lt;br /&gt;
*;Preislisten, welche über Preisgruppen einem Kunden zugeordnet sind, werden im Shop nicht in Kundengruppen und Benutzern hinterlegt&lt;br /&gt;
:An einer Stelle in der Abfrage der Zuordnungen sind die Nummern für Preisgruppe und Preisliste vertauscht. Der Fehler betrifft eigene Preislisten, welche über Preisgruppen zugeordnet sind. Für die Standard-Preislisten VK1 bis VK9 kommt es nicht zu diesem Fehler, da hier die Nummern identisch sind.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003959 (Info 005785).&#039;&#039;&lt;br /&gt;
*;Zuordnungen von Preislisten sind fehlerhaft&lt;br /&gt;
:Unter bestimmten Umständen (Löschen ganzer Preislisten oder Kunde ohne verbleibende Preisliste) kann es im OBS zu einem Problem mit der Verwaltung der Zuordnungen im Shop kommen. Zuordnungen können dabei erhalten bleiben oder werden nicht angelegt.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005847).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Bestellvorlagen/Shoppinglisten===&lt;br /&gt;
*;Anzeige im Shop&lt;br /&gt;
:Nach aktuellem Stand können die Bestellvorlagen, die es auch schon für den VShop 4 exportiert werden konnten, in den brShop24 übertragen werden. Die Anzeige im Frontend (Ansicht für den Kunden) ist jedoch noch nicht umgesetzt. Sie können aktuell nur über den Admibereich prüfen, ob die Bestellvorlagen im Shop angekommen sind.&amp;lt;br /&amp;gt;&#039;&#039;Im Frontend werden die Listen jetzt angezeigt (Stand: 09.11.2021).&#039;&#039;&lt;br /&gt;
*;Generierung Shoppinglisten&lt;br /&gt;
:Durch einen Fehler in der Erkennung des Brüroring Zentrallagers konnte die falsche Lager-ID gezogen werden. Dadurch wurden die Artikel nicht korrekt identifiziert und die Shoppinglisten wurden nicht generiert.&amp;lt;br /&amp;gt;&#039;&#039;Behoben vorraussichtlich mit Version 003815 (Info 005654).&#039;&#039;&lt;br /&gt;
*;Zuordnung Shoppinglisten&lt;br /&gt;
:In der Übertragung wurden Shoppinglisten nicht in Benutzern zugeordnet. Dadurch sehen insbesondere bei allgemeinen Kundengruppen (z. B. registrierte Kunden) Benutzer die von OBS für eine Kundennummer erstellten und übertragenen Shoppinglisten nicht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 003832 (Info 005663).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Migration===&lt;br /&gt;
*;Auswahl eines vorhandenen Ansprechpartner für Zuordnung zu einem Shop-Benutzer schlägt fehlt&lt;br /&gt;
:Die Auswahl verhält sich als würde keine Datensatz ausgewählt werden und setzt daher die Zuordnung nicht.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005845).&#039;&#039;&lt;br /&gt;
*;Aus einem Benutzerkonto kann kein Ansprechpartner angelegt werden&lt;br /&gt;
:Es kann bei der Übernahme der Daten zu einem SQL-Fehler im OBS kommen, welcher die Anlage der Daten verhindert.&amp;lt;br /&amp;gt;&#039;&#039;Behoben mit Version 004012 (Info 005844).&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Kosten=&lt;br /&gt;
*;Einrichtung&lt;br /&gt;
:Sie können die Schnittstelle vom OBS-Support einrichten lassen oder dies selbst erledigen. Informationen zu den nötigen Daten/Angaben für eine Einrichtung finden Sie im nächsten Punkt [[#Installation.2FEinrichtung|Installation/Einrichtung]].&amp;lt;br /&amp;gt;Wenn Sie eine Einrichtung durch den OBS-Support wünschen, wird dies &#039;&#039;&#039;einmalig nach Aufwand&#039;&#039;&#039; abgerechnet.&lt;br /&gt;
*;Nutzung Schnittstelle&lt;br /&gt;
:Für den Einsatz wird pro aktiver brShop24-Schnittstelle &#039;&#039;&#039;monatlich 60 Euro&#039;&#039;&#039; berechnet.&lt;br /&gt;
&lt;br /&gt;
=Installation/Einrichtung=&lt;br /&gt;
Für die Einrichtung werden Angaben zur API-Anbindung und FTP-Zugangsdaten für die Abholung der Auftragsdateien benötigt. Außerdem muss OBS für die Preispflege auf das kostenpflichtige [[OBS/Kostenpflichtige_Module/Preislisten|OBS-Modul Preislisten]] umgestellt worden sein.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Für eine genaue Auflistung der benötigten Informationen und eine Beschreibung der Einrichtung lesen Sie bitte die Seite zur [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|&amp;lt;u&amp;gt;Einrichtung einer brShop24-Schnittstelle&amp;lt;/u&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
=Mit der Schnittstelle Starten=&lt;br /&gt;
==Daten migrieren==&lt;br /&gt;
Sofern Sie in der Vergangenheit einen VShop 4 verwendet haben und die Daten vom Büroring in den neuen brShop24 migriert wurden, empfehlen wir nach Abschluss der Einrichtung eine [[Kostenpflichtige_Module/Internet-Shop/brShop24/Migration|Datenmigration im OBS]] durchzuführen (siehe auch [[#Umstellung.2FMigration_VShop_4|Umstellung/Migration VShop 4]]). Dabei werden die vom VShop 4 migrierten Kundendaten aus dem Shop ausgelesen und in OBS importiert. OBS versucht die importierten Daten anschließend mit den Stammdaten zu verknüpfen und erstellt für die Kunden die Webshop-Einstellungen und gibt die Ansprechpartner frei.&amp;lt;br /&amp;gt;&lt;br /&gt;
Nach den Kundengruppen und Benutzern werden die Kostenstellen eingelesen und versucht den Einträgen im OBS zuzuordnen. Der Anzeigename (Shop) einer Kostenstelle muss dabei mit der Bezeichnung der Kostenstelle übereinstimmen und innerhalb der Kundengruppe eindeutig sein.&lt;br /&gt;
{{Achtung|Die Zuordnung läuft automatisiert und kann einige Minuten in Anspruch nehmen! Sollte der Vorgang abbrechen, können Sie die Migration erneut starten. Die Zuordnung erfolgt nur für Daten, die eindeutig identifiziert werden konnten!}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Außerdem werden die Preislisten aus den im Shop vorhandenen Preislisten ermittelt und für die Schnittstelle freigegeben. Die Preislisten werden stattdessen nach erfolgreicher Zuordnung im Shop geleert und neu befüllt. So sind die Preisdaten auch gleich auf dem aktuellen Stand und für die spätere Aktualisierung sind die Daten im OBS entsprechend vorbereitet.&lt;br /&gt;
{{Achtung|Es findet &#039;&#039;&#039;keine&#039;&#039;&#039; Verknüpfung mit den Preisdaten im OBS statt, da der vollständige Abgleich aller einzelnen Preisdaten zu lange dauern würde!}}&lt;br /&gt;
&lt;br /&gt;
==Datenhoheit==&lt;br /&gt;
Es gibt einige spezifische Daten im Shop, die von OBS nicht angefasst werden (dürfen). Das betrifft z. B. die Standard-Kundengruppen des brShop24. Für OBS-Daten hat jedoch OBS die Datenhoheit. Im Shop können Sie dies an den verfügbaren Funktionen (Bild 1) erkennen. Die von OBS gepflegten Daten werden über die API (Bild 2) angelegt und haben bei den Funktionen statt dem Stift-Symbol (Daten bearbeiten) nur ein Auge-Symbol (Daten ansehen).&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;200px&amp;quot;&amp;gt;&lt;br /&gt;
File:Br24_admin_datenoptionen.jpg|Bild 1: Funktionen|alt=Funktionen&lt;br /&gt;
File:Br24_admin_letzte_aend.jpg|Bild 2: Letzte Änderung|alt=letzte Änderung&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Umstellung/Migration VShop 4=&lt;br /&gt;
Nach aktuellem Stand wird für Kunden mit VShop 4 vom Büroring eine Migration des bestehenden VShop 4 auf den neuen brShop24 durchgeführt. Dabei soll auch gewählt werden können, welche Daten bei der Migration übernommen werden. Wie dies genau aussieht, müssen Sie jedoch mit dem Büroring klären. Es gibt jedoch auch einige Punkte, die Sie bei der Migration für die Umstellung im OBS bedenken müssen.&lt;br /&gt;
*;Neue API&lt;br /&gt;
:Im Unterschied zum VShop 4 läuft die Schnittstelle zum brShop24 über eine API. OBS dies bringt ein paar Einschränkungen für die migrierten Daten mit sich. Es ist OBS nicht möglich die Daten wiederzufinden, die von OBS zuvor in den VShop 4 übertragen wurden. Wie sich dies auf die Pflege von Daten auswirkt, muss noch in Erfahrung gebracht werden, da im Testsystem keine migrierten Daten zur Verfügung stehen.&lt;br /&gt;
*;Besonderheit Preisdaten&lt;br /&gt;
:OBS arbeitet in Schnittstelle über eine sogenannte API-ID, also eine Identifikationsnnummer speziell für die neue API. OBS kann nur Preisdaten verändern, die auch über die API in den Shop übertragen wurden. Wir empfehlen daher die Preisdaten möglichst über OBS zu pflegen und nicht migrieren zu lassen.&lt;br /&gt;
*;Schnittstelle im OBS&lt;br /&gt;
:Die Schnittstelle muss im OBS freigeschaltet und eingerichtet werden (siehe dazu [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|Einrichtung]]). Dies kann bereits vor der Migration geschehen. Bedenken Sie jedoch, dass die Aufträge erst importiert werden können, nachdem die Schnittstelle eingerichtet wurde. Gebe Sie uns also rechtzeitig Bescheid, damit wir die Schnittstelle freigeben können. Die Einrichtung kann auf Wunsch von uns kostenpflichtig übernommen werden.{{Hinweis|Die Freischaltung der Schnittstelle hat auch eine Anpassung des Vertrags zur Folge. Bitte beachten Sie, dass die Schnittstelle brShop24 mit 60 Euro statt 20 Euro berechnet wird.}}&lt;br /&gt;
*;Modul Preislisten&lt;br /&gt;
:Für den brShop24 wird das Modul [[OBS/Kostenpflichtige_Module/Preislisten|Preislisten]] für die Pflege von Preisen über die Schnittstelle vorrausgesetzt. Sollten Sie dieses Modul noch nicht nutzen, so müsste dies zuvor eingerichtet werden, wenn Sie Preise aus OBS in den Shop übertragen möchten. Die Einrichtung des Moduls kann mehrere Stunden in Anspruch nehmen. Wir empfehlen die Umstellung vor der Migration durchzuführen, da dies die Arbeitsweise mit Artikelpreisen verändert. Eine Schulung wird ebenfalls empfohlen.&lt;br /&gt;
*;Migration Freigaben OBS VShop 4 nach brShop24 (siehe [[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]])&lt;br /&gt;
:Über das Shop-Menü können Kundengruppen und Benutzer mit dem OBS-Personenstamm abgeglichen werden. Im Personenstamm werden dann für gefundene Datensätze Webshop-Einstelungen angelegt. Ansprechpartnern, welchen ein Benutzer eindeutig zugeordnet werden konnten, erhalten die Eigenschaft 9013 und die Zuordnung zur Schnittstelle. Sollte die eindeutige Zuordnung ohne Benutzername erfolgt sein, so wird auch der Benutzername im Ansprechpartner hinterlegt. Außerdem werden die Preislisten mit dem Shop abgeglichen, freigegeben und übertragen.{{Hinweis|Es ist nicht möglich die Passwörter auszulesen. Diese können also nicht im Ansprechpartner hinterlegt werden. Sollten Sie zu einem späteren Zeitpunkt die den Benutzer im Shop aktualisieren wollen, müssten diesen zuvor ein Passwort gegeben werden, sollte noch keines vorhanden sein.}}{{Achtung|Damit die Migration auch die Kundendaten verknüpfen kann, muss diese Funktionalität im Shop freigeschaltet sein. Wenden Sie sich hierzu an den Support des Büroring.}}&lt;br /&gt;
==Ablauf einer Umstellung==&lt;br /&gt;
Für gewöhnlich richtet Büroring zunächst einen Shop zu Testzwecken ein. Sie erhalten danach die API-Daten, mit denen die Schnittstelle eingerichtet werden kann (siehe dazu [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung|Einrichtung]]). Sie können jetzt die Schnittstelle testen und wenn Fragen oder Probleme geklärt sind, dem Büroring die Freigabe für den Live-Betrieb erteilen. Der Shop wird daraufhin zurückgesetzt. Dies muss im OBS ebenfalls passieren. Informieren Sie dazu den Support per Ticket oder E-Mail (siehe dazu auch [[Kostenpflichtige_Module/Internet-Shop/brShop24/Einrichtung#Vorwort|Vorwort Einrichtung]]).&lt;br /&gt;
&lt;br /&gt;
=Menü=&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_b&lt;br /&gt;
|B Preislisten verwalten&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen#Preislisten_verwalten|Preislistenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_f&lt;br /&gt;
|F Kundengruppen&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Kundengruppen_verwalten|Kundengruppenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_i&lt;br /&gt;
|I Bestellvorlagen verwalten&lt;br /&gt;
|Öffnet die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Shoppinglisten_übertragen|Shoplistenverwaltung der Schnittstelle]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_m&lt;br /&gt;
|M Migration&lt;br /&gt;
|Startet die [[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]] der Daten. Dabei werden die aktuellen Kudnendaten (Gruppen und Benutzer) eingelesen und im Personestamm, sofern automatisiert möglich, Webshop-Einstellungen angelegt und Ansprechpartner zugeordnet.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_t&lt;br /&gt;
|T Jobinformationen&lt;br /&gt;
|Die [[Kostenpflichtige_Module/Internet-Shop/brShop24/Jobinformationen|Jobinformationen]] sind ein Protokoll des Shops für die Preispflege-Jobs. Diese werden beim Exportieren der Preise angelegt. Über diesen Menüpunkt können Sie die bisherigen Job-Protokolle einsehen. Beim Einlesen der Jobinformationen werden aufgetretene Fehler verarbeitet.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_u&lt;br /&gt;
|U Bestellungen einlesen&lt;br /&gt;
|Liest die vorhanden Bestelldateien aus dem Shop-Verzeichnis ein. Für den automatischen Import siehe [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken#Bestellungen_einlesen|Automatiken: Bestellungen einlesen]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_w&lt;br /&gt;
|W Definitionen importieren&lt;br /&gt;
|Über diesen Menüpunkt können Sie alle für OBS-Relevanten Definitionen zur Vorbereitung der Datenexporte importieren. Dies umfasst aktuell folgende Definitionen:&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/DepotPartner|Depots/Lager mit Partner]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Anreden#brShop24|Anreden]]&lt;br /&gt;
*Kundentypen (u. a. B2B, B2C)&lt;br /&gt;
*Kundenqualifikation (u. a. neuer Kunden, Stammkunde)&lt;br /&gt;
Für den automatischen Import siehe [[Kostenpflichtige_Module/Internet-Shop/Einrichtung/Automatiken#Definitionen_importieren|Automatiken: Definitionen importieren]].&lt;br /&gt;
{{Hinweis|Diese Definitionen spielen an verschiedenen Stellen eine wichtige Rolle. Sollten Sie die Definitionen noch nicht importiert und vor einem Datenexport zugeordnet haben, funktionert entweder der Datenexport nicht oder es werden Standardwerte verwendet.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_x&lt;br /&gt;
|X Konfiguration&lt;br /&gt;
|Öffnet die [[OBS/Stammdaten/Schnittstellen/Internet-Shop/Konfiguration|Konfiguration]] der Schnittstellen. Hier können die Einstellungen der Schnittstelle angepasst werden.{{Hinweis|Um Anpassungen vorzunehmen wird für die meisten Einstellungen ein Level von 3 oder 5 benötigt. Es ist möglich dieses Level anzupassen, auch kann ein Benutzer für die Schnittstelle ein abweichendes Benutzerlevel erhalten. Melden Sie sich bei Bedarf per [[OBS/System/Ticket-System|OBS Ticketsystem]] beim OBS-Support.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_y&lt;br /&gt;
|Y Testumgebung&lt;br /&gt;
|Öffnet eine Testumgebung, um die Anbindung zu testen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|menu_z&lt;br /&gt;
|Z Protokoll&lt;br /&gt;
|Über den Menüpunkt &#039;&#039;Z Protokoll&#039;&#039; des Shops-Menüs erhalten Sie Zugriff auf das Shop-Protokoll. Es werden vorrangig Hinweise zu Fehlern oder Problemen bei Im- und Exporten protokolliert. Über die Konfiguration kann mit Aktivierung des Debugmodus (Schlüssel &#039;&#039;Shop.Debug&#039;&#039;) eine erweiterte Protokollierung aktiviert werden. Dafür benötigt ein Benutzer jedoch Administrationsrechte (Level 9) für die Schnittstelle.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Zuordnungen=&lt;br /&gt;
Zuordnungen von Stammdaten wie Lieferanten und Mengeneinheiten nehmen Sie über den Shop-Menüpunkt &#039;&#039;X Konfiguration&#039;&#039; vor. In der Kofigurationsliste gelangen Sie über {{Key|F8 Zuord}} ins Zuordnungsmenü.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Aktuelle Menüpunkte:&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Anreden#brShop24|A Anreden]]&lt;br /&gt;
:Liste für im Shop definierte Anreden. Hier können Sie die OBS-Anreden mit den Shop-Anreden verknüpfen. Relevant für den Export von Personen. Ohne Zuordnung werden Personen ohne Anrede exportiert.&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/Einheiten#brShop24|E Einheiten]]&lt;br /&gt;
:Liste für im Shop definierte Mengeneinheiten. Ordenen Sie hier die im OBS verwendeten Mengeneinheiten zu. {{Hinweis|Relevant für eigene Artikel. Ist eine verwendete OBS-Mengeneinheit nicht zugeordnet, so wird beim Export die Einheit &amp;quot;ST&amp;quot; (Stück) für den jeweiligen Artikel verwendet.}}&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Konfiguration/Zuordnungen/DepotPartner|L Lager und Lagerlieferanten]]&lt;br /&gt;
:Definierte Depots und Partner des Shops. Partnern können Sie einem OBS-Lieferanten zuordnen und die Lager entsprechend auf Pflege Büroring oder als eigene Artikel definieren. Relevant für den Export von Preisen, Shoppinglisten (Bestellvorlagen) und eigene Artikel.&lt;br /&gt;
*;[[Kostenpflichtige_Module/Internet-Shop/Zusatz/Artikeltausch|T Artikeltausch]]&lt;br /&gt;
:Greift beim Auftragsimport. Austauschen bestimmter Referenznummern gegen einen festgeschrieben Artikel z. B. für Pauschalen.&lt;br /&gt;
&lt;br /&gt;
=Erklärungen/Funktionen=&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Kundengruppen_verwalten|Kundengruppen verwalten]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Personen_übertragen|Kunden übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen|Preise übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Eigene_Artikel_übertragen|eigene Artikel übertragen]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Shoppinglisten_übertragen|Shoppinglisten übertragen (z. B. Bestellvorlagen)]]&lt;br /&gt;
*[[Kostenpflichtige_Module/Internet-Shop/brShop24/Jobinformationen|Jobinformationen]]&lt;br /&gt;
*[[Kostenpflichtige Module/Internet-Shop/brShop24/Migration|Migration]]&lt;br /&gt;
*PDF-Druck Artikellink&lt;br /&gt;
&lt;br /&gt;
=Häufig gestellte Fragen (FAQ)=&lt;br /&gt;
==Daten Allgemein==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_alg_datennichtangezeigt&lt;br /&gt;
|Ich habe Daten aus OBS übertragen, diese werden jedoch nicht angezeigt?&lt;br /&gt;
|Je nach Art der Daten gelten verschiedene Voraussetzungen. Prüfen Sie daher, ob die Voraussetzungen gegeben sind oder bereits der Export scheitert. Entsprechende Hinweise finden Sie in den Hilfetexten zum jeweiligen Datenexport oder im Protokoll.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Sind die Daten im Shop angelegt dort jedoch z. B. über den Adminbereich gelöscht worden, so können die Daten dort wiederhergestellt werden. Prüfen Sie daher auch, ob dies auf die Daten zutrifft.&amp;lt;br /&amp;gt;Dazu sei noch angemerkt, dass es im brShop24 zwei Varianten zum Löschen von Daten gibt:&lt;br /&gt;
#Soft-Delete&amp;lt;br /&amp;gt;d.h. ein Datensatz kann mit einem Löschkennzeichen markiert werden, so dass dieser zur Not auch wieder hergestellt werden kann (ähnlich dem Papierkorb unter Windows). Dies wird so z. B. im Adminbereich angewendet.&lt;br /&gt;
#Hard-Delete&amp;lt;br /&amp;gt;d.h. der Datensatz wird auch physikalisch vom Datenträger gelöscht, ist somit aus dem System entfernt und kann nicht wieder hergestellt werden. Dies gilt für die API.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_alg_apisuperadmin&lt;br /&gt;
|Kann ich die Datensätze aus der API im Adminbereich ändern/editieren?&lt;br /&gt;
|Standardmäßig wird eine Bearbeitung von Datensätzen, welche per API gepflegt werden, im Shop gesperrt. Sie haben jedoch die Möglichkeit die Bearbeitung in Ihrem Adminbenutzer freizugeben. Die Administratoren finden Sie im Menü des Adminbereichs unter &#039;&#039;Administration&#039;&#039; im Unterpunkt &#039;&#039;Administratoren&#039;&#039;. Suchen Sie in der Liste Ihren Benutzer (Benutzername steht oben rechts) und öffnen Sie die Eingabemaske. Im Reiter &#039;&#039;Einstellungen&#039;&#039; setzen Sie dann as Häkchen bei &#039;&#039;API Super-Administrator?&#039;&#039;.&lt;br /&gt;
{{Hinweis|Da es Daten/Felder gibt, welche OBS nicht über die API pflegen kann. Kann es durchaus sinnvoll sein, dies zu aktivieren. Dies betrifft z. B. Berechtigungen für Kundengruppen wie die Sortimentsfreigabe.}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Preise/Preislisten==&lt;br /&gt;
Siehe [[Kostenpflichtige_Module/Internet-Shop/brShop24/Preise_übertragen#Häufig_gestellt_Fragen_(FAQ)|FAQ Preisexport brShop24]].&lt;br /&gt;
&lt;br /&gt;
==Import Auftragsdateien (OpenTRANS)==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_imp_auftrag&lt;br /&gt;
|Warum wird die Kostenstelle nicht übernommen?&lt;br /&gt;
|Die Referenz auf die Kostenestelle muss in der Auftragsdatei im Element COST_CATEGORY_ID enthalten sein. OBS erwartet hier die vollständige Bezeichnung der [[OBS/Stammdaten/Personen#B2_-_Kostenstellen|Kostenstelle]]. Ist die Kostenstelle in der Auftragsdatei nicht enthalten oder die Referenz stimmt mit keiner Kostenstelle überein, so wird im Import keine Kostenstelle übernommen.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Migration VShop4==&lt;br /&gt;
{{Vorlage:KlapptextFAQ&lt;br /&gt;
|faq_brshop24_allg_parallelbetrieb&lt;br /&gt;
|Können im OBS brShop24 und VShop4 parallel betrieben werden?&lt;br /&gt;
|Ja, es ist mögliche beide Shops im OBS zu verwalten. OBS ist in der Lage mehrere Schnittstellen, auch des gleichen Typs, zu verwalten. Die Schnittstellen arbeiten unabhängig voneinander. Nach unseren Informationen ist ein Parallelbetrieb seitens Büroring jedoch nicht gewünscht, da die Daten des VShop 4 nachträglich nicht oder nur mit deutlich größerem Aufwand in den brShop24 migriert werden könnten. Eventuell gehen Ihnen hier also Daten verloren, wenn der VShop4 abgeschaltet wird. Der brShop24 würde nach der Migration also Ihren aktuellen VShop 4 ersetzen. Bei Fragen zu dem Thema wenden Sie sich bitte an den Support des Büroring.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=OBS/Kostenpflichtige_Module/RESTServer/Beispiel2&amp;diff=62607</id>
		<title>OBS/Kostenpflichtige Module/RESTServer/Beispiel2</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=OBS/Kostenpflichtige_Module/RESTServer/Beispiel2&amp;diff=62607"/>
		<updated>2023-10-18T08:39:55Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
Dieses Script dient zur Zeiterfassung über den REST-Server. Bei Seitenaufruf wird eine Liste von Kunden geladen und in einer Liste angezeigt. &lt;br /&gt;
&lt;br /&gt;
Durch Rechtsklick auf einen Eintrag wird eine Liste an zugehörigen Tätigkeiten geladen, die nach Klick einen Timer starten.&lt;br /&gt;
&lt;br /&gt;
Per Javascript werden Startzeit, Startdatum und andere Informationen wie Kunde und Personalnummer über die PHP-Scripte und das Endpunkt-Script in einer Datenbank gespeichert.&lt;br /&gt;
&lt;br /&gt;
Der Status wird hierbei auf &amp;quot;1&amp;quot; gesetzt. Pausenzeiten werden nach Beenden einer Pause in der Datenbank gespeichert.&lt;br /&gt;
&lt;br /&gt;
Durch Drücken des Stop-Buttons wird eine Lightbox mit einer Zusammenfassung aller zum Timer gehörenden Daten angezeigt. Hier hat man die Möglichkeit Tätigkeiten, abgelaufene Zeit und &lt;br /&gt;
&lt;br /&gt;
Pausenzeit nachträglich zu bearbeiten. Durch Klick auf &amp;quot;Speichern&amp;quot; oder Druck auf F2 werden Endzeit und Enddatum gespeichert und der Status auf &amp;quot;21&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
Nach Reload der Webseite wird anhand des Status in der Datenbank nach laufenden Timern gesucht und diese gegebenenfalls gestartet.&lt;br /&gt;
&lt;br /&gt;
= Endpunkt-Script =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure _AddJob(oArr: TJSONArray; id: String);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT CONCAT(za_text, &amp;quot;:&amp;quot;,sys_uid) AS Job FROM zeiterfart &#039; +&lt;br /&gt;
                &#039;WHERE za_psnr = &#039; + DB_SQLVal(id) + &#039; AND za_inaktiv &amp;lt;&amp;gt; &amp;quot;1&amp;quot; &#039; +&lt;br /&gt;
                &#039;ORDER BY za_order&#039;;&lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;Job&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddCustomer(oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=&#039;  SELECT * FROM&#039; + &lt;br /&gt;
              &#039;  (SELECT&#039; +&lt;br /&gt;
              &#039;  ps_nr,&#039; +&lt;br /&gt;
              &#039;  ps_such AS Kunde,&#039; +&lt;br /&gt;
              &#039;  perssta.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PE&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN perssta ON se_ref1 AND perssta.sys_uid = se_ref2&#039; +&lt;br /&gt;
              &#039;  WHERE se_nr = 0087&#039; + &lt;br /&gt;
              &#039;  AND ps_nr &amp;lt;&amp;gt; 100000&#039; +&lt;br /&gt;
              &#039;  UNION SELECT p_nr AS ps_nr,&#039; +&lt;br /&gt;
              &#039;  p_name1 AS ps_such,&#039; +&lt;br /&gt;
              &#039;  projekte.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PR&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN projekte ON se_ref1 = p_nr&#039; +&lt;br /&gt;
              &#039;  AND projekte.sys_uid = se_ref2 WHERE se_nr = 0087)&#039; +&lt;br /&gt;
              &#039;  A WHERE ps_nr IS NOT NULL&#039; +&lt;br /&gt;
              &#039;  ORDER BY Kunde &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;Kunde&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddID(kunde: String; oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=&#039;  SELECT * FROM&#039; + &lt;br /&gt;
              &#039;  (SELECT&#039; +&lt;br /&gt;
              &#039;  ps_nr,&#039; +&lt;br /&gt;
              &#039;  ps_such AS Kunde,&#039; +&lt;br /&gt;
              &#039;  perssta.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PE&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN perssta ON se_ref1 AND perssta.sys_uid = se_ref2&#039; +&lt;br /&gt;
              &#039;  WHERE se_nr = 0087&#039; + &lt;br /&gt;
              &#039;  AND ps_nr &amp;lt;&amp;gt; 100000&#039; +&lt;br /&gt;
              &#039;  UNION SELECT p_nr AS ps_nr,&#039; +&lt;br /&gt;
              &#039;  p_name1 AS ps_such,&#039; +&lt;br /&gt;
              &#039;  projekte.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PR&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN projekte ON se_ref1 = p_nr&#039; +&lt;br /&gt;
              &#039;  AND projekte.sys_uid = se_ref2 WHERE se_nr = 0087)&#039; +&lt;br /&gt;
              &#039;  A WHERE ps_nr IS NOT NULL&#039; +&lt;br /&gt;
              &#039;  AND Kunde = &#039; + DB_SQLVal(kunde) +&lt;br /&gt;
              &#039;  ORDER BY Kunde &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ps_nr&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddCHECK(oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT ze_starttime, zeiterfuser.sys_uid AS sysuid, zk_psnr, &#039; +&lt;br /&gt;
                &#039;za_text, ps_such, ze_startdate FROM &#039; +&lt;br /&gt;
                &#039;zeiterfuser LEFT JOIN zeiterfkomm ON &#039; +&lt;br /&gt;
                &#039;zk_messunguid = zeiterfuser.SYS_UID LEFT JOIN zeiterfart &#039; +&lt;br /&gt;
                &#039;ON zeiterfart.sys_uid = zeiterfuser.ze_uid AND &#039; +&lt;br /&gt;
                &#039;za_psnr = zeiterfkomm.zk_psnr LEFT JOIN perssta ON &#039; +&lt;br /&gt;
                &#039;ps_nr = zeiterfkomm.zk_psnr WHERE ze_status = 01 &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_starttime&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;zk_psnr&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;za_text&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ps_such&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;sysuid&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_startdate&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _getPauseTime(sysuid: String; oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT * FROM zeiterfuser WHERE sys_uid = &#039; + DB_SQLVal(sysuid);&lt;br /&gt;
    &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_pausezeit&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//----------------Funktionen----------------------------------//&lt;br /&gt;
&lt;br /&gt;
function POST(oParams: TStrings): string;&lt;br /&gt;
var &lt;br /&gt;
oArr1                                   : TJSONArray;&lt;br /&gt;
cSql                                    : String;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    if (oParams.values[&#039;choice&#039;]=&#039;job&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddJob(oArr1, oParams.values[&#039;id&#039;]);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;customer&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddCustomer(oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;id&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddID(oParams.values[&#039;selectedKunde&#039;], oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;check&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddCHECK(oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;pauseTime&#039;) then begin    &lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _GetPauseTime(oParams.values[&#039;sysuid&#039;], oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function PUT(oParams: TStrings): string;&lt;br /&gt;
var &lt;br /&gt;
xZeit           : TqSQL;&lt;br /&gt;
cUSER_SYSUID    : String;&lt;br /&gt;
cKOMM_SYSUID    : String;&lt;br /&gt;
lNew            : Boolean;&lt;br /&gt;
cSql            : String;&lt;br /&gt;
dDBNow          : TDateTime;&lt;br /&gt;
begin  &lt;br /&gt;
    writeln(&#039;Choice: &#039; + oParams.values[&#039;choice&#039;]);&lt;br /&gt;
    if (oParams.values[&#039;choice&#039;]=&#039;start&#039;) then&lt;br /&gt;
    begin&lt;br /&gt;
        dDBNow  := DB_Now(oDB); &lt;br /&gt;
        lNew    := True;&lt;br /&gt;
        if (empty(cUSER_SYSUID)) then begin&lt;br /&gt;
            cUSER_SYSUID := GetNewId(oDB);&lt;br /&gt;
        end;&lt;br /&gt;
    &lt;br /&gt;
        xZeit           := qSqlInit(oDB, &#039;zeiterfuser&#039;);&lt;br /&gt;
        xZeit.lNoSysUID := True;&lt;br /&gt;
    &lt;br /&gt;
        writeln(&#039;SYSUID: &#039; + oParams.values[&#039;jobID&#039;]);&lt;br /&gt;
    &lt;br /&gt;
        xZeit.qSet(&#039;ze_user&#039;            , oParams.values[&#039;user&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_starttime&#039;       , oParams.values[&#039;uhrzeit&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_eigen&#039;           , &#039;0101&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_startdate&#039;       , oParams.values[&#039;datum&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_endtime&#039;         , oParams.values[&#039;endTime&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_enddate&#039;         , oParams.values[&#039;endDate&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_zeit&#039;            , &#039;0&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_pausezeit&#039;       , &#039;0&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_status&#039;          , oParams.values[&#039;status&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_berechnen&#039;       , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_officestar&#039;      , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_repa&#039;            , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_vorbereitung&#039;    , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_uid&#039;             , oParams.values[&#039;jobID&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;sys_uid&#039;            , cUSER_SYSUID);&lt;br /&gt;
    &lt;br /&gt;
        xZeit.SaveData(lNew);&lt;br /&gt;
        qSQLFree(xZeit);&lt;br /&gt;
        &lt;br /&gt;
        //---------------------------------------------------------------------&lt;br /&gt;
        &lt;br /&gt;
        xZeit := qSqlInit(oDB,&#039;ZEITERFKOMM&#039;);&lt;br /&gt;
        xZeit.lNoSysUID := True;&lt;br /&gt;
        &lt;br /&gt;
        if (empty(cKOMM_SYSUID)) then begin&lt;br /&gt;
            cKOMM_SYSUID := GetNewId(oDB);&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        xZeit.qSet(&#039;zk_psnr&#039;       , oParams.values[&#039;psnr&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_starttime&#039;  , oParams.values[&#039;uhrzeit&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_startdate&#039;  , oParams.values[&#039;datum&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_kommentar&#039;  , oParams.values[&#039;comm&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_messunguid&#039; , cUSER_SYSUID);&lt;br /&gt;
        xZeit.qSet(&#039;sys_uid&#039;       , cKOMM_SYSUID);&lt;br /&gt;
&lt;br /&gt;
        xZeit.SaveData(lNew);&lt;br /&gt;
        qSQLFree(xZeit);&lt;br /&gt;
        &lt;br /&gt;
        result  := cUser_SYSUID;&lt;br /&gt;
        &lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;stop&#039;) then&lt;br /&gt;
    begin&lt;br /&gt;
        &lt;br /&gt;
        cSql := &#039;UPDATE zeiterfuser, zeiterfkomm &#039;   +&lt;br /&gt;
                &#039; SET zeiterfuser.ze_zeit = &#039;       + oParams.values[&#039;elapsedTime&#039;] + &lt;br /&gt;
                &#039;, zeiterfuser.ze_endtime = &#039;        + oParams.values[&#039;vergZeit&#039;] +&lt;br /&gt;
                &#039;, zeiterfuser.ze_enddate = &#039;        + oParams.values[&#039;stopTimeValue&#039;] +&lt;br /&gt;
                &#039;, zeiterfuser.ze_pausezeit = &#039;      + oParams.values[&#039;elapsedPauseTime&#039;] +&lt;br /&gt;
                &#039;, zeiterfuser.ze_status = &#039;         + oParams.values[&#039;status&#039;] +&lt;br /&gt;
                &#039;, zeiterfkomm.zk_kommentar = &#039;      + oParams.values[&#039;comment&#039;] +&lt;br /&gt;
                &#039; WHERE zeiterfuser.sys_uid = &#039;      + DB_SQLVal(oParams.values[&#039;uid&#039;]) +&lt;br /&gt;
                &#039; AND zeiterfkomm.zk_messunguid = &#039;  + DB_SQLVal(oParams.values[&#039;uid&#039;]);&lt;br /&gt;
&lt;br /&gt;
        if DB_SQLExec(oDB,cSql) then&lt;br /&gt;
        begin&lt;br /&gt;
            result := &#039;Die Daten wurden erfolgreich gespeichert!&#039;;&lt;br /&gt;
        end else begin&lt;br /&gt;
            result := &#039;Fehler!&#039;;&lt;br /&gt;
        end;&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;pause&#039;) then&lt;br /&gt;
    begin     &lt;br /&gt;
        writeln(&#039;Pausezeit: &#039; + oParams.values[&#039;pauseTime&#039;]);&lt;br /&gt;
        cSql := &#039;UPDATE zeiterfuser SET ze_pausezeit &#039; + &lt;br /&gt;
                &#039;= ze_pausezeit + &#039;    + oParams.values[&#039;pauseTime&#039;] +&lt;br /&gt;
                &#039; WHERE sys_uid = &#039;    + DB_SQLVal(oParams.values[&#039;sysuid&#039;]);&lt;br /&gt;
&lt;br /&gt;
        if DB_SQLExec(oDB,cSql) then&lt;br /&gt;
        begin&lt;br /&gt;
            result := &#039;Die Daten wurden erfolgreich gespeichert!&#039;;&lt;br /&gt;
        end else begin&lt;br /&gt;
            result := &#039;Fehler!&#039;;&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= HTML-Datei index.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de-DE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;Ihr IT-Partner in Stade - Ernst Bergau GmbH&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;timestyle.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        &amp;lt;?php&lt;br /&gt;
            include(&#039;timer.js&#039;);&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //--------------------------------------------------------------------------------------------------------------// --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //---------------------------------------------------HTML-------------------------------------------------------// --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //--------------------------------------------------------------------------------------------------------------// --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;textarea id=&amp;quot;search&amp;quot; type=&amp;quot;text&amp;quot; rows=&amp;quot;1&amp;quot; cols=&amp;quot;50&amp;quot; oninput=&amp;quot;searchCustomers(this.value)&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;kundenliste&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ul id=&amp;quot;kundenListe&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table class=&amp;quot;timer&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;tbody id=&amp;quot;timerList&amp;quot;&amp;gt;&amp;lt;/tbody&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
        &amp;lt;table class=&amp;quot;tabelleUeberschriften&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;thead&amp;gt;&lt;br /&gt;
                &amp;lt;tr&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;kunde&amp;quot;&amp;gt;Kunde&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;konto&amp;quot;&amp;gt;Konto&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;laufzeit&amp;quot;&amp;gt;Laufzeit&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;status&amp;quot;&amp;gt;Status&amp;lt;/th&amp;gt;&lt;br /&gt;
                &amp;lt;/tr&amp;gt;&lt;br /&gt;
            &amp;lt;/thead&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;lightbox&amp;quot; id=&amp;quot;lightbox&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label class=&amp;quot;commLabel&amp;quot; id=&amp;quot;commLabel&amp;quot; for=&amp;quot;comment&amp;quot;&amp;gt;Kommentar&amp;lt;/label&amp;gt;&lt;br /&gt;
            &amp;lt;textarea class=&amp;quot;comment&amp;quot; id=&amp;quot;comment&amp;quot; rows=&amp;quot;4&amp;quot; cols=&amp;quot;50&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezZeitkonto&amp;quot;&amp;gt;Zeitkonto&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;select class=&amp;quot;dropButtonsLightbox&amp;quot; id=&amp;quot;tätigkeit2Dropdown&amp;quot;&amp;gt;&amp;lt;/select&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezDatum&amp;quot;&amp;gt;Startdatum&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;date&amp;quot; class=&amp;quot;date&amp;quot; id=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;uhrzeit&amp;quot; id=&amp;quot;uhrzeit&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezPerson&amp;quot;&amp;gt;Person&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;eingPerson&amp;quot; id=&amp;quot;eingPerson&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;eingPersonZusatz&amp;quot; id=&amp;quot;eingPersonZusatz&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Std&amp;quot;&amp;gt;Std&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outStd&amp;quot; id=&amp;quot;outStd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Min&amp;quot;&amp;gt;Min&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outMin&amp;quot; id=&amp;quot;outMin&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Sek&amp;quot;&amp;gt;Sek&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outSek&amp;quot; id=&amp;quot;outSek&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Pausenzeiten&amp;quot;&amp;gt;Davon Pausenzeiten&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Std2&amp;quot;&amp;gt;Std&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outStd2&amp;quot; id=&amp;quot;outStd2&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Min2&amp;quot;&amp;gt;Min&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outMin2&amp;quot; id=&amp;quot;outMin2&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Sek2&amp;quot;&amp;gt;Sek&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outSek2&amp;quot; id=&amp;quot;outSek2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;button class=&amp;quot;saveButton&amp;quot; id=&amp;quot;saveButton&amp;quot;&amp;gt;Speichern&amp;lt;/button&amp;gt;&lt;br /&gt;
            &amp;lt;button class=&amp;quot;closeButton&amp;quot; id=&amp;quot;closeButton&amp;quot; onclick=&amp;quot;closeLightboxOnSchliessen()&amp;quot;&amp;gt;Schließen&amp;lt;/button&amp;gt; &lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div id=&amp;quot;zweiteListe&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ul id=&amp;quot;taetigkeitListe&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Javascript-Datei timer.js =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var api_key             = &#039;Y00C75PODJ&#039;;&lt;br /&gt;
var url                 = &#039;http://127.0.0.1:8099/Zeiterfa/zeiterfa/v1&#039;;&lt;br /&gt;
var zaehler             = -1;&lt;br /&gt;
var timerInterval;      &lt;br /&gt;
var pauseTimerInterval; &lt;br /&gt;
var startTimeValue;     &lt;br /&gt;
var selectedID          = 0;&lt;br /&gt;
var elapsedTime;        &lt;br /&gt;
var uid;                &lt;br /&gt;
var idStop; &lt;br /&gt;
var time;&lt;br /&gt;
var selID               = [];&lt;br /&gt;
var job                 = [];&lt;br /&gt;
var sys_uid             = [];&lt;br /&gt;
var timers              = [];    &lt;br /&gt;
var pauseTimers         = [];  &lt;br /&gt;
var pauseTime           = [];&lt;br /&gt;
var startdate           = [];&lt;br /&gt;
var uhrzeit             = [];&lt;br /&gt;
var datum               = [];&lt;br /&gt;
var statusTimer         = [];       &lt;br /&gt;
var selectedJob         = [];&lt;br /&gt;
var selectedKunde       = [];      &lt;br /&gt;
var tempSelectedKunde   = [];&lt;br /&gt;
var parameter           = [];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------------Seitenaufruf---------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Bei Seitenaufruf werden die Funktionen----//&lt;br /&gt;
//----getCustomer und checkTimer aufgerufen und----//&lt;br /&gt;
//----die Kundenliste gefüllt und geprüft,----//&lt;br /&gt;
//----ob laufende timer vorhanden sind----//&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
&lt;br /&gt;
    getCustomer();&lt;br /&gt;
    checkTimer();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-------------------------------------------------Daten auslesen--------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Eine Liste der Kunden wird ausgelesenund gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getCustomer() {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;customer&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            populateListeKunde(responseData);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Bei Rechtsklick auf Kunden wird----//&lt;br /&gt;
//----seine ID ausgelesen und gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getCustomerID(selectedKunde, callback) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;id&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;selectedKunde=&amp;quot;       + encodeURIComponent(selectedKunde);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            selectedID = JSON.parse(request.responseText);&lt;br /&gt;
            callback(selectedID);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Anhand der Kunden-ID wird eine Liste von Tätigkeiten----//&lt;br /&gt;
//----für jeden Kunden ausgelesen und gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getJob(id, callback) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;job&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;id=&amp;quot;                  + encodeURIComponent(id);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            var Data         = responseData.toString();&lt;br /&gt;
            var teile        = Data.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
            var jobid = [];&lt;br /&gt;
&lt;br /&gt;
            for (i=0; i&amp;lt;teile.length; i++) {&lt;br /&gt;
                job[i]   = teile[i].split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
                jobid[i] = teile[i].split(&amp;quot;:&amp;quot;)[1];&lt;br /&gt;
            }&lt;br /&gt;
            callback(job, jobid);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Tätigkeitsliste wird nochmal zur Weiterverarbeitung gelesen----//&lt;br /&gt;
&lt;br /&gt;
function getJobs(id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;job&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;id=&amp;quot;                  + encodeURIComponent(id);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;, false);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            var data = responseData.toString();&lt;br /&gt;
            var teile = data.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
            var jobid = [];&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; teile.length; i++) {&lt;br /&gt;
                job[i] = teile[i].split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
                jobid[i] = teile[i].split(&amp;quot;:&amp;quot;)[1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Gespeicherte Pausezeit wird ausgelesen----//&lt;br /&gt;
&lt;br /&gt;
function getPauseTime(sysuid, id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;pauseTime&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params  =   &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;sysuid=&amp;quot;              + encodeURIComponent(sysuid);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;, false);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            pauseTime[id].value = JSON.parse(request.responseText);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Listen--------------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Eine Liste wird mit Kundendaten gefüllt und angezeigt----//&lt;br /&gt;
&lt;br /&gt;
function populateListeKunde(data) {&lt;br /&gt;
&lt;br /&gt;
    data.forEach(function(item) {&lt;br /&gt;
        var listItem = document.createElement(&amp;quot;li&amp;quot;);&lt;br /&gt;
        listItem.textContent = item;&lt;br /&gt;
&lt;br /&gt;
        listItem.addEventListener(&amp;quot;contextmenu&amp;quot;, function(event) {&lt;br /&gt;
            event.preventDefault();&lt;br /&gt;
&lt;br /&gt;
            var selectedKunde = item;&lt;br /&gt;
            getCustomerID(selectedKunde, function(selectedID) {&lt;br /&gt;
                getJob(selectedID, function(job, jobid) {&lt;br /&gt;
                    showSecondList(job, jobid, item);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        kundenListe.appendChild(listItem);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Eine zweite Liste wird mit Jobs gefüllt,----//&lt;br /&gt;
//----angezeigt und bei Klick auf einen Eintrag---//&lt;br /&gt;
//-------die Funktion startTimer aufgerufen-------//&lt;br /&gt;
&lt;br /&gt;
function showSecondList(job, jobid, kundeItem) {&lt;br /&gt;
&lt;br /&gt;
    var zweiteListe = document.getElementById(&amp;quot;zweiteListe&amp;quot;);&lt;br /&gt;
    zweiteListe.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    job.forEach(function(item) {&lt;br /&gt;
        var listItem = document.createElement(&amp;quot;li&amp;quot;);&lt;br /&gt;
        listItem.textContent = item;&lt;br /&gt;
    &lt;br /&gt;
        (function(capturedItem) {&lt;br /&gt;
            listItem.addEventListener(&amp;quot;click&amp;quot;, function() {&lt;br /&gt;
                startTimer(job, jobid, capturedItem, kundeItem);&lt;br /&gt;
            });&lt;br /&gt;
        }) (item);&lt;br /&gt;
        zweiteListe.appendChild(listItem);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;block&amp;quot;; &lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeSecondList);&lt;br /&gt;
    document.addEventListener(&#039;click&#039;, closeSecondList);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Nach Klick auf Eintrag wird die Liste geschlossen----//&lt;br /&gt;
function closeSecondList() {&lt;br /&gt;
&lt;br /&gt;
    var zweiteListe = document.getElementById(&amp;quot;zweiteListe&amp;quot;);&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;none&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Daten speichern-----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Startzeit, -datum, ID und Job werden gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveStartTime(user, uhrzeit, datum, endTime, endDate, status, psnr, Job, jobID) {&lt;br /&gt;
    &lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;start&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;user=&amp;quot;                + encodeURIComponent(user) +&lt;br /&gt;
                    &amp;quot;&amp;amp;uhrzeit=&amp;quot;             + encodeURIComponent(uhrzeit) +&lt;br /&gt;
                    &amp;quot;&amp;amp;datum=&amp;quot;               + encodeURIComponent(datum) +&lt;br /&gt;
                    &amp;quot;&amp;amp;endTime=&amp;quot;             + encodeURIComponent(endTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;endDate=&amp;quot;             + encodeURIComponent(endDate) +&lt;br /&gt;
                    &amp;quot;&amp;amp;status=&amp;quot;              + encodeURIComponent(status)+&lt;br /&gt;
                    &amp;quot;&amp;amp;psnr=&amp;quot;                + encodeURIComponent(psnr)+&lt;br /&gt;
                    &amp;quot;&amp;amp;Job=&amp;quot;                 + encodeURIComponent(Job)+&lt;br /&gt;
                    &amp;quot;&amp;amp;jobID=&amp;quot;               + encodeURIComponent(jobID);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            sys_uid[zaehler].value = request.responseText;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Pausezeit wird gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function savePauseTime(pauseTime, id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;pause&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;      + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;         + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;      + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;      + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;pauseTime=&amp;quot;   + encodeURIComponent(pauseTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;sysuid=&amp;quot;      + encodeURIComponent(sys_uid[id].value);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            // alert(request.responseText);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Stopzeit und -datum wird gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveStopTime(stopTimeValue, elapsedTime, elapsedPauseTime, status, uid, vergZeit, comment) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;stop&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;stopTimeValue=&amp;quot;       + encodeURIComponent(stopTimeValue) +&lt;br /&gt;
                    &amp;quot;&amp;amp;elapsedTime=&amp;quot;         + encodeURIComponent(elapsedTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;elapsedPauseTime=&amp;quot;    + encodeURIComponent(elapsedPauseTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;status=&amp;quot;              + encodeURIComponent(status) +&lt;br /&gt;
                    &amp;quot;&amp;amp;uid=&amp;quot;                 + encodeURIComponent(uid) +&lt;br /&gt;
                    &amp;quot;&amp;amp;vergZeit=&amp;quot;            + encodeURIComponent(vergZeit)+&lt;br /&gt;
                    &amp;quot;&amp;amp;comment=&amp;quot;            + encodeURIComponent(comment);&lt;br /&gt;
    &lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200 &amp;amp;&amp;amp; timers.length === 0) {&lt;br /&gt;
            location.reload();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Like-Suche----------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Durchsucht die Liste der Kunden auf alle einegegebenen Zeichen----//&lt;br /&gt;
&lt;br /&gt;
function searchCustomers(text) {&lt;br /&gt;
&lt;br /&gt;
    text = text.toLowerCase();&lt;br /&gt;
    var kundenListe = document.getElementById(&amp;quot;kundenListe&amp;quot;);&lt;br /&gt;
    var listItems = kundenListe.getElementsByTagName(&amp;quot;li&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (i=0; i&amp;lt;listItems.length; i++) {&lt;br /&gt;
        var item = listItems[i].textContent.toLowerCase();&lt;br /&gt;
        if (item.includes(text)) {&lt;br /&gt;
            listItems[i].style.display = &amp;quot;block&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            listItems[i].style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------Vorhandenen Timer checken----------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Überprüft, ob es Einträge in Datenbank ohne----//&lt;br /&gt;
//----Endzeit gibt und startet entsprechend Timer----//&lt;br /&gt;
&lt;br /&gt;
function checkTimer() {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;check&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200 &amp;amp;&amp;amp; timers.length === 0) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            &lt;br /&gt;
            if (responseData.length !== 0) {&lt;br /&gt;
                startTimeValue = new Date();&lt;br /&gt;
                var minutes = startTimeValue.getMinutes();&lt;br /&gt;
                var seconds = startTimeValue.getSeconds();&lt;br /&gt;
                var month = startTimeValue.getMonth() + 1;&lt;br /&gt;
&lt;br /&gt;
                responseData = responseData.toString();&lt;br /&gt;
                var teile = responseData.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                for (var i=0; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
                    uhrzeit.push({value: startTimeValue.getHours() + &amp;quot;:&amp;quot; + (minutes &amp;lt; 10 ? &amp;quot;0&amp;quot; + minutes : minutes) + &amp;quot;:&amp;quot; + (seconds &amp;lt; 10 ? &amp;quot;0&amp;quot; + seconds : seconds)});&lt;br /&gt;
                    datum.push({value: startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + startTimeValue.getDate()});&lt;br /&gt;
&lt;br /&gt;
                    zaehler++;&lt;br /&gt;
&lt;br /&gt;
                    statusTimer.push({value: &#039;Running&#039;});&lt;br /&gt;
                    pauseTimers.push({value: 0});&lt;br /&gt;
                    pauseTime.push({value: 0});&lt;br /&gt;
                    timers.push({value: teile[i]});&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var j=0;&lt;br /&gt;
                for (var i=1; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
                    selID.push({value: teile[i]});&lt;br /&gt;
                    getJobs(selID[j].value);&lt;br /&gt;
                    j++;&lt;br /&gt;
                } &lt;br /&gt;
&lt;br /&gt;
                fillArray(2, selectedJob, teile);&lt;br /&gt;
                fillArray(3, selectedKunde, teile);&lt;br /&gt;
                fillArray(4, sys_uid, teile);&lt;br /&gt;
                fillArray(5, startdate, teile);&lt;br /&gt;
&lt;br /&gt;
                for (var i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
                    var startZeitTeil = timers[i].value.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
                    var startDatumTeil = startdate[i].value.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    var diffMilli = new Date() - getStartdatum(startDatumTeil, startZeitTeil);&lt;br /&gt;
                    timers[i].value = Math.floor(diffMilli / 1000); &lt;br /&gt;
                }   &lt;br /&gt;
&lt;br /&gt;
                selecteID = 0;&lt;br /&gt;
                startInterval(job);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Arrays werden an diese Funktion übergeben und gefüllt----//&lt;br /&gt;
&lt;br /&gt;
function fillArray(LZ, array, teile) {&lt;br /&gt;
&lt;br /&gt;
    var arrLZ = 0;&lt;br /&gt;
    for (var i=LZ; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
        array.push({value: teile[i]});&lt;br /&gt;
        arrLZ++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Startdatum wird errechnet----//&lt;br /&gt;
function getStartdatum(startDatumTeil, startZeitTeil) {&lt;br /&gt;
&lt;br /&gt;
    var startdatum = new Date(&lt;br /&gt;
        parseInt(startDatumTeil[2]),&lt;br /&gt;
        parseInt(startDatumTeil[1]) -1,&lt;br /&gt;
        parseInt(startDatumTeil[0]),&lt;br /&gt;
        parseInt(startZeitTeil[0]),&lt;br /&gt;
        parseInt(startZeitTeil[1]),&lt;br /&gt;
        parseInt(startZeitTeil[2])&lt;br /&gt;
    );&lt;br /&gt;
    return startdatum;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-------------------------------------------------Interval--------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Interval für Timer wird gestartet----//&lt;br /&gt;
&lt;br /&gt;
function startInterval(job, item, kundeItem, index) {&lt;br /&gt;
&lt;br /&gt;
    timerInterval = setInterval(function() {&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
&lt;br /&gt;
            timers[i].value += 1;&lt;br /&gt;
        }&lt;br /&gt;
        updateUI(job, item, kundeItem, index);&lt;br /&gt;
    }, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Interval für Pausentimer wird gestartet----// &lt;br /&gt;
&lt;br /&gt;
function pauseInterval(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    pauseTimerInterval = setInterval(function() {&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;pauseTimers.length; i++) {&lt;br /&gt;
&lt;br /&gt;
            pauseTimers[i].value += 1;&lt;br /&gt;
        }&lt;br /&gt;
        updateUI(job, item, kundeItem);&lt;br /&gt;
    }, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer starten----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----startTimer bereitet die nötigen Arrays vor,----//&lt;br /&gt;
//----speichert Startzeit und -datum,----//&lt;br /&gt;
//----beschreibt Arrays und Variablen entsprechend----//&lt;br /&gt;
//----und ruft die Funktion saveStartTime auf----//&lt;br /&gt;
&lt;br /&gt;
function startTimer(jobs, jobid, selJob, kundeItem) {&lt;br /&gt;
&lt;br /&gt;
    var user = 999;&lt;br /&gt;
    var endTime = &amp;quot;00:00:00&amp;quot;;&lt;br /&gt;
    var endDate = &amp;quot;0000-00-00&amp;quot;;&lt;br /&gt;
    var status = &#039;01&#039;;&lt;br /&gt;
    zaehler++;&lt;br /&gt;
    &lt;br /&gt;
    startTimeValue = new Date();&lt;br /&gt;
&lt;br /&gt;
    var minutes = startTimeValue.getMinutes();&lt;br /&gt;
    var seconds = startTimeValue.getSeconds();&lt;br /&gt;
    uhrzeit.push({value: startTimeValue.getHours() + &amp;quot;:&amp;quot; + (minutes &amp;lt; 10 ? &amp;quot;0&amp;quot; + minutes : minutes) + &amp;quot;:&amp;quot; + (seconds &amp;lt; 10 ? &amp;quot;0&amp;quot; + seconds : seconds)});&lt;br /&gt;
&lt;br /&gt;
    var month = startTimeValue.getMonth() + 1;&lt;br /&gt;
    datum.push({value: startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + startTimeValue.getDate()});&lt;br /&gt;
&lt;br /&gt;
    statusTimer.push({value: &#039;Running&#039;});&lt;br /&gt;
    pauseTimers.push({value: 0});&lt;br /&gt;
    pauseTime.push({value: 0});&lt;br /&gt;
    timers.push({value: 0});&lt;br /&gt;
    selectedKunde.push({value: kundeItem});&lt;br /&gt;
    selectedJob.push({value: selJob});&lt;br /&gt;
    sys_uid.push({value: 0});&lt;br /&gt;
&lt;br /&gt;
    var index = jobs.indexOf(selJob);&lt;br /&gt;
    &lt;br /&gt;
    saveStartTime(user, uhrzeit[zaehler].value, datum[zaehler].value, endTime, endDate, status, selectedID, selJob, jobid[index]);&lt;br /&gt;
    &lt;br /&gt;
    clearInterval(timerInterval);&lt;br /&gt;
    startInterval(jobs, selJob, kundeItem, index);&lt;br /&gt;
&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer stoppen----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Stopt den Timer, ändert den Status und ruft openLightbox auf----//&lt;br /&gt;
&lt;br /&gt;
function stopTimer(job, item, kundeItem, index, id) {&lt;br /&gt;
&lt;br /&gt;
    idStop = id;&lt;br /&gt;
    statusTimer[id].value = &#039;Stopped&#039;;&lt;br /&gt;
    openLightbox(job, item, kundeItem, index, id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer pausieren--------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Pausiert den Timer und ändert den Status----//&lt;br /&gt;
&lt;br /&gt;
function pauseTimer(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    pauseTimers[id].value = 0;&lt;br /&gt;
    clearInterval(pauseTimerInterval);&lt;br /&gt;
    pauseInterval(job, item, kundeItem, id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//----------------------------------------------Button Pause-Start-------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Ruft die Funktion pauseTimer oder----//&lt;br /&gt;
//----savePauseTimer auf----//&lt;br /&gt;
&lt;br /&gt;
function toggleButton(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    var button = document.getElementById(id);&lt;br /&gt;
&lt;br /&gt;
    if (button.innerHTML === &amp;quot;Pause&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
        statusTimer[id].value = &#039;Paused&#039;;&lt;br /&gt;
        pauseTimer(job, item, kundeItem, id);&lt;br /&gt;
    } &lt;br /&gt;
    else {&lt;br /&gt;
&lt;br /&gt;
        statusTimer[id].value = &amp;quot;Running&amp;quot;;&lt;br /&gt;
        savePauseTime(pauseTimers[id].value, id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Ausgabe des Timers-----------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Zeigt eine Liste mit einem oder mehreren----//&lt;br /&gt;
//----Timern und Buttons, verteilt dynamisch ID&#039;s----//&lt;br /&gt;
//----und ruft entsprechend der gedrückten----//&lt;br /&gt;
//----Buttons Funktionen auf----//&lt;br /&gt;
&lt;br /&gt;
function updateUI(job, item, kundeItem, index) {&lt;br /&gt;
    var timerList = document.getElementById(&amp;quot;timerList&amp;quot;);&lt;br /&gt;
    timerList.innerHTML = &#039;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    for (i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
        var neueReihe = document.createElement(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Name des Kunden wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var kundeEintrag = document.createElement(&#039;td&#039;);&lt;br /&gt;
        kundeEintrag.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.width = &amp;quot;30%&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.left = &amp;quot;0%&amp;quot;; &lt;br /&gt;
        kundeEintrag.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        kundeEintrag.classList.add(&#039;kunde_k&#039;);&lt;br /&gt;
        kundeEintrag.textContent = selectedKunde[i].value;&lt;br /&gt;
        timerList.appendChild(kundeEintrag);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Gewählter Job wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var kontoEintrag = document.createElement(&#039;td&#039;);&lt;br /&gt;
        kontoEintrag.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        kontoEintrag.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
        kontoEintrag.style.width = &amp;quot;30%&amp;quot;;&lt;br /&gt;
        kontoEintrag.style.left = &amp;quot;30%&amp;quot;; &lt;br /&gt;
        kontoEintrag.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        kontoEintrag.classList.add(&#039;konto_k&#039;);&lt;br /&gt;
        kontoEintrag.textContent = selectedJob[i].value;&lt;br /&gt;
        timerList.appendChild(kontoEintrag);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Gestartete Timer werden in Liste----//&lt;br /&gt;
        //----ausgegeben, pausierte Timer werden----//&lt;br /&gt;
        //----Liste ausgegeben, sobald Timer gestoppt----//&lt;br /&gt;
        //----wird Ausgabe in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
        if (statusTimer[i].value === &amp;quot;Running&amp;quot;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(timers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &#039;Paused&#039;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(pauseTimers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &#039;Stopped&#039;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(pauseTimers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
&lt;br /&gt;
            var zeit = formatElapsedTime(timers[i].value);&lt;br /&gt;
            zeit = zeit.toString();&lt;br /&gt;
            var teile = zeit.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            var h = teile[0];&lt;br /&gt;
            var m = teile[1];&lt;br /&gt;
            var s = teile[2];&lt;br /&gt;
&lt;br /&gt;
            var outStdField = document.getElementById(&amp;quot;outStd&amp;quot;);&lt;br /&gt;
            var outMinField = document.getElementById(&amp;quot;outMin&amp;quot;);&lt;br /&gt;
            var outSekField = document.getElementById(&amp;quot;outSek&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (document.activeElement !== outStdField &amp;amp;&amp;amp; document.activeElement !== outMinField &amp;amp;&amp;amp; document.activeElement !== outSekField) {&lt;br /&gt;
                document.getElementById(&amp;quot;outStd&amp;quot;).value = h; &lt;br /&gt;
                document.getElementById(&amp;quot;outMin&amp;quot;).value = m;&lt;br /&gt;
                document.getElementById(&amp;quot;outSek&amp;quot;).value = s;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var hEnd = document.getElementById(&amp;quot;outStd&amp;quot;).value;&lt;br /&gt;
            var mEnd = document.getElementById(&amp;quot;outMin&amp;quot;).value;&lt;br /&gt;
            var sEnd = document.getElementById(&amp;quot;outSek&amp;quot;).value;&lt;br /&gt;
            time = hEnd + &amp;quot;:&amp;quot; + mEnd + &amp;quot;:&amp;quot; + sEnd;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Status (Running, Paused, Stopped) wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var statusTimerElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
        statusTimerElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        statusTimerElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
        statusTimerElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
        statusTimerElement.style.left = &amp;quot;75%&amp;quot;; &lt;br /&gt;
        statusTimerElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        statusTimerElement.classList.add(&#039;status_s&#039;);&lt;br /&gt;
        statusTimerElement.textContent = statusTimer[i].value;&lt;br /&gt;
        timerList.appendChild(statusTimerElement);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Pause Button mit dynamisch vergebener ID wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        if (statusTimer[i].value === &amp;quot;Running&amp;quot;) {&lt;br /&gt;
            var pauseButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
            pauseButton.id = i;&lt;br /&gt;
            pauseButton.classList.add(&#039;pauseButton&#039;);&lt;br /&gt;
            pauseButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            pauseButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
            pauseButton.style.left = &amp;quot;90%&amp;quot;; &lt;br /&gt;
            pauseButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
            pauseButton.style.minWidth = &amp;quot;3%&amp;quot;;&lt;br /&gt;
            pauseButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
            pauseButton.textContent = &amp;quot;Pause&amp;quot;&lt;br /&gt;
            pauseButton.addEventListener(&#039;click&#039;, function() {toggleButton(job, item, kundeItem, this.id)});&lt;br /&gt;
            timerList.appendChild(pauseButton);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &amp;quot;Paused&amp;quot;) {&lt;br /&gt;
            var pauseButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
            pauseButton.id = i;&lt;br /&gt;
            pauseButton.classList.add(&#039;pauseButton&#039;);&lt;br /&gt;
            pauseButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            pauseButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
            pauseButton.style.left = &amp;quot;90%&amp;quot;;&lt;br /&gt;
            pauseButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
            pauseButton.style.minWidth = &amp;quot;3%&amp;quot;;&lt;br /&gt;
            pauseButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
            pauseButton.textContent = &amp;quot;Start&amp;quot;&lt;br /&gt;
            pauseButton.addEventListener(&#039;click&#039;, function() {toggleButton(job, item, kundeItem, this.id)});&lt;br /&gt;
            timerList.appendChild(pauseButton);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Stop Button mit dynamisch vergebener ID wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var stopButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
        stopButton.id = i;&lt;br /&gt;
        stopButton.classList.add(&#039;stopButton&#039;);&lt;br /&gt;
        stopButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        stopButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
        stopButton.style.left = &amp;quot;94%&amp;quot;;&lt;br /&gt;
        stopButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
        stopButton.style.width = &amp;quot;3%&amp;quot;;&lt;br /&gt;
        stopButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
        stopButton.textContent = &amp;quot;Stop&amp;quot;&lt;br /&gt;
        stopButton.addEventListener(&#039;click&#039;, function() {stopTimer(job, item, kundeItem, index, this.id)});&lt;br /&gt;
        timerList.appendChild(stopButton);&lt;br /&gt;
        &lt;br /&gt;
        //----Für jeden aufgerufenen Timer wird----//&lt;br /&gt;
        //----eine neue Reihe ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        timerList.appendChild(neueReihe);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------Sekunden in Uhrzeit umrechnen-------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Rechnet übergebene Sekunden in Stunden,----//&lt;br /&gt;
//----Minuten und Sekunden und gibt diese----//&lt;br /&gt;
//----an aufrufende Funktion zurück----//&lt;br /&gt;
&lt;br /&gt;
function formatElapsedTime(seconds) {&lt;br /&gt;
&lt;br /&gt;
    var minutes = Math.floor(seconds / 60);&lt;br /&gt;
    seconds %= 60;&lt;br /&gt;
    var hours = Math.floor(minutes / 60);&lt;br /&gt;
    minutes %= 60;&lt;br /&gt;
    function addLeadingZero(n) {&lt;br /&gt;
        return (n &amp;lt; 10 ? &#039;0&#039; : &#039;&#039;) + n;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return addLeadingZero(hours) + &amp;quot;:&amp;quot; + addLeadingZero(minutes) + &amp;quot;:&amp;quot; + addLeadingZero(seconds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------Uhrzeit in Sekunden umrechnen----------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Rechnet übergebene Stunden, Minuten----//&lt;br /&gt;
//----und Sekunden in Sekunden um und----//&lt;br /&gt;
//----gibt diese an aufrufende Funktion zurück----//&lt;br /&gt;
&lt;br /&gt;
function timeInSeconds(zeit) {&lt;br /&gt;
&lt;br /&gt;
    var teile = zeit.split(&#039;:&#039;);&lt;br /&gt;
    var Stunden = parseInt(teile[0], 10);&lt;br /&gt;
    var Minuten = parseInt(teile[1], 10);&lt;br /&gt;
    var Sekunden = parseInt(teile[2], 10);&lt;br /&gt;
    return Stunden * 3600 + Minuten * 60 + Sekunden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------------Lightbox-------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Öffnet eine Lightbox und zeigt Kunde----//&lt;br /&gt;
//----Job, vergangene Zeit und evtl Pausenzeit an----//&lt;br /&gt;
//----und gibt Möglichkeit alle Zeiten anzupassen----//&lt;br /&gt;
&lt;br /&gt;
function openLightbox(job, item, kundeItem, index, id) {&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&#039;lightbox&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
&lt;br /&gt;
    var dateField = document.getElementById(&amp;quot;date&amp;quot;);&lt;br /&gt;
    dateField.value = datum[id].value;&lt;br /&gt;
    document.getElementById(&amp;quot;uhrzeit&amp;quot;).innerHTML = uhrzeit[id].value;&lt;br /&gt;
&lt;br /&gt;
    var commentTextarea = document.getElementById(&amp;quot;comment&amp;quot;);&lt;br /&gt;
    commentTextarea.value = selectedJob[id].value;&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;eingPersonZusatz&amp;quot;).innerHTML = selectedKunde[id].value;&lt;br /&gt;
&lt;br /&gt;
    if (selectedID.length !== undefined) {&lt;br /&gt;
        document.getElementById(&amp;quot;eingPerson&amp;quot;).innerHTML = selectedID;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        document.getElementById(&amp;quot;eingPerson&amp;quot;).innerHTML = selID[id].value;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //----Ausgabe der vergangenen Zeit in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outMin&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outSek&amp;quot;).value = 00;                      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //----Ausgabe der Pausenzeiten in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd2&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outMin2&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outSek2&amp;quot;).value = 00;                           &lt;br /&gt;
    getPauseTime(sys_uid[id].value, id);                                &lt;br /&gt;
                                                                        &lt;br /&gt;
    var secondsPause = pauseTime[id].value;                             &lt;br /&gt;
    secondsPause %= 60;  &lt;br /&gt;
&lt;br /&gt;
    var minutesPause = Math.floor(pauseTime[id].value / 60);            &lt;br /&gt;
    minutesPause %= 60;    &lt;br /&gt;
&lt;br /&gt;
    var hoursPause = Math.floor(minutesPause / 60);                     &lt;br /&gt;
    hoursPause %= 60;   &lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd2&amp;quot;).value = hoursPause;              &lt;br /&gt;
    document.getElementById(&amp;quot;outMin2&amp;quot;).value = minutesPause;       &lt;br /&gt;
&lt;br /&gt;
    if (secondsPause &amp;gt; 0) {&lt;br /&gt;
        document.getElementById(&amp;quot;outSek2&amp;quot;).value = secondsPause;        &lt;br /&gt;
    }                                                                   &lt;br /&gt;
    else {&lt;br /&gt;
        document.getElementById(&amp;quot;outSek2&amp;quot;).value = 0;                   &lt;br /&gt;
    }                                                                   &lt;br /&gt;
&lt;br /&gt;
    var dropdown2 = document.getElementById(&amp;quot;tätigkeit2Dropdown&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    job.forEach(function(item, index) {&lt;br /&gt;
        var option = document.createElement(&amp;quot;option&amp;quot;);&lt;br /&gt;
        option.textContent = item;&lt;br /&gt;
        dropdown2.add(option)&lt;br /&gt;
&lt;br /&gt;
        if (item === selectedJob[id].value) {&lt;br /&gt;
            option.selected = true;&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeLightboxOnEscape);&lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeLightboxOnF2);&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Lightbox schließen----//&lt;br /&gt;
&lt;br /&gt;
function closeLightbox() {&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&#039;lightbox&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn der Schließen-Button gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnSchliessen() {&lt;br /&gt;
&lt;br /&gt;
    statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
    closeLightbox();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn Escape gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnEscape() {&lt;br /&gt;
&lt;br /&gt;
    if (event.key === &#039;Escape&#039;) {&lt;br /&gt;
        statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
        closeLightbox();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn F2 gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnF2(event) {&lt;br /&gt;
&lt;br /&gt;
    if (event.key === &#039;F2&#039;) {&lt;br /&gt;
        saveBox();&lt;br /&gt;
        closeLightbox();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Alle Daten in Lightbox werden gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveBox() {&lt;br /&gt;
&lt;br /&gt;
    var vergZeit = &#039;&amp;quot;&#039; + time + &#039;&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
    var teile = time.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
    var stunden = parseInt(teile[0]);&lt;br /&gt;
    var minuten = parseInt(teile[1]);&lt;br /&gt;
    var sekunden = parseInt(teile[2]);&lt;br /&gt;
    time = stunden * 3600 + minuten * 60 + sekunden;&lt;br /&gt;
&lt;br /&gt;
    elapsedTime = time;&lt;br /&gt;
&lt;br /&gt;
    var comment = &#039;&amp;quot;&#039; + document.getElementById(&amp;quot;comment&amp;quot;).value + &#039;&amp;quot;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var hPEnd = document.getElementById(&amp;quot;outStd2&amp;quot;).value;&lt;br /&gt;
    var mPEnd = document.getElementById(&amp;quot;outMin2&amp;quot;).value;&lt;br /&gt;
    var sPEnd = document.getElementById(&amp;quot;outSek2&amp;quot;).value;&lt;br /&gt;
    var pTime = hPEnd + &amp;quot;:&amp;quot; + mPEnd + &amp;quot;:&amp;quot; + sPEnd;&lt;br /&gt;
    pTime = timeInSeconds(pTime);&lt;br /&gt;
&lt;br /&gt;
    var uid = sys_uid[idStop].value;&lt;br /&gt;
    var month = startTimeValue.getMonth();&lt;br /&gt;
    var day = startTimeValue.getDate();&lt;br /&gt;
    month += 1;&lt;br /&gt;
    var stopTimeValue = &#039;&amp;quot;&#039; + startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + (day &amp;lt; 10 ? &amp;quot;0&amp;quot; + day : day) + &#039;&amp;quot;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var status = 21;&lt;br /&gt;
&lt;br /&gt;
    timers.splice(idStop, 1);&lt;br /&gt;
    pauseTimers.splice(idStop, 1);&lt;br /&gt;
    pauseTime.splice(idStop, 1);&lt;br /&gt;
    selectedKunde.splice(idStop, 1);&lt;br /&gt;
    selectedJob.splice(idStop, 1);&lt;br /&gt;
    statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
    sys_uid.splice(idStop, 1);&lt;br /&gt;
&lt;br /&gt;
    if (zaehler &amp;gt; 0) {&lt;br /&gt;
        zaehler -= 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    closeLightbox();&lt;br /&gt;
&lt;br /&gt;
    if (timers.length === 0) {&lt;br /&gt;
        clearInterval(timerInterval);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    saveStopTime(stopTimeValue, elapsedTime, pTime, status, uid, vergZeit, comment);&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion saveBox wird aufgerufen,----//&lt;br /&gt;
//----wenn der Save-Button gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function() {&lt;br /&gt;
        const saveButton = document.getElementById(&#039;saveButton&#039;);&lt;br /&gt;
        saveButton.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
            saveBox();&lt;br /&gt;
        })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= PHP-Script saveTime.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $user               = 0;&lt;br /&gt;
    $uhrzeit            = 0;&lt;br /&gt;
    $datum              = 0;&lt;br /&gt;
    $endTime            = 0;&lt;br /&gt;
    $endDate            = 0;&lt;br /&gt;
    $status             = 0;&lt;br /&gt;
    $psnr               = 0;&lt;br /&gt;
    $comm               = 0;&lt;br /&gt;
    $jobID              = 0;&lt;br /&gt;
    $pauseTime          = 0;&lt;br /&gt;
    $sysuid             = 0;&lt;br /&gt;
    $stopTimeValue      = 0;&lt;br /&gt;
    $elapsedTime        = 0;&lt;br /&gt;
    $elapsedPauseTime   = 0;&lt;br /&gt;
    $status             = 0;&lt;br /&gt;
    $uid                = 0;&lt;br /&gt;
    $vergZeit           = 0;&lt;br /&gt;
&lt;br /&gt;
    if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) &lt;br /&gt;
    {&lt;br /&gt;
        $api_key            = $_POST[&#039;api_key&#039;];&lt;br /&gt;
        $url                = $_POST[&#039;url&#039;];&lt;br /&gt;
        $method             = $_POST[&#039;method&#039;];&lt;br /&gt;
        $choice             = $_POST[&#039;choice&#039;];&lt;br /&gt;
&lt;br /&gt;
        if (isset($_POST[&#039;user&#039;])) {&lt;br /&gt;
            $user               = $_POST[&#039;user&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;uhrzeit&#039;])) {&lt;br /&gt;
            $uhrzeit            = $_POST[&#039;uhrzeit&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;datum&#039;])) {&lt;br /&gt;
            $datum              = $_POST[&#039;datum&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;endTime&#039;])) {&lt;br /&gt;
            $endTime            = $_POST[&#039;endTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;endDate&#039;])) {&lt;br /&gt;
            $endDate            = $_POST[&#039;endDate&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;status&#039;])) {&lt;br /&gt;
            $status             = $_POST[&#039;status&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;psnr&#039;])) {&lt;br /&gt;
            $psnr               = $_POST[&#039;psnr&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;Job&#039;])) {&lt;br /&gt;
            $comm               = $_POST[&#039;Job&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;jobID&#039;])) {&lt;br /&gt;
            $jobID              = $_POST[&#039;jobID&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;pauseTime&#039;])) {&lt;br /&gt;
            $pauseTime          = $_POST[&#039;pauseTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;sysuid&#039;])) {&lt;br /&gt;
            $sysuid             = $_POST[&#039;sysuid&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;stopTimeValue&#039;])) {&lt;br /&gt;
            $stopTimeValue      = $_POST[&#039;stopTimeValue&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;elapsedTime&#039;])) {&lt;br /&gt;
            $elapsedTime        = $_POST[&#039;elapsedTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;elapsedPauseTime&#039;])) {&lt;br /&gt;
            $elapsedPauseTime   = $_POST[&#039;elapsedPauseTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;status&#039;])) {&lt;br /&gt;
            $status             = $_POST[&#039;status&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;uid&#039;])) {&lt;br /&gt;
            $uid                = $_POST[&#039;uid&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;vergZeit&#039;])) {&lt;br /&gt;
            $vergZeit           = $_POST[&#039;vergZeit&#039;];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $params = array(    &#039;user&#039;              =&amp;gt; $user, &lt;br /&gt;
                            &#039;uhrzeit&#039;           =&amp;gt; $uhrzeit, &lt;br /&gt;
                            &#039;datum&#039;             =&amp;gt; $datum, &lt;br /&gt;
                            &#039;endTime&#039;           =&amp;gt; $endTime, &lt;br /&gt;
                            &#039;endDate&#039;           =&amp;gt; $endDate, &lt;br /&gt;
                            &#039;status&#039;            =&amp;gt; $status, &lt;br /&gt;
                            &#039;psnr&#039;              =&amp;gt; $psnr,&lt;br /&gt;
                            &#039;comm&#039;              =&amp;gt; $comm,&lt;br /&gt;
                            &#039;jobID&#039;             =&amp;gt; $jobID,&lt;br /&gt;
                            &#039;pauseTime&#039;         =&amp;gt; $pauseTime,&lt;br /&gt;
                            &#039;sysuid&#039;            =&amp;gt; $sysuid,&lt;br /&gt;
                            &#039;stopTimeValue&#039;     =&amp;gt; $stopTimeValue,&lt;br /&gt;
                            &#039;elapsedTime&#039;       =&amp;gt; $elapsedTime,&lt;br /&gt;
                            &#039;elapsedPauseTime&#039;  =&amp;gt; $elapsedPauseTime,&lt;br /&gt;
                            &#039;status&#039;            =&amp;gt; $status,&lt;br /&gt;
                            &#039;uid&#039;               =&amp;gt; $uid,&lt;br /&gt;
                            &#039;vergZeit&#039;          =&amp;gt; $vergZeit,&lt;br /&gt;
                            &#039;choice&#039;            =&amp;gt; $choice);&lt;br /&gt;
&lt;br /&gt;
        $curl = curl_init($url);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(&#039;apikey: &#039;.$api_key));&lt;br /&gt;
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));&lt;br /&gt;
        $response = curl_exec($curl);&lt;br /&gt;
&lt;br /&gt;
        if ($response === false) {&lt;br /&gt;
            if($error) {&lt;br /&gt;
                echo &amp;quot;curl_Fehler: &amp;quot;.$error;&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        else {&lt;br /&gt;
            echo $response;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= PHP-Script getData.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $sysuid             = 0;&lt;br /&gt;
    $id                 = 0;&lt;br /&gt;
    $selectedKunde      = 0;&lt;br /&gt;
            &lt;br /&gt;
    if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) &lt;br /&gt;
    {&lt;br /&gt;
        $api_key        = $_POST[&#039;api_key&#039;];&lt;br /&gt;
        $url            = $_POST[&#039;url&#039;];&lt;br /&gt;
        $method         = $_POST[&#039;method&#039;];&lt;br /&gt;
        $choice         = $_POST[&#039;choice&#039;];&lt;br /&gt;
        &lt;br /&gt;
        if (isset($_POST[&#039;id&#039;])) {&lt;br /&gt;
            $id = $_POST[&#039;id&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;sysuid&#039;])) {&lt;br /&gt;
            $sysuid = $_POST[&#039;sysuid&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;selectedKunde&#039;])) {&lt;br /&gt;
            $selectedKunde  = $_POST[&#039;selectedKunde&#039;];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $params = array(    &#039;sysuid&#039;            =&amp;gt; $sysuid,&lt;br /&gt;
                            &#039;id&#039;                =&amp;gt; $id, &lt;br /&gt;
                            &#039;selectedKunde&#039;     =&amp;gt; $selectedKunde,&lt;br /&gt;
                            &#039;choice&#039;            =&amp;gt; $choice);&lt;br /&gt;
        &lt;br /&gt;
        $curl = curl_init($url);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(&#039;apikey: &#039;.$api_key));&lt;br /&gt;
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));&lt;br /&gt;
        $response = curl_exec($curl);&lt;br /&gt;
&lt;br /&gt;
        if ($response === false) {&lt;br /&gt;
            if($error) {&lt;br /&gt;
                echo &amp;quot;curl_Fehler: &amp;quot;.$error;&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        else {&lt;br /&gt;
            echo $response;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CSS-Datei timestyle.css =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-----------------------------------------Allgemein-----------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
body &lt;br /&gt;
{&lt;br /&gt;
    font-family: &#039;Arial&#039;, sans-serif;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: right;&lt;br /&gt;
    align-items: flex-start;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background-image: url(&#039;web_background_3.png&#039;);&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-size: cover; &lt;br /&gt;
    background-attachment: fixed;&lt;br /&gt;
}&lt;br /&gt;
ul &lt;br /&gt;
{&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
}&lt;br /&gt;
li &lt;br /&gt;
{&lt;br /&gt;
    padding: 0.5em;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    display: flex; &lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------Suche-------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
#search&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 8%;&lt;br /&gt;
    left: 42%;&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    height: 2.8%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.04em solid #e4e4e4;&lt;br /&gt;
    border-radius: 0.1em;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 2em;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-----------------------------------------Timerausgabe--------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.kundenliste&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    height: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 43.5%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    border-top-left-radius: 0.2em;&lt;br /&gt;
    border-top-right-radius: 0.2em;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
}&lt;br /&gt;
.tabelleUeberschriften&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    min-height: 3%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 60%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    /* border-top: 0.14em solid #ccc;&lt;br /&gt;
    border-bottom: 0.14em solid #ccc; */&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    box-shadow: 0 0px 3px rgba(0, 0, 0, 0.5);&lt;br /&gt;
    font-size: 0.9vw;&lt;br /&gt;
}&lt;br /&gt;
#timerList&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    height: 25%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 73.5%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    border-bottom-left-radius: 0.2em;&lt;br /&gt;
    border-bottom-right-radius: 0.2em;&lt;br /&gt;
    /* border: 0.14em solid red; */&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
} &lt;br /&gt;
.kunde&lt;br /&gt;
{&lt;br /&gt;
    width: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 0%;&lt;br /&gt;
}&lt;br /&gt;
.konto&lt;br /&gt;
{&lt;br /&gt;
    width: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 30%;&lt;br /&gt;
}&lt;br /&gt;
.laufzeit&lt;br /&gt;
{&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 60%;&lt;br /&gt;
}&lt;br /&gt;
.status&lt;br /&gt;
{&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 75%;&lt;br /&gt;
}&lt;br /&gt;
.buttons&lt;br /&gt;
{&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------Lightbox----------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.lightbox&lt;br /&gt;
{&lt;br /&gt;
    display: none;&lt;br /&gt;
    width: 52%;&lt;br /&gt;
    height: 62%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 61.5%;&lt;br /&gt;
    left: 67%;&lt;br /&gt;
    border-radius: 0.15em;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    box-shadow: 0 10px 2000px rgba(0, 0, 0, 0.5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------Lightbox-Inhalt-----------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.commLabel&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 5%;&lt;br /&gt;
    left: 5%;   &lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.comment&lt;br /&gt;
{&lt;br /&gt;
    width: 90%;&lt;br /&gt;
    height: 38%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 10%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.9vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.bezZeitkonto&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 55%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.dropButtonsLightbox&lt;br /&gt;
{&lt;br /&gt;
    width: 37%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 15%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.bezDatum&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 55%;&lt;br /&gt;
    left: 58%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.date&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 68%;&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    height: 4%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.uhrzeit&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 85.5%;&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    height: 3.9%;&lt;br /&gt;
    padding: 0.1em;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    resize: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.bezPerson&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.eingPerson&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 15%;&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.eingPersonZusatz&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 26%;&lt;br /&gt;
    width: 25.7%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.Std&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 66%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Min&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 78%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Sek&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 91%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outStd&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 64%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outMin&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 76.5%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outSek&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 89%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.Pausenzeiten&lt;br /&gt;
{&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 79%;&lt;br /&gt;
    left: 71%;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.Std2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 66%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Min2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 78%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Sek2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 91%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outStd2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 64%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outMin2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 76.5%;&lt;br /&gt;
    border: 0.1em  solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outSek2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 89%;&lt;br /&gt;
    border: 0.1em  solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.saveButton&lt;br /&gt;
{&lt;br /&gt;
    min-width: 8%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.closeButton&lt;br /&gt;
{&lt;br /&gt;
    min-width: 8%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 14%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*--------------------------------Tätigkeitenliste (zweite Liste)----------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
#zweiteListe &lt;br /&gt;
{&lt;br /&gt;
    display: none;&lt;br /&gt;
    width: 25%;&lt;br /&gt;
    max-height: 50%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 47%;&lt;br /&gt;
    left: 44%;&lt;br /&gt;
    padding: 1%;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    background-color: #FAFAFA;&lt;br /&gt;
    box-shadow: 0 10px 2000px rgba(0, 0, 0, 0.5);&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=OBS/Kostenpflichtige_Module/RESTServer/Beispiel2&amp;diff=62606</id>
		<title>OBS/Kostenpflichtige Module/RESTServer/Beispiel2</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=OBS/Kostenpflichtige_Module/RESTServer/Beispiel2&amp;diff=62606"/>
		<updated>2023-10-18T08:37:46Z</updated>

		<summary type="html">&lt;p&gt;Prakti: /&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
Dieses Script dient zur Zeiterfassung über den REST-Server. Bei Seitenaufruf wird eine Liste von Kunden geladen und in einer Liste angezeigt. &lt;br /&gt;
&lt;br /&gt;
Durch Rechtsklick auf einen Eintrag wird eine Liste an zugehörigen Tätigkeiten geladen, die nach Klick einen Timer starten.&lt;br /&gt;
&lt;br /&gt;
Per Javascript werden Startzeit, Startdatum und andere Informationen wie Kunde und Personalnummer über die PHP-Scripte und das Endpunkt-Script in einer Datenbank gespeichert.&lt;br /&gt;
&lt;br /&gt;
Der Status wird hierbei auf &amp;quot;1&amp;quot; gesetzt. Pausenzeiten werden nach Beenden einer Pause in der Datenbank gespeichert.&lt;br /&gt;
&lt;br /&gt;
Durch Drücken des Stop-Buttons wird eine Lightbox mit einer Zusammenfassung aller zum Timer gehörenden Daten angezeigt. Hier hat man die Möglichkeit Tätigkeiten, abgelaufene Zeit und &lt;br /&gt;
&lt;br /&gt;
Pausenzeit nachträglich zu bearbeiten. Durch Klick auf &amp;quot;Speichern&amp;quot; oder Druck auf F2 werden Endzeit und Enddatum gespeichert und der Status auf &amp;quot;21&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
Nach Reload der Webseite wird anhand des Status in der Datenbank nach laufenden Timern gesucht und diese gegebenenfalls gestartet.&lt;br /&gt;
&lt;br /&gt;
= Endpunkt-Script =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure _AddJob(oArr: TJSONArray; id: String);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT CONCAT(za_text, &amp;quot;:&amp;quot;,sys_uid) AS Job FROM zeiterfart &#039; +&lt;br /&gt;
                &#039;WHERE za_psnr = &#039; + DB_SQLVal(id) + &#039; AND za_inaktiv &amp;lt;&amp;gt; &amp;quot;1&amp;quot; &#039; +&lt;br /&gt;
                &#039;ORDER BY za_order&#039;;&lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;Job&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddCustomer(oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=&#039;  SELECT * FROM&#039; + &lt;br /&gt;
              &#039;  (SELECT&#039; +&lt;br /&gt;
              &#039;  ps_nr,&#039; +&lt;br /&gt;
              &#039;  ps_such AS Kunde,&#039; +&lt;br /&gt;
              &#039;  perssta.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PE&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN perssta ON se_ref1 AND perssta.sys_uid = se_ref2&#039; +&lt;br /&gt;
              &#039;  WHERE se_nr = 0087&#039; + &lt;br /&gt;
              &#039;  AND ps_nr &amp;lt;&amp;gt; 100000&#039; +&lt;br /&gt;
              &#039;  UNION SELECT p_nr AS ps_nr,&#039; +&lt;br /&gt;
              &#039;  p_name1 AS ps_such,&#039; +&lt;br /&gt;
              &#039;  projekte.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PR&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN projekte ON se_ref1 = p_nr&#039; +&lt;br /&gt;
              &#039;  AND projekte.sys_uid = se_ref2 WHERE se_nr = 0087)&#039; +&lt;br /&gt;
              &#039;  A WHERE ps_nr IS NOT NULL&#039; +&lt;br /&gt;
              &#039;  ORDER BY Kunde &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;Kunde&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddID(kunde: String; oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=&#039;  SELECT * FROM&#039; + &lt;br /&gt;
              &#039;  (SELECT&#039; +&lt;br /&gt;
              &#039;  ps_nr,&#039; +&lt;br /&gt;
              &#039;  ps_such AS Kunde,&#039; +&lt;br /&gt;
              &#039;  perssta.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PE&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN perssta ON se_ref1 AND perssta.sys_uid = se_ref2&#039; +&lt;br /&gt;
              &#039;  WHERE se_nr = 0087&#039; + &lt;br /&gt;
              &#039;  AND ps_nr &amp;lt;&amp;gt; 100000&#039; +&lt;br /&gt;
              &#039;  UNION SELECT p_nr AS ps_nr,&#039; +&lt;br /&gt;
              &#039;  p_name1 AS ps_such,&#039; +&lt;br /&gt;
              &#039;  projekte.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PR&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN projekte ON se_ref1 = p_nr&#039; +&lt;br /&gt;
              &#039;  AND projekte.sys_uid = se_ref2 WHERE se_nr = 0087)&#039; +&lt;br /&gt;
              &#039;  A WHERE ps_nr IS NOT NULL&#039; +&lt;br /&gt;
              &#039;  AND Kunde = &#039; + DB_SQLVal(kunde) +&lt;br /&gt;
              &#039;  ORDER BY Kunde &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ps_nr&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddCHECK(oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT ze_starttime, zeiterfuser.sys_uid AS sysuid, zk_psnr, &#039; +&lt;br /&gt;
                &#039;za_text, ps_such, ze_startdate FROM &#039; +&lt;br /&gt;
                &#039;zeiterfuser LEFT JOIN zeiterfkomm ON &#039; +&lt;br /&gt;
                &#039;zk_messunguid = zeiterfuser.SYS_UID LEFT JOIN zeiterfart &#039; +&lt;br /&gt;
                &#039;ON zeiterfart.sys_uid = zeiterfuser.ze_uid AND &#039; +&lt;br /&gt;
                &#039;za_psnr = zeiterfkomm.zk_psnr LEFT JOIN perssta ON &#039; +&lt;br /&gt;
                &#039;ps_nr = zeiterfkomm.zk_psnr WHERE ze_status = 01 &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_starttime&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;zk_psnr&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;za_text&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ps_such&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;sysuid&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_startdate&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _getPauseTime(sysuid: String; oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT * FROM zeiterfuser WHERE sys_uid = &#039; + DB_SQLVal(sysuid);&lt;br /&gt;
    &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_pausezeit&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//----------------Funktionen----------------------------------//&lt;br /&gt;
&lt;br /&gt;
function POST(oParams: TStrings): string;&lt;br /&gt;
var &lt;br /&gt;
oArr1                                   : TJSONArray;&lt;br /&gt;
cSql                                    : String;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    if (oParams.values[&#039;choice&#039;]=&#039;job&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddJob(oArr1, oParams.values[&#039;id&#039;]);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;customer&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddCustomer(oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;id&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddID(oParams.values[&#039;selectedKunde&#039;], oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;check&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddCHECK(oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;pauseTime&#039;) then begin    &lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _GetPauseTime(oParams.values[&#039;sysuid&#039;], oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function PUT(oParams: TStrings): string;&lt;br /&gt;
var &lt;br /&gt;
xZeit           : TqSQL;&lt;br /&gt;
cUSER_SYSUID    : String;&lt;br /&gt;
cKOMM_SYSUID    : String;&lt;br /&gt;
lNew            : Boolean;&lt;br /&gt;
cSql            : String;&lt;br /&gt;
dDBNow          : TDateTime;&lt;br /&gt;
begin  &lt;br /&gt;
    writeln(&#039;Choice: &#039; + oParams.values[&#039;choice&#039;]);&lt;br /&gt;
    if (oParams.values[&#039;choice&#039;]=&#039;start&#039;) then&lt;br /&gt;
    begin&lt;br /&gt;
        dDBNow  := DB_Now(oDB); &lt;br /&gt;
        lNew    := True;&lt;br /&gt;
        if (empty(cUSER_SYSUID)) then begin&lt;br /&gt;
            cUSER_SYSUID := GetNewId(oDB);&lt;br /&gt;
        end;&lt;br /&gt;
    &lt;br /&gt;
        xZeit           := qSqlInit(oDB, &#039;zeiterfuser&#039;);&lt;br /&gt;
        xZeit.lNoSysUID := True;&lt;br /&gt;
    &lt;br /&gt;
        writeln(&#039;SYSUID: &#039; + oParams.values[&#039;jobID&#039;]);&lt;br /&gt;
    &lt;br /&gt;
        xZeit.qSet(&#039;ze_user&#039;            , oParams.values[&#039;user&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_starttime&#039;       , oParams.values[&#039;uhrzeit&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_eigen&#039;           , &#039;0101&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_startdate&#039;       , oParams.values[&#039;datum&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_endtime&#039;         , oParams.values[&#039;endTime&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_enddate&#039;         , oParams.values[&#039;endDate&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_zeit&#039;            , &#039;0&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_pausezeit&#039;       , &#039;0&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_status&#039;          , oParams.values[&#039;status&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_berechnen&#039;       , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_officestar&#039;      , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_repa&#039;            , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_vorbereitung&#039;    , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_uid&#039;             , oParams.values[&#039;jobID&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;sys_uid&#039;            , cUSER_SYSUID);&lt;br /&gt;
    &lt;br /&gt;
        xZeit.SaveData(lNew);&lt;br /&gt;
        qSQLFree(xZeit);&lt;br /&gt;
        &lt;br /&gt;
        //---------------------------------------------------------------------&lt;br /&gt;
        &lt;br /&gt;
        xZeit := qSqlInit(oDB,&#039;ZEITERFKOMM&#039;);&lt;br /&gt;
        xZeit.lNoSysUID := True;&lt;br /&gt;
        &lt;br /&gt;
        if (empty(cKOMM_SYSUID)) then begin&lt;br /&gt;
            cKOMM_SYSUID := GetNewId(oDB);&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        xZeit.qSet(&#039;zk_psnr&#039;       , oParams.values[&#039;psnr&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_starttime&#039;  , oParams.values[&#039;uhrzeit&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_startdate&#039;  , oParams.values[&#039;datum&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_kommentar&#039;  , oParams.values[&#039;comm&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_messunguid&#039; , cUSER_SYSUID);&lt;br /&gt;
        xZeit.qSet(&#039;sys_uid&#039;       , cKOMM_SYSUID);&lt;br /&gt;
&lt;br /&gt;
        xZeit.SaveData(lNew);&lt;br /&gt;
        qSQLFree(xZeit);&lt;br /&gt;
        &lt;br /&gt;
        result  := cUser_SYSUID;&lt;br /&gt;
        &lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;stop&#039;) then&lt;br /&gt;
    begin&lt;br /&gt;
        &lt;br /&gt;
        cSql := &#039;UPDATE zeiterfuser, zeiterfkomm &#039;   +&lt;br /&gt;
                &#039; SET zeiterfuser.ze_zeit = &#039;       + oParams.values[&#039;elapsedTime&#039;] + &lt;br /&gt;
                &#039;, zeiterfuser.ze_endtime = &#039;        + oParams.values[&#039;vergZeit&#039;] +&lt;br /&gt;
                &#039;, zeiterfuser.ze_enddate = &#039;        + oParams.values[&#039;stopTimeValue&#039;] +&lt;br /&gt;
                &#039;, zeiterfuser.ze_pausezeit = &#039;      + oParams.values[&#039;elapsedPauseTime&#039;] +&lt;br /&gt;
                &#039;, zeiterfuser.ze_status = &#039;         + oParams.values[&#039;status&#039;] +&lt;br /&gt;
                &#039;, zeiterfkomm.zk_kommentar = &#039;      + oParams.values[&#039;comment&#039;] +&lt;br /&gt;
                &#039; WHERE zeiterfuser.sys_uid = &#039;      + DB_SQLVal(oParams.values[&#039;uid&#039;]) +&lt;br /&gt;
                &#039; AND zeiterfkomm.zk_messunguid = &#039;  + DB_SQLVal(oParams.values[&#039;uid&#039;]);&lt;br /&gt;
&lt;br /&gt;
        if DB_SQLExec(oDB,cSql) then&lt;br /&gt;
        begin&lt;br /&gt;
            result := &#039;Die Daten wurden erfolgreich gespeichert!&#039;;&lt;br /&gt;
        end else begin&lt;br /&gt;
            result := &#039;Fehler!&#039;;&lt;br /&gt;
        end;&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;pause&#039;) then&lt;br /&gt;
    begin     &lt;br /&gt;
        writeln(&#039;Pausezeit: &#039; + oParams.values[&#039;pauseTime&#039;]);&lt;br /&gt;
        cSql := &#039;UPDATE zeiterfuser SET ze_pausezeit &#039; + &lt;br /&gt;
                &#039;= ze_pausezeit + &#039;    + oParams.values[&#039;pauseTime&#039;] +&lt;br /&gt;
                &#039; WHERE sys_uid = &#039;    + DB_SQLVal(oParams.values[&#039;sysuid&#039;]);&lt;br /&gt;
&lt;br /&gt;
        if DB_SQLExec(oDB,cSql) then&lt;br /&gt;
        begin&lt;br /&gt;
            result := &#039;Die Daten wurden erfolgreich gespeichert!&#039;;&lt;br /&gt;
        end else begin&lt;br /&gt;
            result := &#039;Fehler!&#039;;&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= HTML-Datei index.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de-DE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;Ihr IT-Partner in Stade - Ernst Bergau GmbH&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;timestyle.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        &amp;lt;?php&lt;br /&gt;
            include(&#039;timer.js&#039;);&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //--------------------------------------------------------------------------------------------------------------// --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //---------------------------------------------------HTML-------------------------------------------------------// --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //--------------------------------------------------------------------------------------------------------------// --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;textarea id=&amp;quot;search&amp;quot; type=&amp;quot;text&amp;quot; rows=&amp;quot;1&amp;quot; cols=&amp;quot;50&amp;quot; oninput=&amp;quot;searchCustomers(this.value)&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;kundenliste&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ul id=&amp;quot;kundenListe&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table class=&amp;quot;timer&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;tbody id=&amp;quot;timerList&amp;quot;&amp;gt;&amp;lt;/tbody&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
        &amp;lt;table class=&amp;quot;tabelleUeberschriften&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;thead&amp;gt;&lt;br /&gt;
                &amp;lt;tr&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;kunde&amp;quot;&amp;gt;Kunde&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;konto&amp;quot;&amp;gt;Konto&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;laufzeit&amp;quot;&amp;gt;Laufzeit&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;status&amp;quot;&amp;gt;Status&amp;lt;/th&amp;gt;&lt;br /&gt;
                &amp;lt;/tr&amp;gt;&lt;br /&gt;
            &amp;lt;/thead&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;lightbox&amp;quot; id=&amp;quot;lightbox&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label class=&amp;quot;commLabel&amp;quot; id=&amp;quot;commLabel&amp;quot; for=&amp;quot;comment&amp;quot;&amp;gt;Kommentar&amp;lt;/label&amp;gt;&lt;br /&gt;
            &amp;lt;textarea class=&amp;quot;comment&amp;quot; id=&amp;quot;comment&amp;quot; rows=&amp;quot;4&amp;quot; cols=&amp;quot;50&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezZeitkonto&amp;quot;&amp;gt;Zeitkonto&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;select class=&amp;quot;dropButtonsLightbox&amp;quot; id=&amp;quot;tätigkeit2Dropdown&amp;quot;&amp;gt;&amp;lt;/select&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezDatum&amp;quot;&amp;gt;Startdatum&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;date&amp;quot; class=&amp;quot;date&amp;quot; id=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;uhrzeit&amp;quot; id=&amp;quot;uhrzeit&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezPerson&amp;quot;&amp;gt;Person&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;eingPerson&amp;quot; id=&amp;quot;eingPerson&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;eingPersonZusatz&amp;quot; id=&amp;quot;eingPersonZusatz&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Std&amp;quot;&amp;gt;Std&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outStd&amp;quot; id=&amp;quot;outStd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Min&amp;quot;&amp;gt;Min&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outMin&amp;quot; id=&amp;quot;outMin&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Sek&amp;quot;&amp;gt;Sek&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outSek&amp;quot; id=&amp;quot;outSek&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Pausenzeiten&amp;quot;&amp;gt;Davon Pausenzeiten&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Std2&amp;quot;&amp;gt;Std&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outStd2&amp;quot; id=&amp;quot;outStd2&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Min2&amp;quot;&amp;gt;Min&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outMin2&amp;quot; id=&amp;quot;outMin2&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Sek2&amp;quot;&amp;gt;Sek&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outSek2&amp;quot; id=&amp;quot;outSek2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;button class=&amp;quot;saveButton&amp;quot; id=&amp;quot;saveButton&amp;quot;&amp;gt;Speichern&amp;lt;/button&amp;gt;&lt;br /&gt;
            &amp;lt;button class=&amp;quot;closeButton&amp;quot; id=&amp;quot;closeButton&amp;quot; onclick=&amp;quot;closeLightboxOnSchliessen()&amp;quot;&amp;gt;Schließen&amp;lt;/button&amp;gt; &lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div id=&amp;quot;zweiteListe&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ul id=&amp;quot;taetigkeitListe&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Javascript-Datei timer.js =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var api_key             = &#039;Y00C75PODJ&#039;;&lt;br /&gt;
var url                 = &#039;http://127.0.0.1:8099/Zeiterfa/zeiterfa/v1&#039;;&lt;br /&gt;
var zaehler             = -1;&lt;br /&gt;
var timerInterval;      &lt;br /&gt;
var pauseTimerInterval; &lt;br /&gt;
var startTimeValue;     &lt;br /&gt;
var selectedID          = 0;&lt;br /&gt;
var elapsedTime;        &lt;br /&gt;
var uid;                &lt;br /&gt;
var idStop; &lt;br /&gt;
var time;&lt;br /&gt;
var selID               = [];&lt;br /&gt;
var job                 = [];&lt;br /&gt;
var sys_uid             = [];&lt;br /&gt;
var timers              = [];    &lt;br /&gt;
var pauseTimers         = [];  &lt;br /&gt;
var pauseTime           = [];&lt;br /&gt;
var startdate           = [];&lt;br /&gt;
var uhrzeit             = [];&lt;br /&gt;
var datum               = [];&lt;br /&gt;
var statusTimer         = [];       &lt;br /&gt;
var selectedJob         = [];&lt;br /&gt;
var selectedKunde       = [];      &lt;br /&gt;
var tempSelectedKunde   = [];&lt;br /&gt;
var parameter           = [];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------------Seitenaufruf---------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Bei Seitenaufruf werden die Funktionen----//&lt;br /&gt;
//----getCustomer und checkTimer aufgerufen und----//&lt;br /&gt;
//----die Kundenliste gefüllt und geprüft,----//&lt;br /&gt;
//----ob laufende timer vorhanden sind----//&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
&lt;br /&gt;
    getCustomer();&lt;br /&gt;
    checkTimer();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-------------------------------------------------Daten auslesen--------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Eine Liste der Kunden wird ausgelesenund gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getCustomer() {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;customer&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            populateListeKunde(responseData);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Bei Rechtsklick auf Kunden wird----//&lt;br /&gt;
//----seine ID ausgelesen und gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getCustomerID(selectedKunde, callback) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;id&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;selectedKunde=&amp;quot;       + encodeURIComponent(selectedKunde);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            selectedID = JSON.parse(request.responseText);&lt;br /&gt;
            callback(selectedID);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Anhand der Kunden-ID wird eine Liste von Tätigkeiten----//&lt;br /&gt;
//----für jeden Kunden ausgelesen und gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getJob(id, callback) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;job&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;id=&amp;quot;                  + encodeURIComponent(id);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            var Data         = responseData.toString();&lt;br /&gt;
            var teile        = Data.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
            var jobid = [];&lt;br /&gt;
&lt;br /&gt;
            for (i=0; i&amp;lt;teile.length; i++) {&lt;br /&gt;
                job[i]   = teile[i].split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
                jobid[i] = teile[i].split(&amp;quot;:&amp;quot;)[1];&lt;br /&gt;
            }&lt;br /&gt;
            callback(job, jobid);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Tätigkeitsliste wird nochmal zur Weiterverarbeitung gelesen----//&lt;br /&gt;
&lt;br /&gt;
function getJobs(id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;job&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;id=&amp;quot;                  + encodeURIComponent(id);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;, false);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            var data = responseData.toString();&lt;br /&gt;
            var teile = data.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
            var jobid = [];&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; teile.length; i++) {&lt;br /&gt;
                job[i] = teile[i].split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
                jobid[i] = teile[i].split(&amp;quot;:&amp;quot;)[1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Gespeicherte Pausezeit wird ausgelesen----//&lt;br /&gt;
&lt;br /&gt;
function getPauseTime(sysuid, id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;pauseTime&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params  =   &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;sysuid=&amp;quot;              + encodeURIComponent(sysuid);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;, false);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            pauseTime[id].value = JSON.parse(request.responseText);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Listen--------------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Eine Liste wird mit Kundendaten gefüllt und angezeigt----//&lt;br /&gt;
&lt;br /&gt;
function populateListeKunde(data) {&lt;br /&gt;
&lt;br /&gt;
    data.forEach(function(item) {&lt;br /&gt;
        var listItem = document.createElement(&amp;quot;li&amp;quot;);&lt;br /&gt;
        listItem.textContent = item;&lt;br /&gt;
&lt;br /&gt;
        listItem.addEventListener(&amp;quot;contextmenu&amp;quot;, function(event) {&lt;br /&gt;
            event.preventDefault();&lt;br /&gt;
&lt;br /&gt;
            var selectedKunde = item;&lt;br /&gt;
            getCustomerID(selectedKunde, function(selectedID) {&lt;br /&gt;
                getJob(selectedID, function(job, jobid) {&lt;br /&gt;
                    showSecondList(job, jobid, item);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        kundenListe.appendChild(listItem);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Eine zweite Liste wird mit Jobs gefüllt,----//&lt;br /&gt;
//----angezeigt und bei Klick auf einen Eintrag---//&lt;br /&gt;
//-------die Funktion startTimer aufgerufen-------//&lt;br /&gt;
&lt;br /&gt;
function showSecondList(job, jobid, kundeItem) {&lt;br /&gt;
&lt;br /&gt;
    var zweiteListe = document.getElementById(&amp;quot;zweiteListe&amp;quot;);&lt;br /&gt;
    zweiteListe.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    job.forEach(function(item) {&lt;br /&gt;
        var listItem = document.createElement(&amp;quot;li&amp;quot;);&lt;br /&gt;
        listItem.textContent = item;&lt;br /&gt;
    &lt;br /&gt;
        (function(capturedItem) {&lt;br /&gt;
            listItem.addEventListener(&amp;quot;click&amp;quot;, function() {&lt;br /&gt;
                startTimer(job, jobid, capturedItem, kundeItem);&lt;br /&gt;
            });&lt;br /&gt;
        }) (item);&lt;br /&gt;
        zweiteListe.appendChild(listItem);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;block&amp;quot;; &lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeSecondList);&lt;br /&gt;
    document.addEventListener(&#039;click&#039;, closeSecondList);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Nach Klick auf Eintrag wird die Liste geschlossen----//&lt;br /&gt;
function closeSecondList() {&lt;br /&gt;
&lt;br /&gt;
    var zweiteListe = document.getElementById(&amp;quot;zweiteListe&amp;quot;);&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;none&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Daten speichern-----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Startzeit, -datum, ID und Job werden gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveStartTime(user, uhrzeit, datum, endTime, endDate, status, psnr, Job, jobID) {&lt;br /&gt;
    &lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;start&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;user=&amp;quot;                + encodeURIComponent(user) +&lt;br /&gt;
                    &amp;quot;&amp;amp;uhrzeit=&amp;quot;             + encodeURIComponent(uhrzeit) +&lt;br /&gt;
                    &amp;quot;&amp;amp;datum=&amp;quot;               + encodeURIComponent(datum) +&lt;br /&gt;
                    &amp;quot;&amp;amp;endTime=&amp;quot;             + encodeURIComponent(endTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;endDate=&amp;quot;             + encodeURIComponent(endDate) +&lt;br /&gt;
                    &amp;quot;&amp;amp;status=&amp;quot;              + encodeURIComponent(status)+&lt;br /&gt;
                    &amp;quot;&amp;amp;psnr=&amp;quot;                + encodeURIComponent(psnr)+&lt;br /&gt;
                    &amp;quot;&amp;amp;Job=&amp;quot;                 + encodeURIComponent(Job)+&lt;br /&gt;
                    &amp;quot;&amp;amp;jobID=&amp;quot;               + encodeURIComponent(jobID);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            sys_uid[zaehler].value = request.responseText;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Pausezeit wird gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function savePauseTime(pauseTime, id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;pause&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;      + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;         + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;      + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;      + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;pauseTime=&amp;quot;   + encodeURIComponent(pauseTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;sysuid=&amp;quot;      + encodeURIComponent(sys_uid[id].value);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            // alert(request.responseText);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Stopzeit und -datum wird gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveStopTime(stopTimeValue, elapsedTime, elapsedPauseTime, status, uid, vergZeit, comment) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;stop&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;stopTimeValue=&amp;quot;       + encodeURIComponent(stopTimeValue) +&lt;br /&gt;
                    &amp;quot;&amp;amp;elapsedTime=&amp;quot;         + encodeURIComponent(elapsedTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;elapsedPauseTime=&amp;quot;    + encodeURIComponent(elapsedPauseTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;status=&amp;quot;              + encodeURIComponent(status) +&lt;br /&gt;
                    &amp;quot;&amp;amp;uid=&amp;quot;                 + encodeURIComponent(uid) +&lt;br /&gt;
                    &amp;quot;&amp;amp;vergZeit=&amp;quot;            + encodeURIComponent(vergZeit)+&lt;br /&gt;
                    &amp;quot;&amp;amp;comment=&amp;quot;            + encodeURIComponent(comment);&lt;br /&gt;
    &lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200 &amp;amp;&amp;amp; timers.length === 0) {&lt;br /&gt;
            location.reload();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Like-Suche----------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Durchsucht die Liste der Kunden auf alle einegegebenen Zeichen----//&lt;br /&gt;
&lt;br /&gt;
function searchCustomers(text) {&lt;br /&gt;
&lt;br /&gt;
    text = text.toLowerCase();&lt;br /&gt;
    var kundenListe = document.getElementById(&amp;quot;kundenListe&amp;quot;);&lt;br /&gt;
    var listItems = kundenListe.getElementsByTagName(&amp;quot;li&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (i=0; i&amp;lt;listItems.length; i++) {&lt;br /&gt;
        var item = listItems[i].textContent.toLowerCase();&lt;br /&gt;
        if (item.includes(text)) {&lt;br /&gt;
            listItems[i].style.display = &amp;quot;block&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            listItems[i].style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------Vorhandenen Timer checken----------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Überprüft, ob es Einträge in Datenbank ohne----//&lt;br /&gt;
//----Endzeit gibt und startet entsprechend Timer----//&lt;br /&gt;
&lt;br /&gt;
function checkTimer() {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;check&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200 &amp;amp;&amp;amp; timers.length === 0) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            &lt;br /&gt;
            if (responseData.length !== 0) {&lt;br /&gt;
                startTimeValue = new Date();&lt;br /&gt;
                var minutes = startTimeValue.getMinutes();&lt;br /&gt;
                var seconds = startTimeValue.getSeconds();&lt;br /&gt;
                var month = startTimeValue.getMonth() + 1;&lt;br /&gt;
&lt;br /&gt;
                responseData = responseData.toString();&lt;br /&gt;
                var teile = responseData.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                for (var i=0; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
                    uhrzeit.push({value: startTimeValue.getHours() + &amp;quot;:&amp;quot; + (minutes &amp;lt; 10 ? &amp;quot;0&amp;quot; + minutes : minutes) + &amp;quot;:&amp;quot; + (seconds &amp;lt; 10 ? &amp;quot;0&amp;quot; + seconds : seconds)});&lt;br /&gt;
                    datum.push({value: startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + startTimeValue.getDate()});&lt;br /&gt;
&lt;br /&gt;
                    zaehler++;&lt;br /&gt;
&lt;br /&gt;
                    statusTimer.push({value: &#039;Running&#039;});&lt;br /&gt;
                    pauseTimers.push({value: 0});&lt;br /&gt;
                    pauseTime.push({value: 0});&lt;br /&gt;
                    timers.push({value: teile[i]});&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var j=0;&lt;br /&gt;
                for (var i=1; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
                    selID.push({value: teile[i]});&lt;br /&gt;
                    getJobs(selID[j].value);&lt;br /&gt;
                    j++;&lt;br /&gt;
                } &lt;br /&gt;
&lt;br /&gt;
                fillArray(2, selectedJob, teile);&lt;br /&gt;
                fillArray(3, selectedKunde, teile);&lt;br /&gt;
                fillArray(4, sys_uid, teile);&lt;br /&gt;
                fillArray(5, startdate, teile);&lt;br /&gt;
&lt;br /&gt;
                for (var i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
                    var startZeitTeil = timers[i].value.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
                    var startDatumTeil = startdate[i].value.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    var diffMilli = new Date() - getStartdatum(startDatumTeil, startZeitTeil);&lt;br /&gt;
                    timers[i].value = Math.floor(diffMilli / 1000); &lt;br /&gt;
                }   &lt;br /&gt;
&lt;br /&gt;
                selecteID = 0;&lt;br /&gt;
                startInterval(job);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Arrays werden an diese Funktion übergeben und gefüllt----//&lt;br /&gt;
&lt;br /&gt;
function fillArray(LZ, array, teile) {&lt;br /&gt;
&lt;br /&gt;
    var arrLZ = 0;&lt;br /&gt;
    for (var i=LZ; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
        array.push({value: teile[i]});&lt;br /&gt;
        arrLZ++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Startdatum wird errechnet----//&lt;br /&gt;
function getStartdatum(startDatumTeil, startZeitTeil) {&lt;br /&gt;
&lt;br /&gt;
    var startdatum = new Date(&lt;br /&gt;
        parseInt(startDatumTeil[2]),&lt;br /&gt;
        parseInt(startDatumTeil[1]) -1,&lt;br /&gt;
        parseInt(startDatumTeil[0]),&lt;br /&gt;
        parseInt(startZeitTeil[0]),&lt;br /&gt;
        parseInt(startZeitTeil[1]),&lt;br /&gt;
        parseInt(startZeitTeil[2])&lt;br /&gt;
    );&lt;br /&gt;
    return startdatum;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-------------------------------------------------Interval--------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Interval für Timer wird gestartet----//&lt;br /&gt;
&lt;br /&gt;
function startInterval(job, item, kundeItem, index) {&lt;br /&gt;
&lt;br /&gt;
    timerInterval = setInterval(function() {&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
&lt;br /&gt;
            timers[i].value += 1;&lt;br /&gt;
        }&lt;br /&gt;
        updateUI(job, item, kundeItem, index);&lt;br /&gt;
    }, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Interval für Pausentimer wird gestartet----// &lt;br /&gt;
&lt;br /&gt;
function pauseInterval(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    pauseTimerInterval = setInterval(function() {&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;pauseTimers.length; i++) {&lt;br /&gt;
&lt;br /&gt;
            pauseTimers[i].value += 1;&lt;br /&gt;
        }&lt;br /&gt;
        updateUI(job, item, kundeItem);&lt;br /&gt;
    }, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer starten----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----startTimer bereitet die nötigen Arrays vor,----//&lt;br /&gt;
//----speichert Startzeit und -datum,----//&lt;br /&gt;
//----beschreibt Arrays und Variablen entsprechend----//&lt;br /&gt;
//----und ruft die Funktion saveStartTime auf----//&lt;br /&gt;
&lt;br /&gt;
function startTimer(jobs, jobid, selJob, kundeItem) {&lt;br /&gt;
&lt;br /&gt;
    var user = 999;&lt;br /&gt;
    var endTime = &amp;quot;00:00:00&amp;quot;;&lt;br /&gt;
    var endDate = &amp;quot;0000-00-00&amp;quot;;&lt;br /&gt;
    var status = &#039;01&#039;;&lt;br /&gt;
    zaehler++;&lt;br /&gt;
    alert(selJob);&lt;br /&gt;
    startTimeValue = new Date();&lt;br /&gt;
&lt;br /&gt;
    var minutes = startTimeValue.getMinutes();&lt;br /&gt;
    var seconds = startTimeValue.getSeconds();&lt;br /&gt;
    uhrzeit.push({value: startTimeValue.getHours() + &amp;quot;:&amp;quot; + (minutes &amp;lt; 10 ? &amp;quot;0&amp;quot; + minutes : minutes) + &amp;quot;:&amp;quot; + (seconds &amp;lt; 10 ? &amp;quot;0&amp;quot; + seconds : seconds)});&lt;br /&gt;
&lt;br /&gt;
    var month = startTimeValue.getMonth() + 1;&lt;br /&gt;
    datum.push({value: startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + startTimeValue.getDate()});&lt;br /&gt;
&lt;br /&gt;
    statusTimer.push({value: &#039;Running&#039;});&lt;br /&gt;
    pauseTimers.push({value: 0});&lt;br /&gt;
    pauseTime.push({value: 0});&lt;br /&gt;
    timers.push({value: 0});&lt;br /&gt;
    selectedKunde.push({value: kundeItem});&lt;br /&gt;
    selectedJob.push({value: selJob});&lt;br /&gt;
    sys_uid.push({value: 0});&lt;br /&gt;
&lt;br /&gt;
    var index = jobs.indexOf(selJob);&lt;br /&gt;
    &lt;br /&gt;
    saveStartTime(user, uhrzeit[zaehler].value, datum[zaehler].value, endTime, endDate, status, selectedID, selJob, jobid[index]);&lt;br /&gt;
    &lt;br /&gt;
    clearInterval(timerInterval);&lt;br /&gt;
    startInterval(jobs, selJob, kundeItem, index);&lt;br /&gt;
&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer stoppen----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Stopt den Timer, ändert den Status und ruft openLightbox auf----//&lt;br /&gt;
&lt;br /&gt;
function stopTimer(job, item, kundeItem, index, id) {&lt;br /&gt;
&lt;br /&gt;
    idStop = id;&lt;br /&gt;
    statusTimer[id].value = &#039;Stopped&#039;;&lt;br /&gt;
    openLightbox(job, item, kundeItem, index, id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer pausieren--------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Pausiert den Timer und ändert den Status----//&lt;br /&gt;
&lt;br /&gt;
function pauseTimer(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    pauseTimers[id].value = 0;&lt;br /&gt;
    clearInterval(pauseTimerInterval);&lt;br /&gt;
    pauseInterval(job, item, kundeItem, id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//----------------------------------------------Button Pause-Start-------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Ruft die Funktion pauseTimer oder----//&lt;br /&gt;
//----savePauseTimer auf----//&lt;br /&gt;
&lt;br /&gt;
function toggleButton(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    var button = document.getElementById(id);&lt;br /&gt;
&lt;br /&gt;
    if (button.innerHTML === &amp;quot;Pause&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
        statusTimer[id].value = &#039;Paused&#039;;&lt;br /&gt;
        pauseTimer(job, item, kundeItem, id);&lt;br /&gt;
    } &lt;br /&gt;
    else {&lt;br /&gt;
&lt;br /&gt;
        statusTimer[id].value = &amp;quot;Running&amp;quot;;&lt;br /&gt;
        savePauseTime(pauseTimers[id].value, id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Ausgabe des Timers-----------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Zeigt eine Liste mit einem oder mehreren----//&lt;br /&gt;
//----Timern und Buttons, verteilt dynamisch ID&#039;s----//&lt;br /&gt;
//----und ruft entsprechend der gedrückten----//&lt;br /&gt;
//----Buttons Funktionen auf----//&lt;br /&gt;
&lt;br /&gt;
function updateUI(job, item, kundeItem, index) {&lt;br /&gt;
    var timerList = document.getElementById(&amp;quot;timerList&amp;quot;);&lt;br /&gt;
    timerList.innerHTML = &#039;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    for (i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
        var neueReihe = document.createElement(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Name des Kunden wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var kundeEintrag = document.createElement(&#039;td&#039;);&lt;br /&gt;
        kundeEintrag.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.width = &amp;quot;30%&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.left = &amp;quot;0%&amp;quot;; &lt;br /&gt;
        kundeEintrag.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        kundeEintrag.classList.add(&#039;kunde_k&#039;);&lt;br /&gt;
        kundeEintrag.textContent = selectedKunde[i].value;&lt;br /&gt;
        timerList.appendChild(kundeEintrag);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Gewählter Job wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var kontoEintrag = document.createElement(&#039;td&#039;);&lt;br /&gt;
        kontoEintrag.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        kontoEintrag.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
        kontoEintrag.style.width = &amp;quot;30%&amp;quot;;&lt;br /&gt;
        kontoEintrag.style.left = &amp;quot;30%&amp;quot;; &lt;br /&gt;
        kontoEintrag.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        kontoEintrag.classList.add(&#039;konto_k&#039;);&lt;br /&gt;
        kontoEintrag.textContent = selectedJob[i].value;&lt;br /&gt;
        timerList.appendChild(kontoEintrag);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Gestartete Timer werden in Liste----//&lt;br /&gt;
        //----ausgegeben, pausierte Timer werden----//&lt;br /&gt;
        //----Liste ausgegeben, sobald Timer gestoppt----//&lt;br /&gt;
        //----wird Ausgabe in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
        if (statusTimer[i].value === &amp;quot;Running&amp;quot;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(timers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &#039;Paused&#039;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(pauseTimers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &#039;Stopped&#039;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(pauseTimers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
&lt;br /&gt;
            var zeit = formatElapsedTime(timers[i].value);&lt;br /&gt;
            zeit = zeit.toString();&lt;br /&gt;
            var teile = zeit.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            var h = teile[0];&lt;br /&gt;
            var m = teile[1];&lt;br /&gt;
            var s = teile[2];&lt;br /&gt;
&lt;br /&gt;
            var outStdField = document.getElementById(&amp;quot;outStd&amp;quot;);&lt;br /&gt;
            var outMinField = document.getElementById(&amp;quot;outMin&amp;quot;);&lt;br /&gt;
            var outSekField = document.getElementById(&amp;quot;outSek&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (document.activeElement !== outStdField &amp;amp;&amp;amp; document.activeElement !== outMinField &amp;amp;&amp;amp; document.activeElement !== outSekField) {&lt;br /&gt;
                document.getElementById(&amp;quot;outStd&amp;quot;).value = h; &lt;br /&gt;
                document.getElementById(&amp;quot;outMin&amp;quot;).value = m;&lt;br /&gt;
                document.getElementById(&amp;quot;outSek&amp;quot;).value = s;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var hEnd = document.getElementById(&amp;quot;outStd&amp;quot;).value;&lt;br /&gt;
            var mEnd = document.getElementById(&amp;quot;outMin&amp;quot;).value;&lt;br /&gt;
            var sEnd = document.getElementById(&amp;quot;outSek&amp;quot;).value;&lt;br /&gt;
            time = hEnd + &amp;quot;:&amp;quot; + mEnd + &amp;quot;:&amp;quot; + sEnd;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Status (Running, Paused, Stopped) wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var statusTimerElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
        statusTimerElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        statusTimerElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
        statusTimerElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
        statusTimerElement.style.left = &amp;quot;75%&amp;quot;; &lt;br /&gt;
        statusTimerElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        statusTimerElement.classList.add(&#039;status_s&#039;);&lt;br /&gt;
        statusTimerElement.textContent = statusTimer[i].value;&lt;br /&gt;
        timerList.appendChild(statusTimerElement);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Pause Button mit dynamisch vergebener ID wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        if (statusTimer[i].value === &amp;quot;Running&amp;quot;) {&lt;br /&gt;
            var pauseButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
            pauseButton.id = i;&lt;br /&gt;
            pauseButton.classList.add(&#039;pauseButton&#039;);&lt;br /&gt;
            pauseButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            pauseButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
            pauseButton.style.left = &amp;quot;90%&amp;quot;; &lt;br /&gt;
            pauseButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
            pauseButton.style.minWidth = &amp;quot;3%&amp;quot;;&lt;br /&gt;
            pauseButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
            pauseButton.textContent = &amp;quot;Pause&amp;quot;&lt;br /&gt;
            pauseButton.addEventListener(&#039;click&#039;, function() {toggleButton(job, item, kundeItem, this.id)});&lt;br /&gt;
            timerList.appendChild(pauseButton);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &amp;quot;Paused&amp;quot;) {&lt;br /&gt;
            var pauseButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
            pauseButton.id = i;&lt;br /&gt;
            pauseButton.classList.add(&#039;pauseButton&#039;);&lt;br /&gt;
            pauseButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            pauseButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
            pauseButton.style.left = &amp;quot;90%&amp;quot;;&lt;br /&gt;
            pauseButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
            pauseButton.style.minWidth = &amp;quot;3%&amp;quot;;&lt;br /&gt;
            pauseButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
            pauseButton.textContent = &amp;quot;Start&amp;quot;&lt;br /&gt;
            pauseButton.addEventListener(&#039;click&#039;, function() {toggleButton(job, item, kundeItem, this.id)});&lt;br /&gt;
            timerList.appendChild(pauseButton);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Stop Button mit dynamisch vergebener ID wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var stopButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
        stopButton.id = i;&lt;br /&gt;
        stopButton.classList.add(&#039;stopButton&#039;);&lt;br /&gt;
        stopButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        stopButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
        stopButton.style.left = &amp;quot;94%&amp;quot;;&lt;br /&gt;
        stopButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
        stopButton.style.width = &amp;quot;3%&amp;quot;;&lt;br /&gt;
        stopButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
        stopButton.textContent = &amp;quot;Stop&amp;quot;&lt;br /&gt;
        stopButton.addEventListener(&#039;click&#039;, function() {stopTimer(job, item, kundeItem, index, this.id)});&lt;br /&gt;
        timerList.appendChild(stopButton);&lt;br /&gt;
        &lt;br /&gt;
        //----Für jeden aufgerufenen Timer wird----//&lt;br /&gt;
        //----eine neue Reihe ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        timerList.appendChild(neueReihe);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------Sekunden in Uhrzeit umrechnen-------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Rechnet übergebene Sekunden in Stunden,----//&lt;br /&gt;
//----Minuten und Sekunden und gibt diese----//&lt;br /&gt;
//----an aufrufende Funktion zurück----//&lt;br /&gt;
&lt;br /&gt;
function formatElapsedTime(seconds) {&lt;br /&gt;
&lt;br /&gt;
    var minutes = Math.floor(seconds / 60);&lt;br /&gt;
    seconds %= 60;&lt;br /&gt;
    var hours = Math.floor(minutes / 60);&lt;br /&gt;
    minutes %= 60;&lt;br /&gt;
    function addLeadingZero(n) {&lt;br /&gt;
        return (n &amp;lt; 10 ? &#039;0&#039; : &#039;&#039;) + n;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return addLeadingZero(hours) + &amp;quot;:&amp;quot; + addLeadingZero(minutes) + &amp;quot;:&amp;quot; + addLeadingZero(seconds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------Uhrzeit in Sekunden umrechnen----------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Rechnet übergebene Stunden, Minuten----//&lt;br /&gt;
//----und Sekunden in Sekunden um und----//&lt;br /&gt;
//----gibt diese an aufrufende Funktion zurück----//&lt;br /&gt;
&lt;br /&gt;
function timeInSeconds(zeit) {&lt;br /&gt;
&lt;br /&gt;
    var teile = zeit.split(&#039;:&#039;);&lt;br /&gt;
    var Stunden = parseInt(teile[0], 10);&lt;br /&gt;
    var Minuten = parseInt(teile[1], 10);&lt;br /&gt;
    var Sekunden = parseInt(teile[2], 10);&lt;br /&gt;
    return Stunden * 3600 + Minuten * 60 + Sekunden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------------Lightbox-------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Öffnet eine Lightbox und zeigt Kunde----//&lt;br /&gt;
//----Job, vergangene Zeit und evtl Pausenzeit an----//&lt;br /&gt;
//----und gibt Möglichkeit alle Zeiten anzupassen----//&lt;br /&gt;
&lt;br /&gt;
function openLightbox(job, item, kundeItem, index, id) {&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&#039;lightbox&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
&lt;br /&gt;
    var dateField = document.getElementById(&amp;quot;date&amp;quot;);&lt;br /&gt;
    dateField.value = datum[id].value;&lt;br /&gt;
    document.getElementById(&amp;quot;uhrzeit&amp;quot;).innerHTML = uhrzeit[id].value;&lt;br /&gt;
&lt;br /&gt;
    var commentTextarea = document.getElementById(&amp;quot;comment&amp;quot;);&lt;br /&gt;
    commentTextarea.value = selectedJob[id].value;&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;eingPersonZusatz&amp;quot;).innerHTML = selectedKunde[id].value;&lt;br /&gt;
&lt;br /&gt;
    if (selectedID.length !== undefined) {&lt;br /&gt;
        document.getElementById(&amp;quot;eingPerson&amp;quot;).innerHTML = selectedID;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        document.getElementById(&amp;quot;eingPerson&amp;quot;).innerHTML = selID[id].value;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //----Ausgabe der vergangenen Zeit in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outMin&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outSek&amp;quot;).value = 00;                      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //----Ausgabe der Pausenzeiten in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd2&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outMin2&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outSek2&amp;quot;).value = 00;                           &lt;br /&gt;
    getPauseTime(sys_uid[id].value, id);                                &lt;br /&gt;
                                                                        &lt;br /&gt;
    var secondsPause = pauseTime[id].value;                             &lt;br /&gt;
    secondsPause %= 60;  &lt;br /&gt;
&lt;br /&gt;
    var minutesPause = Math.floor(pauseTime[id].value / 60);            &lt;br /&gt;
    minutesPause %= 60;    &lt;br /&gt;
&lt;br /&gt;
    var hoursPause = Math.floor(minutesPause / 60);                     &lt;br /&gt;
    hoursPause %= 60;   &lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd2&amp;quot;).value = hoursPause;              &lt;br /&gt;
    document.getElementById(&amp;quot;outMin2&amp;quot;).value = minutesPause;       &lt;br /&gt;
&lt;br /&gt;
    if (secondsPause &amp;gt; 0) {&lt;br /&gt;
        document.getElementById(&amp;quot;outSek2&amp;quot;).value = secondsPause;        &lt;br /&gt;
    }                                                                   &lt;br /&gt;
    else {&lt;br /&gt;
        document.getElementById(&amp;quot;outSek2&amp;quot;).value = 0;                   &lt;br /&gt;
    }                                                                   &lt;br /&gt;
&lt;br /&gt;
    var dropdown2 = document.getElementById(&amp;quot;tätigkeit2Dropdown&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    job.forEach(function(item, index) {&lt;br /&gt;
        var option = document.createElement(&amp;quot;option&amp;quot;);&lt;br /&gt;
        option.textContent = item;&lt;br /&gt;
        dropdown2.add(option)&lt;br /&gt;
&lt;br /&gt;
        if (item === selectedJob[id].value) {&lt;br /&gt;
            option.selected = true;&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeLightboxOnEscape);&lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeLightboxOnF2);&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Lightbox schließen----//&lt;br /&gt;
&lt;br /&gt;
function closeLightbox() {&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&#039;lightbox&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn der Schließen-Button gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnSchliessen() {&lt;br /&gt;
&lt;br /&gt;
    statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
    closeLightbox();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn Escape gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnEscape() {&lt;br /&gt;
&lt;br /&gt;
    if (event.key === &#039;Escape&#039;) {&lt;br /&gt;
        statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
        closeLightbox();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn F2 gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnF2(event) {&lt;br /&gt;
&lt;br /&gt;
    if (event.key === &#039;F2&#039;) {&lt;br /&gt;
        saveBox();&lt;br /&gt;
        closeLightbox();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Alle Daten in Lightbox werden gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveBox() {&lt;br /&gt;
&lt;br /&gt;
    var vergZeit = &#039;&amp;quot;&#039; + time + &#039;&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
    var teile = time.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
    var stunden = parseInt(teile[0]);&lt;br /&gt;
    var minuten = parseInt(teile[1]);&lt;br /&gt;
    var sekunden = parseInt(teile[2]);&lt;br /&gt;
    time = stunden * 3600 + minuten * 60 + sekunden;&lt;br /&gt;
&lt;br /&gt;
    elapsedTime = time;&lt;br /&gt;
&lt;br /&gt;
    var comment = &#039;&amp;quot;&#039; + document.getElementById(&amp;quot;comment&amp;quot;).value + &#039;&amp;quot;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var hPEnd = document.getElementById(&amp;quot;outStd2&amp;quot;).value;&lt;br /&gt;
    var mPEnd = document.getElementById(&amp;quot;outMin2&amp;quot;).value;&lt;br /&gt;
    var sPEnd = document.getElementById(&amp;quot;outSek2&amp;quot;).value;&lt;br /&gt;
    var pTime = hPEnd + &amp;quot;:&amp;quot; + mPEnd + &amp;quot;:&amp;quot; + sPEnd;&lt;br /&gt;
    pTime = timeInSeconds(pTime);&lt;br /&gt;
&lt;br /&gt;
    var uid = sys_uid[idStop].value;&lt;br /&gt;
    var month = startTimeValue.getMonth();&lt;br /&gt;
    var day = startTimeValue.getDate();&lt;br /&gt;
    month += 1;&lt;br /&gt;
    var stopTimeValue = &#039;&amp;quot;&#039; + startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + (day &amp;lt; 10 ? &amp;quot;0&amp;quot; + day : day) + &#039;&amp;quot;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var status = 21;&lt;br /&gt;
&lt;br /&gt;
    timers.splice(idStop, 1);&lt;br /&gt;
    pauseTimers.splice(idStop, 1);&lt;br /&gt;
    pauseTime.splice(idStop, 1);&lt;br /&gt;
    selectedKunde.splice(idStop, 1);&lt;br /&gt;
    selectedJob.splice(idStop, 1);&lt;br /&gt;
    statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
    sys_uid.splice(idStop, 1);&lt;br /&gt;
&lt;br /&gt;
    if (zaehler &amp;gt; 0) {&lt;br /&gt;
        zaehler -= 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    closeLightbox();&lt;br /&gt;
&lt;br /&gt;
    if (timers.length === 0) {&lt;br /&gt;
        clearInterval(timerInterval);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    saveStopTime(stopTimeValue, elapsedTime, pTime, status, uid, vergZeit, comment);&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion saveBox wird aufgerufen,----//&lt;br /&gt;
//----wenn der Save-Button gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function() {&lt;br /&gt;
        const saveButton = document.getElementById(&#039;saveButton&#039;);&lt;br /&gt;
        saveButton.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
            saveBox();&lt;br /&gt;
        })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= PHP-Script saveTime.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $user               = 0;&lt;br /&gt;
    $uhrzeit            = 0;&lt;br /&gt;
    $datum              = 0;&lt;br /&gt;
    $endTime            = 0;&lt;br /&gt;
    $endDate            = 0;&lt;br /&gt;
    $status             = 0;&lt;br /&gt;
    $psnr               = 0;&lt;br /&gt;
    $comm               = 0;&lt;br /&gt;
    $jobID              = 0;&lt;br /&gt;
    $pauseTime          = 0;&lt;br /&gt;
    $sysuid             = 0;&lt;br /&gt;
    $stopTimeValue      = 0;&lt;br /&gt;
    $elapsedTime        = 0;&lt;br /&gt;
    $elapsedPauseTime   = 0;&lt;br /&gt;
    $status             = 0;&lt;br /&gt;
    $uid                = 0;&lt;br /&gt;
    $vergZeit           = 0;&lt;br /&gt;
&lt;br /&gt;
    if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) &lt;br /&gt;
    {&lt;br /&gt;
        $api_key            = $_POST[&#039;api_key&#039;];&lt;br /&gt;
        $url                = $_POST[&#039;url&#039;];&lt;br /&gt;
        $method             = $_POST[&#039;method&#039;];&lt;br /&gt;
        $choice             = $_POST[&#039;choice&#039;];&lt;br /&gt;
&lt;br /&gt;
        if (isset($_POST[&#039;user&#039;])) {&lt;br /&gt;
            $user               = $_POST[&#039;user&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;uhrzeit&#039;])) {&lt;br /&gt;
            $uhrzeit            = $_POST[&#039;uhrzeit&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;datum&#039;])) {&lt;br /&gt;
            $datum              = $_POST[&#039;datum&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;endTime&#039;])) {&lt;br /&gt;
            $endTime            = $_POST[&#039;endTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;endDate&#039;])) {&lt;br /&gt;
            $endDate            = $_POST[&#039;endDate&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;status&#039;])) {&lt;br /&gt;
            $status             = $_POST[&#039;status&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;psnr&#039;])) {&lt;br /&gt;
            $psnr               = $_POST[&#039;psnr&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;Job&#039;])) {&lt;br /&gt;
            $comm               = $_POST[&#039;Job&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;jobID&#039;])) {&lt;br /&gt;
            $jobID              = $_POST[&#039;jobID&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;pauseTime&#039;])) {&lt;br /&gt;
            $pauseTime          = $_POST[&#039;pauseTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;sysuid&#039;])) {&lt;br /&gt;
            $sysuid             = $_POST[&#039;sysuid&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;stopTimeValue&#039;])) {&lt;br /&gt;
            $stopTimeValue      = $_POST[&#039;stopTimeValue&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;elapsedTime&#039;])) {&lt;br /&gt;
            $elapsedTime        = $_POST[&#039;elapsedTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;elapsedPauseTime&#039;])) {&lt;br /&gt;
            $elapsedPauseTime   = $_POST[&#039;elapsedPauseTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;status&#039;])) {&lt;br /&gt;
            $status             = $_POST[&#039;status&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;uid&#039;])) {&lt;br /&gt;
            $uid                = $_POST[&#039;uid&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;vergZeit&#039;])) {&lt;br /&gt;
            $vergZeit           = $_POST[&#039;vergZeit&#039;];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $params = array(    &#039;user&#039;              =&amp;gt; $user, &lt;br /&gt;
                            &#039;uhrzeit&#039;           =&amp;gt; $uhrzeit, &lt;br /&gt;
                            &#039;datum&#039;             =&amp;gt; $datum, &lt;br /&gt;
                            &#039;endTime&#039;           =&amp;gt; $endTime, &lt;br /&gt;
                            &#039;endDate&#039;           =&amp;gt; $endDate, &lt;br /&gt;
                            &#039;status&#039;            =&amp;gt; $status, &lt;br /&gt;
                            &#039;psnr&#039;              =&amp;gt; $psnr,&lt;br /&gt;
                            &#039;comm&#039;              =&amp;gt; $comm,&lt;br /&gt;
                            &#039;jobID&#039;             =&amp;gt; $jobID,&lt;br /&gt;
                            &#039;pauseTime&#039;         =&amp;gt; $pauseTime,&lt;br /&gt;
                            &#039;sysuid&#039;            =&amp;gt; $sysuid,&lt;br /&gt;
                            &#039;stopTimeValue&#039;     =&amp;gt; $stopTimeValue,&lt;br /&gt;
                            &#039;elapsedTime&#039;       =&amp;gt; $elapsedTime,&lt;br /&gt;
                            &#039;elapsedPauseTime&#039;  =&amp;gt; $elapsedPauseTime,&lt;br /&gt;
                            &#039;status&#039;            =&amp;gt; $status,&lt;br /&gt;
                            &#039;uid&#039;               =&amp;gt; $uid,&lt;br /&gt;
                            &#039;vergZeit&#039;          =&amp;gt; $vergZeit,&lt;br /&gt;
                            &#039;choice&#039;            =&amp;gt; $choice);&lt;br /&gt;
&lt;br /&gt;
        $curl = curl_init($url);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(&#039;apikey: &#039;.$api_key));&lt;br /&gt;
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));&lt;br /&gt;
        $response = curl_exec($curl);&lt;br /&gt;
&lt;br /&gt;
        if ($response === false) {&lt;br /&gt;
            if($error) {&lt;br /&gt;
                echo &amp;quot;curl_Fehler: &amp;quot;.$error;&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        else {&lt;br /&gt;
            echo $response;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= PHP-Script getData.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $sysuid             = 0;&lt;br /&gt;
    $id                 = 0;&lt;br /&gt;
    $selectedKunde      = 0;&lt;br /&gt;
            &lt;br /&gt;
    if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) &lt;br /&gt;
    {&lt;br /&gt;
        $api_key        = $_POST[&#039;api_key&#039;];&lt;br /&gt;
        $url            = $_POST[&#039;url&#039;];&lt;br /&gt;
        $method         = $_POST[&#039;method&#039;];&lt;br /&gt;
        $choice         = $_POST[&#039;choice&#039;];&lt;br /&gt;
        &lt;br /&gt;
        if (isset($_POST[&#039;id&#039;])) {&lt;br /&gt;
            $id = $_POST[&#039;id&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;sysuid&#039;])) {&lt;br /&gt;
            $sysuid = $_POST[&#039;sysuid&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;selectedKunde&#039;])) {&lt;br /&gt;
            $selectedKunde  = $_POST[&#039;selectedKunde&#039;];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $params = array(    &#039;sysuid&#039;            =&amp;gt; $sysuid,&lt;br /&gt;
                            &#039;id&#039;                =&amp;gt; $id, &lt;br /&gt;
                            &#039;selectedKunde&#039;     =&amp;gt; $selectedKunde,&lt;br /&gt;
                            &#039;choice&#039;            =&amp;gt; $choice);&lt;br /&gt;
        &lt;br /&gt;
        $curl = curl_init($url);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(&#039;apikey: &#039;.$api_key));&lt;br /&gt;
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));&lt;br /&gt;
        $response = curl_exec($curl);&lt;br /&gt;
&lt;br /&gt;
        if ($response === false) {&lt;br /&gt;
            if($error) {&lt;br /&gt;
                echo &amp;quot;curl_Fehler: &amp;quot;.$error;&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        else {&lt;br /&gt;
            echo $response;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CSS-Datei timestyle.css =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-----------------------------------------Allgemein-----------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
body &lt;br /&gt;
{&lt;br /&gt;
    font-family: &#039;Arial&#039;, sans-serif;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: right;&lt;br /&gt;
    align-items: flex-start;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background-image: url(&#039;web_background_3.png&#039;);&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-size: cover; &lt;br /&gt;
    background-attachment: fixed;&lt;br /&gt;
}&lt;br /&gt;
ul &lt;br /&gt;
{&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
}&lt;br /&gt;
li &lt;br /&gt;
{&lt;br /&gt;
    padding: 0.5em;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    display: flex; &lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------Suche-------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
#search&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 8%;&lt;br /&gt;
    left: 42%;&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    height: 2.8%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.04em solid #e4e4e4;&lt;br /&gt;
    border-radius: 0.1em;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 2em;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-----------------------------------------Timerausgabe--------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.kundenliste&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    height: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 43.5%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    border-top-left-radius: 0.2em;&lt;br /&gt;
    border-top-right-radius: 0.2em;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
}&lt;br /&gt;
.tabelleUeberschriften&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    min-height: 3%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 60%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    /* border-top: 0.14em solid #ccc;&lt;br /&gt;
    border-bottom: 0.14em solid #ccc; */&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    box-shadow: 0 0px 3px rgba(0, 0, 0, 0.5);&lt;br /&gt;
    font-size: 0.9vw;&lt;br /&gt;
}&lt;br /&gt;
#timerList&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    height: 25%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 73.5%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    border-bottom-left-radius: 0.2em;&lt;br /&gt;
    border-bottom-right-radius: 0.2em;&lt;br /&gt;
    /* border: 0.14em solid red; */&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
} &lt;br /&gt;
.kunde&lt;br /&gt;
{&lt;br /&gt;
    width: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 0%;&lt;br /&gt;
}&lt;br /&gt;
.konto&lt;br /&gt;
{&lt;br /&gt;
    width: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 30%;&lt;br /&gt;
}&lt;br /&gt;
.laufzeit&lt;br /&gt;
{&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 60%;&lt;br /&gt;
}&lt;br /&gt;
.status&lt;br /&gt;
{&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 75%;&lt;br /&gt;
}&lt;br /&gt;
.buttons&lt;br /&gt;
{&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------Lightbox----------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.lightbox&lt;br /&gt;
{&lt;br /&gt;
    display: none;&lt;br /&gt;
    width: 52%;&lt;br /&gt;
    height: 62%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 61.5%;&lt;br /&gt;
    left: 67%;&lt;br /&gt;
    border-radius: 0.15em;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    box-shadow: 0 10px 2000px rgba(0, 0, 0, 0.5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------Lightbox-Inhalt-----------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.commLabel&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 5%;&lt;br /&gt;
    left: 5%;   &lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.comment&lt;br /&gt;
{&lt;br /&gt;
    width: 90%;&lt;br /&gt;
    height: 38%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 10%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.9vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.bezZeitkonto&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 55%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.dropButtonsLightbox&lt;br /&gt;
{&lt;br /&gt;
    width: 37%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 15%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.bezDatum&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 55%;&lt;br /&gt;
    left: 58%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.date&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 68%;&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    height: 4%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.uhrzeit&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 85.5%;&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    height: 3.9%;&lt;br /&gt;
    padding: 0.1em;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    resize: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.bezPerson&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.eingPerson&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 15%;&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.eingPersonZusatz&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 26%;&lt;br /&gt;
    width: 25.7%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.Std&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 66%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Min&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 78%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Sek&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 91%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outStd&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 64%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outMin&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 76.5%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outSek&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 89%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.Pausenzeiten&lt;br /&gt;
{&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 79%;&lt;br /&gt;
    left: 71%;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.Std2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 66%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Min2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 78%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Sek2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 91%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outStd2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 64%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outMin2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 76.5%;&lt;br /&gt;
    border: 0.1em  solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outSek2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 89%;&lt;br /&gt;
    border: 0.1em  solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.saveButton&lt;br /&gt;
{&lt;br /&gt;
    min-width: 8%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.closeButton&lt;br /&gt;
{&lt;br /&gt;
    min-width: 8%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 14%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*--------------------------------Tätigkeitenliste (zweite Liste)----------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
#zweiteListe &lt;br /&gt;
{&lt;br /&gt;
    display: none;&lt;br /&gt;
    width: 25%;&lt;br /&gt;
    max-height: 50%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 47%;&lt;br /&gt;
    left: 44%;&lt;br /&gt;
    padding: 1%;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    background-color: #FAFAFA;&lt;br /&gt;
    box-shadow: 0 10px 2000px rgba(0, 0, 0, 0.5);&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=OBS/Kostenpflichtige_Module/RESTServer/Beispiel2&amp;diff=62605</id>
		<title>OBS/Kostenpflichtige Module/RESTServer/Beispiel2</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=OBS/Kostenpflichtige_Module/RESTServer/Beispiel2&amp;diff=62605"/>
		<updated>2023-10-18T07:04:19Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
Dieses Script dient zur Zeiterfassung über den REST-Server. Bei Seitenaufruf wird eine Liste von Kunden geladen und in einer Liste angezeigt. &lt;br /&gt;
&lt;br /&gt;
Durch Rechtsklick auf einen Eintrag wird eine Liste an zugehörigen Tätigkeiten geladen, die nach Klick einen Timer starten.&lt;br /&gt;
&lt;br /&gt;
Per Javascript werden Startzeit, Startdatum und andere Informationen wie Kunde und Personalnummer über die PHP-Scripte und das Endpunkt-Script in einer Datenbank gespeichert.&lt;br /&gt;
&lt;br /&gt;
Der Status wird hierbei auf &amp;quot;1&amp;quot; gesetzt. Pausenzeiten werden nach Beenden einer Pause in der Datenbank gespeichert.&lt;br /&gt;
&lt;br /&gt;
Durch Drücken des Stop-Buttons wird eine Lightbox mit einer Zusammenfassung aller zum Timer gehörenden Daten angezeigt. Hier hat man die Möglichkeit Tätigkeiten, abgelaufene Zeit und &lt;br /&gt;
&lt;br /&gt;
Pausenzeit nachträglich zu bearbeiten. Durch Klick auf &amp;quot;Speichern&amp;quot; oder Druck auf F2 werden Endzeit und Enddatum gespeichert und der Status auf &amp;quot;21&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
Nach Reload der Webseite wird anhand des Status in der Datenbank nach laufenden Timern gesucht und diese gegebenenfalls gestartet.&lt;br /&gt;
&lt;br /&gt;
= Endpunkt-Script =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure _AddJob(oArr: TJSONArray; id: String);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT CONCAT(za_text, &amp;quot;:&amp;quot;,sys_uid) AS Job FROM zeiterfart &#039; +&lt;br /&gt;
                &#039;WHERE za_psnr = &#039; + DB_SQLVal(id) + &#039; AND za_inaktiv &amp;lt;&amp;gt; &amp;quot;1&amp;quot; &#039; +&lt;br /&gt;
                &#039;ORDER BY za_order&#039;;&lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;Job&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddCustomer(oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=&#039;  SELECT * FROM&#039; + &lt;br /&gt;
              &#039;  (SELECT&#039; +&lt;br /&gt;
              &#039;  ps_nr,&#039; +&lt;br /&gt;
              &#039;  ps_such AS Kunde,&#039; +&lt;br /&gt;
              &#039;  perssta.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PE&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN perssta ON se_ref1 AND perssta.sys_uid = se_ref2&#039; +&lt;br /&gt;
              &#039;  WHERE se_nr = 0087&#039; + &lt;br /&gt;
              &#039;  AND ps_nr &amp;lt;&amp;gt; 100000&#039; +&lt;br /&gt;
              &#039;  UNION SELECT p_nr AS ps_nr,&#039; +&lt;br /&gt;
              &#039;  p_name1 AS ps_such,&#039; +&lt;br /&gt;
              &#039;  projekte.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PR&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN projekte ON se_ref1 = p_nr&#039; +&lt;br /&gt;
              &#039;  AND projekte.sys_uid = se_ref2 WHERE se_nr = 0087)&#039; +&lt;br /&gt;
              &#039;  A WHERE ps_nr IS NOT NULL&#039; +&lt;br /&gt;
              &#039;  ORDER BY Kunde &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;Kunde&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddID(kunde: String; oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=&#039;  SELECT * FROM&#039; + &lt;br /&gt;
              &#039;  (SELECT&#039; +&lt;br /&gt;
              &#039;  ps_nr,&#039; +&lt;br /&gt;
              &#039;  ps_such AS Kunde,&#039; +&lt;br /&gt;
              &#039;  perssta.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PE&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN perssta ON se_ref1 AND perssta.sys_uid = se_ref2&#039; +&lt;br /&gt;
              &#039;  WHERE se_nr = 0087&#039; + &lt;br /&gt;
              &#039;  AND ps_nr &amp;lt;&amp;gt; 100000&#039; +&lt;br /&gt;
              &#039;  UNION SELECT p_nr AS ps_nr,&#039; +&lt;br /&gt;
              &#039;  p_name1 AS ps_such,&#039; +&lt;br /&gt;
              &#039;  projekte.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PR&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN projekte ON se_ref1 = p_nr&#039; +&lt;br /&gt;
              &#039;  AND projekte.sys_uid = se_ref2 WHERE se_nr = 0087)&#039; +&lt;br /&gt;
              &#039;  A WHERE ps_nr IS NOT NULL&#039; +&lt;br /&gt;
              &#039;  AND Kunde = &#039; + DB_SQLVal(kunde) +&lt;br /&gt;
              &#039;  ORDER BY Kunde &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ps_nr&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddCHECK(oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT ze_starttime, zeiterfuser.sys_uid AS sysuid, zk_psnr, &#039; +&lt;br /&gt;
                &#039;za_text, ps_such, ze_startdate FROM &#039; +&lt;br /&gt;
                &#039;zeiterfuser LEFT JOIN zeiterfkomm ON &#039; +&lt;br /&gt;
                &#039;zk_messunguid = zeiterfuser.SYS_UID LEFT JOIN zeiterfart &#039; +&lt;br /&gt;
                &#039;ON zeiterfart.sys_uid = zeiterfuser.ze_uid AND &#039; +&lt;br /&gt;
                &#039;za_psnr = zeiterfkomm.zk_psnr LEFT JOIN perssta ON &#039; +&lt;br /&gt;
                &#039;ps_nr = zeiterfkomm.zk_psnr WHERE ze_status = 01 &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_starttime&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;zk_psnr&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;za_text&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ps_such&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;sysuid&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_startdate&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _getPauseTime(sysuid: String; oArr: TJSONArray);&lt;br /&gt;
var cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT * FROM zeiterfuser WHERE sys_uid = &#039; + DB_SQLVal(sysuid);&lt;br /&gt;
    &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_pausezeit&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//----------------Funktionen----------------------------------//&lt;br /&gt;
&lt;br /&gt;
function POST(oParams: TStrings): string;&lt;br /&gt;
var &lt;br /&gt;
oArr1                                   : TJSONArray;&lt;br /&gt;
cSql                                    : String;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    if (oParams.values[&#039;choice&#039;]=&#039;job&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddJob(oArr1, oParams.values[&#039;id&#039;]);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;customer&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddCustomer(oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;id&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddID(oParams.values[&#039;selectedKunde&#039;], oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;check&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddCHECK(oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;pauseTime&#039;) then begin    &lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _GetPauseTime(oParams.values[&#039;sysuid&#039;], oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function PUT(oParams: TStrings): string;&lt;br /&gt;
var &lt;br /&gt;
xZeit           : TqSQL;&lt;br /&gt;
cUSER_SYSUID    : String;&lt;br /&gt;
cKOMM_SYSUID    : String;&lt;br /&gt;
lNew            : Boolean;&lt;br /&gt;
cSql            : String;&lt;br /&gt;
dDBNow          : TDateTime;&lt;br /&gt;
begin  &lt;br /&gt;
    writeln(&#039;Choice: &#039; + oParams.values[&#039;choice&#039;]);&lt;br /&gt;
    if (oParams.values[&#039;choice&#039;]=&#039;start&#039;) then&lt;br /&gt;
    begin&lt;br /&gt;
        dDBNow  := DB_Now(oDB); &lt;br /&gt;
        lNew    := True;&lt;br /&gt;
        if (empty(cUSER_SYSUID)) then begin&lt;br /&gt;
            cUSER_SYSUID := GetNewId(oDB);&lt;br /&gt;
        end;&lt;br /&gt;
    &lt;br /&gt;
        xZeit           := qSqlInit(oDB, &#039;zeiterfuser&#039;);&lt;br /&gt;
        xZeit.lNoSysUID := True;&lt;br /&gt;
    &lt;br /&gt;
        writeln(&#039;SYSUID: &#039; + oParams.values[&#039;jobID&#039;]);&lt;br /&gt;
    &lt;br /&gt;
        xZeit.qSet(&#039;ze_user&#039;            , oParams.values[&#039;user&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_starttime&#039;       , oParams.values[&#039;uhrzeit&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_eigen&#039;           , &#039;0101&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_startdate&#039;       , oParams.values[&#039;datum&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_endtime&#039;         , oParams.values[&#039;endTime&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_enddate&#039;         , oParams.values[&#039;endDate&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_zeit&#039;            , &#039;0&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_pausezeit&#039;       , &#039;0&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_status&#039;          , oParams.values[&#039;status&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_berechnen&#039;       , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_officestar&#039;      , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_repa&#039;            , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_vorbereitung&#039;    , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_uid&#039;             , oParams.values[&#039;jobID&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;sys_uid&#039;            , cUSER_SYSUID);&lt;br /&gt;
    &lt;br /&gt;
        xZeit.SaveData(lNew);&lt;br /&gt;
        qSQLFree(xZeit);&lt;br /&gt;
        &lt;br /&gt;
        //---------------------------------------------------------------------&lt;br /&gt;
        &lt;br /&gt;
        xZeit := qSqlInit(oDB,&#039;ZEITERFKOMM&#039;);&lt;br /&gt;
        xZeit.lNoSysUID := True;&lt;br /&gt;
        &lt;br /&gt;
        if (empty(cKOMM_SYSUID)) then begin&lt;br /&gt;
            cKOMM_SYSUID := GetNewId(oDB);&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        xZeit.qSet(&#039;zk_psnr&#039;       , oParams.values[&#039;psnr&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_starttime&#039;  , oParams.values[&#039;uhrzeit&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_startdate&#039;  , oParams.values[&#039;datum&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_kommentar&#039;  , oParams.values[&#039;comm&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_messunguid&#039; , cUSER_SYSUID);&lt;br /&gt;
        xZeit.qSet(&#039;sys_uid&#039;       , cKOMM_SYSUID);&lt;br /&gt;
&lt;br /&gt;
        xZeit.SaveData(lNew);&lt;br /&gt;
        qSQLFree(xZeit);&lt;br /&gt;
        &lt;br /&gt;
        result  := cUser_SYSUID;&lt;br /&gt;
        &lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;stop&#039;) then&lt;br /&gt;
    begin&lt;br /&gt;
        &lt;br /&gt;
        cSql := &#039;UPDATE zeiterfuser SET ze_zeit = &#039; + oParams.values[&#039;elapsedTime&#039;] +&lt;br /&gt;
                &#039;, ze_endtime = &#039;                   + oParams.values[&#039;vergZeit&#039;] +&lt;br /&gt;
                &#039;, ze_enddate = &#039;                   + oParams.values[&#039;stopTimeValue&#039;] +&lt;br /&gt;
                &#039;, ze_pausezeit = &#039;                 + oParams.values[&#039;elapsedPauseTime&#039;] +&lt;br /&gt;
                &#039;, ze_status = &#039;                    + oParams.values[&#039;status&#039;] +&lt;br /&gt;
                &#039; WHERE sys_uid = &#039;                 + DB_SQLVal(oParams.values[&#039;uid&#039;]);&lt;br /&gt;
&lt;br /&gt;
        if DB_SQLExec(oDB,cSql) then&lt;br /&gt;
        begin&lt;br /&gt;
            result := &#039;Die Daten wurden erfolgreich gespeichert!&#039;;&lt;br /&gt;
        end else begin&lt;br /&gt;
            result := &#039;Fehler!&#039;;&lt;br /&gt;
        end;&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;pause&#039;) then&lt;br /&gt;
    begin     &lt;br /&gt;
        writeln(&#039;Pausezeit: &#039; + oParams.values[&#039;pauseTime&#039;]);&lt;br /&gt;
        cSql := &#039;UPDATE zeiterfuser SET ze_pausezeit &#039; + &lt;br /&gt;
                &#039;= ze_pausezeit + &#039;    + oParams.values[&#039;pauseTime&#039;] +&lt;br /&gt;
                &#039; WHERE sys_uid = &#039;    + DB_SQLVal(oParams.values[&#039;sysuid&#039;]);&lt;br /&gt;
&lt;br /&gt;
        if DB_SQLExec(oDB,cSql) then&lt;br /&gt;
        begin&lt;br /&gt;
            result := &#039;Die Daten wurden erfolgreich gespeichert!&#039;;&lt;br /&gt;
        end else begin&lt;br /&gt;
            result := &#039;Fehler!&#039;;&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= HTML-Datei index.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de-DE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;Ihr IT-Partner in Stade - Ernst Bergau GmbH&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;timestyle.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        &amp;lt;?php&lt;br /&gt;
            include(&#039;timer.js&#039;);&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //--------------------------------------------------------------------------------------------------------------// --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //---------------------------------------------------HTML-------------------------------------------------------// --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //--------------------------------------------------------------------------------------------------------------// --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;textarea id=&amp;quot;search&amp;quot; type=&amp;quot;text&amp;quot; rows=&amp;quot;1&amp;quot; cols=&amp;quot;50&amp;quot; oninput=&amp;quot;searchCustomers(this.value)&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;kundenliste&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ul id=&amp;quot;kundenListe&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table class=&amp;quot;timer&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;tbody id=&amp;quot;timerList&amp;quot;&amp;gt;&amp;lt;/tbody&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
        &amp;lt;table class=&amp;quot;tabelleUeberschriften&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;thead&amp;gt;&lt;br /&gt;
                &amp;lt;tr&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;kunde&amp;quot;&amp;gt;Kunde&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;konto&amp;quot;&amp;gt;Konto&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;laufzeit&amp;quot;&amp;gt;Laufzeit&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;status&amp;quot;&amp;gt;Status&amp;lt;/th&amp;gt;&lt;br /&gt;
                &amp;lt;/tr&amp;gt;&lt;br /&gt;
            &amp;lt;/thead&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;lightbox&amp;quot; id=&amp;quot;lightbox&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label class=&amp;quot;commLabel&amp;quot; id=&amp;quot;commLabel&amp;quot; for=&amp;quot;comment&amp;quot;&amp;gt;Kommentar&amp;lt;/label&amp;gt;&lt;br /&gt;
            &amp;lt;textarea class=&amp;quot;comment&amp;quot; id=&amp;quot;comment&amp;quot; rows=&amp;quot;4&amp;quot; cols=&amp;quot;50&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezZeitkonto&amp;quot;&amp;gt;Zeitkonto&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;select class=&amp;quot;dropButtonsLightbox&amp;quot; id=&amp;quot;tätigkeit2Dropdown&amp;quot;&amp;gt;&amp;lt;/select&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezDatum&amp;quot;&amp;gt;Startdatum&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;date&amp;quot; class=&amp;quot;date&amp;quot; id=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;uhrzeit&amp;quot; id=&amp;quot;uhrzeit&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezPerson&amp;quot;&amp;gt;Person&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;eingPerson&amp;quot; id=&amp;quot;eingPerson&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;eingPersonZusatz&amp;quot; id=&amp;quot;eingPersonZusatz&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Std&amp;quot;&amp;gt;Std&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outStd&amp;quot; id=&amp;quot;outStd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Min&amp;quot;&amp;gt;Min&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outMin&amp;quot; id=&amp;quot;outMin&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Sek&amp;quot;&amp;gt;Sek&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outSek&amp;quot; id=&amp;quot;outSek&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Pausenzeiten&amp;quot;&amp;gt;Davon Pausenzeiten&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Std2&amp;quot;&amp;gt;Std&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outStd2&amp;quot; id=&amp;quot;outStd2&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Min2&amp;quot;&amp;gt;Min&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outMin2&amp;quot; id=&amp;quot;outMin2&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Sek2&amp;quot;&amp;gt;Sek&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outSek2&amp;quot; id=&amp;quot;outSek2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;button class=&amp;quot;saveButton&amp;quot; id=&amp;quot;saveButton&amp;quot;&amp;gt;Speichern&amp;lt;/button&amp;gt;&lt;br /&gt;
            &amp;lt;button class=&amp;quot;closeButton&amp;quot; id=&amp;quot;closeButton&amp;quot; onclick=&amp;quot;closeLightboxOnSchliessen()&amp;quot;&amp;gt;Schließen&amp;lt;/button&amp;gt; &lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div id=&amp;quot;zweiteListe&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ul id=&amp;quot;taetigkeitListe&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Javascript-Datei timer.js =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var api_key             = &#039;Y00C75PODJ&#039;;&lt;br /&gt;
var url                 = &#039;http://127.0.0.1:8099/Zeiterfa/zeiterfa/v1&#039;;&lt;br /&gt;
var zaehler             = -1;&lt;br /&gt;
var timerInterval;      &lt;br /&gt;
var pauseTimerInterval; &lt;br /&gt;
var startTimeValue;     &lt;br /&gt;
var selectedID          = 0;&lt;br /&gt;
var elapsedTime;        &lt;br /&gt;
var uid;                &lt;br /&gt;
var idStop; &lt;br /&gt;
var time;&lt;br /&gt;
var selID               = [];&lt;br /&gt;
var job                 = [];&lt;br /&gt;
var sys_uid             = [];&lt;br /&gt;
var timers              = [];    &lt;br /&gt;
var pauseTimers         = [];  &lt;br /&gt;
var pauseTime           = [];&lt;br /&gt;
var startdate           = [];&lt;br /&gt;
var uhrzeit             = [];&lt;br /&gt;
var datum               = [];&lt;br /&gt;
var statusTimer         = [];       &lt;br /&gt;
var selectedJob         = [];&lt;br /&gt;
var selectedKunde       = [];      &lt;br /&gt;
var tempSelectedKunde   = [];&lt;br /&gt;
var parameter           = [];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------------Seitenaufruf---------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Bei Seitenaufruf werden die Funktionen----//&lt;br /&gt;
//----getCustomer und checkTimer aufgerufen und----//&lt;br /&gt;
//----die Kundenliste gefüllt und geprüft,----//&lt;br /&gt;
//----ob laufende timer vorhanden sind----//&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
&lt;br /&gt;
    getCustomer();&lt;br /&gt;
    checkTimer();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-------------------------------------------------Daten auslesen--------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Eine Liste der Kunden wird ausgelesenund gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getCustomer() {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;customer&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            populateListeKunde(responseData);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Bei Rechtsklick auf Kunden wird----//&lt;br /&gt;
//----seine ID ausgelesen und gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getCustomerID(selectedKunde, callback) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;id&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;selectedKunde=&amp;quot;       + encodeURIComponent(selectedKunde);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            selectedID = JSON.parse(request.responseText);&lt;br /&gt;
            callback(selectedID);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Anhand der Kunden-ID wird eine Liste von Tätigkeiten----//&lt;br /&gt;
//----für jeden Kunden ausgelesen und gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getJob(id, callback) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;job&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;id=&amp;quot;                  + encodeURIComponent(id);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            var Data         = responseData.toString();&lt;br /&gt;
            var teile        = Data.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
            var jobid = [];&lt;br /&gt;
&lt;br /&gt;
            for (i=0; i&amp;lt;teile.length; i++) {&lt;br /&gt;
                job[i]   = teile[i].split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
                jobid[i] = teile[i].split(&amp;quot;:&amp;quot;)[1];&lt;br /&gt;
            }&lt;br /&gt;
            callback(job, jobid);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Tätigkeitsliste wird nochmal zur Weiterverarbeitung gelesen----//&lt;br /&gt;
&lt;br /&gt;
function getJobs(id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;job&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;id=&amp;quot;                  + encodeURIComponent(id);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;, false);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            var data = responseData.toString();&lt;br /&gt;
            var teile = data.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
            var jobid = [];&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; teile.length; i++) {&lt;br /&gt;
                job[i] = teile[i].split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
                jobid[i] = teile[i].split(&amp;quot;:&amp;quot;)[1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Gespeicherte Pausezeit wird ausgelesen----//&lt;br /&gt;
&lt;br /&gt;
function getPauseTime(sysuid, id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;pauseTime&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params  =   &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;sysuid=&amp;quot;              + encodeURIComponent(sysuid);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;, false);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            pauseTime[id].value = JSON.parse(request.responseText);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Listen--------------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Eine Liste wird mit Kundendaten gefüllt und angezeigt----//&lt;br /&gt;
&lt;br /&gt;
function populateListeKunde(data) {&lt;br /&gt;
&lt;br /&gt;
    data.forEach(function(item) {&lt;br /&gt;
        var listItem = document.createElement(&amp;quot;li&amp;quot;);&lt;br /&gt;
        listItem.textContent = item;&lt;br /&gt;
&lt;br /&gt;
        listItem.addEventListener(&amp;quot;contextmenu&amp;quot;, function(event) {&lt;br /&gt;
            event.preventDefault();&lt;br /&gt;
&lt;br /&gt;
            var selectedKunde = item;&lt;br /&gt;
            getCustomerID(selectedKunde, function(selectedID) {&lt;br /&gt;
                getJob(selectedID, function(job, jobid) {&lt;br /&gt;
                    showSecondList(job, jobid, item);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        kundenListe.appendChild(listItem);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Eine zweite Liste wird mit Jobs gefüllt,----//&lt;br /&gt;
//----angezeigt und bei Klick auf einen Eintrag---//&lt;br /&gt;
//-------die Funktion startTimer aufgerufen-------//&lt;br /&gt;
&lt;br /&gt;
function showSecondList(job, jobid, kundeItem) {&lt;br /&gt;
&lt;br /&gt;
    var zweiteListe = document.getElementById(&amp;quot;zweiteListe&amp;quot;);&lt;br /&gt;
    zweiteListe.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    job.forEach(function(item) {&lt;br /&gt;
        var listItem = document.createElement(&amp;quot;li&amp;quot;);&lt;br /&gt;
        listItem.textContent = item;&lt;br /&gt;
    &lt;br /&gt;
        (function(capturedItem) {&lt;br /&gt;
            listItem.addEventListener(&amp;quot;click&amp;quot;, function() {&lt;br /&gt;
                startTimer(job, jobid, capturedItem, kundeItem);&lt;br /&gt;
            });&lt;br /&gt;
        }) (item);&lt;br /&gt;
        zweiteListe.appendChild(listItem);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;block&amp;quot;; &lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeSecondList);&lt;br /&gt;
    document.addEventListener(&#039;click&#039;, closeSecondList);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Nach Klick auf Eintrag wird die Liste geschlossen----//&lt;br /&gt;
function closeSecondList() {&lt;br /&gt;
&lt;br /&gt;
    var zweiteListe = document.getElementById(&amp;quot;zweiteListe&amp;quot;);&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;none&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Daten speichern-----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Startzeit, -datum, ID und Job werden gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveStartTime(user, uhrzeit, datum, endTime, endDate, status, psnr, Job, jobID) {&lt;br /&gt;
    &lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;start&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;user=&amp;quot;                + encodeURIComponent(user) +&lt;br /&gt;
                    &amp;quot;&amp;amp;uhrzeit=&amp;quot;             + encodeURIComponent(uhrzeit) +&lt;br /&gt;
                    &amp;quot;&amp;amp;datum=&amp;quot;               + encodeURIComponent(datum) +&lt;br /&gt;
                    &amp;quot;&amp;amp;endTime=&amp;quot;             + encodeURIComponent(endTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;endDate=&amp;quot;             + encodeURIComponent(endDate) +&lt;br /&gt;
                    &amp;quot;&amp;amp;status=&amp;quot;              + encodeURIComponent(status)+&lt;br /&gt;
                    &amp;quot;&amp;amp;psnr=&amp;quot;                + encodeURIComponent(psnr)+&lt;br /&gt;
                    &amp;quot;&amp;amp;Job=&amp;quot;                 + encodeURIComponent(Job)+&lt;br /&gt;
                    &amp;quot;&amp;amp;jobID=&amp;quot;               + encodeURIComponent(jobID);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            sys_uid[zaehler].value = request.responseText;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Pausezeit wird gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function savePauseTime(pauseTime, id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;pause&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;      + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;         + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;      + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;      + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;pauseTime=&amp;quot;   + encodeURIComponent(pauseTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;sysuid=&amp;quot;      + encodeURIComponent(sys_uid[id].value);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            // alert(request.responseText);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Stopzeit und -datum wird gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveStopTime(stopTimeValue, elapsedTime, elapsedPauseTime, status, uid, vergZeit) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;stop&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;stopTimeValue=&amp;quot;       + encodeURIComponent(stopTimeValue) +&lt;br /&gt;
                    &amp;quot;&amp;amp;elapsedTime=&amp;quot;         + encodeURIComponent(elapsedTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;elapsedPauseTime=&amp;quot;    + encodeURIComponent(elapsedPauseTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;status=&amp;quot;              + encodeURIComponent(status) +&lt;br /&gt;
                    &amp;quot;&amp;amp;uid=&amp;quot;                 + encodeURIComponent(uid) +&lt;br /&gt;
                    &amp;quot;&amp;amp;vergZeit=&amp;quot;            + encodeURIComponent(vergZeit);&lt;br /&gt;
    &lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200 &amp;amp;&amp;amp; timers.length === 0) {&lt;br /&gt;
            location.reload();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Like-Suche----------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Durchsucht die Liste der Kunden auf alle einegegebenen Zeichen----//&lt;br /&gt;
&lt;br /&gt;
function searchCustomers(text) {&lt;br /&gt;
&lt;br /&gt;
    text = text.toLowerCase();&lt;br /&gt;
    var kundenListe = document.getElementById(&amp;quot;kundenListe&amp;quot;);&lt;br /&gt;
    var listItems = kundenListe.getElementsByTagName(&amp;quot;li&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (i=0; i&amp;lt;listItems.length; i++) {&lt;br /&gt;
        var item = listItems[i].textContent.toLowerCase();&lt;br /&gt;
        if (item.includes(text)) {&lt;br /&gt;
            listItems[i].style.display = &amp;quot;block&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            listItems[i].style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------Vorhandenen Timer checken----------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Überprüft, ob es Einträge in Datenbank ohne----//&lt;br /&gt;
//----Endzeit gibt und startet entsprechend Timer----//&lt;br /&gt;
&lt;br /&gt;
function checkTimer() {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;check&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200 &amp;amp;&amp;amp; timers.length === 0) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            &lt;br /&gt;
            if (responseData.length !== 0) {&lt;br /&gt;
                startTimeValue = new Date();&lt;br /&gt;
                var minutes = startTimeValue.getMinutes();&lt;br /&gt;
                var seconds = startTimeValue.getSeconds();&lt;br /&gt;
                var month = startTimeValue.getMonth() + 1;&lt;br /&gt;
&lt;br /&gt;
                responseData = responseData.toString();&lt;br /&gt;
                var teile = responseData.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                for (var i=0; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
                    uhrzeit.push({value: startTimeValue.getHours() + &amp;quot;:&amp;quot; + (minutes &amp;lt; 10 ? &amp;quot;0&amp;quot; + minutes : minutes) + &amp;quot;:&amp;quot; + (seconds &amp;lt; 10 ? &amp;quot;0&amp;quot; + seconds : seconds)});&lt;br /&gt;
                    datum.push({value: startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + startTimeValue.getDate()});&lt;br /&gt;
&lt;br /&gt;
                    zaehler++;&lt;br /&gt;
&lt;br /&gt;
                    statusTimer.push({value: &#039;Running&#039;});&lt;br /&gt;
                    pauseTimers.push({value: 0});&lt;br /&gt;
                    pauseTime.push({value: 0});&lt;br /&gt;
                    timers.push({value: teile[i]});&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var j=0;&lt;br /&gt;
                for (var i=1; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
                    selID.push({value: teile[i]});&lt;br /&gt;
                    getJobs(selID[j].value);&lt;br /&gt;
                    j++;&lt;br /&gt;
                } &lt;br /&gt;
&lt;br /&gt;
                fillArray(2, selectedJob, teile);&lt;br /&gt;
                fillArray(3, selectedKunde, teile);&lt;br /&gt;
                fillArray(4, sys_uid, teile);&lt;br /&gt;
                fillArray(5, startdate, teile);&lt;br /&gt;
&lt;br /&gt;
                for (var i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
                    var startZeitTeil = timers[i].value.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
                    var startDatumTeil = startdate[i].value.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    var diffMilli = new Date() - getStartdatum(startDatumTeil, startZeitTeil);&lt;br /&gt;
                    timers[i].value = Math.floor(diffMilli / 1000); &lt;br /&gt;
                }   &lt;br /&gt;
&lt;br /&gt;
                selecteID = 0;&lt;br /&gt;
                startInterval(job);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Arrays werden an diese Funktion übergeben und gefüllt----//&lt;br /&gt;
&lt;br /&gt;
function fillArray(LZ, array, teile) {&lt;br /&gt;
&lt;br /&gt;
    var arrLZ = 0;&lt;br /&gt;
    for (var i=LZ; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
        array.push({value: teile[i]});&lt;br /&gt;
        arrLZ++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Startdatum wird errechnet----//&lt;br /&gt;
function getStartdatum(startDatumTeil, startZeitTeil) {&lt;br /&gt;
&lt;br /&gt;
    var startdatum = new Date(&lt;br /&gt;
        parseInt(startDatumTeil[2]),&lt;br /&gt;
        parseInt(startDatumTeil[1]) -1,&lt;br /&gt;
        parseInt(startDatumTeil[0]),&lt;br /&gt;
        parseInt(startZeitTeil[0]),&lt;br /&gt;
        parseInt(startZeitTeil[1]),&lt;br /&gt;
        parseInt(startZeitTeil[2])&lt;br /&gt;
    );&lt;br /&gt;
    return startdatum;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-------------------------------------------------Interval--------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Interval für Timer wird gestartet----//&lt;br /&gt;
&lt;br /&gt;
function startInterval(job, item, kundeItem, index) {&lt;br /&gt;
&lt;br /&gt;
    timerInterval = setInterval(function() {&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
&lt;br /&gt;
            timers[i].value += 1;&lt;br /&gt;
        }&lt;br /&gt;
        updateUI(job, item, kundeItem, index);&lt;br /&gt;
    }, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Interval für Pausentimer wird gestartet----// &lt;br /&gt;
&lt;br /&gt;
function pauseInterval(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    pauseTimerInterval = setInterval(function() {&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;pauseTimers.length; i++) {&lt;br /&gt;
&lt;br /&gt;
            pauseTimers[i].value += 1;&lt;br /&gt;
        }&lt;br /&gt;
        updateUI(job, item, kundeItem);&lt;br /&gt;
    }, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer starten----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----startTimer bereitet die nötigen Arrays vor,----//&lt;br /&gt;
//----speichert Startzeit und -datum,----//&lt;br /&gt;
//----beschreibt Arrays und Variablen entsprechend----//&lt;br /&gt;
//----und ruft die Funktion saveStartTime auf----//&lt;br /&gt;
&lt;br /&gt;
function startTimer(jobs, jobid, selJob, kundeItem) {&lt;br /&gt;
&lt;br /&gt;
    var user = 999;&lt;br /&gt;
    var endTime = &amp;quot;00:00:00&amp;quot;;&lt;br /&gt;
    var endDate = &amp;quot;0000-00-00&amp;quot;;&lt;br /&gt;
    var status = &#039;01&#039;;&lt;br /&gt;
    zaehler++;&lt;br /&gt;
    &lt;br /&gt;
    startTimeValue = new Date();&lt;br /&gt;
&lt;br /&gt;
    var minutes = startTimeValue.getMinutes();&lt;br /&gt;
    var seconds = startTimeValue.getSeconds();&lt;br /&gt;
    uhrzeit.push({value: startTimeValue.getHours() + &amp;quot;:&amp;quot; + (minutes &amp;lt; 10 ? &amp;quot;0&amp;quot; + minutes : minutes) + &amp;quot;:&amp;quot; + (seconds &amp;lt; 10 ? &amp;quot;0&amp;quot; + seconds : seconds)});&lt;br /&gt;
&lt;br /&gt;
    var month = startTimeValue.getMonth() + 1;&lt;br /&gt;
    datum.push({value: startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + startTimeValue.getDate()});&lt;br /&gt;
&lt;br /&gt;
    statusTimer.push({value: &#039;Running&#039;});&lt;br /&gt;
    pauseTimers.push({value: 0});&lt;br /&gt;
    pauseTime.push({value: 0});&lt;br /&gt;
    timers.push({value: 0});&lt;br /&gt;
    selectedKunde.push({value: kundeItem});&lt;br /&gt;
    selectedJob.push({value: selJob});&lt;br /&gt;
    sys_uid.push({value: 0});&lt;br /&gt;
&lt;br /&gt;
    var index = jobs.indexOf(selJob);&lt;br /&gt;
    &lt;br /&gt;
    saveStartTime(user, uhrzeit[zaehler].value, datum[zaehler].value, endTime, endDate, status, selectedID, selJob, jobid[index]);&lt;br /&gt;
    &lt;br /&gt;
    clearInterval(timerInterval);&lt;br /&gt;
    startInterval(jobs, selJob, kundeItem, index);&lt;br /&gt;
&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer stoppen----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Stopt den Timer, ändert den Status und ruft openLightbox auf----//&lt;br /&gt;
&lt;br /&gt;
function stopTimer(job, item, kundeItem, index, id) {&lt;br /&gt;
&lt;br /&gt;
    idStop = id;&lt;br /&gt;
    statusTimer[id].value = &#039;Stopped&#039;;&lt;br /&gt;
    openLightbox(job, item, kundeItem, index, id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer pausieren--------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Pausiert den Timer und ändert den Status----//&lt;br /&gt;
&lt;br /&gt;
function pauseTimer(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    pauseTimers[id].value = 0;&lt;br /&gt;
    clearInterval(pauseTimerInterval);&lt;br /&gt;
    pauseInterval(job, item, kundeItem, id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//----------------------------------------------Button Pause-Start-------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Ruft die Funktion pauseTimer oder----//&lt;br /&gt;
//----savePauseTimer auf----//&lt;br /&gt;
&lt;br /&gt;
function toggleButton(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    var button = document.getElementById(id);&lt;br /&gt;
&lt;br /&gt;
    if (button.innerHTML === &amp;quot;Pause&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
        statusTimer[id].value = &#039;Paused&#039;;&lt;br /&gt;
        pauseTimer(job, item, kundeItem, id);&lt;br /&gt;
    } &lt;br /&gt;
    else {&lt;br /&gt;
&lt;br /&gt;
        statusTimer[id].value = &amp;quot;Running&amp;quot;;&lt;br /&gt;
        savePauseTime(pauseTimers[id].value, id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Ausgabe des Timers-----------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Zeigt eine Liste mit einem oder mehreren----//&lt;br /&gt;
//----Timern und Buttons, verteilt dynamisch ID&#039;s----//&lt;br /&gt;
//----und ruft entsprechend der gedrückten----//&lt;br /&gt;
//----Buttons Funktionen auf----//&lt;br /&gt;
&lt;br /&gt;
function updateUI(job, item, kundeItem, index) {&lt;br /&gt;
    var timerList = document.getElementById(&amp;quot;timerList&amp;quot;);&lt;br /&gt;
    timerList.innerHTML = &#039;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    for (i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
        var neueReihe = document.createElement(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Name des Kunden wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var kundeEintrag = document.createElement(&#039;td&#039;);&lt;br /&gt;
        kundeEintrag.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.width = &amp;quot;30%&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.left = &amp;quot;0%&amp;quot;; &lt;br /&gt;
        kundeEintrag.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        kundeEintrag.classList.add(&#039;kunde_k&#039;);&lt;br /&gt;
        kundeEintrag.textContent = selectedKunde[i].value;&lt;br /&gt;
        timerList.appendChild(kundeEintrag);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Gewählter Job wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var kontoEintrag = document.createElement(&#039;td&#039;);&lt;br /&gt;
        kontoEintrag.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        kontoEintrag.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
        kontoEintrag.style.width = &amp;quot;30%&amp;quot;;&lt;br /&gt;
        kontoEintrag.style.left = &amp;quot;30%&amp;quot;; &lt;br /&gt;
        kontoEintrag.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        kontoEintrag.classList.add(&#039;konto_k&#039;);&lt;br /&gt;
        kontoEintrag.textContent = selectedJob[i].value;&lt;br /&gt;
        timerList.appendChild(kontoEintrag);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Gestartete Timer werden in Liste----//&lt;br /&gt;
        //----ausgegeben, pausierte Timer werden----//&lt;br /&gt;
        //----Liste ausgegeben, sobald Timer gestoppt----//&lt;br /&gt;
        //----wird Ausgabe in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
        if (statusTimer[i].value === &amp;quot;Running&amp;quot;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(timers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &#039;Paused&#039;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(pauseTimers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &#039;Stopped&#039;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(pauseTimers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
&lt;br /&gt;
            var zeit = formatElapsedTime(timers[i].value);&lt;br /&gt;
            zeit = zeit.toString();&lt;br /&gt;
            var teile = zeit.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            var h = teile[0];&lt;br /&gt;
            var m = teile[1];&lt;br /&gt;
            var s = teile[2];&lt;br /&gt;
&lt;br /&gt;
            var outStdField = document.getElementById(&amp;quot;outStd&amp;quot;);&lt;br /&gt;
            var outMinField = document.getElementById(&amp;quot;outMin&amp;quot;);&lt;br /&gt;
            var outSekField = document.getElementById(&amp;quot;outSek&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (document.activeElement !== outStdField &amp;amp;&amp;amp; document.activeElement !== outMinField &amp;amp;&amp;amp; document.activeElement !== outSekField) {&lt;br /&gt;
                document.getElementById(&amp;quot;outStd&amp;quot;).value = h; &lt;br /&gt;
                document.getElementById(&amp;quot;outMin&amp;quot;).value = m;&lt;br /&gt;
                document.getElementById(&amp;quot;outSek&amp;quot;).value = s;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var hEnd = document.getElementById(&amp;quot;outStd&amp;quot;).value;&lt;br /&gt;
            var mEnd = document.getElementById(&amp;quot;outMin&amp;quot;).value;&lt;br /&gt;
            var sEnd = document.getElementById(&amp;quot;outSek&amp;quot;).value;&lt;br /&gt;
            time = hEnd + &amp;quot;:&amp;quot; + mEnd + &amp;quot;:&amp;quot; + sEnd;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Status (Running, Paused, Stopped) wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var statusTimerElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
        statusTimerElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        statusTimerElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
        statusTimerElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
        statusTimerElement.style.left = &amp;quot;75%&amp;quot;; &lt;br /&gt;
        statusTimerElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        statusTimerElement.classList.add(&#039;status_s&#039;);&lt;br /&gt;
        statusTimerElement.textContent = statusTimer[i].value;&lt;br /&gt;
        timerList.appendChild(statusTimerElement);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Pause Button mit dynamisch vergebener ID wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        if (statusTimer[i].value === &amp;quot;Running&amp;quot;) {&lt;br /&gt;
            var pauseButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
            pauseButton.id = i;&lt;br /&gt;
            pauseButton.classList.add(&#039;pauseButton&#039;);&lt;br /&gt;
            pauseButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            pauseButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
            pauseButton.style.left = &amp;quot;90%&amp;quot;; &lt;br /&gt;
            pauseButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
            pauseButton.style.minWidth = &amp;quot;3%&amp;quot;;&lt;br /&gt;
            pauseButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
            pauseButton.textContent = &amp;quot;Pause&amp;quot;&lt;br /&gt;
            pauseButton.addEventListener(&#039;click&#039;, function() {toggleButton(job, item, kundeItem, this.id)});&lt;br /&gt;
            timerList.appendChild(pauseButton);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &amp;quot;Paused&amp;quot;) {&lt;br /&gt;
            var pauseButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
            pauseButton.id = i;&lt;br /&gt;
            pauseButton.classList.add(&#039;pauseButton&#039;);&lt;br /&gt;
            pauseButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            pauseButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
            pauseButton.style.left = &amp;quot;90%&amp;quot;;&lt;br /&gt;
            pauseButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
            pauseButton.style.minWidth = &amp;quot;3%&amp;quot;;&lt;br /&gt;
            pauseButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
            pauseButton.textContent = &amp;quot;Start&amp;quot;&lt;br /&gt;
            pauseButton.addEventListener(&#039;click&#039;, function() {toggleButton(job, item, kundeItem, this.id)});&lt;br /&gt;
            timerList.appendChild(pauseButton);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Stop Button mit dynamisch vergebener ID wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var stopButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
        stopButton.id = i;&lt;br /&gt;
        stopButton.classList.add(&#039;stopButton&#039;);&lt;br /&gt;
        stopButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        stopButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
        stopButton.style.left = &amp;quot;94%&amp;quot;;&lt;br /&gt;
        stopButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
        stopButton.style.width = &amp;quot;3%&amp;quot;;&lt;br /&gt;
        stopButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
        stopButton.textContent = &amp;quot;Stop&amp;quot;&lt;br /&gt;
        stopButton.addEventListener(&#039;click&#039;, function() {stopTimer(job, item, kundeItem, index, this.id)});&lt;br /&gt;
        timerList.appendChild(stopButton);&lt;br /&gt;
        &lt;br /&gt;
        //----Für jeden aufgerufenen Timer wird----//&lt;br /&gt;
        //----eine neue Reihe ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        timerList.appendChild(neueReihe);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------Sekunden in Uhrzeit umrechnen-------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Rechnet übergebene Sekunden in Stunden,----//&lt;br /&gt;
//----Minuten und Sekunden und gibt diese----//&lt;br /&gt;
//----an aufrufende Funktion zurück----//&lt;br /&gt;
&lt;br /&gt;
function formatElapsedTime(seconds) {&lt;br /&gt;
&lt;br /&gt;
    var minutes = Math.floor(seconds / 60);&lt;br /&gt;
    seconds %= 60;&lt;br /&gt;
    var hours = Math.floor(minutes / 60);&lt;br /&gt;
    minutes %= 60;&lt;br /&gt;
    function addLeadingZero(n) {&lt;br /&gt;
        return (n &amp;lt; 10 ? &#039;0&#039; : &#039;&#039;) + n;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return addLeadingZero(hours) + &amp;quot;:&amp;quot; + addLeadingZero(minutes) + &amp;quot;:&amp;quot; + addLeadingZero(seconds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------Uhrzeit in Sekunden umrechnen----------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Rechnet übergebene Stunden, Minuten----//&lt;br /&gt;
//----und Sekunden in Sekunden um und----//&lt;br /&gt;
//----gibt diese an aufrufende Funktion zurück----//&lt;br /&gt;
&lt;br /&gt;
function timeInSeconds(zeit) {&lt;br /&gt;
&lt;br /&gt;
    var teile = zeit.split(&#039;:&#039;);&lt;br /&gt;
    var Stunden = parseInt(teile[0], 10);&lt;br /&gt;
    var Minuten = parseInt(teile[1], 10);&lt;br /&gt;
    var Sekunden = parseInt(teile[2], 10);&lt;br /&gt;
    return Stunden * 3600 + Minuten * 60 + Sekunden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------------Lightbox-------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Öffnet eine Lightbox und zeigt Kunde----//&lt;br /&gt;
//----Job, vergangene Zeit und evtl Pausenzeit an----//&lt;br /&gt;
//----und gibt Möglichkeit alle Zeiten anzupassen----//&lt;br /&gt;
&lt;br /&gt;
function openLightbox(job, item, kundeItem, index, id) {&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&#039;lightbox&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
&lt;br /&gt;
    var dateField = document.getElementById(&amp;quot;date&amp;quot;);&lt;br /&gt;
    dateField.value = datum[id].value;&lt;br /&gt;
    document.getElementById(&amp;quot;uhrzeit&amp;quot;).innerHTML = uhrzeit[id].value;&lt;br /&gt;
&lt;br /&gt;
    var commentTextarea = document.getElementById(&amp;quot;comment&amp;quot;);&lt;br /&gt;
    commentTextarea.value = selectedJob[id].value;&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;eingPersonZusatz&amp;quot;).innerHTML = selectedKunde[id].value;&lt;br /&gt;
&lt;br /&gt;
    if (selectedID.length !== undefined) {&lt;br /&gt;
        document.getElementById(&amp;quot;eingPerson&amp;quot;).innerHTML = selectedID;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        document.getElementById(&amp;quot;eingPerson&amp;quot;).innerHTML = selID[id].value;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //----Ausgabe der vergangenen Zeit in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outMin&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outSek&amp;quot;).value = 00;                      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //----Ausgabe der Pausenzeiten in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd2&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outMin2&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outSek2&amp;quot;).value = 00;                           &lt;br /&gt;
    getPauseTime(sys_uid[id].value, id);                                &lt;br /&gt;
                                                                        &lt;br /&gt;
    var secondsPause = pauseTime[id].value;                             &lt;br /&gt;
    secondsPause %= 60;  &lt;br /&gt;
&lt;br /&gt;
    var minutesPause = Math.floor(pauseTime[id].value / 60);            &lt;br /&gt;
    minutesPause %= 60;    &lt;br /&gt;
&lt;br /&gt;
    var hoursPause = Math.floor(minutesPause / 60);                     &lt;br /&gt;
    hoursPause %= 60;   &lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd2&amp;quot;).value = hoursPause;              &lt;br /&gt;
    document.getElementById(&amp;quot;outMin2&amp;quot;).value = minutesPause;       &lt;br /&gt;
&lt;br /&gt;
    if (secondsPause &amp;gt; 0) {&lt;br /&gt;
        document.getElementById(&amp;quot;outSek2&amp;quot;).value = secondsPause;        &lt;br /&gt;
    }                                                                   &lt;br /&gt;
    else {&lt;br /&gt;
        document.getElementById(&amp;quot;outSek2&amp;quot;).value = 0;                   &lt;br /&gt;
    }                                                                   &lt;br /&gt;
&lt;br /&gt;
    var dropdown2 = document.getElementById(&amp;quot;tätigkeit2Dropdown&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    job.forEach(function(item, index) {&lt;br /&gt;
        var option = document.createElement(&amp;quot;option&amp;quot;);&lt;br /&gt;
        option.textContent = item;&lt;br /&gt;
        dropdown2.add(option)&lt;br /&gt;
&lt;br /&gt;
        if (item === selectedJob[id].value) {&lt;br /&gt;
            option.selected = true;&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeLightboxOnEscape);&lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeLightboxOnF2);&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Lightbox schließen----//&lt;br /&gt;
&lt;br /&gt;
function closeLightbox() {&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&#039;lightbox&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn der Schließen-Button gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnSchliessen() {&lt;br /&gt;
&lt;br /&gt;
    statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
    closeLightbox();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn Escape gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnEscape() {&lt;br /&gt;
&lt;br /&gt;
    if (event.key === &#039;Escape&#039;) {&lt;br /&gt;
        statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
        closeLightbox();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn F2 gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnF2(event) {&lt;br /&gt;
&lt;br /&gt;
    if (event.key === &#039;F2&#039;) {&lt;br /&gt;
        saveBox();&lt;br /&gt;
        closeLightbox();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Alle Daten in Lightbox werden gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveBox() {&lt;br /&gt;
&lt;br /&gt;
    var vergZeit = &#039;&amp;quot;&#039; + time + &#039;&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
    var teile = time.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
    var stunden = parseInt(teile[0]);&lt;br /&gt;
    var minuten = parseInt(teile[1]);&lt;br /&gt;
    var sekunden = parseInt(teile[2]);&lt;br /&gt;
    time = stunden * 3600 + minuten * 60 + sekunden;&lt;br /&gt;
&lt;br /&gt;
    elapsedTime = time;&lt;br /&gt;
&lt;br /&gt;
    var Job = selectedJob[idStop].value;&lt;br /&gt;
    var Kunde = selectedKunde[idStop].value;&lt;br /&gt;
&lt;br /&gt;
    var hPEnd = document.getElementById(&amp;quot;outStd2&amp;quot;).value;&lt;br /&gt;
    var mPEnd = document.getElementById(&amp;quot;outMin2&amp;quot;).value;&lt;br /&gt;
    var sPEnd = document.getElementById(&amp;quot;outSek2&amp;quot;).value;&lt;br /&gt;
    var pTime = hPEnd + &amp;quot;:&amp;quot; + mPEnd + &amp;quot;:&amp;quot; + sPEnd;&lt;br /&gt;
    pTime = timeInSeconds(pTime);&lt;br /&gt;
&lt;br /&gt;
    var uid = sys_uid[idStop].value;&lt;br /&gt;
    var month = startTimeValue.getMonth();&lt;br /&gt;
    var day = startTimeValue.getDate();&lt;br /&gt;
    month += 1;&lt;br /&gt;
    stopTimeValue = &#039;&amp;quot;&#039; + startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + (day &amp;lt; 10 ? &amp;quot;0&amp;quot; + day : day) + &#039;&amp;quot;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var status = 21;&lt;br /&gt;
&lt;br /&gt;
    timers.splice(idStop, 1);&lt;br /&gt;
    pauseTimers.splice(idStop, 1);&lt;br /&gt;
    pauseTime.splice(idStop, 1);&lt;br /&gt;
    selectedKunde.splice(idStop, 1);&lt;br /&gt;
    selectedJob.splice(idStop, 1);&lt;br /&gt;
    statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
    sys_uid.splice(idStop, 1);&lt;br /&gt;
&lt;br /&gt;
    if (zaehler &amp;gt; 0) {&lt;br /&gt;
        zaehler -= 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    closeLightbox();&lt;br /&gt;
&lt;br /&gt;
    if (timers.length === 0) {&lt;br /&gt;
        clearInterval(timerInterval);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    saveStopTime(stopTimeValue, elapsedTime, pTime, status, uid, vergZeit);&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion saveBox wird aufgerufen,----//&lt;br /&gt;
//----wenn der Save-Button gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function() {&lt;br /&gt;
        const saveButton = document.getElementById(&#039;saveButton&#039;);&lt;br /&gt;
        saveButton.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
            saveBox();&lt;br /&gt;
        })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= PHP-Script saveTime.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $user               = 0;&lt;br /&gt;
    $uhrzeit            = 0;&lt;br /&gt;
    $datum              = 0;&lt;br /&gt;
    $endTime            = 0;&lt;br /&gt;
    $endDate            = 0;&lt;br /&gt;
    $status             = 0;&lt;br /&gt;
    $psnr               = 0;&lt;br /&gt;
    $comm               = 0;&lt;br /&gt;
    $jobID              = 0;&lt;br /&gt;
    $pauseTime          = 0;&lt;br /&gt;
    $sysuid             = 0;&lt;br /&gt;
    $stopTimeValue      = 0;&lt;br /&gt;
    $elapsedTime        = 0;&lt;br /&gt;
    $elapsedPauseTime   = 0;&lt;br /&gt;
    $status             = 0;&lt;br /&gt;
    $uid                = 0;&lt;br /&gt;
    $vergZeit           = 0;&lt;br /&gt;
&lt;br /&gt;
    if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) &lt;br /&gt;
    {&lt;br /&gt;
        $api_key            = $_POST[&#039;api_key&#039;];&lt;br /&gt;
        $url                = $_POST[&#039;url&#039;];&lt;br /&gt;
        $method             = $_POST[&#039;method&#039;];&lt;br /&gt;
        $choice             = $_POST[&#039;choice&#039;];&lt;br /&gt;
&lt;br /&gt;
        if (isset($_POST[&#039;user&#039;])) {&lt;br /&gt;
            $user               = $_POST[&#039;user&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;uhrzeit&#039;])) {&lt;br /&gt;
            $uhrzeit            = $_POST[&#039;uhrzeit&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;datum&#039;])) {&lt;br /&gt;
            $datum              = $_POST[&#039;datum&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;endTime&#039;])) {&lt;br /&gt;
            $endTime            = $_POST[&#039;endTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;endDate&#039;])) {&lt;br /&gt;
            $endDate            = $_POST[&#039;endDate&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;status&#039;])) {&lt;br /&gt;
            $status             = $_POST[&#039;status&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;psnr&#039;])) {&lt;br /&gt;
            $psnr               = $_POST[&#039;psnr&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;Job&#039;])) {&lt;br /&gt;
            $comm               = $_POST[&#039;Job&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;jobID&#039;])) {&lt;br /&gt;
            $jobID              = $_POST[&#039;jobID&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;pauseTime&#039;])) {&lt;br /&gt;
            $pauseTime          = $_POST[&#039;pauseTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;sysuid&#039;])) {&lt;br /&gt;
            $sysuid             = $_POST[&#039;sysuid&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;stopTimeValue&#039;])) {&lt;br /&gt;
            $stopTimeValue      = $_POST[&#039;stopTimeValue&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;elapsedTime&#039;])) {&lt;br /&gt;
            $elapsedTime        = $_POST[&#039;elapsedTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;elapsedPauseTime&#039;])) {&lt;br /&gt;
            $elapsedPauseTime   = $_POST[&#039;elapsedPauseTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;status&#039;])) {&lt;br /&gt;
            $status             = $_POST[&#039;status&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;uid&#039;])) {&lt;br /&gt;
            $uid                = $_POST[&#039;uid&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;vergZeit&#039;])) {&lt;br /&gt;
            $vergZeit           = $_POST[&#039;vergZeit&#039;];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $params = array(    &#039;user&#039;              =&amp;gt; $user, &lt;br /&gt;
                            &#039;uhrzeit&#039;           =&amp;gt; $uhrzeit, &lt;br /&gt;
                            &#039;datum&#039;             =&amp;gt; $datum, &lt;br /&gt;
                            &#039;endTime&#039;           =&amp;gt; $endTime, &lt;br /&gt;
                            &#039;endDate&#039;           =&amp;gt; $endDate, &lt;br /&gt;
                            &#039;status&#039;            =&amp;gt; $status, &lt;br /&gt;
                            &#039;psnr&#039;              =&amp;gt; $psnr,&lt;br /&gt;
                            &#039;comm&#039;              =&amp;gt; $comm,&lt;br /&gt;
                            &#039;jobID&#039;             =&amp;gt; $jobID,&lt;br /&gt;
                            &#039;pauseTime&#039;         =&amp;gt; $pauseTime,&lt;br /&gt;
                            &#039;sysuid&#039;            =&amp;gt; $sysuid,&lt;br /&gt;
                            &#039;stopTimeValue&#039;     =&amp;gt; $stopTimeValue,&lt;br /&gt;
                            &#039;elapsedTime&#039;       =&amp;gt; $elapsedTime,&lt;br /&gt;
                            &#039;elapsedPauseTime&#039;  =&amp;gt; $elapsedPauseTime,&lt;br /&gt;
                            &#039;status&#039;            =&amp;gt; $status,&lt;br /&gt;
                            &#039;uid&#039;               =&amp;gt; $uid,&lt;br /&gt;
                            &#039;vergZeit&#039;          =&amp;gt; $vergZeit,&lt;br /&gt;
                            &#039;choice&#039;            =&amp;gt; $choice);&lt;br /&gt;
&lt;br /&gt;
        $curl = curl_init($url);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(&#039;apikey: &#039;.$api_key));&lt;br /&gt;
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));&lt;br /&gt;
        $response = curl_exec($curl);&lt;br /&gt;
&lt;br /&gt;
        if ($response === false) {&lt;br /&gt;
            if($error) {&lt;br /&gt;
                echo &amp;quot;curl_Fehler: &amp;quot;.$error;&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        else {&lt;br /&gt;
            echo $response;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= PHP-Script getData.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $sysuid             = 0;&lt;br /&gt;
    $id                 = 0;&lt;br /&gt;
    $selectedKunde      = 0;&lt;br /&gt;
            &lt;br /&gt;
    if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) &lt;br /&gt;
    {&lt;br /&gt;
        $api_key        = $_POST[&#039;api_key&#039;];&lt;br /&gt;
        $url            = $_POST[&#039;url&#039;];&lt;br /&gt;
        $method         = $_POST[&#039;method&#039;];&lt;br /&gt;
        $choice         = $_POST[&#039;choice&#039;];&lt;br /&gt;
        &lt;br /&gt;
        if (isset($_POST[&#039;id&#039;])) {&lt;br /&gt;
            $id = $_POST[&#039;id&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;sysuid&#039;])) {&lt;br /&gt;
            $sysuid = $_POST[&#039;sysuid&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;selectedKunde&#039;])) {&lt;br /&gt;
            $selectedKunde  = $_POST[&#039;selectedKunde&#039;];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $params = array(    &#039;sysuid&#039;            =&amp;gt; $sysuid,&lt;br /&gt;
                            &#039;id&#039;                =&amp;gt; $id, &lt;br /&gt;
                            &#039;selectedKunde&#039;     =&amp;gt; $selectedKunde,&lt;br /&gt;
                            &#039;choice&#039;            =&amp;gt; $choice);&lt;br /&gt;
        &lt;br /&gt;
        $curl = curl_init($url);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(&#039;apikey: &#039;.$api_key));&lt;br /&gt;
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));&lt;br /&gt;
        $response = curl_exec($curl);&lt;br /&gt;
&lt;br /&gt;
        if ($response === false) {&lt;br /&gt;
            if($error) {&lt;br /&gt;
                echo &amp;quot;curl_Fehler: &amp;quot;.$error;&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        else {&lt;br /&gt;
            echo $response;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CSS-Datei timestyle.css =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-----------------------------------------Allgemein-----------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
body &lt;br /&gt;
{&lt;br /&gt;
    font-family: &#039;Arial&#039;, sans-serif;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: right;&lt;br /&gt;
    align-items: flex-start;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background-image: url(&#039;web_background_3.png&#039;);&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-size: cover; &lt;br /&gt;
    background-attachment: fixed;&lt;br /&gt;
}&lt;br /&gt;
ul &lt;br /&gt;
{&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
}&lt;br /&gt;
li &lt;br /&gt;
{&lt;br /&gt;
    padding: 0.5em;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    display: flex; &lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------Suche-------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
#search&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 8%;&lt;br /&gt;
    left: 42%;&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    height: 2.8%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.04em solid #e4e4e4;&lt;br /&gt;
    border-radius: 0.1em;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 2em;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-----------------------------------------Timerausgabe--------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.kundenliste&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    height: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 43.5%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    border-top-left-radius: 0.2em;&lt;br /&gt;
    border-top-right-radius: 0.2em;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
}&lt;br /&gt;
.tabelleUeberschriften&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    min-height: 3%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 60%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    /* border-top: 0.14em solid #ccc;&lt;br /&gt;
    border-bottom: 0.14em solid #ccc; */&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    box-shadow: 0 0px 3px rgba(0, 0, 0, 0.5);&lt;br /&gt;
    font-size: 0.9vw;&lt;br /&gt;
}&lt;br /&gt;
#timerList&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    height: 25%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 73.5%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    border-bottom-left-radius: 0.2em;&lt;br /&gt;
    border-bottom-right-radius: 0.2em;&lt;br /&gt;
    /* border: 0.14em solid red; */&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
} &lt;br /&gt;
.kunde&lt;br /&gt;
{&lt;br /&gt;
    width: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 0%;&lt;br /&gt;
}&lt;br /&gt;
.konto&lt;br /&gt;
{&lt;br /&gt;
    width: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 30%;&lt;br /&gt;
}&lt;br /&gt;
.laufzeit&lt;br /&gt;
{&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 60%;&lt;br /&gt;
}&lt;br /&gt;
.status&lt;br /&gt;
{&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 75%;&lt;br /&gt;
}&lt;br /&gt;
.buttons&lt;br /&gt;
{&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------Lightbox----------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.lightbox&lt;br /&gt;
{&lt;br /&gt;
    display: none;&lt;br /&gt;
    width: 52%;&lt;br /&gt;
    height: 62%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 61.5%;&lt;br /&gt;
    left: 67%;&lt;br /&gt;
    border-radius: 0.15em;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    box-shadow: 0 10px 2000px rgba(0, 0, 0, 0.5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------Lightbox-Inhalt-----------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.commLabel&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 5%;&lt;br /&gt;
    left: 5%;   &lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.comment&lt;br /&gt;
{&lt;br /&gt;
    width: 90%;&lt;br /&gt;
    height: 38%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 10%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.9vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.bezZeitkonto&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 55%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.dropButtonsLightbox&lt;br /&gt;
{&lt;br /&gt;
    width: 37%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 15%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.bezDatum&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 55%;&lt;br /&gt;
    left: 58%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.date&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 68%;&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    height: 4%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.uhrzeit&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 85.5%;&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    height: 3.9%;&lt;br /&gt;
    padding: 0.1em;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    resize: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.bezPerson&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.eingPerson&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 15%;&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.eingPersonZusatz&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 26%;&lt;br /&gt;
    width: 25.7%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.Std&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 66%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Min&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 78%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Sek&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 91%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outStd&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 64%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outMin&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 76.5%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outSek&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 89%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.Pausenzeiten&lt;br /&gt;
{&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 79%;&lt;br /&gt;
    left: 71%;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.Std2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 66%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Min2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 78%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Sek2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 91%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outStd2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 64%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outMin2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 76.5%;&lt;br /&gt;
    border: 0.1em  solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outSek2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 89%;&lt;br /&gt;
    border: 0.1em  solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.saveButton&lt;br /&gt;
{&lt;br /&gt;
    min-width: 8%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.closeButton&lt;br /&gt;
{&lt;br /&gt;
    min-width: 8%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 14%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*--------------------------------Tätigkeitenliste (zweite Liste)----------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
#zweiteListe &lt;br /&gt;
{&lt;br /&gt;
    display: none;&lt;br /&gt;
    width: 25%;&lt;br /&gt;
    max-height: 50%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 47%;&lt;br /&gt;
    left: 44%;&lt;br /&gt;
    padding: 1%;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    background-color: #FAFAFA;&lt;br /&gt;
    box-shadow: 0 10px 2000px rgba(0, 0, 0, 0.5);&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
	<entry>
		<id>https://wiki.bergau.de/index.php?title=OBS/Kostenpflichtige_Module/RESTServer/Beispiel2&amp;diff=62604</id>
		<title>OBS/Kostenpflichtige Module/RESTServer/Beispiel2</title>
		<link rel="alternate" type="text/html" href="https://wiki.bergau.de/index.php?title=OBS/Kostenpflichtige_Module/RESTServer/Beispiel2&amp;diff=62604"/>
		<updated>2023-10-18T06:44:52Z</updated>

		<summary type="html">&lt;p&gt;Prakti: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Kostenpflichtige Module}}&lt;br /&gt;
&lt;br /&gt;
Dieses Script dient zur Zeiterfassung über den REST-Server. Bei Seitenaufruf wird eine Liste von Kunden geladen und in einer Liste angezeigt. &lt;br /&gt;
&lt;br /&gt;
Durch Rechtsklick auf einen Eintrag wird eine Liste an zugehörigen Tätigkeiten geladen, die nach Klick einen Timer starten.&lt;br /&gt;
&lt;br /&gt;
Per Javascript werden Startzeit, Startdatum und andere Informationen wie Kunde und Personalnummer über die PHP-Scripte und das Endpunkt-Script in einer Datenbank gespeichert.&lt;br /&gt;
&lt;br /&gt;
Der Status wird hierbei auf &amp;quot;1&amp;quot; gesetzt. Pausenzeiten werden nach Beenden einer Pause in der Datenbank gespeichert.&lt;br /&gt;
&lt;br /&gt;
Durch Drücken des Stop-Buttons wird eine Lightbox mit einer Zusammenfassung aller zum Timer gehörenden Daten angezeigt. Hier hat man die Möglichkeit Tätigkeiten, abgelaufene Zeit und &lt;br /&gt;
&lt;br /&gt;
Pausenzeit nachträglich zu bearbeiten. Durch Klick auf &amp;quot;Speichern&amp;quot; oder Druck auf F2 werden Endzeit und Enddatum gespeichert und der Status auf &amp;quot;21&amp;quot; gesetzt.&lt;br /&gt;
&lt;br /&gt;
Nach Reload der Webseite wird anhand des Status in der Datenbank nach laufenden Timern gesucht und diese gegebenenfalls gestartet.&lt;br /&gt;
&lt;br /&gt;
= Endpunkt-Script =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure _AddJob(oArr: TJSONArray; id: String);&lt;br /&gt;
var oWert       : TJSONObject;&lt;br /&gt;
    cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT CONCAT(za_text, &amp;quot;:&amp;quot;,sys_uid) AS Job FROM zeiterfart &#039; +&lt;br /&gt;
                &#039;WHERE za_psnr = &#039; + DB_SQLVal(id) + &#039; AND za_inaktiv &amp;lt;&amp;gt; &amp;quot;1&amp;quot; &#039; +&lt;br /&gt;
                &#039;ORDER BY za_order&#039;;&lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;Job&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddCustomer(oArr: TJSONArray);&lt;br /&gt;
var oWert       : TJSONObject;&lt;br /&gt;
    cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=&#039;  SELECT * FROM&#039; + &lt;br /&gt;
              &#039;  (SELECT&#039; +&lt;br /&gt;
              &#039;  ps_nr,&#039; +&lt;br /&gt;
              &#039;  ps_such AS Kunde,&#039; +&lt;br /&gt;
              &#039;  perssta.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PE&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN perssta ON se_ref1 AND perssta.sys_uid = se_ref2&#039; +&lt;br /&gt;
              &#039;  WHERE se_nr = 0087&#039; + &lt;br /&gt;
              &#039;  AND ps_nr &amp;lt;&amp;gt; 100000&#039; +&lt;br /&gt;
              &#039;  UNION SELECT p_nr AS ps_nr,&#039; +&lt;br /&gt;
              &#039;  p_name1 AS ps_such,&#039; +&lt;br /&gt;
              &#039;  projekte.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PR&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN projekte ON se_ref1 = p_nr&#039; +&lt;br /&gt;
              &#039;  AND projekte.sys_uid = se_ref2 WHERE se_nr = 0087)&#039; +&lt;br /&gt;
              &#039;  A WHERE ps_nr IS NOT NULL&#039; +&lt;br /&gt;
              &#039;  ORDER BY Kunde &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;Kunde&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddID(kunde: String; oArr: TJSONArray);&lt;br /&gt;
var oWert       : TJSONObject;&lt;br /&gt;
    cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=&#039;  SELECT * FROM&#039; + &lt;br /&gt;
              &#039;  (SELECT&#039; +&lt;br /&gt;
              &#039;  ps_nr,&#039; +&lt;br /&gt;
              &#039;  ps_such AS Kunde,&#039; +&lt;br /&gt;
              &#039;  perssta.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PE&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN perssta ON se_ref1 AND perssta.sys_uid = se_ref2&#039; +&lt;br /&gt;
              &#039;  WHERE se_nr = 0087&#039; + &lt;br /&gt;
              &#039;  AND ps_nr &amp;lt;&amp;gt; 100000&#039; +&lt;br /&gt;
              &#039;  UNION SELECT p_nr AS ps_nr,&#039; +&lt;br /&gt;
              &#039;  p_name1 AS ps_such,&#039; +&lt;br /&gt;
              &#039;  projekte.sys_uid AS ps_sys_uid,&#039; +&lt;br /&gt;
              &#039;  &amp;quot;PR&amp;quot; AS TYP&#039; +&lt;br /&gt;
              &#039;  FROM eigenschaften&#039; +&lt;br /&gt;
              &#039;  LEFT JOIN projekte ON se_ref1 = p_nr&#039; +&lt;br /&gt;
              &#039;  AND projekte.sys_uid = se_ref2 WHERE se_nr = 0087)&#039; +&lt;br /&gt;
              &#039;  A WHERE ps_nr IS NOT NULL&#039; +&lt;br /&gt;
              &#039;  AND Kunde = &#039; + DB_SQLVal(kunde) +&lt;br /&gt;
              &#039;  ORDER BY Kunde &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ps_nr&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _AddCHECK(oArr: TJSONArray);&lt;br /&gt;
var oWert       : TJSONObject;&lt;br /&gt;
    cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT ze_starttime, zeiterfuser.sys_uid AS sysuid, zk_psnr, &#039; +&lt;br /&gt;
                &#039;za_text, ps_such, ze_startdate FROM &#039; +&lt;br /&gt;
                &#039;zeiterfuser LEFT JOIN zeiterfkomm ON &#039; +&lt;br /&gt;
                &#039;zk_messunguid = zeiterfuser.SYS_UID LEFT JOIN zeiterfart &#039; +&lt;br /&gt;
                &#039;ON zeiterfart.sys_uid = zeiterfuser.ze_uid AND &#039; +&lt;br /&gt;
                &#039;za_psnr = zeiterfkomm.zk_psnr LEFT JOIN perssta ON &#039; +&lt;br /&gt;
                &#039;ps_nr = zeiterfkomm.zk_psnr WHERE ze_status = 01 &#039;;&lt;br /&gt;
              &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_starttime&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;zk_psnr&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;za_text&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ps_such&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;sysuid&#039;));&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_startdate&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure _getPauseTime(sysuid: String; oArr: TJSONArray);&lt;br /&gt;
var oWert       : TJSONObject;&lt;br /&gt;
    cSql        : String;&lt;br /&gt;
    A_Query     : TxFQuery;&lt;br /&gt;
begin&lt;br /&gt;
    cSql    :=  &#039;SELECT * FROM zeiterfuser WHERE sys_uid = &#039; + DB_SQLVal(sysuid);&lt;br /&gt;
    &lt;br /&gt;
    if (DB_xSOpen(&#039;Y009LHNBTY&#039;, oDB, cSql, A_Query, False)) then begin&lt;br /&gt;
        while (not A_Query.EoF) do begin&lt;br /&gt;
            oArr.Add(A_Query.A2C(&#039;ze_pausezeit&#039;));&lt;br /&gt;
            A_Query.Next();&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
    DB_Close(A_Query);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
//----------------Funktionen----------------------------------//&lt;br /&gt;
&lt;br /&gt;
function POST(oParams: TStrings): string;&lt;br /&gt;
var &lt;br /&gt;
oArr1                                   : TJSONArray;&lt;br /&gt;
cSql                                    : String;&lt;br /&gt;
startTime                               : TDateTime;&lt;br /&gt;
elapsedTime                             : Integer;&lt;br /&gt;
millisec, seconds, minutes, hours       : Word;&lt;br /&gt;
year, month, day                        : Word;&lt;br /&gt;
uhrzeit, datum                          : String;&lt;br /&gt;
begin&lt;br /&gt;
    if (oParams.values[&#039;choice&#039;]=&#039;job&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddJob(oArr1, oParams.values[&#039;id&#039;]);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;customer&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddCustomer(oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;id&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddID(oParams.values[&#039;selectedKunde&#039;], oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;check&#039;) then begin&lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _AddCHECK(oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;pauseTime&#039;) then begin    &lt;br /&gt;
        oArr1 := TJSONArray.Create();&lt;br /&gt;
        _GetPauseTime(oParams.values[&#039;sysuid&#039;], oArr1);&lt;br /&gt;
        result := oArr1.ToJSON();&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function PUT(oParams: TStrings): string;&lt;br /&gt;
var &lt;br /&gt;
xZeit           : TqSQL;&lt;br /&gt;
cUSER_SYSUID    : String;&lt;br /&gt;
cKOMM_SYSUID    : String;&lt;br /&gt;
lNew            : Boolean;&lt;br /&gt;
cSql            : String;&lt;br /&gt;
dDBNow          : TDateTime;&lt;br /&gt;
begin  &lt;br /&gt;
    writeln(&#039;Choice: &#039; + oParams.values[&#039;choice&#039;]);&lt;br /&gt;
    if (oParams.values[&#039;choice&#039;]=&#039;start&#039;) then&lt;br /&gt;
    begin&lt;br /&gt;
        dDBNow  := DB_Now(oDB); &lt;br /&gt;
        lNew    := True;&lt;br /&gt;
        if (empty(cUSER_SYSUID)) then begin&lt;br /&gt;
            cUSER_SYSUID := GetNewId(oDB);&lt;br /&gt;
        end;&lt;br /&gt;
    &lt;br /&gt;
        xZeit           := qSqlInit(oDB, &#039;zeiterfuser&#039;);&lt;br /&gt;
        xZeit.lNoSysUID := True;&lt;br /&gt;
    &lt;br /&gt;
        writeln(&#039;SYSUID: &#039; + oParams.values[&#039;jobID&#039;]);&lt;br /&gt;
    &lt;br /&gt;
        xZeit.qSet(&#039;ze_user&#039;            , oParams.values[&#039;user&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_starttime&#039;       , oParams.values[&#039;uhrzeit&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_eigen&#039;           , &#039;0101&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_startdate&#039;       , oParams.values[&#039;datum&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_endtime&#039;         , oParams.values[&#039;endTime&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_enddate&#039;         , oParams.values[&#039;endDate&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_zeit&#039;            , &#039;0&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_pausezeit&#039;       , &#039;0&#039;);&lt;br /&gt;
        xZeit.qSet(&#039;ze_status&#039;          , oParams.values[&#039;status&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;ze_berechnen&#039;       , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_officestar&#039;      , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_repa&#039;            , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_vorbereitung&#039;    , 0);&lt;br /&gt;
        xZeit.qSet(&#039;ze_uid&#039;             , oParams.values[&#039;jobID&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;sys_uid&#039;            , cUSER_SYSUID);&lt;br /&gt;
    &lt;br /&gt;
        xZeit.SaveData(lNew);&lt;br /&gt;
        qSQLFree(xZeit);&lt;br /&gt;
        &lt;br /&gt;
        //---------------------------------------------------------------------&lt;br /&gt;
        &lt;br /&gt;
        xZeit := qSqlInit(oDB,&#039;ZEITERFKOMM&#039;);&lt;br /&gt;
        xZeit.lNoSysUID := True;&lt;br /&gt;
        &lt;br /&gt;
        if (empty(cKOMM_SYSUID)) then begin&lt;br /&gt;
            cKOMM_SYSUID := GetNewId(oDB);&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        xZeit.qSet(&#039;zk_psnr&#039;       , oParams.values[&#039;psnr&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_starttime&#039;  , oParams.values[&#039;uhrzeit&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_startdate&#039;  , oParams.values[&#039;datum&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_kommentar&#039;  , oParams.values[&#039;comm&#039;]);&lt;br /&gt;
        xZeit.qSet(&#039;zk_messunguid&#039; , cUSER_SYSUID);&lt;br /&gt;
        xZeit.qSet(&#039;sys_uid&#039;       , cKOMM_SYSUID);&lt;br /&gt;
&lt;br /&gt;
        xZeit.SaveData(lNew);&lt;br /&gt;
        qSQLFree(xZeit);&lt;br /&gt;
        &lt;br /&gt;
        result  := cUser_SYSUID;&lt;br /&gt;
        &lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;stop&#039;) then&lt;br /&gt;
    begin&lt;br /&gt;
        &lt;br /&gt;
        cSql := &#039;UPDATE zeiterfuser SET ze_zeit = &#039; + oParams.values[&#039;elapsedTime&#039;] +&lt;br /&gt;
                &#039;, ze_endtime = &#039;                   + oParams.values[&#039;vergZeit&#039;] +&lt;br /&gt;
                &#039;, ze_enddate = &#039;                   + oParams.values[&#039;stopTimeValue&#039;] +&lt;br /&gt;
                &#039;, ze_pausezeit = &#039;                 + oParams.values[&#039;elapsedPauseTime&#039;] +&lt;br /&gt;
                &#039;, ze_status = &#039;                    + oParams.values[&#039;status&#039;] +&lt;br /&gt;
                &#039; WHERE sys_uid = &#039;                 + DB_SQLVal(oParams.values[&#039;uid&#039;]);&lt;br /&gt;
&lt;br /&gt;
        if DB_SQLExec(oDB,cSql) then&lt;br /&gt;
        begin&lt;br /&gt;
            result := &#039;Die Daten wurden erfolgreich gespeichert!&#039;;&lt;br /&gt;
        end else begin&lt;br /&gt;
            result := &#039;Fehler!&#039;;&lt;br /&gt;
        end;&lt;br /&gt;
    end else if (oParams.values[&#039;choice&#039;]=&#039;pause&#039;) then&lt;br /&gt;
    begin     &lt;br /&gt;
        writeln(&#039;Pausezeit: &#039; + oParams.values[&#039;pauseTime&#039;]);&lt;br /&gt;
        cSql := &#039;UPDATE zeiterfuser SET ze_pausezeit &#039; + &lt;br /&gt;
                &#039;= ze_pausezeit + &#039;    + oParams.values[&#039;pauseTime&#039;] +&lt;br /&gt;
                &#039; WHERE sys_uid = &#039;    + DB_SQLVal(oParams.values[&#039;sysuid&#039;]);&lt;br /&gt;
&lt;br /&gt;
        if DB_SQLExec(oDB,cSql) then&lt;br /&gt;
        begin&lt;br /&gt;
            result := &#039;Die Daten wurden erfolgreich gespeichert!&#039;;&lt;br /&gt;
        end else begin&lt;br /&gt;
            result := &#039;Fehler!&#039;;&lt;br /&gt;
        end;&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= HTML-Datei index.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de-DE&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;Ihr IT-Partner in Stade - Ernst Bergau GmbH&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;timestyle.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/head&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        &amp;lt;?php&lt;br /&gt;
            include(&#039;timer.js&#039;);&lt;br /&gt;
        ?&amp;gt;&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //--------------------------------------------------------------------------------------------------------------// --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //---------------------------------------------------HTML-------------------------------------------------------// --&amp;gt;&lt;br /&gt;
        &amp;lt;!-- //--------------------------------------------------------------------------------------------------------------// --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;textarea id=&amp;quot;search&amp;quot; type=&amp;quot;text&amp;quot; rows=&amp;quot;1&amp;quot; cols=&amp;quot;50&amp;quot; oninput=&amp;quot;searchCustomers(this.value)&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;kundenliste&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ul id=&amp;quot;kundenListe&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;table class=&amp;quot;timer&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;tbody id=&amp;quot;timerList&amp;quot;&amp;gt;&amp;lt;/tbody&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
        &amp;lt;table class=&amp;quot;tabelleUeberschriften&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;thead&amp;gt;&lt;br /&gt;
                &amp;lt;tr&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;kunde&amp;quot;&amp;gt;Kunde&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;konto&amp;quot;&amp;gt;Konto&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;laufzeit&amp;quot;&amp;gt;Laufzeit&amp;lt;/th&amp;gt;&lt;br /&gt;
                    &amp;lt;th class=&amp;quot;status&amp;quot;&amp;gt;Status&amp;lt;/th&amp;gt;&lt;br /&gt;
                &amp;lt;/tr&amp;gt;&lt;br /&gt;
            &amp;lt;/thead&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;lightbox&amp;quot; id=&amp;quot;lightbox&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label class=&amp;quot;commLabel&amp;quot; id=&amp;quot;commLabel&amp;quot; for=&amp;quot;comment&amp;quot;&amp;gt;Kommentar&amp;lt;/label&amp;gt;&lt;br /&gt;
            &amp;lt;textarea class=&amp;quot;comment&amp;quot; id=&amp;quot;comment&amp;quot; rows=&amp;quot;4&amp;quot; cols=&amp;quot;50&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezZeitkonto&amp;quot;&amp;gt;Zeitkonto&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;select class=&amp;quot;dropButtonsLightbox&amp;quot; id=&amp;quot;tätigkeit2Dropdown&amp;quot;&amp;gt;&amp;lt;/select&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezDatum&amp;quot;&amp;gt;Startdatum&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;date&amp;quot; class=&amp;quot;date&amp;quot; id=&amp;quot;date&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;uhrzeit&amp;quot; id=&amp;quot;uhrzeit&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;bezPerson&amp;quot;&amp;gt;Person&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;eingPerson&amp;quot; id=&amp;quot;eingPerson&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;textarea disabled class=&amp;quot;eingPersonZusatz&amp;quot; id=&amp;quot;eingPersonZusatz&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Std&amp;quot;&amp;gt;Std&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outStd&amp;quot; id=&amp;quot;outStd&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Min&amp;quot;&amp;gt;Min&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outMin&amp;quot; id=&amp;quot;outMin&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Sek&amp;quot;&amp;gt;Sek&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outSek&amp;quot; id=&amp;quot;outSek&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Pausenzeiten&amp;quot;&amp;gt;Davon Pausenzeiten&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Std2&amp;quot;&amp;gt;Std&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outStd2&amp;quot; id=&amp;quot;outStd2&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Min2&amp;quot;&amp;gt;Min&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outMin2&amp;quot; id=&amp;quot;outMin2&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;Sek2&amp;quot;&amp;gt;Sek&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;outSek2&amp;quot; id=&amp;quot;outSek2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;button class=&amp;quot;saveButton&amp;quot; id=&amp;quot;saveButton&amp;quot;&amp;gt;Speichern&amp;lt;/button&amp;gt;&lt;br /&gt;
            &amp;lt;button class=&amp;quot;closeButton&amp;quot; id=&amp;quot;closeButton&amp;quot; onclick=&amp;quot;closeLightboxOnSchliessen()&amp;quot;&amp;gt;Schließen&amp;lt;/button&amp;gt; &lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div id=&amp;quot;zweiteListe&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ul id=&amp;quot;taetigkeitListe&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Javascript-Datei timer.js =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var api_key             = &#039;Y00C75PODJ&#039;;&lt;br /&gt;
var url                 = &#039;http://127.0.0.1:8099/Zeiterfa/zeiterfa/v1&#039;;&lt;br /&gt;
var zaehler             = -1;&lt;br /&gt;
var timerInterval;      &lt;br /&gt;
var pauseTimerInterval; &lt;br /&gt;
var startTimeValue;     &lt;br /&gt;
var selectedID          = 0;&lt;br /&gt;
var elapsedTime;        &lt;br /&gt;
var uid;                &lt;br /&gt;
var idStop; &lt;br /&gt;
var time;&lt;br /&gt;
var selID               = [];&lt;br /&gt;
var job                 = [];&lt;br /&gt;
var sys_uid             = [];&lt;br /&gt;
var timers              = [];    &lt;br /&gt;
var pauseTimers         = [];  &lt;br /&gt;
var pauseTime           = [];&lt;br /&gt;
var startdate           = [];&lt;br /&gt;
var uhrzeit             = [];&lt;br /&gt;
var datum               = [];&lt;br /&gt;
var statusTimer         = [];       &lt;br /&gt;
var selectedJob         = [];&lt;br /&gt;
var selectedKunde       = [];      &lt;br /&gt;
var tempSelectedKunde   = [];&lt;br /&gt;
var parameter           = [];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------------Seitenaufruf---------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Bei Seitenaufruf werden die Funktionen----//&lt;br /&gt;
//----getCustomer und checkTimer aufgerufen und----//&lt;br /&gt;
//----die Kundenliste gefüllt und geprüft,----//&lt;br /&gt;
//----ob laufende timer vorhanden sind----//&lt;br /&gt;
&lt;br /&gt;
window.onload = function() {&lt;br /&gt;
&lt;br /&gt;
    getCustomer();&lt;br /&gt;
    checkTimer();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-------------------------------------------------Daten auslesen--------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Eine Liste der Kunden wird ausgelesenund gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getCustomer() {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;customer&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            populateListeKunde(responseData);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Bei Rechtsklick auf Kunden wird----//&lt;br /&gt;
//----seine ID ausgelesen und gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getCustomerID(selectedKunde, callback) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;id&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;selectedKunde=&amp;quot;       + encodeURIComponent(selectedKunde);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            selectedID = JSON.parse(request.responseText);&lt;br /&gt;
            callback(selectedID);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Anhand der Kunden-ID wird eine Liste von Tätigkeiten----//&lt;br /&gt;
//----für jeden Kunden ausgelesen und gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function getJob(id, callback) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;job&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;id=&amp;quot;                  + encodeURIComponent(id);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            var Data         = responseData.toString();&lt;br /&gt;
            var teile        = Data.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
            var jobid = [];&lt;br /&gt;
&lt;br /&gt;
            for (i=0; i&amp;lt;teile.length; i++) {&lt;br /&gt;
                job[i]   = teile[i].split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
                jobid[i] = teile[i].split(&amp;quot;:&amp;quot;)[1];&lt;br /&gt;
            }&lt;br /&gt;
            callback(job, jobid);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Tätigkeitsliste wird nochmal zur Weiterverarbeitung gelesen----//&lt;br /&gt;
&lt;br /&gt;
function getJobs(id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;job&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;id=&amp;quot;                  + encodeURIComponent(id);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;, false);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            var data = responseData.toString();&lt;br /&gt;
            var teile = data.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
            var jobid = [];&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; teile.length; i++) {&lt;br /&gt;
                job[i] = teile[i].split(&amp;quot;:&amp;quot;)[0];&lt;br /&gt;
                jobid[i] = teile[i].split(&amp;quot;:&amp;quot;)[1];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Gespeicherte Pausezeit wird ausgelesen----//&lt;br /&gt;
&lt;br /&gt;
function getPauseTime(sysuid, id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;pauseTime&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params  =   &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;sysuid=&amp;quot;              + encodeURIComponent(sysuid);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;, false);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            pauseTime[id].value = JSON.parse(request.responseText);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Listen--------------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Eine Liste wird mit Kundendaten gefüllt und angezeigt----//&lt;br /&gt;
&lt;br /&gt;
function populateListeKunde(data) {&lt;br /&gt;
&lt;br /&gt;
    data.forEach(function(item) {&lt;br /&gt;
        var listItem = document.createElement(&amp;quot;li&amp;quot;);&lt;br /&gt;
        listItem.textContent = item;&lt;br /&gt;
&lt;br /&gt;
        listItem.addEventListener(&amp;quot;contextmenu&amp;quot;, function(event) {&lt;br /&gt;
            event.preventDefault();&lt;br /&gt;
&lt;br /&gt;
            var selectedKunde = item;&lt;br /&gt;
            getCustomerID(selectedKunde, function(selectedID) {&lt;br /&gt;
                getJob(selectedID, function(job, jobid) {&lt;br /&gt;
                    showSecondList(job, jobid, item);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        kundenListe.appendChild(listItem);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Eine zweite Liste wird mit Jobs gefüllt,----//&lt;br /&gt;
//----angezeigt und bei Klick auf einen Eintrag---//&lt;br /&gt;
//-------die Funktion startTimer aufgerufen-------//&lt;br /&gt;
&lt;br /&gt;
function showSecondList(job, jobid, kundeItem) {&lt;br /&gt;
&lt;br /&gt;
    var zweiteListe = document.getElementById(&amp;quot;zweiteListe&amp;quot;);&lt;br /&gt;
    zweiteListe.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    job.forEach(function(item) {&lt;br /&gt;
        var listItem = document.createElement(&amp;quot;li&amp;quot;);&lt;br /&gt;
        listItem.textContent = item;&lt;br /&gt;
    &lt;br /&gt;
        (function(capturedItem) {&lt;br /&gt;
            listItem.addEventListener(&amp;quot;click&amp;quot;, function() {&lt;br /&gt;
                startTimer(job, jobid, capturedItem, kundeItem);&lt;br /&gt;
            });&lt;br /&gt;
        }) (item);&lt;br /&gt;
        zweiteListe.appendChild(listItem);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;block&amp;quot;; &lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeSecondList);&lt;br /&gt;
    document.addEventListener(&#039;click&#039;, closeSecondList);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Nach Klick auf Eintrag wird die Liste geschlossen----//&lt;br /&gt;
function closeSecondList() {&lt;br /&gt;
&lt;br /&gt;
    var zweiteListe = document.getElementById(&amp;quot;zweiteListe&amp;quot;);&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;none&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Daten speichern-----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Startzeit, -datum, ID und Job werden gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveStartTime(user, uhrzeit, datum, endTime, endDate, status, psnr, Job, jobID) {&lt;br /&gt;
    &lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;start&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;user=&amp;quot;                + encodeURIComponent(user) +&lt;br /&gt;
                    &amp;quot;&amp;amp;uhrzeit=&amp;quot;             + encodeURIComponent(uhrzeit) +&lt;br /&gt;
                    &amp;quot;&amp;amp;datum=&amp;quot;               + encodeURIComponent(datum) +&lt;br /&gt;
                    &amp;quot;&amp;amp;endTime=&amp;quot;             + encodeURIComponent(endTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;endDate=&amp;quot;             + encodeURIComponent(endDate) +&lt;br /&gt;
                    &amp;quot;&amp;amp;status=&amp;quot;              + encodeURIComponent(status)+&lt;br /&gt;
                    &amp;quot;&amp;amp;psnr=&amp;quot;                + encodeURIComponent(psnr)+&lt;br /&gt;
                    &amp;quot;&amp;amp;Job=&amp;quot;                 + encodeURIComponent(Job)+&lt;br /&gt;
                    &amp;quot;&amp;amp;jobID=&amp;quot;               + encodeURIComponent(jobID);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            sys_uid[zaehler].value = request.responseText;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Pausezeit wird gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function savePauseTime(pauseTime, id) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;pause&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;      + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;         + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;      + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;      + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;pauseTime=&amp;quot;   + encodeURIComponent(pauseTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;sysuid=&amp;quot;      + encodeURIComponent(sys_uid[id].value);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200) {&lt;br /&gt;
            // alert(request.responseText);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//----Stopzeit und -datum wird gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveStopTime(stopTimeValue, elapsedTime, elapsedPauseTime, status, uid, vergZeit) {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;PUT&#039;;&lt;br /&gt;
    var choice = &#039;stop&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice) +&lt;br /&gt;
                    &amp;quot;&amp;amp;stopTimeValue=&amp;quot;       + encodeURIComponent(stopTimeValue) +&lt;br /&gt;
                    &amp;quot;&amp;amp;elapsedTime=&amp;quot;         + encodeURIComponent(elapsedTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;elapsedPauseTime=&amp;quot;    + encodeURIComponent(elapsedPauseTime) +&lt;br /&gt;
                    &amp;quot;&amp;amp;status=&amp;quot;              + encodeURIComponent(status) +&lt;br /&gt;
                    &amp;quot;&amp;amp;uid=&amp;quot;                 + encodeURIComponent(uid) +&lt;br /&gt;
                    &amp;quot;&amp;amp;vergZeit=&amp;quot;            + encodeURIComponent(vergZeit);&lt;br /&gt;
    &lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;saveTime.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200 &amp;amp;&amp;amp; timers.length === 0) {&lt;br /&gt;
            location.reload();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//---------------------------------------------Like-Suche----------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Durchsucht die Liste der Kunden auf alle einegegebenen Zeichen----//&lt;br /&gt;
&lt;br /&gt;
function searchCustomers(text) {&lt;br /&gt;
&lt;br /&gt;
    text = text.toLowerCase();&lt;br /&gt;
    var kundenListe = document.getElementById(&amp;quot;kundenListe&amp;quot;);&lt;br /&gt;
    var listItems = kundenListe.getElementsByTagName(&amp;quot;li&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (i=0; i&amp;lt;listItems.length; i++) {&lt;br /&gt;
        var item = listItems[i].textContent.toLowerCase();&lt;br /&gt;
        if (item.includes(text)) {&lt;br /&gt;
            listItems[i].style.display = &amp;quot;block&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            listItems[i].style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------Vorhandenen Timer checken----------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Überprüft, ob es Einträge in Datenbank ohne----//&lt;br /&gt;
//----Endzeit gibt und startet entsprechend Timer----//&lt;br /&gt;
&lt;br /&gt;
function checkTimer() {&lt;br /&gt;
&lt;br /&gt;
    var method = &#039;POST&#039;;&lt;br /&gt;
    var choice = &#039;check&#039;;&lt;br /&gt;
&lt;br /&gt;
    var params =    &amp;quot;api_key=&amp;quot;              + encodeURIComponent(api_key) +&lt;br /&gt;
                    &amp;quot;&amp;amp;url=&amp;quot;                 + encodeURIComponent(url) +&lt;br /&gt;
                    &amp;quot;&amp;amp;method=&amp;quot;              + encodeURIComponent(method) +&lt;br /&gt;
                    &amp;quot;&amp;amp;choice=&amp;quot;              + encodeURIComponent(choice);&lt;br /&gt;
&lt;br /&gt;
    var request = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
    request.open(&amp;quot;POST&amp;quot;, &amp;quot;getData.php&amp;quot;);&lt;br /&gt;
    request.setRequestHeader(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    request.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState === 4 &amp;amp;&amp;amp; this.status === 200 &amp;amp;&amp;amp; timers.length === 0) {&lt;br /&gt;
            var responseData = JSON.parse(request.responseText);&lt;br /&gt;
            &lt;br /&gt;
            if (responseData.length !== 0) {&lt;br /&gt;
                startTimeValue = new Date();&lt;br /&gt;
                var minutes = startTimeValue.getMinutes();&lt;br /&gt;
                var seconds = startTimeValue.getSeconds();&lt;br /&gt;
                var month = startTimeValue.getMonth() + 1;&lt;br /&gt;
&lt;br /&gt;
                responseData = responseData.toString();&lt;br /&gt;
                var teile = responseData.split(&amp;quot;,&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                for (var i=0; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
                    uhrzeit.push({value: startTimeValue.getHours() + &amp;quot;:&amp;quot; + (minutes &amp;lt; 10 ? &amp;quot;0&amp;quot; + minutes : minutes) + &amp;quot;:&amp;quot; + (seconds &amp;lt; 10 ? &amp;quot;0&amp;quot; + seconds : seconds)});&lt;br /&gt;
                    datum.push({value: startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + startTimeValue.getDate()});&lt;br /&gt;
&lt;br /&gt;
                    zaehler++;&lt;br /&gt;
&lt;br /&gt;
                    statusTimer.push({value: &#039;Running&#039;});&lt;br /&gt;
                    pauseTimers.push({value: 0});&lt;br /&gt;
                    pauseTime.push({value: 0});&lt;br /&gt;
                    timers.push({value: teile[i]});&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                var j=0;&lt;br /&gt;
                for (var i=1; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
                    selID.push({value: teile[i]});&lt;br /&gt;
                    getJobs(selID[j].value);&lt;br /&gt;
                    j++;&lt;br /&gt;
                } &lt;br /&gt;
&lt;br /&gt;
                fillArray(2, selectedJob, teile);&lt;br /&gt;
                fillArray(3, selectedKunde, teile);&lt;br /&gt;
                fillArray(4, sys_uid, teile);&lt;br /&gt;
                fillArray(5, startdate, teile);&lt;br /&gt;
&lt;br /&gt;
                for (var i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
                    var startZeitTeil = timers[i].value.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
                    var startDatumTeil = startdate[i].value.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    var diffMilli = new Date() - getStartdatum(startDatumTeil, startZeitTeil);&lt;br /&gt;
                    timers[i].value = Math.floor(diffMilli / 1000); &lt;br /&gt;
                }   &lt;br /&gt;
&lt;br /&gt;
                selecteID = 0;&lt;br /&gt;
                startInterval(job);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    request.send(params);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Arrays werden an diese Funktion übergeben und gefüllt----//&lt;br /&gt;
&lt;br /&gt;
function fillArray(LZ, array, teile) {&lt;br /&gt;
&lt;br /&gt;
    var arrLZ = 0;&lt;br /&gt;
    for (var i=LZ; i&amp;lt;teile.length; i+=6) {&lt;br /&gt;
        array.push({value: teile[i]});&lt;br /&gt;
        arrLZ++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Startdatum wird errechnet----//&lt;br /&gt;
function getStartdatum(startDatumTeil, startZeitTeil) {&lt;br /&gt;
&lt;br /&gt;
    var startdatum = new Date(&lt;br /&gt;
        parseInt(startDatumTeil[2]),&lt;br /&gt;
        parseInt(startDatumTeil[1]) -1,&lt;br /&gt;
        parseInt(startDatumTeil[0]),&lt;br /&gt;
        parseInt(startZeitTeil[0]),&lt;br /&gt;
        parseInt(startZeitTeil[1]),&lt;br /&gt;
        parseInt(startZeitTeil[2])&lt;br /&gt;
    );&lt;br /&gt;
    return startdatum;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-------------------------------------------------Interval--------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Interval für Timer wird gestartet----//&lt;br /&gt;
&lt;br /&gt;
function startInterval(job, item, kundeItem, index) {&lt;br /&gt;
&lt;br /&gt;
    timerInterval = setInterval(function() {&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
&lt;br /&gt;
            timers[i].value += 1;&lt;br /&gt;
        }&lt;br /&gt;
        updateUI(job, item, kundeItem, index);&lt;br /&gt;
    }, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Interval für Pausentimer wird gestartet----// &lt;br /&gt;
&lt;br /&gt;
function pauseInterval(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    pauseTimerInterval = setInterval(function() {&lt;br /&gt;
&lt;br /&gt;
        for (i=0; i&amp;lt;pauseTimers.length; i++) {&lt;br /&gt;
&lt;br /&gt;
            pauseTimers[i].value += 1;&lt;br /&gt;
        }&lt;br /&gt;
        updateUI(job, item, kundeItem);&lt;br /&gt;
    }, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer starten----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----startTimer bereitet die nötigen Arrays vor,----//&lt;br /&gt;
//----speichert Startzeit und -datum,----//&lt;br /&gt;
//----beschreibt Arrays und Variablen entsprechend----//&lt;br /&gt;
//----und ruft die Funktion saveStartTime auf----//&lt;br /&gt;
&lt;br /&gt;
function startTimer(jobs, jobid, selJob, kundeItem) {&lt;br /&gt;
&lt;br /&gt;
    var user = 999;&lt;br /&gt;
    var endTime = &amp;quot;00:00:00&amp;quot;;&lt;br /&gt;
    var endDate = &amp;quot;0000-00-00&amp;quot;;&lt;br /&gt;
    var status = &#039;01&#039;;&lt;br /&gt;
    zaehler++;&lt;br /&gt;
    &lt;br /&gt;
    startTimeValue = new Date();&lt;br /&gt;
&lt;br /&gt;
    var minutes = startTimeValue.getMinutes();&lt;br /&gt;
    var seconds = startTimeValue.getSeconds();&lt;br /&gt;
    uhrzeit.push({value: startTimeValue.getHours() + &amp;quot;:&amp;quot; + (minutes &amp;lt; 10 ? &amp;quot;0&amp;quot; + minutes : minutes) + &amp;quot;:&amp;quot; + (seconds &amp;lt; 10 ? &amp;quot;0&amp;quot; + seconds : seconds)});&lt;br /&gt;
&lt;br /&gt;
    var month = startTimeValue.getMonth() + 1;&lt;br /&gt;
    datum.push({value: startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + startTimeValue.getDate()});&lt;br /&gt;
&lt;br /&gt;
    statusTimer.push({value: &#039;Running&#039;});&lt;br /&gt;
    pauseTimers.push({value: 0});&lt;br /&gt;
    pauseTime.push({value: 0});&lt;br /&gt;
    timers.push({value: 0});&lt;br /&gt;
    selectedKunde.push({value: kundeItem});&lt;br /&gt;
    selectedJob.push({value: selJob});&lt;br /&gt;
    sys_uid.push({value: 0});&lt;br /&gt;
&lt;br /&gt;
    var index = jobs.indexOf(selJob);&lt;br /&gt;
    &lt;br /&gt;
    saveStartTime(user, uhrzeit[zaehler].value, datum[zaehler].value, endTime, endDate, status, selectedID, selJob, jobid[index]);&lt;br /&gt;
    &lt;br /&gt;
    clearInterval(timerInterval);&lt;br /&gt;
    startInterval(jobs, selJob, kundeItem, index);&lt;br /&gt;
&lt;br /&gt;
    zweiteListe.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer stoppen----------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Stopt den Timer, ändert den Status und ruft openLightbox auf----//&lt;br /&gt;
&lt;br /&gt;
function stopTimer(job, item, kundeItem, index, id) {&lt;br /&gt;
&lt;br /&gt;
    idStop = id;&lt;br /&gt;
    statusTimer[id].value = &#039;Stopped&#039;;&lt;br /&gt;
    openLightbox(job, item, kundeItem, index, id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Timer pausieren--------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Pausiert den Timer und ändert den Status----//&lt;br /&gt;
&lt;br /&gt;
function pauseTimer(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    pauseTimers[id].value = 0;&lt;br /&gt;
    clearInterval(pauseTimerInterval);&lt;br /&gt;
    pauseInterval(job, item, kundeItem, id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//----------------------------------------------Button Pause-Start-------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Ruft die Funktion pauseTimer oder----//&lt;br /&gt;
//----savePauseTimer auf----//&lt;br /&gt;
&lt;br /&gt;
function toggleButton(job, item, kundeItem, id) {&lt;br /&gt;
&lt;br /&gt;
    var button = document.getElementById(id);&lt;br /&gt;
&lt;br /&gt;
    if (button.innerHTML === &amp;quot;Pause&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
        statusTimer[id].value = &#039;Paused&#039;;&lt;br /&gt;
        pauseTimer(job, item, kundeItem, id);&lt;br /&gt;
    } &lt;br /&gt;
    else {&lt;br /&gt;
&lt;br /&gt;
        statusTimer[id].value = &amp;quot;Running&amp;quot;;&lt;br /&gt;
        savePauseTime(pauseTimers[id].value, id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//------------------------------------------------Ausgabe des Timers-----------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Zeigt eine Liste mit einem oder mehreren----//&lt;br /&gt;
//----Timern und Buttons, verteilt dynamisch ID&#039;s----//&lt;br /&gt;
//----und ruft entsprechend der gedrückten----//&lt;br /&gt;
//----Buttons Funktionen auf----//&lt;br /&gt;
&lt;br /&gt;
function updateUI(job, item, kundeItem, index) {&lt;br /&gt;
    var timerList = document.getElementById(&amp;quot;timerList&amp;quot;);&lt;br /&gt;
    timerList.innerHTML = &#039;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    for (i=0; i&amp;lt;timers.length; i++) {&lt;br /&gt;
        var neueReihe = document.createElement(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Name des Kunden wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var kundeEintrag = document.createElement(&#039;td&#039;);&lt;br /&gt;
        kundeEintrag.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.width = &amp;quot;30%&amp;quot;;&lt;br /&gt;
        kundeEintrag.style.left = &amp;quot;0%&amp;quot;; &lt;br /&gt;
        kundeEintrag.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        kundeEintrag.classList.add(&#039;kunde_k&#039;);&lt;br /&gt;
        kundeEintrag.textContent = selectedKunde[i].value;&lt;br /&gt;
        timerList.appendChild(kundeEintrag);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Gewählter Job wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var kontoEintrag = document.createElement(&#039;td&#039;);&lt;br /&gt;
        kontoEintrag.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        kontoEintrag.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
        kontoEintrag.style.width = &amp;quot;30%&amp;quot;;&lt;br /&gt;
        kontoEintrag.style.left = &amp;quot;30%&amp;quot;; &lt;br /&gt;
        kontoEintrag.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        kontoEintrag.classList.add(&#039;konto_k&#039;);&lt;br /&gt;
        kontoEintrag.textContent = selectedJob[i].value;&lt;br /&gt;
        timerList.appendChild(kontoEintrag);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Gestartete Timer werden in Liste----//&lt;br /&gt;
        //----ausgegeben, pausierte Timer werden----//&lt;br /&gt;
        //----Liste ausgegeben, sobald Timer gestoppt----//&lt;br /&gt;
        //----wird Ausgabe in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
        if (statusTimer[i].value === &amp;quot;Running&amp;quot;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(timers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &#039;Paused&#039;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(pauseTimers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &#039;Stopped&#039;) {&lt;br /&gt;
            var laufzeitElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
            laufzeitElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
            laufzeitElement.style.left = &amp;quot;60%&amp;quot;; &lt;br /&gt;
            laufzeitElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
            laufzeitElement.classList.add(&#039;laufzeit_l&#039;);&lt;br /&gt;
            laufzeitElement.textContent = formatElapsedTime(pauseTimers[i].value);&lt;br /&gt;
            timerList.appendChild(laufzeitElement);&lt;br /&gt;
&lt;br /&gt;
            var zeit = formatElapsedTime(timers[i].value);&lt;br /&gt;
            zeit = zeit.toString();&lt;br /&gt;
            var teile = zeit.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            var h = teile[0];&lt;br /&gt;
            var m = teile[1];&lt;br /&gt;
            var s = teile[2];&lt;br /&gt;
&lt;br /&gt;
            var outStdField = document.getElementById(&amp;quot;outStd&amp;quot;);&lt;br /&gt;
            var outMinField = document.getElementById(&amp;quot;outMin&amp;quot;);&lt;br /&gt;
            var outSekField = document.getElementById(&amp;quot;outSek&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if (document.activeElement !== outStdField &amp;amp;&amp;amp; document.activeElement !== outMinField &amp;amp;&amp;amp; document.activeElement !== outSekField) {&lt;br /&gt;
                document.getElementById(&amp;quot;outStd&amp;quot;).value = h; &lt;br /&gt;
                document.getElementById(&amp;quot;outMin&amp;quot;).value = m;&lt;br /&gt;
                document.getElementById(&amp;quot;outSek&amp;quot;).value = s;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var hEnd = document.getElementById(&amp;quot;outStd&amp;quot;).value;&lt;br /&gt;
            var mEnd = document.getElementById(&amp;quot;outMin&amp;quot;).value;&lt;br /&gt;
            var sEnd = document.getElementById(&amp;quot;outSek&amp;quot;).value;&lt;br /&gt;
            time = hEnd + &amp;quot;:&amp;quot; + mEnd + &amp;quot;:&amp;quot; + sEnd;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Status (Running, Paused, Stopped) wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var statusTimerElement = document.createElement(&#039;td&#039;);&lt;br /&gt;
        statusTimerElement.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        statusTimerElement.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;; &lt;br /&gt;
        statusTimerElement.style.width = &amp;quot;15%&amp;quot;;&lt;br /&gt;
        statusTimerElement.style.left = &amp;quot;75%&amp;quot;; &lt;br /&gt;
        statusTimerElement.style.textAlign = &amp;quot;center&amp;quot;;&lt;br /&gt;
        statusTimerElement.classList.add(&#039;status_s&#039;);&lt;br /&gt;
        statusTimerElement.textContent = statusTimer[i].value;&lt;br /&gt;
        timerList.appendChild(statusTimerElement);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Pause Button mit dynamisch vergebener ID wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        if (statusTimer[i].value === &amp;quot;Running&amp;quot;) {&lt;br /&gt;
            var pauseButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
            pauseButton.id = i;&lt;br /&gt;
            pauseButton.classList.add(&#039;pauseButton&#039;);&lt;br /&gt;
            pauseButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            pauseButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
            pauseButton.style.left = &amp;quot;90%&amp;quot;; &lt;br /&gt;
            pauseButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
            pauseButton.style.minWidth = &amp;quot;3%&amp;quot;;&lt;br /&gt;
            pauseButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
            pauseButton.textContent = &amp;quot;Pause&amp;quot;&lt;br /&gt;
            pauseButton.addEventListener(&#039;click&#039;, function() {toggleButton(job, item, kundeItem, this.id)});&lt;br /&gt;
            timerList.appendChild(pauseButton);&lt;br /&gt;
        }&lt;br /&gt;
        else if (statusTimer[i].value === &amp;quot;Paused&amp;quot;) {&lt;br /&gt;
            var pauseButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
            pauseButton.id = i;&lt;br /&gt;
            pauseButton.classList.add(&#039;pauseButton&#039;);&lt;br /&gt;
            pauseButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
            pauseButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
            pauseButton.style.left = &amp;quot;90%&amp;quot;;&lt;br /&gt;
            pauseButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
            pauseButton.style.minWidth = &amp;quot;3%&amp;quot;;&lt;br /&gt;
            pauseButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
            pauseButton.textContent = &amp;quot;Start&amp;quot;&lt;br /&gt;
            pauseButton.addEventListener(&#039;click&#039;, function() {toggleButton(job, item, kundeItem, this.id)});&lt;br /&gt;
            timerList.appendChild(pauseButton);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        //----Stop Button mit dynamisch vergebener ID wird ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        var stopButton = document.createElement(&#039;button&#039;)&lt;br /&gt;
        stopButton.id = i;&lt;br /&gt;
        stopButton.classList.add(&#039;stopButton&#039;);&lt;br /&gt;
        stopButton.style.position = &amp;quot;fixed&amp;quot;;&lt;br /&gt;
        stopButton.style.top = (12 + i * 14) + &amp;quot;%&amp;quot;;&lt;br /&gt;
        stopButton.style.left = &amp;quot;94%&amp;quot;;&lt;br /&gt;
        stopButton.style.height = &amp;quot;9.4%&amp;quot;;&lt;br /&gt;
        stopButton.style.width = &amp;quot;3%&amp;quot;;&lt;br /&gt;
        stopButton.style.fontSize = &amp;quot;80%&amp;quot;;&lt;br /&gt;
        stopButton.textContent = &amp;quot;Stop&amp;quot;&lt;br /&gt;
        stopButton.addEventListener(&#039;click&#039;, function() {stopTimer(job, item, kundeItem, index, this.id)});&lt;br /&gt;
        timerList.appendChild(stopButton);&lt;br /&gt;
        &lt;br /&gt;
        //----Für jeden aufgerufenen Timer wird----//&lt;br /&gt;
        //----eine neue Reihe ausgegeben----//&lt;br /&gt;
&lt;br /&gt;
        timerList.appendChild(neueReihe);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------Sekunden in Uhrzeit umrechnen-------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Rechnet übergebene Sekunden in Stunden,----//&lt;br /&gt;
//----Minuten und Sekunden und gibt diese----//&lt;br /&gt;
//----an aufrufende Funktion zurück----//&lt;br /&gt;
&lt;br /&gt;
function formatElapsedTime(seconds) {&lt;br /&gt;
&lt;br /&gt;
    var minutes = Math.floor(seconds / 60);&lt;br /&gt;
    seconds %= 60;&lt;br /&gt;
    var hours = Math.floor(minutes / 60);&lt;br /&gt;
    minutes %= 60;&lt;br /&gt;
    function addLeadingZero(n) {&lt;br /&gt;
        return (n &amp;lt; 10 ? &#039;0&#039; : &#039;&#039;) + n;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return addLeadingZero(hours) + &amp;quot;:&amp;quot; + addLeadingZero(minutes) + &amp;quot;:&amp;quot; + addLeadingZero(seconds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------Uhrzeit in Sekunden umrechnen----------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Rechnet übergebene Stunden, Minuten----//&lt;br /&gt;
//----und Sekunden in Sekunden um und----//&lt;br /&gt;
//----gibt diese an aufrufende Funktion zurück----//&lt;br /&gt;
&lt;br /&gt;
function timeInSeconds(zeit) {&lt;br /&gt;
&lt;br /&gt;
    var teile = zeit.split(&#039;:&#039;);&lt;br /&gt;
    var Stunden = parseInt(teile[0], 10);&lt;br /&gt;
    var Minuten = parseInt(teile[1], 10);&lt;br /&gt;
    var Sekunden = parseInt(teile[2], 10);&lt;br /&gt;
    return Stunden * 3600 + Minuten * 60 + Sekunden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
//--------------------------------------------------Lightbox-------------------------------------------------------------//&lt;br /&gt;
//-----------------------------------------------------------------------------------------------------------------------//&lt;br /&gt;
&lt;br /&gt;
//----Öffnet eine Lightbox und zeigt Kunde----//&lt;br /&gt;
//----Job, vergangene Zeit und evtl Pausenzeit an----//&lt;br /&gt;
//----und gibt Möglichkeit alle Zeiten anzupassen----//&lt;br /&gt;
&lt;br /&gt;
function openLightbox(job, item, kundeItem, index, id) {&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&#039;lightbox&#039;).style.display = &#039;block&#039;;&lt;br /&gt;
&lt;br /&gt;
    var dateField = document.getElementById(&amp;quot;date&amp;quot;);&lt;br /&gt;
    dateField.value = datum[id].value;&lt;br /&gt;
    document.getElementById(&amp;quot;uhrzeit&amp;quot;).innerHTML = uhrzeit[id].value;&lt;br /&gt;
&lt;br /&gt;
    var commentTextarea = document.getElementById(&amp;quot;comment&amp;quot;);&lt;br /&gt;
    commentTextarea.value = selectedJob[id].value;&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;eingPersonZusatz&amp;quot;).innerHTML = selectedKunde[id].value;&lt;br /&gt;
&lt;br /&gt;
    if (selectedID.length !== undefined) {&lt;br /&gt;
        document.getElementById(&amp;quot;eingPerson&amp;quot;).innerHTML = selectedID;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        document.getElementById(&amp;quot;eingPerson&amp;quot;).innerHTML = selID[id].value;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //----Ausgabe der vergangenen Zeit in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outMin&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outSek&amp;quot;).value = 00;                      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //----Ausgabe der Pausenzeiten in Lightbox----//&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd2&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outMin2&amp;quot;).value = 00;                      &lt;br /&gt;
    document.getElementById(&amp;quot;outSek2&amp;quot;).value = 00;                           &lt;br /&gt;
    getPauseTime(sys_uid[id].value, id);                                &lt;br /&gt;
                                                                        &lt;br /&gt;
    var secondsPause = pauseTime[id].value;                             &lt;br /&gt;
    secondsPause %= 60;  &lt;br /&gt;
&lt;br /&gt;
    var minutesPause = Math.floor(pauseTime[id].value / 60);            &lt;br /&gt;
    minutesPause %= 60;    &lt;br /&gt;
&lt;br /&gt;
    var hoursPause = Math.floor(minutesPause / 60);                     &lt;br /&gt;
    hoursPause %= 60;   &lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&amp;quot;outStd2&amp;quot;).value = hoursPause;              &lt;br /&gt;
    document.getElementById(&amp;quot;outMin2&amp;quot;).value = minutesPause;       &lt;br /&gt;
&lt;br /&gt;
    if (secondsPause &amp;gt; 0) {&lt;br /&gt;
        document.getElementById(&amp;quot;outSek2&amp;quot;).value = secondsPause;        &lt;br /&gt;
    }                                                                   &lt;br /&gt;
    else {&lt;br /&gt;
        document.getElementById(&amp;quot;outSek2&amp;quot;).value = 0;                   &lt;br /&gt;
    }                                                                   &lt;br /&gt;
&lt;br /&gt;
    var dropdown2 = document.getElementById(&amp;quot;tätigkeit2Dropdown&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    job.forEach(function(item, index) {&lt;br /&gt;
        var option = document.createElement(&amp;quot;option&amp;quot;);&lt;br /&gt;
        option.textContent = item;&lt;br /&gt;
        dropdown2.add(option)&lt;br /&gt;
&lt;br /&gt;
        if (item === selectedJob[id].value) {&lt;br /&gt;
            option.selected = true;&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeLightboxOnEscape);&lt;br /&gt;
    document.addEventListener(&#039;keydown&#039;, closeLightboxOnF2);&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Lightbox schließen----//&lt;br /&gt;
&lt;br /&gt;
function closeLightbox() {&lt;br /&gt;
&lt;br /&gt;
    document.getElementById(&#039;lightbox&#039;).style.display = &#039;none&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn der Schließen-Button gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnSchliessen() {&lt;br /&gt;
&lt;br /&gt;
    statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
    closeLightbox();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn Escape gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnEscape() {&lt;br /&gt;
&lt;br /&gt;
    if (event.key === &#039;Escape&#039;) {&lt;br /&gt;
        statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
        closeLightbox();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion closeLightbox wird aufgerufen,----//&lt;br /&gt;
//----wenn F2 gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
function closeLightboxOnF2(event) {&lt;br /&gt;
&lt;br /&gt;
    if (event.key === &#039;F2&#039;) {&lt;br /&gt;
        saveBox();&lt;br /&gt;
        closeLightbox();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Alle Daten in Lightbox werden gespeichert----//&lt;br /&gt;
&lt;br /&gt;
function saveBox() {&lt;br /&gt;
&lt;br /&gt;
    var vergZeit = &#039;&amp;quot;&#039; + time + &#039;&amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
    var teile = time.split(&amp;quot;:&amp;quot;);&lt;br /&gt;
    var stunden = parseInt(teile[0]);&lt;br /&gt;
    var minuten = parseInt(teile[1]);&lt;br /&gt;
    var sekunden = parseInt(teile[2]);&lt;br /&gt;
    time = stunden * 3600 + minuten * 60 + sekunden;&lt;br /&gt;
&lt;br /&gt;
    elapsedTime = time;&lt;br /&gt;
&lt;br /&gt;
    var Job = selectedJob[idStop].value;&lt;br /&gt;
    var Kunde = selectedKunde[idStop].value;&lt;br /&gt;
&lt;br /&gt;
    var hPEnd = document.getElementById(&amp;quot;outStd2&amp;quot;).value;&lt;br /&gt;
    var mPEnd = document.getElementById(&amp;quot;outMin2&amp;quot;).value;&lt;br /&gt;
    var sPEnd = document.getElementById(&amp;quot;outSek2&amp;quot;).value;&lt;br /&gt;
    var pTime = hPEnd + &amp;quot;:&amp;quot; + mPEnd + &amp;quot;:&amp;quot; + sPEnd;&lt;br /&gt;
    pTime = timeInSeconds(pTime);&lt;br /&gt;
&lt;br /&gt;
    var uid = sys_uid[idStop].value;&lt;br /&gt;
    var month = startTimeValue.getMonth();&lt;br /&gt;
    var day = startTimeValue.getDate();&lt;br /&gt;
    month += 1;&lt;br /&gt;
    stopTimeValue = &#039;&amp;quot;&#039; + startTimeValue.getFullYear() + &amp;quot;-&amp;quot; + (month &amp;lt; 10 ? &amp;quot;0&amp;quot; + month : month) + &amp;quot;-&amp;quot; + (day &amp;lt; 10 ? &amp;quot;0&amp;quot; + day : day) + &#039;&amp;quot;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    var status = 21;&lt;br /&gt;
&lt;br /&gt;
    timers.splice(idStop, 1);&lt;br /&gt;
    pauseTimers.splice(idStop, 1);&lt;br /&gt;
    pauseTime.splice(idStop, 1);&lt;br /&gt;
    selectedKunde.splice(idStop, 1);&lt;br /&gt;
    selectedJob.splice(idStop, 1);&lt;br /&gt;
    statusTimer[idStop].value = &#039;Running&#039;;&lt;br /&gt;
    sys_uid.splice(idStop, 1);&lt;br /&gt;
&lt;br /&gt;
    if (zaehler &amp;gt; 0) {&lt;br /&gt;
        zaehler -= 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    closeLightbox();&lt;br /&gt;
&lt;br /&gt;
    if (timers.length === 0) {&lt;br /&gt;
        clearInterval(timerInterval);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    saveStopTime(stopTimeValue, elapsedTime, pTime, status, uid, vergZeit);&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//----Funktion saveBox wird aufgerufen,----//&lt;br /&gt;
//----wenn der Save-Button gedrückt wird----//&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function() {&lt;br /&gt;
        const saveButton = document.getElementById(&#039;saveButton&#039;);&lt;br /&gt;
        saveButton.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
            saveBox();&lt;br /&gt;
        })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= PHP-Script saveTime.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $user               = 0;&lt;br /&gt;
    $uhrzeit            = 0;&lt;br /&gt;
    $datum              = 0;&lt;br /&gt;
    $endTime            = 0;&lt;br /&gt;
    $endDate            = 0;&lt;br /&gt;
    $status             = 0;&lt;br /&gt;
    $psnr               = 0;&lt;br /&gt;
    $comm               = 0;&lt;br /&gt;
    $jobID              = 0;&lt;br /&gt;
    $pauseTime          = 0;&lt;br /&gt;
    $sysuid             = 0;&lt;br /&gt;
    $stopTimeValue      = 0;&lt;br /&gt;
    $elapsedTime        = 0;&lt;br /&gt;
    $elapsedPauseTime   = 0;&lt;br /&gt;
    $status             = 0;&lt;br /&gt;
    $uid                = 0;&lt;br /&gt;
    $vergZeit           = 0;&lt;br /&gt;
&lt;br /&gt;
    if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) &lt;br /&gt;
    {&lt;br /&gt;
        $api_key            = $_POST[&#039;api_key&#039;];&lt;br /&gt;
        $url                = $_POST[&#039;url&#039;];&lt;br /&gt;
        $method             = $_POST[&#039;method&#039;];&lt;br /&gt;
        $choice             = $_POST[&#039;choice&#039;];&lt;br /&gt;
&lt;br /&gt;
        if (isset($_POST[&#039;user&#039;])) {&lt;br /&gt;
            $user               = $_POST[&#039;user&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;uhrzeit&#039;])) {&lt;br /&gt;
            $uhrzeit            = $_POST[&#039;uhrzeit&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;datum&#039;])) {&lt;br /&gt;
            $datum              = $_POST[&#039;datum&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;endTime&#039;])) {&lt;br /&gt;
            $endTime            = $_POST[&#039;endTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;endDate&#039;])) {&lt;br /&gt;
            $endDate            = $_POST[&#039;endDate&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;status&#039;])) {&lt;br /&gt;
            $status             = $_POST[&#039;status&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;psnr&#039;])) {&lt;br /&gt;
            $psnr               = $_POST[&#039;psnr&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;Job&#039;])) {&lt;br /&gt;
            $comm               = $_POST[&#039;Job&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;jobID&#039;])) {&lt;br /&gt;
            $jobID              = $_POST[&#039;jobID&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;pauseTime&#039;])) {&lt;br /&gt;
            $pauseTime          = $_POST[&#039;pauseTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;sysuid&#039;])) {&lt;br /&gt;
            $sysuid             = $_POST[&#039;sysuid&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;stopTimeValue&#039;])) {&lt;br /&gt;
            $stopTimeValue      = $_POST[&#039;stopTimeValue&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;elapsedTime&#039;])) {&lt;br /&gt;
            $elapsedTime        = $_POST[&#039;elapsedTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;elapsedPauseTime&#039;])) {&lt;br /&gt;
            $elapsedPauseTime   = $_POST[&#039;elapsedPauseTime&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;status&#039;])) {&lt;br /&gt;
            $status             = $_POST[&#039;status&#039;];    &lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;uid&#039;])) {&lt;br /&gt;
            $uid                = $_POST[&#039;uid&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;vergZeit&#039;])) {&lt;br /&gt;
            $vergZeit           = $_POST[&#039;vergZeit&#039;];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $params = array(    &#039;user&#039;              =&amp;gt; $user, &lt;br /&gt;
                            &#039;uhrzeit&#039;           =&amp;gt; $uhrzeit, &lt;br /&gt;
                            &#039;datum&#039;             =&amp;gt; $datum, &lt;br /&gt;
                            &#039;endTime&#039;           =&amp;gt; $endTime, &lt;br /&gt;
                            &#039;endDate&#039;           =&amp;gt; $endDate, &lt;br /&gt;
                            &#039;status&#039;            =&amp;gt; $status, &lt;br /&gt;
                            &#039;psnr&#039;              =&amp;gt; $psnr,&lt;br /&gt;
                            &#039;comm&#039;              =&amp;gt; $comm,&lt;br /&gt;
                            &#039;jobID&#039;             =&amp;gt; $jobID,&lt;br /&gt;
                            &#039;pauseTime&#039;         =&amp;gt; $pauseTime,&lt;br /&gt;
                            &#039;sysuid&#039;            =&amp;gt; $sysuid,&lt;br /&gt;
                            &#039;stopTimeValue&#039;     =&amp;gt; $stopTimeValue,&lt;br /&gt;
                            &#039;elapsedTime&#039;       =&amp;gt; $elapsedTime,&lt;br /&gt;
                            &#039;elapsedPauseTime&#039;  =&amp;gt; $elapsedPauseTime,&lt;br /&gt;
                            &#039;status&#039;            =&amp;gt; $status,&lt;br /&gt;
                            &#039;uid&#039;               =&amp;gt; $uid,&lt;br /&gt;
                            &#039;vergZeit&#039;          =&amp;gt; $vergZeit,&lt;br /&gt;
                            &#039;choice&#039;            =&amp;gt; $choice);&lt;br /&gt;
&lt;br /&gt;
        $curl = curl_init($url);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(&#039;apikey: &#039;.$api_key));&lt;br /&gt;
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));&lt;br /&gt;
        $response = curl_exec($curl);&lt;br /&gt;
&lt;br /&gt;
        if ($response === false) {&lt;br /&gt;
            if($error) {&lt;br /&gt;
                echo &amp;quot;curl_Fehler: &amp;quot;.$error;&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        else {&lt;br /&gt;
            echo $response;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= PHP-Script getData.php =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $sysuid             = 0;&lt;br /&gt;
    $id                 = 0;&lt;br /&gt;
    $selectedKunde      = 0;&lt;br /&gt;
            &lt;br /&gt;
    if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) &lt;br /&gt;
    {&lt;br /&gt;
        $api_key        = $_POST[&#039;api_key&#039;];&lt;br /&gt;
        $url            = $_POST[&#039;url&#039;];&lt;br /&gt;
        $method         = $_POST[&#039;method&#039;];&lt;br /&gt;
        $choice         = $_POST[&#039;choice&#039;];&lt;br /&gt;
        &lt;br /&gt;
        if (isset($_POST[&#039;id&#039;])) {&lt;br /&gt;
            $id = $_POST[&#039;id&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;sysuid&#039;])) {&lt;br /&gt;
            $sysuid = $_POST[&#039;sysuid&#039;];&lt;br /&gt;
        }&lt;br /&gt;
        if (isset($_POST[&#039;selectedKunde&#039;])) {&lt;br /&gt;
            $selectedKunde  = $_POST[&#039;selectedKunde&#039;];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $params = array(    &#039;sysuid&#039;            =&amp;gt; $sysuid,&lt;br /&gt;
                            &#039;id&#039;                =&amp;gt; $id, &lt;br /&gt;
                            &#039;selectedKunde&#039;     =&amp;gt; $selectedKunde,&lt;br /&gt;
                            &#039;choice&#039;            =&amp;gt; $choice);&lt;br /&gt;
        &lt;br /&gt;
        $curl = curl_init($url);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(&#039;apikey: &#039;.$api_key));&lt;br /&gt;
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);&lt;br /&gt;
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));&lt;br /&gt;
        $response = curl_exec($curl);&lt;br /&gt;
&lt;br /&gt;
        if ($response === false) {&lt;br /&gt;
            if($error) {&lt;br /&gt;
                echo &amp;quot;curl_Fehler: &amp;quot;.$error;&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
        else {&lt;br /&gt;
            echo $response;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CSS-Datei timestyle.css =&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-----------------------------------------Allgemein-----------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
body &lt;br /&gt;
{&lt;br /&gt;
    font-family: &#039;Arial&#039;, sans-serif;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: right;&lt;br /&gt;
    align-items: flex-start;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background-image: url(&#039;web_background_3.png&#039;);&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-size: cover; &lt;br /&gt;
    background-attachment: fixed;&lt;br /&gt;
}&lt;br /&gt;
ul &lt;br /&gt;
{&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
}&lt;br /&gt;
li &lt;br /&gt;
{&lt;br /&gt;
    padding: 0.5em;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    display: flex; &lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    font-size: 0.85em;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------Suche-------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
#search&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 8%;&lt;br /&gt;
    left: 42%;&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    height: 2.8%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.04em solid #e4e4e4;&lt;br /&gt;
    border-radius: 0.1em;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 2em;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-----------------------------------------Timerausgabe--------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.kundenliste&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    height: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 43.5%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    border-top-left-radius: 0.2em;&lt;br /&gt;
    border-top-right-radius: 0.2em;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
}&lt;br /&gt;
.tabelleUeberschriften&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    min-height: 3%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 60%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    /* border-top: 0.14em solid #ccc;&lt;br /&gt;
    border-bottom: 0.14em solid #ccc; */&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    box-shadow: 0 0px 3px rgba(0, 0, 0, 0.5);&lt;br /&gt;
    font-size: 0.9vw;&lt;br /&gt;
}&lt;br /&gt;
#timerList&lt;br /&gt;
{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
    height: 25%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 73.5%;&lt;br /&gt;
    left: 50%;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    border-bottom-left-radius: 0.2em;&lt;br /&gt;
    border-bottom-right-radius: 0.2em;&lt;br /&gt;
    /* border: 0.14em solid red; */&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
} &lt;br /&gt;
.kunde&lt;br /&gt;
{&lt;br /&gt;
    width: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 0%;&lt;br /&gt;
}&lt;br /&gt;
.konto&lt;br /&gt;
{&lt;br /&gt;
    width: 30%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 30%;&lt;br /&gt;
}&lt;br /&gt;
.laufzeit&lt;br /&gt;
{&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 60%;&lt;br /&gt;
}&lt;br /&gt;
.status&lt;br /&gt;
{&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 75%;&lt;br /&gt;
}&lt;br /&gt;
.buttons&lt;br /&gt;
{&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    left: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------Lightbox----------------------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.lightbox&lt;br /&gt;
{&lt;br /&gt;
    display: none;&lt;br /&gt;
    width: 52%;&lt;br /&gt;
    height: 62%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 61.5%;&lt;br /&gt;
    left: 67%;&lt;br /&gt;
    border-radius: 0.15em;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    box-shadow: 0 10px 2000px rgba(0, 0, 0, 0.5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-----------------------------------------Lightbox-Inhalt-----------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
.commLabel&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 5%;&lt;br /&gt;
    left: 5%;   &lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.comment&lt;br /&gt;
{&lt;br /&gt;
    width: 90%;&lt;br /&gt;
    height: 38%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 10%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.9vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.bezZeitkonto&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 55%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.dropButtonsLightbox&lt;br /&gt;
{&lt;br /&gt;
    width: 37%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 15%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.bezDatum&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 55%;&lt;br /&gt;
    left: 58%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.date&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 68%;&lt;br /&gt;
    width: 15%;&lt;br /&gt;
    height: 4%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.uhrzeit&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 54%;&lt;br /&gt;
    left: 85.5%;&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    height: 3.9%;&lt;br /&gt;
    padding: 0.1em;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    resize: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.bezPerson&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.eingPerson&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 15%;&lt;br /&gt;
    width: 10%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.eingPersonZusatz&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 26%;&lt;br /&gt;
    width: 25.7%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    resize: none;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
    color: gray;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.Std&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 66%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Min&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 78%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Sek&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 63%;&lt;br /&gt;
    left: 91%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outStd&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 64%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outMin&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 76.5%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outSek&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 68%;&lt;br /&gt;
    left: 89%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.Pausenzeiten&lt;br /&gt;
{&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 79%;&lt;br /&gt;
    left: 71%;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-size: 0.8vw;&lt;br /&gt;
}&lt;br /&gt;
.Std2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 66%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Min2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 78%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.Sek2&lt;br /&gt;
{&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 84%;&lt;br /&gt;
    left: 91%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outStd2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 64%;&lt;br /&gt;
    border: 0.1em solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outMin2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 76.5%;&lt;br /&gt;
    border: 0.1em  solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.outSek2&lt;br /&gt;
{&lt;br /&gt;
    width: 6%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 89%;&lt;br /&gt;
    border: 0.1em  solid black;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.saveButton&lt;br /&gt;
{&lt;br /&gt;
    min-width: 8%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 5%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
.closeButton&lt;br /&gt;
{&lt;br /&gt;
    min-width: 8%;&lt;br /&gt;
    height: 4.4%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 89%;&lt;br /&gt;
    left: 14%;&lt;br /&gt;
    font-size: 0.7vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
/*--------------------------------Tätigkeitenliste (zweite Liste)----------------------------------*/&lt;br /&gt;
/*-------------------------------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
#zweiteListe &lt;br /&gt;
{&lt;br /&gt;
    display: none;&lt;br /&gt;
    width: 25%;&lt;br /&gt;
    max-height: 50%;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 47%;&lt;br /&gt;
    left: 44%;&lt;br /&gt;
    padding: 1%;&lt;br /&gt;
    overflow: auto;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    transform: translate(-50%, -50%);&lt;br /&gt;
    background-color: #FAFAFA;&lt;br /&gt;
    box-shadow: 0 10px 2000px rgba(0, 0, 0, 0.5);&lt;br /&gt;
    font-size: 0.85vw;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Prakti</name></author>
	</entry>
</feed>