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>
91 lines
2.6 KiB
PHP
91 lines
2.6 KiB
PHP
<?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' => '1–3 Werktage', 'days' => 3],
|
||
['label' => '3–5 Werktage', 'days' => 5],
|
||
['label' => '1–2 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]
|
||
);
|
||
}
|
||
}
|
||
}
|