gruene-seele/database/seeders/InventoryStammdatenSeeder.php
Kevin Adametz e53201f229 Warenwirtschaft: Anforderungsrunde 12.06. — Plan V5.0 + AP-26/AP-25/AP-22
Neue Anforderungen (docs/) interpretiert und als Entwicklungsplan V5.0
(AP-20 bis AP-28) aufgenommen; erste drei Pakete umgesetzt:

AP-26 Ausschuss-Gründe konfigurierbar:
- Stammdaten-Tabelle disposal_reasons + CRUD unter Einstellungen → Allgemein
- StockDisposalController liest aktive DB-Gründe statt hartkodierter Liste
- Seeder übernimmt die bisherigen 6 Gründe idempotent

AP-25 Lieferbestand — Datum statt Tage:
- "Nicht vorrätig" wird über Datepicker "Wieder lieferbar ab" gepflegt;
  Resttage-Hinweis zählt täglich automatisch herunter
- Interne Bestellliste wieder kaufbar: Hinweis erscheint zusätzlich zu
  den Mengen-Buttons (VP entscheidet selbst)

AP-22 Produktbestand-Erweiterungen:
- Default-Sortierung nach Dringlichkeit, Status-Kopf toggelt
- Alle vier Status-Kacheln als Filter klickbar
- Neue Spalte "Verbrauch/Monat" (Ø Abgänge der letzten 6 Monate)
- Produkt-Flag "Im Produktbestand anzeigen" (products.show_in_product_stock)

Tests: 77 grün (DisposalReasonSettings 8, ProductOutOfStock 8,
ProductStock 13 + Regression). Hinweise-Doku + Plan-Protokoll fortgeschrieben;
nächster Schritt laut Plan: AP-21 (INCI-Erweiterungen).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 16:28:45 +00:00

91 lines
2.6 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Database\Seeders;
use App\Models\DeliveryTime;
use App\Models\DisposalReason;
use App\Models\Location;
use App\Models\MaterialQuality;
use App\Models\PackagingMaterial;
use App\Models\TaxRate;
use Illuminate\Database\Seeder;
class InventoryStammdatenSeeder extends Seeder
{
public function run(): void
{
$locations = ['Köln', 'Waldböl'];
foreach ($locations as $name) {
Location::query()->firstOrCreate(
['name' => $name],
['active' => true]
);
}
$qualities = [
'konventionell',
'bio kaltgepresst',
'bio raffiniert',
'konventionell kaltgepresst',
'konventionell raffiniert',
];
foreach ($qualities as $pos => $name) {
MaterialQuality::query()->firstOrCreate(
['name' => $name],
['pos' => $pos]
);
}
$materials = [
'Glas',
'Holz/Bambus',
'Pappe/Papier',
'Kunststoff',
];
foreach ($materials as $pos => $name) {
PackagingMaterial::query()->firstOrCreate(
['name' => $name],
['pos' => $pos]
);
}
$taxRates = [
['name' => 'Standard', 'percent' => 19.00],
['name' => 'Ermäßigt', 'percent' => 7.00],
['name' => 'Steuerfrei', 'percent' => 0.00],
];
foreach ($taxRates as $pos => $taxRate) {
TaxRate::query()->firstOrCreate(
['percent' => $taxRate['percent']],
['name' => $taxRate['name'], 'active' => true, 'pos' => $pos]
);
}
$deliveryTimes = [
['label' => '13 Werktage', 'days' => 3],
['label' => '35 Werktage', 'days' => 5],
['label' => '12 Wochen', 'days' => 14],
];
foreach ($deliveryTimes as $pos => $deliveryTime) {
DeliveryTime::query()->firstOrCreate(
['label' => $deliveryTime['label']],
['days' => $deliveryTime['days'], 'active' => true, 'pos' => $pos]
);
}
$disposalReasons = [
'Bruch / Beschädigung',
'Verfall / MHD überschritten',
'Qualitätsmangel',
'Schwund / Inventurdifferenz',
'Muster / Testverbrauch',
'Sonstiges',
];
foreach ($disposalReasons as $pos => $label) {
DisposalReason::query()->firstOrCreate(
['label' => $label],
['active' => true, 'pos' => $pos]
);
}
}
}