Compare commits

...

4 Commits

Author SHA1 Message Date
OpenXE
0572295637 Lager bestandsberechnung bugfix currencies 2023-02-08 16:24:30 +01:00
OpenXE
770a36b183 Produktion lager stock remove parts with production number 2023-02-06 15:00:34 +01:00
OpenXE
826923fd51 Bugfix waehrungumrechnung 2023-02-06 14:33:51 +01:00
OpenXE
9657e16797 Bugfix Lagerbestandsberechnung 2023-02-06 14:31:20 +01:00
3 changed files with 145 additions and 203 deletions

View File

@ -207,14 +207,112 @@ class Lager extends GenLager {
*
* @return string
*/
public static function KursJoin($typ, $live = true)
/*
Get the correct currency conversion rate to the date
*/
public static function KursJoin(string $datum, string $waehrung_nach = 'EUR')
{
return " LEFT JOIN (
SELECT max(kurs) as kurs, waehrung_von, waehrung_nach FROM waehrung_umrechnung WHERE (isnull(gueltig_bis) OR gueltig_bis >= now() OR gueltig_bis = '0000-00-00') AND (waehrung_von LIKE 'EUR' OR waehrung_nach LIKE 'EUR') GROUP BY waehrung_von,waehrung_nach
) wt ON wt.waehrung_nach <> 'EUR' AND wt.waehrung_nach = ".self::Waehrung($typ, $live)." OR wt.waehrung_von <> 'EUR' AND wt.waehrung_von = ".self::Waehrung($typ, $live)." ";
$relevant_dates = "
SELECT
waehrung_von,
waehrung_nach,
MIN(
DATE
(
REPLACE
(
COALESCE(gueltig_bis,'9999-12-31'),
'0000-00-00',
'9999-12-31'
)
)
) AS gueltig_datum
FROM
`waehrung_umrechnung`
WHERE
REPLACE
(
COALESCE(gueltig_bis,'9999-12-31'),
'0000-00-00',
'9999-12-31'
) >= '".$datum."'
GROUP BY
waehrung_von,
waehrung_nach
";
$list_of_rates = "
SELECT
waehrung_von,
waehrung_nach,
DATE
(
REPLACE
(
COALESCE(gueltig_bis,'9999-12-31'),
'0000-00-00',
'9999-12-31'
)
) AS gueltig_datum,
kurs
FROM
waehrung_umrechnung
";
$sql = "
LEFT JOIN
(
SELECT
lor.waehrung_von,
lor.waehrung_nach,
MAX(lor.kurs) AS kurs
FROM
(
$list_of_rates
) lor
INNER JOIN(
$relevant_dates
) rd
ON
lor.gueltig_datum = rd.gueltig_datum
AND
lor.waehrung_von = rd.waehrung_von
AND
lor.waehrung_nach = rd.waehrung_nach
GROUP BY
lor.waehrung_von,
lor.waehrung_nach
) wt
ON
wt.waehrung_von = ek.waehrung AND wt.waehrung_nach = '".$waehrung_nach."'";
return($sql);
}
/*
LEFT JOIN(
SELECT MAX(kurs) AS kurs,
waehrung_von,
waehrung_nach
FROM
waehrung_umrechnung
WHERE
(
ISNULL(gueltig_bis) OR gueltig_bis >= NOW() OR gueltig_bis = '0000-00-00') AND(
waehrung_von LIKE 'EUR' OR waehrung_nach LIKE 'EUR'
)
GROUP BY
waehrung_von,
waehrung_nach
) wt
ON
wt.waehrung_nach <> 'EUR' AND wt.waehrung_nach = ".self::Waehrung($typ, $live)." OR wt.waehrung_von <> 'EUR' AND wt.waehrung_von = ".self::Waehrung($typ, $live)." ";
*/
/**
* @param Application $app
* @param string $typ
@ -597,15 +695,7 @@ class Lager extends GenLager {
$count = "SELECT COUNT(l.id) FROM lager_differenzen l WHERE l.user='" . $app->User->GetID() . "' AND l.lager_platz = 0 ";
break;
case "lager_wert":
$allowed['lager'] = array('wert');
$app->DB->Select("SELECT waehrungkalk,waehrungletzt,kurskalk,kursletzt FROM lagerwert LIMIT 1");
if($app->DB->error())
{
$app->erp->CheckColumn("waehrungkalk", "VARCHAR(16)", "lagerwert", "NOT NULL DEFAULT ''");
$app->erp->CheckColumn("waehrungletzt", "VARCHAR(16)", "lagerwert", "NOT NULL DEFAULT ''");
$app->erp->CheckColumn("kurskalk","DECIMAL(19,8)", "lagerwert", "NOT NULL DEFAULT '0'");
$app->erp->CheckColumn("kursletzt","DECIMAL(19,8)", "lagerwert", "NOT NULL DEFAULT '0'");
}
$allowed['lager'] = array('wert');
// Get HTML form values
$preisart = $app->User->GetParameter('preisart');
@ -633,33 +723,6 @@ class Lager extends GenLager {
}
}
$lager = (String)$app->YUI->TableSearchFilter($name, 4, 'lager', $app->User->GetParameter("lager_lager"));
if($lager)
{
$lager = $app->DB->Select("SELECT id FROM lager WHERE bezeichnung = '$lager' AND (geloescht = 0 OR isnull(geloescht)) LIMIT 1");
}
$lagerplatz = (String)$app->YUI->TableSearchFilter($name, 5, 'lagerplatz', $app->User->GetParameter("lager_lagerplatz"));
if($lagerplatz)
{
$lagerplatz = explode(' ', $lagerplatz);
$lagerplatz = $app->DB->Select("SELECT id FROM lager_platz WHERE kurzbezeichnung = '".reset($lagerplatz)."' AND (geloescht = 0 OR isnull(geloescht)) LIMIT 1");
}
if($preiseineuro)
{
$kursusd = $app->erp->GetWaehrungUmrechnungskurs('EUR','USD');
$kurschf = $app->erp->GetWaehrungUmrechnungskurs('EUR','CHF');
}
$artikelkategorie = (String)$app->YUI->TableSearchFilter($name, 8, 'artikelkategorie', $app->User->GetParameter("lager_wert_artikelkategorie"));
$artikelkategorie = explode(" ", $artikelkategorie);
$artikelkategorieid = $artikelkategorie[0];
$artikelkategorieid = $app->DB->Select("SELECT id FROM artikelkategorien WHERE id = '$artikelkategorieid' LIMIT 1");
if($artikelkategorieid != ''){
$artikelkategorie = $artikelkategorieid;
}else{
$artikelkategorie = 0;
}
//if($artikelkategorie)$artikelkategorie = $app->DB->Select("SELECT id FROM artikelkategorien WHERE bezeichnung LIKE '%$artikelkategorie%' LIMIT 1");
$colgewicht ="if(lw.gewicht = 0,ifnull(art.gewicht,'0') ,lw.gewicht) *lw.menge";
$colvolumen = "if(lw.volumen=0,ifnull(art.laenge,'0')*ifnull(art.breite,'0')*ifnull(art.hoehe,'0'),lw.volumen)*lw.menge";
$colkurzbezeichnung = 'lp.kurzbezeichnung';
@ -671,150 +734,53 @@ class Lager extends GenLager {
$colkurzbezeichnung = 'lpi.kurzbezeichnung';
$colbezeichnung = 'lpi.bezeichnung';
}
$heading = array('Datum','Artikel-Nr.','Artikel','Artikelkategorie','Lager','Lagerplatz','Menge','Gewicht','Volumen','EK-Preis','Gesamt','W&auml;hrung','letzte Bewegung', '');
$width = array('5%','10%','20%','10%','10%','10%','5%','5%','5%','5%','5%','5%','8%', '1%');
$heading = array('Datum','Artikel-Nr.','Artikel','Artikelkategorie','Lager','Lagerplatz','Menge','Gewicht','Volumen','EK-Preis','W&auml;hrung','Kurs','Gesamt','invisible!?','letzte Bewegung','');
$width = array( '5%', '05%', '20%', '10%', '10%', '5%' , '5%', '5%', '5%', '5%', '5%', '5%', '1%', '23%', '5%');
$findcols = array('lw.datum','art.nummer','art.name_de','(select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, \'kat\', 1), \'_\', 1) as type from artikel where id=art.id))', $colbezeichnung,$colkurzbezeichnung,$colmenge,$colgewicht,$colvolumen);
$kursjoin = "";
$numbercols = array(9, 10);
$datecols = array(0);
$preis = self::EinzelPreis($preisart,$live);
$preiscol = $app->erp->FormatPreis($preis,2);
$waehrungcol = self::Waehrung($preisart,$live);
if($preisart == 'letzterek')
{
if($preiseineuro){
$kursjoin = self::KursJoin($preisart, $datum);
$dummy = self::PreisUmrechnung($app, $preisart, $live);
/*$dummy = '
if(
ifnull(lw.kursletzt,0)<> 0
,
1 / lw.kursletzt
,
if(
ifnull(wt.kurs,0) <> 0
,
if(
wt.waehrung_nach = lw.waehrungletzt,
(1/wt.kurs),
wt.kurs
)
,
if(lw.waehrungletzt = \'USD\',
1.0 / '.$kursusd.',
if(lw.waehrungletzt = \'CHF\',
1.0 / '.$kurschf.',
1)
)
)
)
* ifnull(lw.preis_letzterek,0)
';*/
}else{
//$dummy = 'ifnull(lw.preis_letzterek,0)';
$dummy = self::EinzelPreis($preisart,$live);
}
$findcols[] = $dummy;
$preiscol = $app->erp->FormatPreis($dummy,2);
$gesamtcol = "(".$dummy.'*'.$colmenge.")";
$findcols[] = $gesamtcol;
//$waehrungcol = 'lw.waehrungletzt';
$waehrungcol = self::Waehrung($preisart,$live);
$findcols[] = $waehrungcol;
}elseif($preisart == 'inventurwert'){
if($preiseineuro){
$dummy = self::PreisUmrechnung($app, $preisart, $live);
$kursjoin = self::KursJoin($preisart, $datum);
}else{
$dummy = 'if(ifnull(lw.inventurwert,0) = 0 AND art.inventurekaktiv = 1, ifnull(art.inventurek,0), ifnull(lw.inventurwert,0))';
$dummy = $dummy = self::EinzelPreis($preisart,$live);
}
$findcols[] = $dummy;
$preiscol = $app->erp->FormatPreis($dummy,2);
$findcols[] = $dummy.'*'.$colmenge;
//$gesamtcol = $app->erp->FormatPreis($dummy.'*'.$colmenge,2);
$gesamtcol = "(".$dummy.'*'.$colmenge.")";
//$waehrungcol = "'EUR'";
$waehrungcol = self::Waehrung($preisart,$live);
$findcols[] = $waehrungcol;
}else{
if($preiseineuro){
$kursjoin = self::KursJoin($preisart, $datum);
/*$dummy = '
if(
if(ifnull(lw.preis_kalkulierterek,0) <> 0,ifnull(lw.kurskalk,0),ifnull(lw.kursletzt,0))<> 0
,
1 / if(ifnull(lw.preis_kalkulierterek,0) <> 0,ifnull(lw.kurskalk,0),ifnull(lw.kursletzt,0))
,
if(
ifnull(wt.kurs,0) <> 0
,
if(
wt.waehrung_nach = if(ifnull(lw.preis_kalkulierterek,0) <> 0,lw.kurskalk,lw.kursletzt),
(1/wt.kurs),
wt.kurs
)
,
if(if(ifnull(lw.preis_kalkulierterek,0) <> 0,lw.kurskalk,lw.kursletzt) = \'USD\',
1.0 / '.$kursusd.',
if(if(ifnull(lw.preis_kalkulierterek,0) <> 0,lw.kurskalk,lw.kursletzt) = \'CHF\',
1.0 / '.$kurschf.',
1)
)
)
)
* if(ifnull(lw.preis_kalkulierterek,0) <> 0,lw.preis_kalkulierterek,ifnull(lw.preis_letzterek,0))
';*/
$dummy = self::PreisUmrechnung($app, $preisart, $live);
//$dummy = 'if(ifnull(lw.preis_kalkulierterek,0) <> 0,lw.preis_kalkulierterek,ifnull(lw.preis_letzterek,0))';
}else{
//$dummy = 'if(ifnull(lw.preis_kalkulierterek,0) <> 0,lw.preis_kalkulierterek,ifnull(lw.preis_letzterek,0))';
$dummy = self::EinzelPreis($preisart,$live);
}
$findcols[] = $dummy;
$preiscol = $app->erp->FormatPreis($dummy,2);
$findcols[] = '('.$dummy.'*'.$colmenge.')';
//$gesamtcol = $app->erp->FormatPreis('('.$dummy.'*'.$colmenge.')',2);
$gesamtcol = '('.$dummy.'*'.$colmenge.')';
//$waehrungcol = 'if(ifnull(lw.preis_kalkulierterek,0) <> 0,lw.waehrungkalk,lw.waehrungletzt)';
$waehrungcol = self::Waehrung($preisart,$live);
$findcols[] = $waehrungcol;
if ($preiseineuro) {
$kursjoin = self::KursJoin($datum);
$preisEUR = self::PreisUmrechnung($app, $preisart, true);
$gesamtcol = "(".$preisEUR.'*'.$colmenge.")";
$kurs = $app->erp->FormatPreis('kurs',2);
} else {
$gesamtcol = "(".$preis.'*'.$colmenge.")";
$kurs = 1;
}
$findcols[] = 'lw.letzte_bewegung';
$findcols[] = $preis;
$findcols[] = 'waehrung';
$findcols[] = 'kurs';
$findcols[] = $gesamtcol;
$findcols[] = 'art.id';
//$searchsql = array('art.nummer','art.name_de','lag.bezeichnung','lp.kurzbezeichnung');
$searchsql = $findcols;
$searchsql[0] = "date_format(lw.datum,'%d.%m.%Y')";
$searchsql[11] = "date_format(lw.letzte_bewegung,'%d.%m.%Y %H:%i:%s')";
$searchsql[13] = "date_format(lw.letzte_bewegung,'%d.%m.%Y %H:%i:%s')";
$searchsql[12] = "date_format(lbew.zeit,'%d.%m.%Y %H:%i:%s')";
//$columnfilter = true;
$defaultorder = 1;
$defaultorderdesc = 0;
$alignright = array(7,8,9,10,11);
$sumcol = array(8,9,11);
$alignright = array(7,8,9,10,11,12,13);
$sumcol = array(7,8,9,13);
$numbercols = array(7,8,9,10,12,13);
$datecols = array(0);
$onequeryperuser = true;
$joinek = ' LEFT JOIN '.self::LetzterEK('art', 'e1','e2').' ek ON art.id = ek.artikel';
if($artikelkategorie > 0){
$joinartikelbaum = ' LEFT JOIN artikelbaum_artikel aba ON art.id = aba.artikel';
}
$waehrungcolanz = $waehrungcol;
if($preiseineuro){
$waehrungcolanz = "'EUR'";
}
if(!$live)
if (!$live)
{
$findcols[] = 'lw.letzte_bewegung';
$sql = "SELECT DISTINCT SQL_CALC_FOUND_ROWS art.id, date_format(lw.datum,'%d.%m.%Y'), art.nummer, art.name_de, (select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, 'kat', 1), '_', 1) as type from artikel where id=art.id)) as artikelkategorie, lag.bezeichnung, lp.kurzbezeichnung,
".$app->erp->FormatMenge('lw.menge',2).",".$app->erp->FormatPreis($colgewicht,2).",".$app->erp->FormatPreis($colvolumen,2)."
, $preiscol, ".$app->erp->FormatPreis($gesamtcol,2).", $waehrungcolanz ,ifnull(date_format(lw.letzte_bewegung,'%d.%m.%Y %H:%i:%s'), ''), art.id
, $preiscol, $waehrungcol, ".$kurs.", ".$app->erp->FormatPreis($gesamtcol,2).", '', ifnull(date_format(lw.letzte_bewegung,'%d.%m.%Y %H:%i:%s'), ''), art.id
FROM artikel art
INNER JOIN lagerwert lw ON lw.artikel = art.id AND (isnull(art.geloescht) OR art.geloescht = 0) AND art.lagerartikel = 1
$joinek
@ -823,42 +789,26 @@ class Lager extends GenLager {
";
$where = " lw.datum = '$datum' ";
if($gruppierenlager)
if ($gruppierenlager)
{
$sql .= "INNER JOIN (SELECT '' as kurzbezeichnung ) lp ON lp.kurzbezeichnung = ''
INNER JOIN lager lag ON lw.lager = lag.id
";
";
$where .= " AND lw.lager <> 0";
if($lager)
{
$where .= " AND lw.lager = '$lager' ";
}
if($lagerplatz)
{
$where .= " AND lw.lager_platz = '$lagerplatz' ";
}
}else{
} else {
$sql .= "INNER JOIN lager_platz lp ON lp.id = lw.lager_platz
INNER JOIN lager lag ON lag.id = lp.lager
";
$where .= " AND lw.lager = 0";
if($lager)
{
$where .= " AND lw.lager = '$lager' ";
}
if($lagerplatz)
{
$where .= " AND lw.lager_platz = '$lagerplatz' ";
}
}
}else{
} else {
$findcols[0] = 'curdate()';
$findcols[] = 'lbew.zeit';
$sql = "SELECT DISTINCT SQL_CALC_FOUND_ROWS art.id, date_format(curdate(),'%d.%m.%Y'), art.nummer, art.name_de, (select bezeichnung from artikelkategorien where id=(select SUBSTRING_INDEX(SUBSTRING_INDEX(art.typ, 'kat', 1), '_', 1) as type from artikel where id=art.id)) as artikelkategorie, lpi.bezeichnung, lpi.kurzbezeichnung,
".$app->erp->FormatMenge($colmenge,2).",".$app->erp->FormatPreis($colgewicht,2).",".$app->erp->FormatPreis($colvolumen,2)."
, $preiscol, ".$app->erp->FormatPreis($gesamtcol,2).", $waehrungcolanz ,ifnull(date_format(lbew.zeit,'%d.%m.%Y %H:%i:%s'), ''), art.id
, $preiscol, $waehrungcol, ".$kurs.", ".$app->erp->FormatPreis($gesamtcol,2).", '', ifnull(date_format(lbew.zeit,'%d.%m.%Y %H:%i:%s'), ''), art.id
FROM artikel art
$joinek
$joinartikelbaum
@ -866,7 +816,7 @@ class Lager extends GenLager {
$kursjoin
";
$where = " (isnull(art.geloescht) OR art.geloescht = 0) AND art.lagerartikel = 1 ";
if($gruppierenlager)
if ($gruppierenlager)
{
$sql .= "INNER JOIN (
SELECT lager_platz_inhalt.artikel, sum(lager_platz_inhalt.menge) as menge, '' as kurzbezeichnung,lager.bezeichnung, lager.id as lager
@ -889,8 +839,7 @@ class Lager extends GenLager {
{
$where .= " AND lpi.lager = '$lager' ";
}
//if($lagerplatz)$where .= " AND lpi.lager_platz = '$lagerplatz' ";
}else{
} else {
$sql .= "INNER JOIN (
SELECT lager_platz_inhalt.artikel, sum(lager_platz_inhalt.menge) as menge, lager_platz.kurzbezeichnung,lager.bezeichnung, lager.id as lager,lager_platz.id as lager_platz
FROM lager_platz_inhalt
@ -912,13 +861,7 @@ class Lager extends GenLager {
{
$where .= " AND lpi.lager = '$lager' ";
}
}
$findcols[10] = "CAST($gesamtcol as DECIMAL(10,2))";
$findcols[11] = $waehrungcol;
$findcols[12] = "ifnull(lbew.zeit, '')";
$searchsql[12] = "date_format(lbew.zeit,'%d.%m.%Y %H:%i:%s')";
}
}
if($artikel)
@ -927,9 +870,8 @@ class Lager extends GenLager {
}
if($artikelkategorie > 0){
$where .= " AND (aba.kategorie = '$artikelkategorie' OR art.typ = '".$artikelkategorie."_kat') ";
//$where .= " AND art.typ = '".$artikelkategorie."_kat' ";
}
$sql = $app->YUI->CodiereSQLForOneQuery($sql, $name);
$sql = $app->YUI->CodiereSQLForOneQuery($sql, $name);
$groupby = "";
$count = "";

View File

@ -594,7 +594,7 @@ class Produktion {
// Remove material from stock
if ($material_position['stuecklistestufe'] == 0 && $material_position['lagerartikel']) {
$result = $this->app->erp->LagerAuslagernRegal($material_position['artikel'],$global_standardlager,$menge_artikel_auslagern,$global_projekt,'Produktion '.$produktion_belegnr);
$result = $this->app->erp->LagerAuslagernRegal($material_position['artikel'],$global_standardlager,$menge_artikel_auslagern,$global_projekt,'Produktion '.$global_produktionsnummer);
if ($result != 1) {
$msg .= "<div class=\"error\">Kritischer Fehler beim Ausbuchen! (Position ".$material_position['id'].", Menge ".$menge_artikel_auslagern.").</div>".
$error = true;

View File

@ -36,7 +36,7 @@ class Waehrungumrechnung {
// columns that are aligned right (numbers etc)
// $alignright = array(4,5,6,7,8);
$findcols = array('w.waehrung_von', 'w.waehrung_nach', 'w.kurs', 'w.gueltig_bis', 'w.zeitstempel', 'w.bearbeiter', 'w.kommentar');
$findcols = array('id','id','w.waehrung_von', 'w.waehrung_nach', 'w.kurs', 'w.gueltig_bis', 'w.zeitstempel', 'w.bearbeiter', 'w.kommentar');
$searchsql = array('w.waehrung_von', 'w.waehrung_nach', 'w.kurs', 'w.gueltig_bis', 'w.zeitstempel', 'w.bearbeiter', 'w.kommentar');
$defaultorder = 1;