在庫管理機能 Phase 1 実装(apps/materials + フロントエンド)

Backend:
- apps/materials 新規作成(Material, FertilizerProfile, PesticideProfile, StockTransaction)
- 資材マスタ CRUD API(/api/materials/materials/)
- 入出庫履歴 API(/api/materials/stock-transactions/)
- 在庫集計 API(/api/materials/stock-summary/)
- 既存 Fertilizer に material OneToOneField 追加(0005マイグレーション、データ移行込み)

Frontend:
- /materials: 在庫一覧画面(タブフィルタ、履歴展開、入出庫モーダル)
- /materials/masters: 資材マスタ管理(肥料/農薬/その他タブ、インライン編集)
- Navbar に「在庫管理」メニュー追加
- Material/StockTransaction/StockSummary 型定義追加

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Akira
2026-03-14 15:42:47 +09:00
parent 67d4197b7f
commit 497bc87c24
20 changed files with 2344 additions and 1 deletions

View File

@@ -0,0 +1,56 @@
import django.db.models.deletion
from django.db import migrations, models
def create_materials_for_existing_fertilizers(apps, schema_editor):
Fertilizer = apps.get_model('fertilizer', 'Fertilizer')
Material = apps.get_model('materials', 'Material')
FertilizerProfile = apps.get_model('materials', 'FertilizerProfile')
for fertilizer in Fertilizer.objects.all():
material = Material.objects.create(
name=fertilizer.name,
material_type='fertilizer',
maker=fertilizer.maker or '',
stock_unit='bag',
is_active=True,
notes=fertilizer.notes or '',
)
FertilizerProfile.objects.create(
material=material,
capacity_kg=fertilizer.capacity_kg,
nitrogen_pct=fertilizer.nitrogen_pct,
phosphorus_pct=fertilizer.phosphorus_pct,
potassium_pct=fertilizer.potassium_pct,
)
fertilizer.material = material
fertilizer.save(update_fields=['material'])
def reverse_migration(apps, schema_editor):
Fertilizer = apps.get_model('fertilizer', 'Fertilizer')
Fertilizer.objects.all().update(material=None)
class Migration(migrations.Migration):
dependencies = [
('fertilizer', '0004_fertilizationplan_calc_settings'),
('materials', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='fertilizer',
name='material',
field=models.OneToOneField(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name='legacy_fertilizer',
to='materials.material',
verbose_name='資材マスタ',
),
),
migrations.RunPython(create_materials_for_existing_fertilizers, reverse_migration),
]