From a5be2e984a1ba286b89221d5d6d830b42e94e6e0 Mon Sep 17 00:00:00 2001
From: OpenXE <>
Date: Wed, 25 Oct 2023 13:26:52 +0200
Subject: [PATCH] versandpakete improvements, added lieferungen view
---
phpwf/plugins/class.yui.php | 8 +-
www/lib/class.erpapi.php | 2 +-
www/pages/content/versandpakete_lieferung.tpl | 50 ++
www/pages/versandpakete.php | 457 +++++++++++++-----
www/themes/new/css/color3.css | 3 +-
www/themes/new/css/styles.css | 11 +-
www/themes/new/images/lagergo_stop_teil.png | Bin 0 -> 10317 bytes
www/themes/new/images/lagergo_teil.png | Bin 0 -> 11224 bytes
8 files changed, 400 insertions(+), 131 deletions(-)
create mode 100644 www/pages/content/versandpakete_lieferung.tpl
create mode 100644 www/themes/new/images/lagergo_stop_teil.png
create mode 100644 www/themes/new/images/lagergo_teil.png
diff --git a/phpwf/plugins/class.yui.php b/phpwf/plugins/class.yui.php
index 58a89a4d..c06f3ab2 100644
--- a/phpwf/plugins/class.yui.php
+++ b/phpwf/plugins/class.yui.php
@@ -3642,7 +3642,7 @@ class YUI {
$lieferschein_kein = "
app->Conf->WFconf['defaulttheme']}/images/summe_stop.png\" title=\"Kein Lieferschein\" border=\"0\" style=\"margin-right:1px\">";
$lieferschein_ohne_pos = "
app->Conf->WFconf['defaulttheme']}/images/summe_go.png\" title=\"Lieferschein ohne Positionen\" border=\"0\" style=\"margin-right:1px\">";
$lieferschein_voll = "
app->Conf->WFconf['defaulttheme']}/images/lagergo.png\" title=\"Lieferschein vollständig\" border=\"0\" style=\"margin-right:1px\">";
- $lieferschein_teil = "
app->Conf->WFconf['defaulttheme']}/images/lagergo_stop.png\" title=\"Lieferschein teilweise\" border=\"0\" style=\"margin-right:1px\">";
+ $lieferschein_teil = "
app->Conf->WFconf['defaulttheme']}/images/lagergo_teil.png\" title=\"Lieferschein teilweise\" border=\"0\" style=\"margin-right:1px\">";
$versendet = "
app->Conf->WFconf['defaulttheme']}/images/liefersperrego.png\" title=\"Versendet\" border=\"0\" style=\"margin-right:1px\">";
$versendet_nicht = "
app->Conf->WFconf['defaulttheme']}/images/liefersperrestop.png\" title=\"Nicht versendet\" border=\"0\" style=\"margin-right:1px\">";
@@ -3693,10 +3693,10 @@ class YUI {
}
function IconsSQL_lieferung() {
- $lieferschein_kein = "
app->Conf->WFconf['defaulttheme']}/images/summe_stop.png\" title=\"Kein Lieferschein\" border=\"0\" style=\"margin-right:1px\">";
+ $lieferschein_kein = "
app->Conf->WFconf['defaulttheme']}/images/lagerstop.png\" title=\"Keine Artikel\" border=\"0\" style=\"margin-right:1px\">";
$lieferschein_ohne_pos = "
app->Conf->WFconf['defaulttheme']}/images/summe_go.png\" title=\"Lieferschein ohne Positionen\" border=\"0\" style=\"margin-right:1px\">";
- $lieferschein_voll = "
app->Conf->WFconf['defaulttheme']}/images/lagergo.png\" title=\"Lieferschein vollständig\" border=\"0\" style=\"margin-right:1px\">";
- $lieferschein_teil = "
app->Conf->WFconf['defaulttheme']}/images/lagergo_stop.png\" title=\"Lieferschein teilweise\" border=\"0\" style=\"margin-right:1px\">";
+ $lieferschein_voll = "
app->Conf->WFconf['defaulttheme']}/images/lagergo.png\" title=\"Artikel vollständig\" border=\"0\" style=\"margin-right:1px\">";
+ $lieferschein_teil = "
app->Conf->WFconf['defaulttheme']}/images/lagergo_stop.png\" title=\"Artikel teilweise\" border=\"0\" style=\"margin-right:1px\">";
$versendet = "
app->Conf->WFconf['defaulttheme']}/images/liefersperrego.png\" title=\"Versendet\" border=\"0\" style=\"margin-right:1px\">";
$versendet_nicht = "
app->Conf->WFconf['defaulttheme']}/images/liefersperrestop.png\" title=\"Nicht versendet\" border=\"0\" style=\"margin-right:1px\">";
diff --git a/www/lib/class.erpapi.php b/www/lib/class.erpapi.php
index b9ba007f..dae90b63 100644
--- a/www/lib/class.erpapi.php
+++ b/www/lib/class.erpapi.php
@@ -7110,7 +7110,7 @@ title: 'Abschicken',
$navarray['menu']['admin'][++$menu]['first'] = array('Logistik','lager','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Wareneingang','wareneingang','list');
$navarray['menu']['admin'][$menu]['sec'][] = array('Lieferschein','lieferschein','list');
- $navarray['menu']['admin'][$menu]['sec'][] = array('Versand','versandpakete','list');
+ $navarray['menu']['admin'][$menu]['sec'][] = array('Versand','versandpakete','lieferungen');
$navarray['menu']['admin'][$menu]['sec'][] = array('Lagerverwaltung','lager','list');
if($this->ModulVorhanden('lagermobil')) {
$navarray['menu']['admin'][$menu]['sec'][] = array('Mobile Lagerverwaltung','lagermobil','list');
diff --git a/www/pages/content/versandpakete_lieferung.tpl b/www/pages/content/versandpakete_lieferung.tpl
new file mode 100644
index 00000000..78a322f1
--- /dev/null
+++ b/www/pages/content/versandpakete_lieferung.tpl
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ [MESSAGE]
+
+ [TAB1NEXT]
+
+
+
+
diff --git a/www/pages/versandpakete.php b/www/pages/versandpakete.php
index 3a2d4f81..94ebacb2 100644
--- a/www/pages/versandpakete.php
+++ b/www/pages/versandpakete.php
@@ -28,6 +28,16 @@ class Versandpakete {
lieferschein_ohne_pos <> 0
";
+ const SQL_VERSANDPAKETE_LIEFERSCHEIN_WITH_POS = "
+ SELECT DISTINCT
+ versandpaket,
+ lieferschein
+ FROM
+ versandpaket_lieferschein_position vlp
+ INNER JOIN lieferschein_position lp ON
+ vlp.lieferschein_position = lp.id
+ ";
+
function __construct($app, $intern = false) {
$this->app = $app;
if ($intern)
@@ -38,7 +48,8 @@ class Versandpakete {
$this->app->ActionHandler("create", "versandpakete_edit"); // This automatically adds a "New" button
$this->app->ActionHandler("edit", "versandpakete_edit");
$this->app->ActionHandler("add", "versandpakete_add");
- $this->app->ActionHandler("pakete", "versandpakete_pakete");
+ $this->app->ActionHandler("lieferungen", "versandpakete_lieferungen");
+ $this->app->ActionHandler("lieferung", "versandpakete_lieferung");
$this->app->ActionHandler("stapelverarbeitung", "versandpakete_stapelverarbeitung");
$this->app->ActionHandler("paketmarke", "versandpakete_paketmarke");
$this->app->ActionHandler("delete", "versandpakete_delete");
@@ -54,16 +65,23 @@ class Versandpakete {
}
static function TableSearch(&$app, $name, $erlaubtevars) {
+ $lieferschein_filter = null;
switch ($name) {
+ case "lieferung_versandpakete_list":
+ $lieferschein_filter = $app->User->GetParameter('versandpakete_lieferschein_filter');
+ if ($lieferschein_filter) {
+ $lieferschein_filter_where = "WHERE lieferschein = ".$lieferschein_filter;
+ }
+ // break omitted intentionally
case "versandpakete_list":
$allowed['versandpakete_list'] = array('list');
- $heading = array('', '', 'Paket-Nr.','Datum','Adresse', 'Lieferschein', 'Versandart', 'Tracking', 'Menge auf Lieferscheinen', 'Menge', 'Gewicht','Versender', 'Bemerkung', 'Status', 'Monitor', 'Menü');
- $width = array( '1%','1%','1%', '1%', '10%', '1%', '2%', '2%', '1%', '1%', '1%', '2%', '10%', '1%', '1%', '1%');
+ $heading = array('', '', 'Paket-Nr.','Datum','Adresse', 'Lieferschein', 'Versandart', 'Tracking', 'Menge auf Lieferscheinen', 'Menge', 'Gewicht','Versender', 'Bemerkung', 'Status', 'Monitor', 'Menü', '');
+ $width = array( '1%','1%','1%', '1%', '10%', '1%', '2%', '2%', '1%', '1%', '1%', '2%', '10%', '1%', '1%', '1%', '1%');
// columns that are aligned right (numbers etc)
// $alignright = array(4,5,6,7,8);
- $findcols = array('id','id','id','datum','name','if (lieferscheine IS NULL, lieferscheine_ohne_pos, lieferscheine)','versandart','tracking','lmenge','vmenge','gewicht','versender','bemerkung','status','id','id');
+ $findcols = array('id','id','id','datum','name','lieferscheine','versandart','tracking','lmenge','vmenge','gewicht','versender','bemerkung','status','id','id');
$searchsql = array('name', 'if (lieferscheine IS NULL, lieferscheine_ohne_pos, lieferscheine)', 'tracking', 'bemerkung');
$defaultorder = 1;
@@ -72,10 +90,23 @@ class Versandpakete {
$dropnbox = "'
' AS `open`, CONCAT('') AS `auswahl`";
- $menu = "";
+ $menu = "";
$menucol = 1;
$moreinfo = true; // Allow drop down details
+ $menu_link = array(
+ '',
+ "
Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\">",
+ '',
+ " 'id'],
+ "\");>" . "
Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">"
+ );
+
$lieferschein_link = array(
' 'v.tracking_link'],
+ ['sql' => 'tracking_link'],
'">',
- ['sql' => 'v.tracking'],
+ ['sql' => 'tracking'],
''
- );
+ );
- $sql = "SELECT SQL_CALC_FOUND_ROWS
- id,
- $dropnbox,
- id,
- datum_format,
- if (lieferscheine IS NULL,alop_name,name) as name,
- if (lieferscheine IS NULL, lieferscheine_ohne_pos, lieferscheine) as belegnr,
- versandart,
+ $sql_lieferschein_mengen = "
+ SELECT
+ l.id,
+ l.belegnr,
+ l.adresse,
+ l.name,
+ SUM(lp.menge) lmenge
+ FROM
+ lieferschein_position lp
+ INNER JOIN
+ lieferschein l ON l.id = lp.lieferschein
+ INNER JOIN
+ artikel a ON a.id = lp.artikel
+ WHERE
+ a.lagerartikel
+ GROUP BY l.id
+ ";
+
+ $sql_pakete_zu_lieferschein = "
+ SELECT
+ v.id,
+ v.datum,
+ v.lieferschein_ohne_pos,
+ v.versandart,
+ v.tracking_link,
+ v.tracking,
+ v.gewicht,
+ v.versender,
+ v.bemerkung,
+ v.status,
+ lp.lieferschein,
+ SUM(vlp.menge) AS vmenge
+ FROM
+ versandpakete v
+ LEFT JOIN
+ versandpaket_lieferschein_position vlp ON vlp.versandpaket = v.id
+ LEFT JOIN
+ lieferschein_position lp ON vlp.lieferschein_position = lp.id
+ GROUP BY v.id, lp.lieferschein
+ ";
+
+ $sql = "
+ SELECT SQL_CALC_FOUND_ROWS
+ id,
+ ".$dropnbox.",
+ id id2,
+ ".$app->erp->FormatDateShort("datum").",
+ name,
+ lieferscheine,
+ versandart,
+ ".$app->erp->ConcatSQL($tracking_link)." AS tracking,
+ lmenge,
+ vmenge,
+ gewicht,
+ versender,
+ bemerkung,
+ status,
+ ".$app->YUI->IconsSQL_versandpaket()." icons,
+ ".$app->erp->ConcatSQL($menu_link)." AS paket_edit,
+ id,
+ id
+ FROM (
+ SELECT
+ v.id,
+ v.datum,
+ if(lop.id IS NOT NULL,lop.name,l.name) AS name,
+ if(lop.id IS NOT NULL,".$app->erp->ConcatSQL($lieferschein_ohne_pos_link).", GROUP_CONCAT(".$app->erp->ConcatSQL($lieferschein_link)." SEPARATOR ', ')) AS lieferscheine,
+ v.versandart,
+ tracking,
tracking_link,
- lmenge,
- vmenge,
- gewicht,
- versender,
- bemerkung,
- status,
- ".$app->YUI->IconsSQL_versandpaket().",
- id,
- datum
- FROM
- (
- SELECT
- v.id,
- ".$app->erp->FormatDateShort('v.datum')." AS datum_format,
- v.datum,
- a.name,
- alop.name alop_name,
- GROUP_CONCAT(DISTINCT ".$app->erp->ConcatSQL($lieferschein_link)." SEPARATOR ', ') as lieferscheine,
- v.lieferschein_ohne_pos,
- GROUP_CONCAT(DISTINCT ".$app->erp->ConcatSQL($lieferschein_ohne_pos_link)." SEPARATOR ', ') as lieferscheine_ohne_pos,
- ".$app->erp->FormatUCfirst('v.versandart')." as versandart,
- ".$app->erp->ConcatSQL($tracking_link)." as tracking_link,
- tracking,
- ".$app->erp->FormatMenge('SUM(lp.menge)')." as lmenge,
- ".$app->erp->FormatMenge('SUM(vlp.menge)')." AS vmenge,
- v.gewicht,
- v.versender,
- v.bemerkung,
- v.status
- FROM
- versandpakete v
- LEFT JOIN
- versandpaket_lieferschein_position vlp ON vlp.versandpaket = v.id
- LEFT JOIN
- lieferschein_position lp ON vlp.lieferschein_position = lp.id
- LEFT JOIN
- lieferschein l ON lp.lieferschein = l.id
- LEFT JOIN
- adresse a ON a.id = l.adresse
- LEFT JOIN
- lieferschein lop ON v.lieferschein_ohne_pos = lop.id
- LEFT JOIN
- adresse alop ON lop.adresse = alop.id
- GROUP BY v.id
- ) temp
- ";
+ ".$app->erp->FormatMenge("SUM(l.lmenge)")." AS lmenge,
+ ".$app->erp->FormatMenge("SUM(v.vmenge)")." AS vmenge,
+ v.gewicht,
+ v.versender,
+ v.bemerkung,
+ v.status,
+ lieferschein_ohne_pos
+ FROM
+ (".$sql_pakete_zu_lieferschein.") AS v
+ LEFT JOIN
+ (".$sql_lieferschein_mengen.") as l
+ ON v.lieferschein = l.id
+ LEFT JOIN
+ lieferschein lop ON lop.id = v.lieferschein_ohne_pos
+ ".$lieferschein_filter_where."
+ GROUP BY
+ v.id
+ ) final
+ ";
- $where = "((status IN ('neu', 'versendet')";
- // Toggle filters
- $app->Tpl->Add('JQUERYREADY', "$('#geschlossene').click( function() { fnFilterColumn1( 0 ); } );");
- $app->Tpl->Add('JQUERYREADY', "$('#stornierte').click( function() { fnFilterColumn2( 0 ); } );");
+ if (!$lieferschein_filter) {
+ $where = "((status IN ('neu', 'versendet')";
+ // Toggle filters
+ $app->Tpl->Add('JQUERYREADY', "$('#geschlossene').click( function() { fnFilterColumn1( 0 ); } );");
+ $app->Tpl->Add('JQUERYREADY', "$('#stornierte').click( function() { fnFilterColumn2( 0 ); } );");
- for ($r = 1;$r <= 2;$r++) {
- $app->Tpl->Add('JAVASCRIPT', '
- function fnFilterColumn' . $r . ' ( i )
- {
- if(oMoreData' . $r . $name . '==1)
- oMoreData' . $r . $name . ' = 0;
- else
- oMoreData' . $r . $name . ' = 1;
+ for ($r = 1;$r <= 2;$r++) {
+ $app->Tpl->Add('JAVASCRIPT', '
+ function fnFilterColumn' . $r . ' ( i )
+ {
+ if(oMoreData' . $r . $name . '==1)
+ oMoreData' . $r . $name . ' = 0;
+ else
+ oMoreData' . $r . $name . ' = 1;
- $(\'#' . $name . '\').dataTable().fnFilter(
- \'\',
- i,
- 0,0
- );
- }
- ');
- }
+ $(\'#' . $name . '\').dataTable().fnFilter(
+ \'\',
+ i,
+ 0,0
+ );
+ }
+ ');
+ }
- $more_data1 = $app->Secure->GetGET("more_data1");
- if ($more_data1 == 1) {
- $where .= " OR status IN ('abgeschlossen'))";
+ $more_data1 = $app->Secure->GetGET("more_data1");
+ if ($more_data1 == 1) {
+ $where .= " OR status IN ('abgeschlossen'))";
+ } else {
+ $where .= " )";
+ }
+
+ $more_data2 = $app->Secure->GetGET("more_data2");
+ if ($more_data2 == 1) {
+ $where .= " OR status IN ('storniert'))";
+ }
+ else {
+ $where .= " )";
+ }
+ // END Toggle filters
+
+
} else {
- $where .= " )";
+ $where = "1";
}
- $more_data2 = $app->Secure->GetGET("more_data2");
- if ($more_data2 == 1) {
- $where .= " OR status IN ('storniert'))";
- }
- else {
- $where .= " )";
- }
- // END Toggle filters
-
- $count = "SELECT count(DISTINCT id) FROM versandpakete v";
+ $count = "SELECT count(DISTINCT id) FROM versandpakete v WHERE ".$where;
$groupby = "";
break;
@@ -204,13 +275,13 @@ class Versandpakete {
$allowed['versandpakete_lieferscheine'] = array('lieferscheine');
- $heading = array('', '', 'Lieferschein', 'Adresse','Menge','Menge in Versandpaketen','Monitor','Paket erstellen');
- $width = array( '1%','1%', '10%', '10%', '10%', '10%' ,'1%', '1%'); // Fill out manually later
+ $heading = array('', '', 'Lieferschein', 'Adresse','Menge','Menge in Versandpaketen','Monitor','Pakete','Paket erstellen');
+ $width = array( '1%','1%', '10%', '10%', '10%', '10%', '1%', '1%', '1%'); // Fill out manually later
// columns that are aligned right (numbers etc)
// $alignright = array(4,5,6,7,8);
- $findcols = array('id','id','belegnr','name','lmenge','vmenge','(alle_versendet+alle_abgeschlossen*2)','id');
+ $findcols = array('id','id','belegnr','name','lmenge','vmenge','(alle_versendet+alle_abgeschlossen*2)','id','id');
$searchsql = array('belegnr','name');
$defaultorder = 1;
@@ -220,9 +291,9 @@ class Versandpakete {
$menucol = 1;
$moreinfoaction = "lieferschein";
$moreinfo = true; // Allow drop down details
- $aligncenter = [5,6,7,8];
+ $aligncenter = [5,6,7,8,9,10];
- $menu = "
Conf->WFconf['defaulttheme']}/images/forward.svg\" border=\"0\">";
+ $menu = "
Conf->WFconf['defaulttheme']}/images/add.png\" border=\"0\">";
$sql_lieferschein_position = "
SELECT
@@ -272,8 +343,9 @@ class Versandpakete {
CONCAT('',belegnr,''),
name,
".$app->erp->FormatMenge("lmenge").",
- ".$app->erp->FormatMenge("vmenge").",
+ ".$app->erp->FormatMenge("vmenge").",
".$app->YUI->IconsSQL_lieferung().",
+ CONCAT('
Conf->WFconf['defaulttheme']}/images/forward.svg\" border=\"0\">'),
id,
alle_abgeschlossen
FROM (
@@ -314,7 +386,7 @@ class Versandpakete {
}
$more_data2 = $app->Secure->GetGET("more_data2");
if ($more_data2 == 1) {
- $where .= " AND (alle_versendet)";
+ $where .= " AND (alle_versendet | eins_versendet)";
} else {
}
@@ -462,13 +534,11 @@ class Versandpakete {
}
function versandpakete_menu() {
- $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=list", "Lieferungen");
- $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=pakete", "Versandpakete");
- $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=create", "Neu anlegen");
+ $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=lieferungen", "Lieferungen");
+ $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=list", "Versandpakete");
}
- function versandpakete_pakete() {
- $this->versandpakete_menu();
+ function versandpakete_status_select() {
// Status select
$options_text = "";
foreach (self::STATUS as $status)
@@ -476,6 +546,12 @@ class Versandpakete {
$options_text .= "";
}
$this->app->Tpl->Set('STATUS_OPTIONS', $options_text);
+ }
+
+ function versandpakete_list() {
+ $this->versandpakete_menu();
+ $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=create", "Neu anlegen");
+ $this->versandpakete_status_select();
$this->app->YUI->TableSearch('TAB1', 'versandpakete_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "versandpakete_list.tpl");
}
@@ -501,12 +577,48 @@ class Versandpakete {
$this->versandpakete_list();
}
- function versandpakete_list() {
+ function versandpakete_lieferungen() {
$this->versandpakete_menu();
$this->app->YUI->TableSearch('TAB1', 'versandpakete_lieferscheine', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "versandpakete_lieferungen.tpl");
}
+ function versandpakete_lieferung() {
+ $lieferschein_filter = (int) $this->app->Secure->GetGET('id');
+ $this->versandpakete_menu();
+ $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=add&lieferschein=".$lieferschein_filter, "Neu anlegen");
+ $this->app->User->SetParameter('versandpakete_lieferschein_filter',$lieferschein_filter);
+ $this->versandpakete_status_select();
+
+ $sql = "SELECT
+ versandpaket,
+ belegnr,
+ l.name
+ FROM
+ versandpaket_lieferschein_position vlp
+ INNER JOIN
+ lieferschein_position lp ON lp.id = vlp.lieferschein_position
+ INNER JOIN
+ lieferschein l ON l.id = lp.lieferschein
+ WHERE l.id = ".$lieferschein_filter." LIMIT 1";
+
+ $info = $this->app->DB->SelectArr($sql);
+
+ $this->app->Tpl->Set('BELEGNR', $info[0]['belegnr']);
+
+ $this->app->Tpl->SetText('KURZUEBERSCHRIFT2', $info[0]['name']." Lieferung ".$info[0]['belegnr']);
+
+ if ($this->versandpakete_check_completion($info[0]['versandpaket'])) {
+ $this->app->Tpl->addMessage('success', 'Lieferung vollständig in Paketen.', false, 'MESSAGE');
+ }
+ else {
+ $this->app->Tpl->addMessage('info', 'Lieferung unvollständig.', false, 'MESSAGE');
+ }
+
+ $this->app->YUI->TableSearch('TAB1', 'lieferung_versandpakete_list', "show", "", "", basename(__FILE__), __CLASS__);
+ $this->app->Tpl->Parse('PAGE', "versandpakete_lieferung.tpl");
+ }
+
public function versandpakete_delete() {
$id = (int) $this->app->Secure->GetGET('id');
@@ -533,10 +645,14 @@ class Versandpakete {
function versandpakete_edit() {
+ $id = $this->app->Secure->GetGET('id');
+ $lieferung = $this->app->Secure->GetGET('lieferung');
+
+ if ($lieferung) {
+ $this->app->erp->MenuEintrag("index.php?module=versandpakete&action=lieferung&id=".$lieferung, "Zurück");
+ }
$this->versandpakete_menu();
- $id = $this->app->Secure->GetGET('id');
-
// Check if other users are editing this id
if($this->app->erp->DisableModul('versandpakete',$id))
{
@@ -696,6 +812,13 @@ class Versandpakete {
$icons = $this->app->DB->SelectArr($sql);
$this->app->Tpl->Set('ICONS', $icons[0]['icons']);
+ if ($this->versandpakete_check_completion($id)) {
+ $this->app->Tpl->addMessage('success', 'Lieferung vollständig in Paketen.', false, 'MESSAGE');
+ }
+ else {
+ $this->app->Tpl->addMessage('info', 'Lieferung unvollständig.', false, 'MESSAGE');
+ }
+
$this->app->YUI->TableSearch('PAKETINHALT', 'versandpakete_paketinhalt_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "versandpakete_edit.tpl");
}
@@ -780,16 +903,14 @@ class Versandpakete {
foreach($lieferschein_positionen as $lieferschein_position) {
$restmenge = $lieferschein_position['lp_menge']-$lieferschein_position['v_menge'];
- if ($restmenge <= 0) {
+ if ($restmenge <= 0 || $menge <= 0) {
continue;
}
-
if ($menge > $restmenge) {
$buchmenge = $restmenge;
} else {
$buchmenge = $menge;
- }
-
+ }
$buchmenge_gesamt += $buchmenge;
$menge -= $buchmenge;
@@ -825,14 +946,21 @@ class Versandpakete {
$msg = "Keine passende Lieferscheinposition gefunden.
";
break;
}
-
+ $buchmenge_gesamt = 0;
foreach($lieferschein_positionen as $lieferschein_position) {
- $buchmenge = $lieferschein_position['lp_menge']-$lieferschein_position['v_menge'];
+ $buchmenge = $lieferschein_position['lp_menge']-$lieferschein_position['v_menge'];
+ if ($buchmenge <= 0) {
+ continue;
+ }
+ $buchmenge_gesamt += $buchmenge;
$sql = "INSERT INTO versandpaket_lieferschein_position (versandpaket, lieferschein_position, menge) VALUES (".$id.",".$lieferschein_position['lp_id'].",".$buchmenge.") ON DUPLICATE KEY UPDATE menge = menge+'".$buchmenge."'";
$this->app->DB->Insert($sql);
}
- $msg = $this->app->erp->base64_url_encode("Lieferschein hinzugefügt.
");
- header("Location: index.php?module=versandpakete&action=edit&id=".$id."&msg=$msg");
+
+ if ($buchmenge_gesamt > 0) {
+ $msg = $this->app->erp->base64_url_encode("Lieferschein hinzugefügt.
");
+ header("Location: index.php?module=versandpakete&action=edit&id=".$id."&msg=$msg");
+ }
break;
}
@@ -846,12 +974,94 @@ class Versandpakete {
$this->app->User->SetParameter('versandpakete_lieferschein', $lieferschein);
$this->app->User->SetParameter('versandpakete_versandpaket', $id);
+ if ($this->versandpakete_check_completion($id)) {
+ $this->app->Tpl->addMessage('success', 'Lieferung vollständig in Paketen.', false, 'MESSAGE');
+ }
+ else {
+ $this->app->Tpl->addMessage('info', 'Lieferung unvollständig.', false, 'MESSAGE');
+ }
+
$this->app->YUI->TableSearch('LIEFERSCHEININHALT', 'versandpakete_lieferschein_paket_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->YUI->TableSearch('PAKETINHALT', 'versandpakete_paketinhalt_list', "show", "", "", basename(__FILE__), __CLASS__);
- $this->app->Tpl->Set('MESSAGE', $msg);
+ $this->app->Tpl->Add('MESSAGE', $msg);
$this->app->Tpl->Parse('PAGE', "versandpakete_add.tpl");
}
+ function versandpakete_check_completion($id) : bool {
+ $sql_lieferschein = "
+ SELECT DISTINCT
+ lieferschein
+ FROM
+ versandpaket_lieferschein_position vlp
+ INNER JOIN lieferschein_position lp ON vlp.lieferschein_position = lp.id
+ WHERE versandpaket = ".$id;
+
+ $sql_lieferschein_mengen = "
+ SELECT
+ belegnr,
+ lp.id lieferschein_position,
+ menge lmenge
+ FROM
+ lieferschein_position lp
+ INNER JOIN
+ artikel a ON a.id = lp.artikel
+ INNER JOIN
+ lieferschein l on l.id = lp.lieferschein
+ INNER JOIN
+ (".$sql_lieferschein.") lieferschein_filter
+ ON lieferschein_filter.lieferschein = lp.lieferschein
+ WHERE
+ a.lagerartikel
+ GROUP BY
+ lp.id
+ ";
+
+ // Check completion
+ $sql_versandmengen = "
+ SELECT
+ v.id versandpaket,
+ lieferschein_position,
+ SUM(menge) vmenge
+ FROM
+ versandpaket_lieferschein_position vlp
+ INNER JOIN
+ versandpakete v ON v.id = vlp.versandpaket
+ WHERE
+ v.status <> 'storniert'
+ GROUP BY
+ lieferschein_position
+ ";
+
+ $sql_intermediate = "
+ SELECT
+ vmengen.versandpaket,
+ GROUP_CONCAT(DISTINCT lmengen.belegnr SEPARATOR ', ') lieferscheine,
+ SUM(lmenge) lmenge,
+ SUM(vmenge) vmenge
+ FROM
+ (".$sql_lieferschein_mengen.") lmengen
+ LEFT JOIN
+ (".$sql_versandmengen.") vmengen
+ ON lmengen.lieferschein_position = vmengen.lieferschein_position
+ ";
+
+ $sql = "
+ SELECT
+ *,
+ ".$this->app->YUI->IconsSQL_versandpaket()." icons
+ FROM
+ (".$sql_intermediate.") final INNER JOIN versandpakete v ON v.id = final.versandpaket
+ ";
+
+ $completion = $this->app->DB->SelectArr($sql);
+
+ if (!empty($completion)) {
+ if ($completion[0]['lmenge'] == $completion[0]['vmenge']) {
+ return(true);
+ }
+ }
+ return(false);
+ }
function versandpakete_minidetail() {
$id = $this->app->Secure->GetGET('id');
@@ -905,8 +1115,9 @@ class Versandpakete {
FROM
lieferschein l
INNER JOIN lieferschein_position lp ON lp.lieferschein = l.id
- INNER JOIN versandpaket_lieferschein_position vlp ON vlp.lieferschein_position = lp.id
- WHERE l.id = ".$id."
+ INNER JOIN artikel a ON lp.artikel = a.id
+ LEFT JOIN versandpaket_lieferschein_position vlp ON vlp.lieferschein_position = lp.id
+ WHERE l.id = ".$id." AND a.lagerartikel
GROUP BY lp.id"
);
$table->DisplayNew('TABLE', 'Paket', 'noAction');
@@ -917,9 +1128,9 @@ class Versandpakete {
function versandpakete_paketmarke()
{
- $this->versandpakete_menu();
$id = $this->app->Secure->GetGET('id');
$this->app->erp->MenuEintrag("index.php?module=versandpakete&action=edit&id=".$id, "Zurück");
+ $this->versandpakete_menu();
$this->app->Tpl->Set('TABTEXT',"Paketmarke");
diff --git a/www/themes/new/css/color3.css b/www/themes/new/css/color3.css
index e847a0dc..f3c975c9 100644
--- a/www/themes/new/css/color3.css
+++ b/www/themes/new/css/color3.css
@@ -64,5 +64,6 @@
--error: #F05A5C;
--error-color: #fff;
--important: #68D4D0;
- --success: #92EFB4;
+/* --success: #92EFB4;*/
+ --success: #2DCA73;
}
diff --git a/www/themes/new/css/styles.css b/www/themes/new/css/styles.css
index b2cc3e3b..9c5dcab2 100644
--- a/www/themes/new/css/styles.css
+++ b/www/themes/new/css/styles.css
@@ -2961,7 +2961,6 @@ div.error > input[type=submit] {
}
.info,
-.success,
.error2 {
background-color: var(--info);
color: var(--info-color);
@@ -2976,6 +2975,14 @@ div.error > input[type=submit] {
background-size: 30px 30px;
}
+.success {
+ background-color: var(--success);
+ color: var(--info-color);
+ background-image: url('../images/info.png');
+ background-size: 30px 30px;
+}
+
+
.pull-right {
float: right !important;
}
@@ -3040,7 +3047,7 @@ div.error > input[type=submit] {
#header div.headererror > input {
padding: 5px;
margin: 3px;
- background-color: var(--info);
+ background-color: var(--success);
color: var(--info-color);
}
diff --git a/www/themes/new/images/lagergo_stop_teil.png b/www/themes/new/images/lagergo_stop_teil.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3d1cd0179c77fb82561fbf8dbd1350073ac247c
GIT binary patch
literal 10317
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
C0ij+1
literal 0
HcmV?d00001
diff --git a/www/themes/new/images/lagergo_teil.png b/www/themes/new/images/lagergo_teil.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f2c2e7b9a90d581a428d3c595597c610a77e15d
GIT binary patch
literal 11224
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