diff --git a/app/Services/Admin/Master/RawMaterial/RawMaterialVariantService.php b/app/Services/Admin/Master/RawMaterial/RawMaterialVariantService.php
index 83fb008..a653857 100644
--- a/app/Services/Admin/Master/RawMaterial/RawMaterialVariantService.php
+++ b/app/Services/Admin/Master/RawMaterial/RawMaterialVariantService.php
@@ -24,10 +24,22 @@ public function getForCutting(): array
->select(['id', 'name', 'unit', 'is_active'])
->with([
'rawMaterialPrices:id,raw_material_id,variant,price,stock',
+ 'rawMaterialPrices.media',
])
->active()
->orderBy('name')
->get()
+ ->each(function (RawMaterial $rawMaterial) {
+ $rawMaterial->rawMaterialPrices->each(function (RawMaterialPrice $price) {
+ $media = $price->getFirstMedia('images');
+ $price->photo_url = $media
+ ? $this->s3Service->getTemporaryUrl($media->getPath())
+ : null;
+ $price->photo_conversion_url = $media
+ ? $this->s3Service->getTemporaryUrl($media->getPath('thumb'))
+ : null;
+ });
+ })
->toArray();
}
diff --git a/docs/2026-08-15-raw-material-photo-fix.md b/docs/2026-08-15-raw-material-photo-fix.md
new file mode 100644
index 0000000..b810507
--- /dev/null
+++ b/docs/2026-08-15-raw-material-photo-fix.md
@@ -0,0 +1,49 @@
+# Fix: Foto Bahan Baku Tidak Muncul di Cutting & Belanja
+
+## Tujuan
+Memperbaiki foto bahan baku (raw material) yang tidak muncul di halaman create/edit Cutting dan Belanja (Purchasing). Menampilkan foto conversion (thumbnail) bukan original.
+
+## File yang Dibaca
+- `app/Services/Admin/Master/RawMaterial/RawMaterialVariantService.php` → `getForCutting()` method (root cause backend)
+- `resources/js/pages/admin/manage/cutting/columns.tsx` → `CuttingCreateData` type (root cause frontend)
+- `resources/js/pages/admin/manage/purchase/columns.tsx` → `PurchaseCreateData` type (root cause frontend)
+- `resources/js/pages/admin/master/raw-material/columns.tsx` → reference type pattern
+
+## Root Cause
+
+### Backend
+`getForCutting()` tidak load media atau set `photo_url`/`photo_conversion_url` pada `RawMaterialPrice`.
+
+### Frontend
+Type `CuttingCreateData` dan `PurchaseCreateData` tidak include `photo_conversion_url` di `raw_material_prices` → TypeScript strip property → frontend tidak bisa akses.
+
+## Perubahan
+
+### 1. Backend — `RawMaterialVariantService::getForCutting()`
+- Tambah eager load `rawMaterialPrices.media`
+- Iterasi setiap `RawMaterialPrice` untuk set `photo_url` + `photo_conversion_url`
+
+### 2. Frontend Types — `columns.tsx`
+- `CuttingCreateData.raw_material_prices` → tambah `photo_conversion_url: string | null`
+- `PurchaseCreateData.raw_material_prices` → tambah `photo_conversion_url: string | null`
+
+### 3. Frontend Components — 4 files
+- Tambah `photo_conversion_url` ke `MaterialState` type (cutting create/edit)
+- Map `photo_conversion_url` dari backend data
+- ` ({
material_result: c.material_result,
@@ -192,6 +195,7 @@ export default function CuttingCreate({ rawMaterials }: Props) {
material_name: rawMaterial.name,
unit: rawMaterial.unit,
photo_url: price.photo_url,
+ photo_conversion_url: price.photo_conversion_url,
},
];
});
@@ -242,6 +246,7 @@ export default function CuttingCreate({ rawMaterials }: Props) {
material_name: foundMaterial?.name ?? '',
unit: foundMaterial?.unit ?? '',
photo_url: foundPrice?.photo_url ?? null,
+ photo_conversion_url: foundPrice?.photo_conversion_url ?? null,
};
});
@@ -393,8 +398,8 @@ export default function CuttingCreate({ rawMaterials }: Props) {
return (