fix: Items API 품목 생성 시 타입별 테이블 분기 저장

- FG, PT 타입 → Products 테이블 저장
- SM, RM, CS 타입 → Materials 테이블 저장
- createMaterial() 메서드 추가
- resolveUniqueMaterialCode() 메서드 추가
This commit is contained in:
2025-12-02 17:22:00 +09:00
parent 2605d06f91
commit 686a979127

View File

@@ -236,15 +236,33 @@ private function fetchPrices(string $itemType, int $itemId, ?int $clientId, ?str
}
/**
* 품목 생성 (Product 전용)
* 품목 생성 (타입에 따라 Products 또는 Materials 테이블에 저장)
*
* - FG, PT → Products 테이블
* - SM, RM, CS → Materials 테이블
*
* @param array $data 검증된 데이터
*/
public function createItem(array $data): Product
public function createItem(array $data): Product|Material
{
$tenantId = $this->tenantId();
$userId = $this->apiUserId();
$itemType = strtoupper($data['product_type'] ?? 'FG');
// Materials 타입 (SM, RM, CS)
if (in_array($itemType, ['SM', 'RM', 'CS'])) {
return $this->createMaterial($data, $tenantId, $userId, $itemType);
}
// Products 타입 (FG, PT) - 기본값
return $this->createProduct($data, $tenantId, $userId);
}
/**
* Product 생성 (FG, PT)
*/
private function createProduct(array $data, int $tenantId, int $userId): Product
{
// 품목 코드 중복 시 자동 증가
$data['code'] = $this->resolveUniqueCode($data['code'], $tenantId);
@@ -259,6 +277,82 @@ public function createItem(array $data): Product
return Product::create($payload);
}
/**
* Material 생성 (SM, RM, CS)
*/
private function createMaterial(array $data, int $tenantId, int $userId, string $materialType): Material
{
// 품목 코드 중복 시 자동 증가 (Materials용)
$code = $data['code'] ?? $data['material_code'] ?? '';
$data['material_code'] = $this->resolveUniqueMaterialCode($code, $tenantId);
$payload = [
'tenant_id' => $tenantId,
'created_by' => $userId,
'material_type' => $materialType,
'material_code' => $data['material_code'],
'name' => $data['name'],
'unit' => $data['unit'],
'category_id' => $data['category_id'] ?? null,
'item_name' => $data['item_name'] ?? $data['name'],
'specification' => $data['specification'] ?? $data['description'] ?? null,
'is_inspection' => $data['is_inspection'] ?? 'N',
'search_tag' => $data['search_tag'] ?? null,
'remarks' => $data['remarks'] ?? null,
'attributes' => $data['attributes'] ?? null,
'options' => $data['options'] ?? null,
'is_active' => $data['is_active'] ?? true,
];
return Material::create($payload);
}
/**
* Material 코드 중복 체크 및 고유 코드 생성
*/
private function resolveUniqueMaterialCode(string $code, int $tenantId): string
{
$exists = Material::withTrashed()
->where('tenant_id', $tenantId)
->where('material_code', $code)
->exists();
if (! $exists) {
return $code;
}
// 마지막이 숫자인지 확인
if (preg_match('/^(.+?)(\d+)$/', $code, $matches)) {
$prefix = $matches[1];
$number = (int) $matches[2];
$digits = strlen($matches[2]);
do {
$number++;
$newCode = $prefix.str_pad($number, $digits, '0', STR_PAD_LEFT);
$exists = Material::withTrashed()
->where('tenant_id', $tenantId)
->where('material_code', $newCode)
->exists();
} while ($exists);
return $newCode;
}
// 마지막이 문자면 -001 추가
$suffix = 1;
do {
$newCode = $code.'-'.str_pad($suffix, 3, '0', STR_PAD_LEFT);
$exists = Material::withTrashed()
->where('tenant_id', $tenantId)
->where('material_code', $newCode)
->exists();
$suffix++;
} while ($exists);
return $newCode;
}
/**
* 중복되지 않는 고유 코드 생성
*
@@ -287,7 +381,7 @@ private function resolveUniqueCode(string $code, int $tenantId): string
// 숫자 증가하며 고유 코드 찾기
do {
$number++;
$newCode = $prefix . str_pad($number, $digits, '0', STR_PAD_LEFT);
$newCode = $prefix.str_pad($number, $digits, '0', STR_PAD_LEFT);
$exists = Product::withTrashed()
->where('tenant_id', $tenantId)
->where('code', $newCode)
@@ -300,7 +394,7 @@ private function resolveUniqueCode(string $code, int $tenantId): string
// 마지막이 문자면 -001 추가
$suffix = 1;
do {
$newCode = $code . '-' . str_pad($suffix, 3, '0', STR_PAD_LEFT);
$newCode = $code.'-'.str_pad($suffix, 3, '0', STR_PAD_LEFT);
$exists = Product::withTrashed()
->where('tenant_id', $tenantId)
->where('code', $newCode)