diff --git a/lager/lister/styklister.php b/lager/lister/styklister.php
new file mode 100644
index 00000000..738203cc
--- /dev/null
+++ b/lager/lister/styklister.php
@@ -0,0 +1,371 @@
+ "varenr",
+ "headerName" => "Vare Nr.",
+ "render" => function ($value, $row, $column) {
+ $url = "../../lager/varekort.php?id=$row[id]&returside=lister/styklister.php";
+ $notes = htmlspecialchars($row['notes'] ? $row["notes"] : '', ENT_QUOTES, 'UTF-8');
+ return "
$value | ";
+ },
+ "sqlOverride" => "v.varenr",
+ "generateSearch" => function ($column, $term) {
+ $term = db_escape_string($term);
+ $words = preg_split('/\s+/', trim($term));
+ $conditions = array();
+ foreach ($words as $word) {
+ if (!empty($word)) {
+ $word = db_escape_string($word);
+ $conditions[] = "(v.varenr ILIKE '%$word%' OR v.varenr_alias ILIKE '%$word%')";
+ }
+ }
+ return !empty($conditions) ? "(" . implode(" AND ", $conditions) . ")" : "1=1";
+ },
+);
+
+$columns[] = array(
+ "field" => "varenr_alias",
+ "headerName" => "Vare Nr. (alias)",
+ "render" => function ($value, $row, $column) {
+ $url = "../../lager/varekort.php?id=$row[id]&returside=lister/styklister.php";
+ $notes = htmlspecialchars($row['notes'] ? $row["notes"] : '', ENT_QUOTES, 'UTF-8');
+ return "$value | ";
+ },
+ "sqlOverride" => "v.varenr_alias",
+ "generateSearch" => function ($column, $term) {
+ $term = db_escape_string($term);
+ $words = preg_split('/\s+/', trim($term));
+ $conditions = array();
+ foreach ($words as $word) {
+ if (!empty($word)) {
+ $word = db_escape_string($word);
+ $conditions[] = "(v.varenr ILIKE '%$word%' OR v.varenr_alias ILIKE '%$word%')";
+ }
+ }
+ return !empty($conditions) ? "(" . implode(" AND ", $conditions) . ")" : "1=1";
+ },
+ "hidden" => true,
+);
+
+$columns[] = array(
+ "field" => "beskrivelse",
+ "headerName" => "Navn",
+ "width" => "3",
+ "render" => function ($value, $row, $column) {
+ $url = "../../lager/varekort.php?id=$row[id]&returside=lister/styklister.php";
+ $notes = htmlspecialchars($row['notes'] ? $row["notes"] : '', ENT_QUOTES, 'UTF-8');
+ return "$value | ";
+ },
+ "sqlOverride" => "v.beskrivelse",
+ "generateSearch" => function ($column, $term) {
+ $term = db_escape_string($term);
+ $words = preg_split('/\s+/', trim($term));
+ $conditions = array();
+ foreach ($words as $word) {
+ if (!empty($word)) {
+ $word = db_escape_string($word);
+ $conditions[] = "(v.beskrivelse ILIKE '%$word%' OR v.beskrivelse_alias ILIKE '%$word%')";
+ }
+ }
+ return !empty($conditions) ? "(" . implode(" AND ", $conditions) . ")" : "1=1";
+ },
+);
+
+$columns[] = array(
+ "field" => "beskrivelse_alias",
+ "headerName" => "Navn (alias)",
+ "width" => "3",
+ "render" => function ($value, $row, $column) {
+ $url = "../../lager/varekort.php?id=$row[id]&returside=lister/styklister.php";
+ $notes = htmlspecialchars($row['notes'] ? $row["notes"] : '', ENT_QUOTES, 'UTF-8');
+ return "$value | ";
+ },
+ "sqlOverride" => "v.beskrivelse_alias",
+ "generateSearch" => function ($column, $term) {
+ $term = db_escape_string($term);
+ $words = preg_split('/\s+/', trim($term));
+ $conditions = array();
+ foreach ($words as $word) {
+ if (!empty($word)) {
+ $word = db_escape_string($word);
+ $conditions[] = "(v.beskrivelse ILIKE '%$word%' OR v.beskrivelse_alias ILIKE '%$word%')";
+ }
+ }
+ return !empty($conditions) ? "(" . implode(" AND ", $conditions) . ")" : "1=1";
+ },
+ "hidden" => true,
+);
+
+$columns[] = array(
+ "field" => "trademark",
+ "headerName" => "Varemærke",
+ "sqlOverride" => "v.trademark"
+);
+$columns[] = array(
+ "field" => "varegruppe",
+ "headerName" => "Varegruppe",
+ "sqlOverride" => "vg.beskrivelse",
+);
+$columns[] = array(
+ "field" => "stregkode",
+ "headerName" => "Stregkode",
+ "sqlOverride" => "v.stregkode"
+);
+$columns[] = array(
+ "field" => "notes",
+ "headerName" => "Note",
+ "sqlOverride" => "v.notes",
+ "hidden" => true,
+);
+$columns[] = array(
+ "field" => "notes_internal",
+ "headerName" => "Intern note",
+ "sqlOverride" => "v.notes_internal",
+ "hidden" => true,
+);
+$columns[] = array(
+ "field" => "leverandør",
+ "headerName" => "Leverandør",
+ "width" => "1.5",
+ "sqlOverride" => "ol.lev",
+ "render" => function ($value, $row, $column) {
+ $html = "";
+ if ($value) {
+ foreach (explode("\n", $value) as $lev) {
+ list($id, $kontonr, $name) = explode("\t", $lev);
+ $url = "../../kreditor/kreditorkort.php?id=$id&returside=../lager/lister/styklister.php";
+ $html .= "$kontonr : $name ";
+ }
+ }
+ $html .= " | ";
+ return $html;
+ },
+);
+$columns[] = array(
+ "field" => "enhed",
+ "headerName" => "Enhed",
+ "width" => "0.5",
+ "sqlOverride" => "v.enhed"
+);
+$columns[] = array(
+ "field" => "salgspris",
+ "headerName" => "Salgspris",
+ "description" => "(excl.moms)",
+ "type" => "number",
+ "align" => "right",
+ "width" => "0.5",
+ "hidden" => (!$vatOnItemCard),
+ "sqlOverride" => "v.salgspris"
+);
+$columns[] = array(
+ "field" => "momspris",
+ "headerName" => "Salgspris",
+ "description" => "(incl.moms)",
+ "type" => "number",
+ "align" => "right",
+ "width" => "0.5",
+ "hidden" => $vatOnItemCard,
+ "sqlOverride" => "CASE
+ WHEN vg.box7 = 'on' THEN v.salgspris
+ ELSE (100+sm.box2::float)/100*v.salgspris
+ END"
+);
+$columns[] = array(
+ "field" => "kostpris",
+ "headerName" => "Kostpris",
+ "type" => "number",
+ "align" => "right",
+ "width" => "0.5",
+ "sqlOverride" => "v.kostpris"
+);
+$columns[] = array(
+ "field" => "dg",
+ "headerName" => "DG",
+ "type" => "number",
+ "align" => "right",
+ "sqlOverride" => "
+ ROUND(CASE
+ WHEN v.salgspris = 0 THEN 0
+ ELSE (v.salgspris - v.kostpris) / v.salgspris * 100
+ END, 2)",
+ "width" => "0.5",
+ "valueGetter" => function ($value, $row, $column) {
+ return dkdecimal($value, 1) . "%";
+ },
+ "decimalPrecision" => 1,
+);
+
+// Filtersetup
+$filters = array();
+
+// Varegrupper
+$query = "SELECT * FROM grupper WHERE art='VG' AND fiscal_year=$regnaar ORDER BY beskrivelse";
+$q = db_select($query, __FILE__ . " line " . __LINE__);
+$VGs = array();
+while ($row = db_fetch_array($q)) {
+ $VGs[] = array(
+ "name" => $row["beskrivelse"],
+ "checked" => "",
+ "sqlOn" => "vg.kodenr = $row[kodenr]",
+ "sqlOff" => "",
+ );
+}
+$filters[] = array(
+ "filterName" => "Varegrupper",
+ "joinOperator" => "or",
+ "options" => $VGs
+);
+
+$query = "SELECT kontonr, firmanavn
+FROM
+ adresser a
+INNER JOIN vare_lev vl ON vl.lev_id = a.id
+WHERE
+ art='K'
+GROUP BY a.kontonr, a.firmanavn
+";
+$q = db_select($query, __FILE__ . " line " . __LINE__);
+$levs = array();
+while ($row = db_fetch_array($q)) {
+ $levs[] = array(
+ "name" => $row["firmanavn"],
+ "checked" => "",
+ "sqlOn" => "ol.kontonr_concat = '$row[kontonr]'",
+ "sqlOff" => "",
+ );
+}
+$filters[] = array(
+ "filterName" => "Leverandøre",
+ "joinOperator" => "or",
+ "options" => $levs
+);
+
+$filters[] = array(
+ "filterName" => "Misc",
+ "joinOperator" => "and",
+ "options" => array(
+ array(
+ "name" => "Vis udgået",
+ "checked" => "checked",
+ "sqlOn" => "",
+ "sqlOff" => "(v.lukket IS NULL OR v.lukket = '0' or v.lukket = '')",
+ )
+ )
+);
+
+$data = array(
+ "table_name" => "varer",
+ "query" => "WITH optimized_levs AS (
+ SELECT
+ vl.vare_id,
+ string_agg(a.kontonr::TEXT, ' ') AS kontonr_concat,
+ string_agg(a.id || '\t' || a.kontonr::TEXT || '\t' || a.firmanavn, '\n') AS lev
+ FROM
+ vare_lev vl
+ LEFT JOIN
+ adresser a ON vl.lev_id = a.id AND a.art = 'K'
+ GROUP BY
+ vl.vare_id
+)
+SELECT DISTINCT
+ v.id AS id,
+ v.varenr AS varenr,
+ v.varenr_alias AS varenr_alias,
+ v.lukket AS lukket,
+ v.beskrivelse AS beskrivelse,
+ v.beskrivelse_alias AS beskrivelse_alias,
+ v.trademark AS trademark,
+ v.stregkode AS stregkode,
+ v.enhed AS enhed,
+ v.notes AS notes,
+ v.notesinternal AS notes_internal,
+ v.salgspris AS salgspris,
+ v.kostpris AS kostpris,
+ CASE
+ WHEN v.salgspris = 0 THEN 0
+ ELSE (v.salgspris - v.kostpris) / v.salgspris * 100
+ END AS dg,
+ vg.beskrivelse AS varegruppe,
+ CASE
+ WHEN vg.box7 = 'on' THEN v.salgspris
+ ELSE (100 + sm.box2::float) / 100 * v.salgspris
+ END AS momspris,
+ ol.lev AS leverandør
+FROM varer v
+LEFT JOIN grupper vg ON vg.kodenr = v.gruppe AND vg.fiscal_year = $regnaar AND vg.art = 'VG'
+LEFT JOIN kontoplan kp ON kp.kontonr::text = vg.box4 AND regnskabsaar = $regnaar AND vg.box7 != 'on'
+LEFT JOIN grupper sm
+ ON sm.kodenr::text =
+ CASE
+ WHEN LENGTH(kp.moms) > 1 THEN SUBSTRING(kp.moms FROM 2 FOR LENGTH(kp.moms) - 1)
+ ELSE NULL
+ END
+ AND sm.fiscal_year = $regnaar
+ AND sm.art = 'SM'
+LEFT JOIN optimized_levs ol ON v.id = ol.vare_id
+WHERE v.samlevare = 'on' AND {{WHERE}}
+ORDER BY {{SORT}}
+",
+
+ 'rowStyle' => function ($row) {
+ switch ($row['lukket']) {
+ case '1':
+ return "color: #f00;";
+ default:
+ return "";
+ }
+ },
+ "columns" => $columns,
+ "filters" => $filters,
+);
+
+print "";
+create_datagrid("styklister", $data);
+print "
";
+?>
diff --git a/lager/lister/topLineVarer.php b/lager/lister/topLineVarer.php
index 8b2188d4..1768aa0d 100755
--- a/lager/lister/topLineVarer.php
+++ b/lager/lister/topLineVarer.php
@@ -7,6 +7,7 @@
$TableBG = "bgcolor=$bgcolor";
$icon_serialnumber = '';
+ $icon_styklister = '';
$icon_vareliste = '';
$icon_indkob = '';
$icon_ordre = '';
@@ -78,13 +79,28 @@
if ($valg=="Serienumre") {
print "
| ";
} else {
print "
| ";
+ }
+
+ print " | ";
+
+ if ($valg=="Styklister") {
+ print "
+ | ";
+ } else {
+ print "
+
+ | ";
}
print "\n"; # <- Tabel 1.1.1