Files
sam-api/app/Services/ItemMaster/ItemBomItemService.php
hskwon 28a943bf8e feat: ItemMaster Phase 2 API 구현 (확장 기능 11개 엔드포인트)
- Controller 3개, Service 3개, FormRequest 6개 생성
- Routes 등록 (BOM 항목, 섹션 템플릿, 마스터 필드)
- Service-First, Multi-tenant, Soft Delete
- 라우트 테스트 및 Pint 검사 통과

13 files changed, 600+ insertions(+)
2025-11-20 17:07:40 +09:00

97 lines
2.8 KiB
PHP

<?php
namespace App\Services\ItemMaster;
use App\Models\ItemMaster\ItemBomItem;
use App\Models\ItemMaster\ItemSection;
use App\Services\Service;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class ItemBomItemService extends Service
{
/**
* BOM 항목 생성
*/
public function store(int $sectionId, array $data): ItemBomItem
{
$tenantId = $this->tenantId();
$userId = $this->apiUserId();
// 섹션 존재 확인
$section = ItemSection::where('tenant_id', $tenantId)
->where('id', $sectionId)
->first();
if (! $section) {
throw new NotFoundHttpException(__('error.not_found'));
}
$bomItem = ItemBomItem::create([
'tenant_id' => $tenantId,
'section_id' => $sectionId,
'item_code' => $data['item_code'] ?? null,
'item_name' => $data['item_name'],
'quantity' => $data['quantity'] ?? 1,
'unit' => $data['unit'] ?? null,
'unit_price' => $data['unit_price'] ?? null,
'total_price' => $data['total_price'] ?? null,
'spec' => $data['spec'] ?? null,
'note' => $data['note'] ?? null,
'created_by' => $userId,
]);
return $bomItem;
}
/**
* BOM 항목 수정
*/
public function update(int $id, array $data): ItemBomItem
{
$tenantId = $this->tenantId();
$userId = $this->apiUserId();
$bomItem = ItemBomItem::where('tenant_id', $tenantId)
->where('id', $id)
->first();
if (! $bomItem) {
throw new NotFoundHttpException(__('error.not_found'));
}
$bomItem->update([
'item_code' => $data['item_code'] ?? $bomItem->item_code,
'item_name' => $data['item_name'] ?? $bomItem->item_name,
'quantity' => $data['quantity'] ?? $bomItem->quantity,
'unit' => $data['unit'] ?? $bomItem->unit,
'unit_price' => $data['unit_price'] ?? $bomItem->unit_price,
'total_price' => $data['total_price'] ?? $bomItem->total_price,
'spec' => $data['spec'] ?? $bomItem->spec,
'note' => $data['note'] ?? $bomItem->note,
'updated_by' => $userId,
]);
return $bomItem->fresh();
}
/**
* BOM 항목 삭제
*/
public function destroy(int $id): void
{
$tenantId = $this->tenantId();
$userId = $this->apiUserId();
$bomItem = ItemBomItem::where('tenant_id', $tenantId)
->where('id', $id)
->first();
if (! $bomItem) {
throw new NotFoundHttpException(__('error.not_found'));
}
$bomItem->update(['deleted_by' => $userId]);
$bomItem->delete();
}
}