Files
sam-api/app/Services/ItemMaster/ItemBomItemService.php
hskwon bccfa19791 feat: Item Master 하이브리드 구조 전환 및 독립 API 추가
- CASCADE FK → 독립 엔티티 + entity_relationships 링크 테이블
- 독립 API 10개 추가 (섹션/필드/BOM CRUD, clone, usage)
- SectionTemplate 모델 제거 → ItemSection.is_template 통합
- 페이지-섹션, 섹션-필드, 섹션-BOM 링크/언링크 API 14개 추가
- Swagger 문서 업데이트
2025-11-26 14:09:31 +09:00

140 lines
4.0 KiB
PHP

<?php
namespace App\Services\ItemMaster;
use App\Models\ItemMaster\ItemBomItem;
use App\Models\ItemMaster\ItemSection;
use App\Services\Service;
use Illuminate\Database\Eloquent\Collection;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class ItemBomItemService extends Service
{
/**
* 독립 BOM 목록 조회
*
* GET /api/v1/item-master/bom-items
*/
public function index(): Collection
{
$tenantId = $this->tenantId();
return ItemBomItem::where('tenant_id', $tenantId)
->orderBy('created_at', 'desc')
->get();
}
/**
* 독립 BOM 생성 (섹션 연결 없음)
*
* POST /api/v1/item-master/bom-items
*/
public function storeIndependent(array $data): ItemBomItem
{
$tenantId = $this->tenantId();
$userId = $this->apiUserId();
$bomItem = ItemBomItem::create([
'tenant_id' => $tenantId,
'group_id' => $data['group_id'] ?? 1,
'section_id' => null,
'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 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();
}
}