diff --git a/classes/Carrier/SendCloud/SendCloudApi.php b/classes/Carrier/SendCloud/SendCloudApi.php
index 7ae71daa..df9425e1 100644
--- a/classes/Carrier/SendCloud/SendCloudApi.php
+++ b/classes/Carrier/SendCloud/SendCloudApi.php
@@ -1,7 +1,7 @@
sendRequest($uri);
+ $highest = null;
+ foreach ($response['body']->statuses as $status) {
+ switch ($status->parent_status) {
+ case 'announcing':
+ case 'ready-to-send':
+ if ($highest === null) $highest = ShipmentStatus::Announced;
+ break;
+ case 'to-sorting':
+ case 'at-sorting-centre':
+ case 'shipment-on-route':
+ case 'driver-on-route':
+ $highest = ShipmentStatus::EnRoute;
+ break;
+ case 'delivered': return ShipmentStatus::Delivered;
+ }
+ }
+ return $highest;
+ }
+
/**
* @throws SendcloudApiException
*/
diff --git a/classes/Modules/ShippingMethod/Model/ShipmentStatus.php b/classes/Modules/ShippingMethod/Model/ShipmentStatus.php
new file mode 100644
index 00000000..de04c7b4
--- /dev/null
+++ b/classes/Modules/ShippingMethod/Model/ShipmentStatus.php
@@ -0,0 +1,14 @@
+Container->get('Database');
+
+$shipments_sql = "SELECT CONCAT(va.id, ';', va.modul) module, vp.id, vp.tracking, vp.status
+ FROM versandpakete vp
+ JOIN versandarten va ON vp.versandart = va.type
+ WHERE status IN ('neu', 'versendet')";
+$shipments = $db->fetchGroup($shipments_sql);
+
+foreach ($shipments as $module => $vps) {
+ list($moduleId, $moduleName) = explode(';', $module,2);
+ $module = $app->erp->LoadVersandModul($moduleName, intval($moduleId));
+
+ foreach ($vps as $vp) {
+ $status = match ($module->GetShipmentStatus($vp['tracking'])) {
+ ShipmentStatus::Announced => 'neu',
+ ShipmentStatus::EnRoute => 'versendet',
+ ShipmentStatus::Delivered => 'abgeschlossen',
+ default => null,
+ };
+ if ($status === null || $status === $vp['status']) continue;
+ $db->perform('UPDATE versandpakete SET status = :status WHERE id = :id',
+ ['status' => $status, 'id' => $vp['id']]);
+ }
+}
diff --git a/database/struktur.sql b/database/struktur.sql
index 2b0475e9..ff2d9243 100755
--- a/database/struktur.sql
+++ b/database/struktur.sql
@@ -12945,12 +12945,8 @@ DROP TABLE IF EXISTS `seriennummern`;
CREATE TABLE `seriennummern` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`seriennummer` varchar(255) NOT NULL,
- `adresse` int(11) NOT NULL,
`artikel` int(11) NOT NULL,
`beschreibung` varchar(255) NOT NULL,
- `lieferung` date NOT NULL,
- `lieferschein` int(11) NOT NULL,
- `lieferscheinpos` int(11) NOT NULL,
`bearbeiter` varchar(255) NOT NULL,
`logdatei` datetime NOT NULL,
PRIMARY KEY (`id`)
diff --git a/phpwf/plugins/class.templateparser.php b/phpwf/plugins/class.templateparser.php
index c7e55f3d..8e1def44 100644
--- a/phpwf/plugins/class.templateparser.php
+++ b/phpwf/plugins/class.templateparser.php
@@ -365,9 +365,13 @@ class TemplateParser {
echo '
';
}
}
- function SetText($_var, $_value)
- {
- $this->VARARRAY[$_var]= $this->htmlspecialchars($_value);
+ function SetText($_var, $_value, $html = false)
+ {
+ if(!$html)
+ {
+ $_value = $this->htmlspecialchars($_value);
+ }
+ $this->VARARRAY[$_var]= $_value;
}
function AddText($_var,$_value, $variable = false){
diff --git a/upgrade/data/db_schema.json b/upgrade/data/db_schema.json
index 0b440a32..e42e187e 100644
--- a/upgrade/data/db_schema.json
+++ b/upgrade/data/db_schema.json
@@ -91440,12 +91440,12 @@
"Comment": ""
},
{
- "Field": "adresse",
- "Type": "int(11)",
+ "Field": "datum",
+ "Type": "datetime",
"Collation": null,
"Null": "NO",
"Key": "",
- "Default": null,
+ "Default": "current_timestamp()",
"Extra": "",
"Privileges": "select,insert,update,references",
"Comment": ""
@@ -91473,34 +91473,12 @@
"Comment": ""
},
{
- "Field": "lieferung",
- "Type": "date",
+ "Field": "eingelagert",
+ "Type": "int(1)",
"Collation": null,
"Null": "NO",
"Key": "",
- "Default": null,
- "Extra": "",
- "Privileges": "select,insert,update,references",
- "Comment": ""
- },
- {
- "Field": "lieferschein",
- "Type": "int(11)",
- "Collation": null,
- "Null": "NO",
- "Key": "",
- "Default": null,
- "Extra": "",
- "Privileges": "select,insert,update,references",
- "Comment": ""
- },
- {
- "Field": "lieferscheinpos",
- "Type": "int(11)",
- "Collation": null,
- "Null": "NO",
- "Key": "",
- "Default": null,
+ "Default": 0,
"Extra": "",
"Privileges": "select,insert,update,references",
"Comment": ""
@@ -91528,6 +91506,76 @@
"Comment": ""
}
],
+ "keys": [
+ {
+ "Key_name": "PRIMARY",
+ "Index_type": "BTREE",
+ "columns": [
+ "id"
+ ],
+ "Non_unique": ""
+ },
+ {
+ "Key_name": "seriennummer_artikel",
+ "Index_type": "BTREE",
+ "columns": [
+ "seriennummer",
+ "artikel"
+ ],
+ "Non_unique": "UNIQUE"
+ }
+ ]
+ },
+ {
+ "name": "seriennummern_beleg_position",
+ "collation": "utf8mb3_general_ci",
+ "type": "BASE TABLE",
+ "columns": [
+ {
+ "Field": "id",
+ "Type": "int(11)",
+ "Collation": null,
+ "Null": "NO",
+ "Key": "PRI",
+ "Default": null,
+ "Extra": "auto_increment",
+ "Privileges": "select,insert,update,references",
+ "Comment": ""
+ },
+ {
+ "Field": "seriennummer",
+ "Type": "int(11)",
+ "Collation": null,
+ "Null": "NO",
+ "Key": "",
+ "Default": null,
+ "Extra": "",
+ "Privileges": "select,insert,update,references",
+ "Comment": ""
+ },
+ {
+ "Field": "beleg_typ",
+ "Type": "varchar(30)",
+ "Collation": "utf8mb3_general_ci",
+ "Null": "NO",
+ "Key": "",
+ "Default": null,
+ "Extra": "",
+ "Privileges": "select,insert,update,references",
+ "Comment": ""
+ },
+ {
+ "Field": "beleg_position",
+ "Type": "int(11)",
+ "Collation": null,
+ "Null": "NO",
+ "Key": "",
+ "Default": null,
+ "Extra": "",
+ "Privileges": "select,insert,update,references",
+ "Comment": ""
+ }
+ ],
"keys": [
{
"Key_name": "PRIMARY",
diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php
index ce239bff..17b536c5 100644
--- a/www/lib/class.erpapi.php
+++ b/www/lib/class.erpapi.php
@@ -1127,8 +1127,10 @@ public function NavigationHooks(&$menu)
function FormatMenge($spalte, $decimals = 0)
{
return ('FORMAT('.$spalte.','.$decimals.',\'de_DE\')');
+ }
-// return "replace(trim($spalte)+0,'.',',')";
+ function FormatMengeFuerFormular($spalte) {
+ return "trim($spalte)+0";
}
function FormatUCfirst($spalte)
@@ -2423,14 +2425,45 @@ public function NavigationHooks(&$menu)
}
-function LieferscheinSeriennummernberechnen($id)
-{
- /** @var Seriennummern $obj */
- $obj = $this->LoadModul('seriennummern');
- if(!empty($obj) && method_exists($obj, 'LieferscheinSeriennummernberechnen')) {
- $obj->LieferscheinSeriennummernberechnen($id);
- }
-}
+ function LieferscheinSeriennummernberechnen($id)
+ {
+ /** @var Seriennummern $obj */
+ $obj = $this->LoadModul('seriennummern');
+ if(!empty($obj) && method_exists($obj, 'LieferscheinSeriennummernberechnen')) {
+ $obj->LieferscheinSeriennummernberechnen($id);
+ }
+ }
+
+ function SeriennummernCheckBenachrichtigung(int $artikel_id) {
+ $obj = $this->LoadModul('seriennummern');
+ return($obj->seriennummern_check_and_notification_stock_added($artikel_id));
+ }
+
+ function SeriennummernCheckLieferscheinBenachrichtigung(int $lieferschein_id) {
+ $obj = $this->LoadModul('seriennummern');
+ return($obj->seriennummern_check_and_notification_delivery_note($lieferschein_id));
+ }
+
+ function SeriennummernCheckLieferscheinWarnung(int $lieferschein_id) {
+ $obj = $this->LoadModul('seriennummern');
+ return($obj->seriennummern_check_and_message_delivery_notes($lieferschein_id));
+ }
+
+ function SeriennummernCheckLieferschein($lieferschein_id = null, $ignore_date = false, $only_missing = true, $group_lieferschein = false) {
+ $obj = $this->LoadModul('seriennummern');
+ return ($obj->seriennummern_check_delivery_notes($lieferschein_id, $ignore_date, $only_missing, $group_lieferschein));
+ }
+
+ function SeriennummernCheckWareneingangWarnung(int $wareneingang_id) {
+ $obj = $this->LoadModul('seriennummern');
+ return($obj->seriennummern_check_and_message_incoming_goods($wareneingang_id));
+ }
+
+ function SeriennummernCheckWareneingang($wareneingang_id = null, $ignore_date = false, $only_missing = true, $group_wareneingang = false) {
+ $obj = $this->LoadModul('seriennummern');
+ return ($obj->seriennummern_check_incoming_goods($wareneingang_id, $ignore_date, $only_missing, $group_wareneingang));
+ }
+
// @refactor in Lager Modul
function ArtikelAnzahlLagerPlatzMitSperre($artikel,$lager_platz)
@@ -2517,7 +2550,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu
}
if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id']))
{
- $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1");
+// Xentral Legacy $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1");
}elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){
$this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1");
}
@@ -2544,7 +2577,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu
}
if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id']))
{
- $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1");
+// Xentral Legacy $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1");
}elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){
$this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1");
}
@@ -2570,7 +2603,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu
}
if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id']))
{
- $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1");
+// Xentral Legacy $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1");
}elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){
$this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1");
}
@@ -2579,7 +2612,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu
}else{
if(isset($v['table']) && $v['table'] == 'seriennummern' && !empty($v['id']))
{
- $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1");
+// Xentral Legacy $this->app->DB->Delete("DELETE FROM seriennummern WHERE id = '".$v['id']."' LIMIT 1");
}elseif(isset($v['table']) && $v['table'] == 'beleg_chargesnmhd' && !empty($v['id'])){
$this->app->DB->Delete("DELETE FROM beleg_chargesnmhd WHERE id = '".$v['id']."' LIMIT 1");
}
@@ -3158,6 +3191,7 @@ function LieferscheinEinlagern($id,$grund="Lieferschein Einlagern", $lpiids = nu
}
$this->RunHook('erpapi_lieferschein_auslagern', 1, $lieferschein);
+ $this->SeriennummernCheckLieferscheinWarnung($lieferschein, true);
$this->LieferscheinProtokoll($lieferschein,"Lieferschein ausgelagert");
}
}
@@ -20047,6 +20081,8 @@ function ChargenMHDAuslagern($artikel, $menge, $lagerplatztyp, $lpid,$typ,$wert,
}
$this->RunHook('LagerEinlagern_after',7, $artikel, $menge, $regal, $projekt, $grund, $doctype,$doctypeid);
+
+ $this->SeriennummernCheckBenachrichtigung($artikel);
}
function CreateLagerPlatzInhaltVPE($artikel, $menge, $gewicht, $laenge, $breite, $hoehe, $menge2 = 0, $gewicht2 = 0, $laenge2 = 0, $breite2 = 0, $hoehe2 = 0)
@@ -33999,10 +34035,10 @@ function Firmendaten($field,$projekt="")
* Recalculate payment status and skonto
* using module rechnung
*/
- public function rechnung_zahlstatus_berechnen() {
+ public function rechnung_zahlstatus_berechnen($id = null) {
$rechnung = $this->app->loadModule('rechnung', false);
if($rechnung !== null && method_exists($rechnung, 'rechnung_zahlstatus_berechnen')) {
- return $rechnung->rechnung_zahlstatus_berechnen();
+ return $rechnung->rechnung_zahlstatus_berechnen($id);
}
}
@@ -39170,7 +39206,7 @@ function Firmendaten($field,$projekt="")
}
return $sipuid;
}
-}
+} // END erpAPI
function parse_csv($str,$parse_split_parameter="")
diff --git a/www/lib/class.versanddienstleister.php b/www/lib/class.versanddienstleister.php
index d9aa1b82..7bd7b48f 100644
--- a/www/lib/class.versanddienstleister.php
+++ b/www/lib/class.versanddienstleister.php
@@ -1,6 +1,6 @@
doctype="bestellung";
$this->doctypeOrig="Bestellung";
$this->bestellungohnepreis=0;
- parent::__construct($this->app,$projekt);
+ parent::__construct($this->app,$projekt,Array('kleinunternehmer' => 'ignore')); // Fix for ignoring kleinunternehmer 0 or false does not work because of function getStyleElement($key) (class.briefpapier.php)
}
diff --git a/www/lib/dokumente/class.briefpapier.php b/www/lib/dokumente/class.briefpapier.php
index c858d917..368d0934 100644
--- a/www/lib/dokumente/class.briefpapier.php
+++ b/www/lib/dokumente/class.briefpapier.php
@@ -304,6 +304,36 @@ class Briefpapier extends SuperFPDF {
public function GetChargeMHDSNString($type,$doctype,$doctypeid,$posid, $returnSimpleString = false)
{
+
+
+ switch ($type) {
+ case 'sn':
+ $sql = "SELECT
+ s.seriennummer
+ FROM
+ seriennummern s
+ INNER JOIN
+ seriennummern_beleg_position slp ON slp.beleg_typ = 'lieferschein' AND slp.seriennummer = s.id
+ WHERE
+ slp.beleg_position = $posid
+ ";
+ $values = (array) $this->app->DB->SelectArr($sql);
+ return(implode(', ',array_column($values,'seriennummer')));
+ break;
+ }
+
+ if(!empty($values)){
+ if($returnSimpleString) {
+ return implode(', ', $values);
+ }
+ return implode("\r\n",$values);
+ }
+ return '';
+
+
+// XENTRAL Legacy
+/*
+
$lieferschein_posid = 0;
$auftrag_position_id = 0;
$lieferschein = 0;
@@ -557,6 +587,7 @@ class Briefpapier extends SuperFPDF {
return implode("\r\n",$tmp_string);
}
return '';
+*/
}
function CheckPosition($value,$doctype,$doctypeid,$posid)
@@ -2336,7 +2367,7 @@ class Briefpapier extends SuperFPDF {
if(isset($this->textDetails['footer'])) {
$freitext = $this->getStyleElement('freitext');
- if($this->getStyleElement("kleinunternehmer"))
+ if($this->getStyleElement("kleinunternehmer") == '1')
{
if($this->textDetails['footer']=="") $this->textDetails['footer'] ="Als Kleinunternehmer im Sinne von §19 Abs.1 UStG wird Umsatzsteuer nicht berechnet!";
else $this->textDetails['footer'] .="\r\nAls Kleinunternehmer im Sinne von § 19 Abs. 1 UStG wird Umsatzsteuer nicht berechnet!";
@@ -3303,6 +3334,10 @@ class Briefpapier extends SuperFPDF {
}
}
+ // OpenXE Seriennummern
+
+
+
if(!empty($this->doctype) && !empty($this->id) && strpos($item['desc'], '{') !== false) {
$item['desc'] = $this->app->erp->ParseUserVars($this->doctype, $this->id ,$item['desc']);
}
diff --git a/www/lib/versandarten/dhl.php b/www/lib/versandarten/dhl.php
index 9ed5e7ee..d5c0fc16 100644
--- a/www/lib/versandarten/dhl.php
+++ b/www/lib/versandarten/dhl.php
@@ -1,7 +1,7 @@
api->GetTrackingStatus($tracking);
+ } catch (SendcloudApiException) {
+ return null;
+ }
+ }
+
}
diff --git a/www/pages/ajax.php b/www/pages/ajax.php
index c57e5204..410d715b 100644
--- a/www/pages/ajax.php
+++ b/www/pages/ajax.php
@@ -2608,6 +2608,35 @@ select a.kundennummer, (SELECT name FROM adresse a2 WHERE a2.kundennummer = a.ku
$newarr[] = $arr[$i]['name'];
}
break;
+ case "seriennummerverfuegbar":
+ $artikel = (int)$this->app->Secure->GetGET('artikel');
+ $lieferschein = (int)$this->app->Secure->GetGET('lieferschein');
+
+ $sql = "
+ SELECT DISTINCT
+ s.seriennummer
+ FROM
+ seriennummern s
+ INNER JOIN
+ lieferschein_position lp ON lp.artikel = s.artikel
+ WHERE
+ s.eingelagert = 1
+ AND s.seriennummer LIKE '%$term%'
+ AND (s.artikel = '$artikel' OR '$artikel' = '0')
+ LIMIT 20
+ ";
+
+ //echo($sql);
+
+ $arr = $this->app->DB->SelectArr($sql);
+
+ $carr = !empty($arr)?count($arr):0;
+ for($i = 0; $i < $carr; $i++) {
+ $newarr[] = $arr[$i]['seriennummer'];
+ }
+ break;
+
+ break;
case "artikelmengeinbeleg":
$beleg = $this->app->Secure->GetGet('beleg');
$belegid = $this->app->Secure->GetGet('id');
diff --git a/www/pages/artikel.php b/www/pages/artikel.php
index 1d201002..21baba30 100644
--- a/www/pages/artikel.php
+++ b/www/pages/artikel.php
@@ -7204,6 +7204,9 @@ class Artikel extends GenArtikel {
$this->app->erp->MenuEintrag("index.php?module=artikel&action=lager&id=$id",'Lager');
}
+ if ($tmp[0]['seriennummern'] <> 'keine') {
+ $this->app->erp->MenuEintrag("index.php?module=seriennummern&action=nummern_list&artikel=$id&from=artikel",'Seriennummern');
+ }
if($tmp[0]['mindesthaltbarkeitsdatum']=='1' && $tmp[0]['chargenverwaltung']<=0)
{
diff --git a/www/pages/auftrag.php b/www/pages/auftrag.php
index df5f3517..27d0e000 100644
--- a/www/pages/auftrag.php
+++ b/www/pages/auftrag.php
@@ -5716,6 +5716,7 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '.
);
$this->app->erp->ANABREGSNeuberechnen($rechnung,"rechnung");
+ $this->app->erp->rechnung_zahlstatus_berechnen($id);
$this->app->erp->PDFArchivieren("rechnung",$rechnung);
}
}
@@ -5794,6 +5795,8 @@ Die Gesamtsumme stimmt nicht mehr mit ursprünglich festgelegten Betrag '.
$nurRestmenge
);
+ $this->app->erp->SeriennummernCheckLieferscheinBenachrichtigung($lieferschein);
+
$sql = "SELECT id FROM kommissionierung k WHERE k.auftrag = '".$id."'";
$vorkommissionierung = $this->app->DB->Select($sql);
diff --git a/www/pages/content/einlagern.tpl b/www/pages/content/einlagern.tpl
index b39ec8be..9f7449a9 100644
--- a/www/pages/content/einlagern.tpl
+++ b/www/pages/content/einlagern.tpl
@@ -24,8 +24,6 @@
[SHOWCHRSTART]