Subversion-Projekte lars-tiefland.content-management

Revision

Zur aktuellen Revision | Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
	/**
3
     * Lagerwirtschaft mit warenwirtschaftlichen Zügen.
4
     * Diese Datei enthält den gesamten PHP-Quelltext des Backendmoduls „Lagerwirtschaft mit warenwirtschaftlichen Zügen“.
5
     * Nach Abarbeitung des Quelltexts wird das jeweilige Smarty-Template aufgerufen und diesen benötigte Variabeln übergeben.
6
     *
7
     * @author Patrick Lautsch <lautsch@weban.de>
8
     * @copyright 2009 Webagentur Niewerth
9
     * @package Content-management
10
     * @version
11
     * @license propietary
12
     * @filesource
13
     */
14
 
15
	/**
16
	 * Deutsche Umgebung.
17
	 */
18
    setlocale( LC_ALL, "de_DE" );
19
 
20
    /**
21
     * Setzte "CET" als Zeitzone.
22
     */
23
    date_default_timezone_set( 'CET' );
24
 
25
    /**
26
     * Gibt die Backendmodulgruppe an, in welchem sich das Backendmodul befindet.
27
     */
28
    define( "modul_name", "Warenwirtschaft" );
29
 
30
    /**
31
     * Gibt den Modulnamen an.
32
     */
33
    define( "tool_name", "lagerwirtschaft" );
34
 
35
    /**
36
     * Gibt den Namen dieser Datei aus.
37
     */
38
    define( "F_NAME", basename($_SERVER["PHP_SELF"]) );
39
 
40
    /**
41
	 * Connect-Datei einbinden.
42
	 */
43
    require_once  "../Online-Shop/connect2.php";
44
 
45
    /**
46
     * Zusätzliche Funktionen.
47
     */
48
    require_once '../includes/system/functions.lagerwirtschaft.php';
49
 
50
    /**
51
	 * Start der Session.
52
	 */
53
    session_start();
54
 
55
    /**
56
	* Smarty Initialisierung.
57
	*/
58
    require_once  "Weban_Smarty.class.php";
59
    $GLOBALS["ui"] = new Weban_Smarty();
60
    $GLOBALS["ui"]->conifg_dir = SMARTY_DIR;
61
    $GLOBALS["ui"]->template_dir = "templates/";
62
    $GLOBALS["ui"]->compile_dir = "templates_c";
63
    $GLOBALS["ui"]->compile_check = true;
64
    $GLOBALS["ui"]->assign( "eingabefelder", $eingabefelder );
65
    $GLOBALS["ui"]->assign( "webs", $webs );
66
 
67
    /**
68
     * Übergebe den GET-Parameter 'artikelId' an Smarty, falls dieser gesetzt ist.
69
     */
70
    if ( !empty($_GET['artikelId']) )
71
	{
72
		$GLOBALS["ui"]->assign("artikelId", $_GET['artikelId']);
73
	}
74
 
75
    /**
76
     * Wenn <var>$_GET['buchungEingetragen']</var> gleich eins ist, dann trage die Buchung in die Datenbank ein
77
     */
78
    if ( $_GET['action'] == "buchungEingetragen" )
79
    {
80
        /**
81
         * Speichere die vom Eingangsbuchungsformular abgeschickten POST-Daten in Variabeln.
82
         */
83
 
84
        /**
85
         * Lieferant
86
         */
87
        $eingangsbuchungLieferantenNummer = $_POST['lieferant'];
88
 
89
        /**
90
         * Datum: Tag
91
         */
92
         $eingangsbuchungDatum = $_POST['datum'];
93
 
94
        /**
95
         * Erstelle aus den POST-Arrays <var>$_POST['menge']</var>, <var>$_POST['artikelID']</var> und <var>$_POST['warenwert']</var>
96
         * ein einziges LOOP-Array.
97
         */
98
        for ( $i = 0; $i < sizeof($_POST['menge']); $i++ )
99
        {
100
        	/**
101
        	 * Wenn im Buchungsformular "Ausgangsbuchung(-)" gewählt wurde, wird vor die Menge ein Minus gehängt.
102
        	 */
103
        	if ( $_POST['buchungsart'][$i] == 'ausgangsbuchung')
104
        	{
105
        		$eingangsbuchungArtikel[$i]['menge'] = -$_POST['menge'][$i];
106
        	} else {
107
        		$eingangsbuchungArtikel[$i]['menge'] = $_POST['menge'][$i];
108
        	}
109
 
110
            $eingangsbuchungArtikel[$i]['artikelID']    = $_POST['artikelID'][$i];
111
            $eingangsbuchungArtikel[$i]['warenwert']    = $_POST['warenwert'][$i];
112
        }
113
 
114
        /**
115
         * QUERY: Trage die Buchung in die Datenbank ein.
116
         */
117
        $sql = "
118
            INSERT INTO
119
                buchungen
120
            (
121
                eintragsdatum
122
            )
123
            VALUES
124
            (
125
                NOW()
126
            )
127
        ;";
128
 
129
        /**
130
         * QUERY ausführen.
131
         */
132
        $result = mysql_query( $sql ) or die( mysql_errno() . ': ' . mysql_error() . '<hr />' . $sql );
133
 
134
        /**
135
         * Die ID der eingetragenen Buchung in der Tabelle "buchungen".
136
         */
137
        $eingangsbuchungBuchungenID = mysql_insert_id();
138
 
139
        /**
140
         * Trage die Artikel der Buchung in die Tabelle "lagerbewegungen" ein.
141
         */
142
        for ( $i = 0; $i < sizeof($eingangsbuchungArtikel); $i++ )
143
        {
144
           /**
145
            * QUERY
146
            */
147
           $sql = "
148
                INSERT INTO
149
                    lagerbewegungen
150
                (
151
                    artikel,
152
                    buchungen,
153
                    menge
154
                )
155
                VALUES
156
                (
157
                    ".$eingangsbuchungArtikel[$i]['artikelID'].",
158
                    ".$eingangsbuchungBuchungenID.",
159
                    ".$eingangsbuchungArtikel[$i]['menge']."
160
                )
161
           ;";
162
 
163
           /**
164
            * QUERY ausführen
165
            */
166
           $result = mysql_query( $sql ) or die( mysql_errno() . ': ' . mysql_error() . '<hr />' . $sql );
167
        }
168
        unset($_GET['action']);
169
        ?>
170
        <script type="text/javascript">
171
        	location.href="javascript:history.go(-2);";
172
        </script>
173
        <?php
174
    }
175
 
176
    /**
177
     * Wenn die Übersichtsseite angezeigt werden soll (<var>$_GET['action']</var> nicht gesetzt oder <var>$_GET['action']</var> = "uebersicht"),
178
     * dann führe diesen Codeblock aus.
179
     */
180
    if ( $_GET['action'] == "uebersicht" || empty($_GET['action']) )
181
    {
182
        /**
183
         * Setzte die Standardparameter für die Artikelsuche.
184
         */
185
 
186
        /**
187
         * Bestimmt den Artikelnamen nach dem gesucht werden soll.
188
         */
189
        $sucheArtikelname = "";
190
 
191
        /**
192
         * Bestimmt den Bestand nach dem gesucht werden soll.
193
         */
194
        $sucheBestand = NULL;
195
 
196
        /**
197
         * Bestimmt in Verbindung mit dem Bestandsoperator nach welchen Beständen gesucht wird.
198
         */
199
        $sucheBestand = 0;
200
 
201
        /**
202
         * Bestimmt den Bestandsoperator, welcher angibt ob der gesuchte Bestand größer, kleiner oder gleich dem angegebenen ist.
203
         * "0" entspricht "="
204
         * "1" entspricht ">"
205
         * "2" entspricht "<"
206
         * "3" bedeutet: keine Bestandssuche
207
         */
208
        $sucheBestandsoperator = 3;
209
 
210
        /**
211
         * Bestimmt ob die Suche Absteigend oder Aufsteigend die Suchergebnisse anzeigt.
212
         * "0" entspricht "Absteigend"
213
         * "1" entspricht "Aufsteigend"
214
         */
215
        $sucheSortierung = "DESC";
216
 
217
        /**
218
         * Bestimmt wie viele Artikel pro Seite angezeigt werden sollen.
219
         */
220
        $sucheArtikelProSeite = 50;
221
 
222
        /**
223
         * Bestimmt welche Artikelseite angezeit werden soll.
224
         */
225
        $sucheArtikelseite = 1;
226
 
227
        /**
228
         * Bestimmt welche Artikelseite angezeit werden soll.
229
         */
230
        $sucheArtikelanzahl['start'] = 0;
231
 
232
        /**
233
         * Wenn "Suche ausführen" geklickt wurde, ersetzte die Standardsuchparameter durch die, die der Benutzer eingegeben hat.
234
         */
235
        if ( $_POST['sucheSubmit'] || $_POST['sucheWeiter'] || $_POST['sucheZurueck'] || $_POST['sucheNeueSeite'] )
236
        {
237
            $sucheArtikelname                   = $_POST['sucheArtikelname'];
238
            $sucheBestand                       = $_POST['sucheBestand'];
239
            $sucheBestandsoperator              = $_POST['sucheBestandsoperator'];
240
            $sucheMeldebestandGroesserBestand   = $_POST['sucheMeldebestandGroesserBestand'];
241
            $sucheSortierung                    = ($_POST['sucheSortierung']) ? "ASC" : "DESC";
242
 
243
            /**
244
             * Sollte <var>$sucheBestand</var> keinen Wert haben, dann setzte diesen auf "0".
245
             */
246
            if ( empty($sucheBestand) )
247
            {
248
                $sucheBestand = 0;
249
            }
250
 
251
            /**
252
             * Sollte sich der Suchbegriff geändert haben, dann setzte die Artikelseite auf eins,
253
             * ansonsten setzte <var>$sucheArtikelseite</var> gleich eins, wenn <var>$sucheArtikelseite</var> gleich false ist,
254
             * ausßerdem addiere <var>$sucheArtikelseite</var> um den Wert von <var>$_POST['sucheWeiter']</var> und subtrahiere
255
             * <var>$sucheArtikelseite</var> um den Wert von <var>$_POST['sucheZurueck']</var>.
256
             */
257
            if ( $_POST['sucheAlterArtikelname'] != $sucheArtikelname )
258
            {
259
                $sucheArtikelseite = 1;
260
            }
261
            else
262
            {
263
                $sucheArtikelseite = ($_POST['sucheArtikelseite']) ? $_POST['sucheArtikelseite'] : 1;
264
                $sucheArtikelseite += $_POST['sucheWeiter'];
265
                $sucheArtikelseite -= $_POST['sucheZurueck'];
266
            }
267
 
268
            /**
269
             * Bestimmt den Startpunkt der Datenbanksuche und somit auch welche Seite angezeigt wird.
270
             * Dazu wird die Anzahl der Artikel pro Seite (<var>$sucheArtikelProSeite</var>) durch die aktuelle Seitennummer
271
             * (<var>$sucheArtikelseite</var>) dividiert und der Wert des Quotionenten mit Anzahl der Artikel pro Seite subtrahiert.
272
             */
273
            $sucheArtikelanzahl['start']  = ($sucheArtikelProSeite * $sucheArtikelseite) -  $sucheArtikelProSeite;
274
        }
275
 
276
        /**
277
         * Bestandsoperator bestimmen.
278
         */
279
        if ( $sucheBestandsoperator == 0 )
280
        {
281
            $sucheBestandsoperatorZeichen = "=";
282
        }
283
        elseif ( $sucheBestandsoperator == 1 )
284
        {
285
            $sucheBestandsoperatorZeichen = ">";
286
        }
287
        elseif ( $sucheBestandsoperator == 2 )
288
        {
289
            $sucheBestandsoperatorZeichen = "<";
290
        }
291
        elseif ( $sucheBestandsoperator == 3 )
292
        {
293
            $sucheBestandsoperatorZeichen = FALSE;
294
        }
295
        else
296
        {
297
            die ("<strong>Fehler:</strong> Der Bestandsoperator konnte nicht ermittelt werden!");
298
        }
299
 
300
        /**
301
         * HAVING-Bedingung, welche nur in die nachfolgende Query übernommen wird, wenn ein Bestandsoperatorzeichen
302
         * ausgewählt wurde, also <var>$sucheBestandsoperatorZeichen</var> nicht den Wert FALSE hat.
303
         */
304
        if ( $sucheBestandsoperatorZeichen != FALSE )
305
        {
306
            $havingBedingung = "HAVING bestand $sucheBestandsoperatorZeichen $sucheBestand";
307
        }
308
 
309
        /**
310
         * QUERY: Hole aus der Datenbank alle Artikel, die den angegebenen Parametern entsprechen.
311
         */
312
        $sql = "
313
            SELECT
314
                SQL_CALC_FOUND_ROWS
315
                a.ID as id,
316
                a.kurzbezeichnung,
317
                a.durchschnittliche_lieferzeit,
318
                a.jahreszinssatz,
319
                a.mindestbestand,
320
                SUM(b.menge) AS bestand
321
            FROM
322
                artikel AS a LEFT JOIN lagerbewegungen as b
323
                    ON a.ID = b.artikel
324
            WHERE
325
                a.kurzbezeichnung LIKE '%$sucheArtikelname%'
326
                OR a.ID = '$sucheArtikelname'
327
            GROUP BY
328
                a.ID
329
            $havingBedingung
330
            ORDER BY
331
                a.kurzbezeichnung $sucheSortierung
332
            LIMIT
333
                ".$sucheArtikelanzahl['start'].", ".$sucheArtikelProSeite."
334
        ;";
335
 
336
        /**
337
         * QUERY ausführen.
338
         */
339
        $result = mysql_query( $sql ) or die( mysql_errno() . ': ' . mysql_error() . '<hr />' . $sql );
340
 
341
        /**
342
         * Speichere alle zurückgegebenen Artikeldaten in einem Loop-Array mit den Sub-Arrays: id, kurzbezeichnung, durchschnittliche_lieferzeit,
343
         * jahreszinssatz und mindestbestand.
344
         */
345
        for ( $i = 0; $row = mysql_fetch_assoc($result); $i++ )
346
        {
347
            $sucheArtikel[$i]['id']                             = $row['id'];
348
            $sucheArtikel[$i]['kurzbezeichnung']                = $row['kurzbezeichnung'];
349
            $sucheArtikel[$i]['mindestbestand']                 = $row['mindestbestand'];
350
        }
351
 
352
        /**
353
         * Hole die Anzahl der Artikel, die den Suchparametern entsprechen.
354
         */
355
        $sql = "SELECT FOUND_ROWS() AS sucheAnzahlArtikel";
356
 
357
        /**
358
         * QUERY ausführen.
359
         */
360
        $result = mysql_query( $sql ) or die( mysql_errno() . ': ' . mysql_error() . '<hr />' . $sql );
361
 
362
        /**
363
         * QUERY in ein Assoziatives Array speichern.
364
         */
365
        $row = mysql_fetch_assoc($result);
366
 
367
        /**
368
         * Die Anzahl der Artikel, die den Suchparametern entsprechen.
369
         */
370
        $sucheAnzahlArtikel = $row['sucheAnzahlArtikel'];
371
 
372
        /**
373
         * Prüfe, ob die Anzahl der Artikel ohne Rest durch die Anzahl der Artikel pro Seite teilbar ist.
374
         */
375
        $rest = $sucheAnzahlArtikel % $sucheArtikelProSeite;
376
 
377
        /**
378
         * Sollte <var>$rest</var> größer als 0 sein, rechne die Anzahl der Artikel durch die Artikel pro Seite + 1.
379
         */
380
        if ( $rest > 0 )
381
        {
382
            $sucheAnzahlSeiten = (int)($sucheAnzahlArtikel / $sucheArtikelProSeite) + 1;
383
        }
384
        else
385
        {
386
            $sucheAnzahlSeiten = ($sucheAnzahlArtikel / $sucheArtikelProSeite);
387
        }
388
 
389
        /**
390
         * Sollte die aktuelle Seitennummer (<var>$sucheArtikelseite</var>) größer sein als die Gesamtseitenzahl (<var>$sucheAnzahlSeiten</var>),
391
         * dann dekrementiere die aktuelle Seitennummer um eins.
392
         */
393
        if ( $sucheArtikelseite > $sucheAnzahlSeiten )
394
        {
395
            $sucheArtikelseite--;
396
        }
397
 
398
        /**
399
         * Sollte die aktuelle Seitennummer (<var>$sucheArtikelseite</var>) kleiner sein als eins,
400
         * dann inkrementiere die aktuelle Seitennummer um eins.
401
         */
402
        if ( $sucheArtikelseite < 1 )
403
        {
404
            $sucheArtikelseite++;
405
        }
406
 
407
        /**
408
         * Berechnung aller Bestände der Artikel der aktuellen Seite.
409
         */
410
        for ( $i = 0; $i < sizeof($sucheArtikel); $i++ )
411
        {
412
            /**
413
             * QUERY: Berechnung des aktuellen Bestands für den <var>$sucheArtikel[$i]['id']</var>.
414
             */
415
            $sql = "
416
                SELECT
417
                    SUM(menge) as bestand
418
                FROM
419
                    lagerbewegungen
420
                WHERE
421
                    artikel = ".$sucheArtikel[$i]['id']."
422
            ;";
423
 
424
            /**
425
             * QUERY ausführen.
426
             */
427
            $result = mysql_query( $sql ) or die( mysql_errno() . ': ' . mysql_error() . '<hr />' . $sql );
428
 
429
            /**
430
             * Das Ergebnis der QUERY in einem assoziativen Array speichern.
431
             */
432
            $row = mysql_fetch_assoc($result);
433
 
434
            /**
435
             * Speicherung des Bestands in <var>$sucheArtikel[$i]['bestand']</var>
436
             */
437
            $sucheArtikel[$i]['bestand'] = $row['bestand'];
438
        }
439
 
440
        /**
441
         * Übergabe der Artikel- und Formulardaten an Smarty.
442
         */
443
        /**
444
         * Übergabe Artikelname
445
         */
446
        $GLOBALS["ui"]->assign("sucheArtikelname", $sucheArtikelname);
447
 
448
        /**
449
         * Übergabe Bestand
450
         */
451
        $GLOBALS["ui"]->assign("sucheBestand", $sucheBestand);
452
 
453
        /**
454
         * Übergabe Bestandsoperatorennummer
455
         */
456
        $GLOBALS["ui"]->assign("sucheBestandsoperator", $sucheBestandsoperator);
457
 
458
        /**
459
         * Übergabe Meldebestand-größer-als-Bestand-Option
460
         */
461
        $GLOBALS["ui"]->assign("sucheMeldebestandGroesserBestand", $sucheMeldebestandGroesserBestand);
462
 
463
        /**
464
         * Übergabe Sortierung
465
         */
466
        $GLOBALS["ui"]->assign("sucheSortierung", $sucheSortierung);
467
 
468
        /**
469
         * Übergabe Nummer der aktuellen Seite
470
         */
471
        $GLOBALS["ui"]->assign("sucheArtikelseite", $sucheArtikelseite);
472
 
473
        /**
474
         * Übergabe der Anzahl der Seiten
475
         */
476
        $GLOBALS["ui"]->assign("sucheAnzahlSeiten", $sucheAnzahlSeiten);
477
 
478
        /**
479
         * Übergabe des Artikel-Arrays
480
         */
481
        $GLOBALS["ui"]->assign("artikelLoop", $sucheArtikel);
482
    }
483
 
484
    /**
485
     * Wenn <var>$_GET['action']</var> gleich "buchung" ist, dann führe diesen Codeblock aus.
486
     */
487
    if ( $_GET['action'] == "buchung" )
488
    {
489
        /**
490
         * QUERY: Hole alle Lieferanten des Kunden, die nicht gesperrt sind.
491
         */
492
        $sql = "
493
            SELECT
494
                ID as id,
495
                Name as name
496
            FROM
497
                Firma
498
            WHERE
499
                gesperrt = 'nein'
500
        ";
501
        /**
502
         * QUERY ausführen.
503
         */
504
        $result = mysql_query( $sql ) or die( mysql_errno() . ': ' . mysql_error() . '<hr />' . $sql );
505
 
506
        /**
507
         * QUERY in ein Assoziatives Array speichern.
508
         */
509
        for ( $i = 0; $row = mysql_fetch_assoc($result); $i++ )
510
        {
511
            $eingangsbuchungLieferanten[$i]['id']   = $row['id'];
512
            $eingangsbuchungLieferanten[$i]['name'] = $row['name'];
513
        }
514
 
515
        /**
516
         * Übergabe der Lieferanten an Smarty.
517
         */
518
        $GLOBALS["ui"]->assign("lieferantenLoop", $eingangsbuchungLieferanten);
519
    }
520
 
521
    /**
522
     * Wenn <var>$_GET['action']</var> gleich "artikel" ist, dann führe diesen Codeblock aus.
523
     */
524
    if ( $_GET['action'] == "artikel" )
525
    {
526
        /**
527
         * Prüfe ob eine <var>$_GET['id']</var> korrekt übergeben wurde.
528
         */
529
        if ( empty($_GET['id']) )
530
        {
531
            /**
532
             * Abbruch des Skripts.
533
             */
534
            die ("<strong>Fehler:</strong> Sie haben diese Seite ohne id-Parameter aufgerufen!");
535
        }
536
 
537
        /**
538
         * Wenn "Artikeldaten aktualisieren" geklickt wurde updatete in der Datenbank folgende Attribute des Artikels:
539
         * mindestbestand, durchschnittliche_lieferzeit und jahreszinssatz.
540
         */
541
        if ( $_POST['artikeldaten_eintragen'] )
542
        {
543
           /**
544
            * QUERY: UPDATE der Artikeltabelle.
545
            */
546
           $sql = "
547
                UPDATE
548
                    artikel
549
                SET
550
                    mindestbestand                  = '".$_POST['mindestbestand']."',
551
                    durchschnittliche_lieferzeit    = '".$_POST['durchschnittlicheLieferzeit']."',
552
                    jahreszinssatz                  = '".$_POST['jahreszinssatz']."'
553
                WHERE
554
                    ID = ".$_GET['id']."
555
           ;";
556
 
557
           /**
558
            * QUERY ausführen.
559
            */
560
           mysql_query( $sql ) or die( mysql_errno() . ': ' . mysql_error() . '<hr />' . $sql );
561
        }
562
 
563
        /**
564
         * QUERY: Hole folgende Daten des Artikel: ID (Artikelnummer), kurzbezeichnung (Artikelbezeichnung),
565
         * durschnittliche_lieferzeit (durchschnittliche Lieferzeit), jahreszinssatz (Jahreszinssatz), mindestbestand (Mindestbestand).
566
         */
567
        $sql = "
568
            SELECT
569
                a.ID AS id,
570
                a.kurzbezeichnung AS artikelbezeichnung,
571
                a.durchschnittliche_lieferzeit AS durchschnittlicheLieferzeit,
572
                a.jahreszinssatz,
573
                a.mindestbestand,
574
                SUM(b.menge) AS bestand
575
            FROM
576
                artikel AS a LEFT JOIN lagerbewegungen AS b
577
                    ON a.ID = b.artikel
578
            WHERE
579
                a.ID = ".$_GET['id']."
580
            GROUP BY
581
                id
582
        ;";
583
 
584
        /**
585
         * QUERY ausführen.
586
         */
587
        $result = mysql_query( $sql ) or die( mysql_errno() . ': ' . mysql_error() . '<hr />' . $sql );
588
 
589
        /**
590
         * Prüfe ob keine Artikeldaten zurückgegeben wurden indem ein assoziatives Array mit den Rückgabewerten gefüllt wird.
591
         */
592
        if ( !$artikelArtikeldaten = mysql_fetch_assoc($result) )
593
        {
594
            /**
595
             * Abbruch des Skripts.
596
             */
597
            die ("<strong>Fehler:</strong> Der Artikel (ID=".$_GET['id'].") konnte nicht gefunden werden!");
598
        }
599
 
600
        /**
601
         * Berechnung des durchschnittlichen Lagerbestand.
602
         */
603
        /**
604
         * QUERY: Hole alle Lagerbewegungen des Artikels der letzten 360 Tage aus der Datenbank.
605
         */
606
        $sql = "
607
            SELECT
608
                b.eintragsdatum AS datum,
609
                a.menge
610
            FROM
611
                lagerbewegungen AS a INNER JOIN buchungen AS b
612
                    ON a.buchungen = b.ID
613
            WHERE
614
                a.artikel = ".$_GET['id']."
615
            ORDER BY
616
                datum DESC
617
        ;";
618
 
619
        /**
620
         * QUERY ausführen.
621
         */
622
        $result = mysql_query( $sql ) or die( mysql_errno() . ': ' . mysql_error() . '<hr />' . $sql );
623
 
624
        /**
625
         * Speicherung aller Lagerbewegungen als LOOP-Array mit Datum und Menge.
626
         */
627
        for ( $i = 0; $row = mysql_fetch_assoc($result); $i++ )
628
        {
629
            $lagerbewegungen[$i]['datum'] = date("d.m.Y H:i:s", strtotime($row['datum']));
630
            $lagerbewegungen[$i]['menge'] = $row['menge'];
631
        }
632
 
633
        /**
634
         * Die Lagerbewegungen werden zusätzlich in eine zweite Variable gespeichert,
635
         * damit diese unverändert an Smarty übergeben werden können, da die Lagerbewegungen durch die Berechnung
636
         * des durchschnittlichen Lagerbestands verfälscht werden würden.
637
         */
638
        $lagerbewegungenArtikel = $lagerbewegungen;
639
 
640
        /**
641
         * Addition aller Bestände eines <b>jeden</b> Tages von Beginn bis Ende der Buchungen.
642
         * Gespeichert wird dies in der Variable <var>$zwischenspeicher</var>.
643
         */
644
        for ( $i = 0; $i < sizeof($lagerbewegungen); $i++ )
645
        {
646
            /**
647
             * Letzter Lagerbewegungseintrag noch nicht erreicht?
648
             */
649
            if ( $i+1 != sizeof($lagerbewegungen) )
650
            {
651
                /**
652
                 * Zwischenspeichern des i. Datums im Format "YYYY-MM-TT", vorher "YYYY-MM-TT HH:ii:ss".
653
                 */
654
                $temp = explode(" ", $lagerbewegungen[$i]['datum']);
655
 
656
                /**
657
                 * <var>$tempDatum[0]</var> enthält den Timestamp der i. Lagerbewegung.
658
                 */
659
                $tempDatum[0] = strtotime($temp[0]);
660
 
661
                /**
662
                 * Zwischenspeichern des i+1. Datums im Format "YYYY-MM-TT", vorher "YYYY-MM-TT HH:ii:ss".
663
                 */
664
                $temp = explode(" ", $lagerbewegungen[$i+1]['datum']);
665
 
666
                /**
667
                 * <var>$tempDatum[0]</var> enthält den Timestamp der i+1. Lagerbewegung.
668
                 */
669
                $tempDatum[1] = strtotime($temp[0]);
670
 
671
                /**
672
                 * Ist das i. Datum gleich dem i+1. Datum?
673
                 */
674
                if ( $tempDatum[0] == $tempDatum[1] )
675
                {
676
                    /**
677
                     * Addition der Menge der i. Lagerbewegungen mit der i+1 und Überschreibung der i+1. Menge.
678
                     */
679
                    $lagerbewegungen[$i+1]['menge'] += $lagerbewegungen[$i]['menge'];
680
 
681
                    /**
682
                     * Setzte die Menge der i. Lagerbewegung auf 0.
683
                     */
684
                    $lagerbewegungen[$i]['menge'] = 0;
685
 
686
                    /**
687
                     * Setzte ein Flag für die i+1. Lagerbewegung.
688
                     */
689
                    $lagerbewegungen[$i+1]['flag'] = 1;
690
                }
691
                else
692
                {
693
                    /**
694
                     * Addiere auf die Variable <var>aktuellerBestand</var> den Wert von <var>$lagerbewegungen[$i]['menge']</var>.
695
                     */
696
                    $aktuellerBestand += $lagerbewegungen[$i]['menge'];
697
 
698
                    /**
699
                     * Ist das Flag <var>$lagerbewegungen[$i]['flag']</var> gesetzt?
700
                     */
701
                    if ( $lagerbewegungen[$i]['flag'] )
702
                    {
703
                        /**
704
                         * Ziehe vom Datum der i+1. Lagerbewegung das der i. ab und speichere dies in <var>$temp</var>.
705
                         */
706
                        $temp = $tempDatum[1] - $tempDatum[0];
707
 
708
                        /**
709
                         * Wandle <var>$temp</var> von Timestamp auf Tage um.
710
                         */
711
                        $temp = ((($temp / 60) / 60) / 24);
712
 
713
                        /**
714
                         * Speichere in der Variable <var>$zwischenspeicher</var> das Ergebnis der Multiplikation
715
                         * von <var>$temp</var> (Anzahl der Tage) und <var>$aktuellerBestand</var>.
716
                         */
717
                        $zwischenspeicher += $aktuellerBestand * $temp;
718
                    }
719
                    else
720
                    {
721
                        /**
722
                         * Ist <var>$i</var> gleich 0?
723
                         */
724
                        if ( $i == 0 )
725
                        {
726
                            /**
727
                             * Ziehe vom Datum der i+1. Lagerbewegung das der i. ab und speichere dies in <var>$temp</var>.
728
                             */
729
                            $temp = $tempDatum[1] - $tempDatum[0];
730
 
731
                            /**
732
                             * Wandle <var>$temp</var> von Timestamp auf Tage um.
733
                             */
734
                            $temp = ((($temp / 60) / 60) / 24);
735
 
736
                            /**
737
                             * Setzte die Variable <var>$zwischenspeicher</var> auf die Menge der i. Lagerbewegung x die Anzahl an Tagen
738
                             * bis zur i+1 Lagerbewegung.
739
                             */
740
                            $zwischenspeicher = $lagerbewegungen[$i]['menge'] * $temp;
741
                        }
742
                        else
743
                        {
744
                            /**
745
                             * Überschreibe den Wert von <var>$zwischenspeicher</var> mit dem Ergebnis der Addtion
746
                             * von <var>$zwischenspeicher</var> und <var>$aktuellerBestand</var>.
747
                             */
748
                            $zwischenspeicher += $aktuellerBestand;
749
                        }
750
                    }
751
                }
752
            }
753
            else
754
            {
755
                 /**
756
                  * Addiere zum Wert von <var>$aktuellerBestand</var> den Wert von <var>$lagerbewegungen[$i]['menge']</var>.
757
                  */
758
                 $aktuellerBestand += $lagerbewegungen[$i]['menge'];
759
 
760
                 /**
761
                  * Addiere zum Wert von <var>$zwischenspeicher</var> den Wert von <var>$aktuellerBestand</var>.
762
                  */
763
                 $zwischenspeicher += $aktuellerBestand;
764
            }
765
        }
766
 
767
        /**
768
         * Zwischenspeichern des 1. Datums im Format "YYYY-MM-TT", vorher "YYYY-MM-TT HH:ii:ss".
769
         */
770
        $temp = explode(" ", $lagerbewegungen[0]['datum']);
771
 
772
        /**
773
         * <var>$tempDatum[0]</var> enthält den Timestamp der 1. Lagerbewegung.
774
         */
775
        $tempDatum[0] = strtotime($temp[0]);
776
 
777
        /**
778
         * Zwischenspeichern des 1. Datums im Format "YYYY-MM-TT", vorher "YYYY-MM-TT HH:ii:ss".
779
         */
780
        $temp = explode(" ", $lagerbewegungen[sizeof($lagerbewegungen)-1]['datum']);
781
 
782
        /**
783
         * <var>$tempDatum[1]</var> enthält den Timestamp der letzten Lagerbewegung.
784
         */
785
        $tempDatum[1] = strtotime($temp[0]);
786
 
787
        /**
788
         * Berechne den Zeitraum in Sek. zwischen der ersten und der letzten Lagerbewegung.
789
         */
790
        $temp = $tempDatum[1] - $tempDatum[0];
791
 
792
        /**
793
         * Wandle den Zeitraum zwischen der ersten und der letzten Lagerbewegung in Tage um.
794
         */
795
        $temp = ((($temp / 60) / 60) / 24);
796
 
797
        /**
798
         * Berechne den durchschnittlichen Lagerbestand.
799
         */
800
        @$durschnittlicherBestand = $zwischenspeicher / ($temp+1);
801
 
802
        /**
803
         * Berechnung des Wareneinsatz.
804
         * Für die Berechnung des Wareneinsatzes werden alle Warenausgänge der letzten 360 Tage miteinander addiert.
805
         */
806
        /**
807
         * QUERY: Hole alle Ausgänge des Artikels mit der ID <var>$_GET['id']</var>.
808
         */
809
        $sql = "
810
            SELECT
811
                SUM(a.menge) as wareneinsatz
812
            FROM
813
                lagerbewegungen as a INNER JOIN buchungen as b
814
                    ON a.buchungen = b.ID
815
            WHERE
816
                a.artikel = ".$_GET['id']."
817
                AND a.menge < 0
818
                AND b.eintragsdatum > NOW() - INTERVAL 360 DAY
819
        ;";
820
 
821
        /**
822
         * QUERY ausführen.
823
         */
824
        $result = mysql_query( $sql ) or die( mysql_errno() . ': ' . mysql_error() . '<hr />' . $sql );
825
 
826
        /**
827
         * Speichere das Ergebnis der QUERY in einem assoziativen Array.
828
         */
829
        $row = mysql_fetch_assoc($result);
830
 
831
        /**
832
         * Der Wareneinsatz der letzten 360 Tage des Artikels mit der ID <var>$_GET['id']</var>.
833
         */
834
        $wareneinsatz = abs($row['wareneinsatz']);
835
 
836
        /**
837
         * Berechnung der Umschlagshäufigkeit.
838
         */
839
        /**
840
         * QUERY: Hole das höchste und das niedrigste Datum des letzten Jahres der Lagerbewegungen des Artikels mit der ID <var>$_GET['id']</var>.
841
         */
842
        $sql = "
843
            SELECT
844
                MIN(b.eintragsdatum) AS minEintragsdatum,
845
                MAX(b.eintragsdatum) AS maxEintragsdatum
846
            FROM
847
                lagerbewegungen AS a INNER JOIN buchungen AS b
848
                    ON a.buchungen = b.ID
849
            WHERE
850
                artikel = ".$_GET['id']."
851
                AND b.eintragsdatum > NOW() - INTERVAL 360 DAY
852
        ;";
853
 
854
        /**
855
         * QUERY ausführen
856
         */
857
        $result = mysql_query( $sql ) or die( mysql_errno() . ': ' . mysql_error() . '<hr />' . $sql );
858
 
859
        /**
860
         * Speichere das Ergebnis der QUERY in einem assoziativen Array.
861
         */
862
        $row = mysql_fetch_assoc($result);
863
 
864
        /**
865
         * Berechne den Zeitraum zwischen <var>$row['minEintragsdatum']</var> und <var>$row['maxEintragsdatum']</var> in Tagen.
866
         */
867
        $temp = explode(" ", $row['minEintragsdatum']);
868
        $minEintragsdatum = strtotime($temp[0]);
869
 
870
        $temp = explode(" ", $row['maxEintragsdatum']);
871
        $maxEintragsdatum = strtotime($temp[0]);
872
 
873
        $zeitraumEintragsdatum = (((($maxEintragsdatum - $minEintragsdatum) / 60) / 60) / 24) + 1;
874
 
875
        /**
876
         * Rechne den Wareneinsatz auf das Jahr hoch.
877
         */
878
        $wareneinsatz *= (360 / $zeitraumEintragsdatum);
879
 
880
        /**
881
         * Berechne die Umschlagshäufigkeit.
882
         */
883
        @$umschlagshaeufigkeit = $wareneinsatz / $durschnittlicherBestand;
884
 
885
        /**
886
         * Berechne die durchschnittliche Lagerdauer.
887
         */
888
        @$durchschnittlicheLagerdauer = 360 / $umschlagshaeufigkeit;
889
 
890
        /**
891
         * Berechne den Lagerzinssatz.
892
         */
893
        $lagerzinssatz = $artikelArtikeldaten['jahreszinssatz'] * $umschlagshaeufigkeit / 360;
894
 
895
        /**
896
         * Berechne die Lagerzinskosten.
897
         */
898
        $lagerzinskosten = $lagerzinssatz * $durschnittlicherBestand / 100;
899
 
900
        /**
901
         * Berechne den Meldebestand.
902
         */
903
        $meldebestand = $artikelArtikeldaten['mindestbestand'] * ($wareneinsatz / 360);
904
 
905
        /**
906
         * Berechnung des verfügbaren Bestands.
907
         */
908
        $bestandsInfo = getArtikelbestandsInfo($artikelArtikeldaten['id']);
909
        $verfuegbarerBestand = $bestandsInfo['verfuegbareMenge'];
910
 
911
        /**
912
         * Übergabe Artikeldaten an Smarty.
913
         */
914
        $GLOBALS["ui"]->assign("artikelArtikeldaten", $artikelArtikeldaten);
915
 
916
        /**
917
         * Übergabe Lagerbewegungsdaten an Smarty.
918
         */
919
        $GLOBALS["ui"]->assign("lagerbewegungenArtikel", $lagerbewegungenArtikel);
920
 
921
        /**
922
         * Übergabe des durchschnittlichen Bestands an Smarty.
923
         */
924
        $GLOBALS["ui"]->assign("durschnittlicherBestand", number_format($durschnittlicherBestand, 2, ",", "."));
925
 
926
        /**
927
         * Übergabe des Wareneinsatz an Smarty.
928
         */
929
        $GLOBALS["ui"]->assign("wareneinsatz", $wareneinsatz);
930
 
931
        /**
932
         * Übergabe der durchschnittlichen Lagerdauer an Smarty.
933
         */
934
        $GLOBALS["ui"]->assign("durchschnittlicheLagerdauer", number_format($durchschnittlicheLagerdauer, 2, ",", "."));
935
 
936
        /**
937
         * Übergabe der Umschlagshäufigkeit an Smarty.
938
         */
939
        $GLOBALS["ui"]->assign("umschlagshaeufigkeit", number_format($umschlagshaeufigkeit, 2, ",", "."));
940
 
941
        /**
942
         * Übergabe des Lagerzinssatz an Smarty.
943
         */
944
        $GLOBALS["ui"]->assign("lagerzinssatz", number_format($lagerzinssatz, 2, ",", "."));
945
 
946
        /**
947
         * Übergabe der Lagerzinskosten an Smarty.
948
         */
949
        $GLOBALS["ui"]->assign("lagerzinskosten", number_format($lagerzinskosten, 2, ",", "."));
950
 
951
        /**
952
         * Übergabe des Meldebestand an Smarty.
953
         */
954
        $GLOBALS["ui"]->assign("meldebestand", $meldebestand);
955
 
956
        /**
957
         * Übergabe des verfügbaren Bestands.
958
         */
959
        $GLOBALS["ui"]->assign('verfuegbarerBestand', $verfuegbarerBestand);
960
 
961
    }
962
    /**
963
	* Auswahl des Smarty-Templates.
964
	*/
965
    switch ( $_REQUEST['action'] )
966
    {
967
        case 'uebersicht':
968
            $GLOBALS["ui"]->display( "lagerwirtschaft/uebersicht.tpl" );
969
        break;
970
 
971
        case 'buchung':
972
            $GLOBALS["ui"]->display( "lagerwirtschaft/buchung.tpl" );
973
        break;
974
 
975
        case 'artikel':
976
            $GLOBALS["ui"]->display( "lagerwirtschaft/artikel.tpl" );
977
        break;
978
 
979
        default:
980
            unset( $_SESSION[F_NAME] );
981
            $GLOBALS["ui"]->display( "lagerwirtschaft/uebersicht.tpl" );
982
    }
983
?>