Files
sam-api/app/Constants/SystemFields.php

146 lines
3.6 KiB
PHP
Raw Normal View History

<?php
namespace App\Constants;
/**
* 테이블별 시스템 필드(고정 컬럼) 예약어 관리
*
* field_key 중복 검증 해당 테이블의 고정 컬럼과 충돌을 방지합니다.
* source_table (products, materials) 기반으로 대상 테이블을 결정합니다.
*/
class SystemFields
{
/**
* 소스 테이블 상수
*/
public const SOURCE_TABLE_PRODUCTS = 'products';
public const SOURCE_TABLE_MATERIALS = 'materials';
/**
* 그룹 ID 상수
*/
public const GROUP_ITEM_MASTER = 1; // 품목관리
/**
* products 테이블 고정 컬럼
*/
public const PRODUCTS = [
// 기본 정보
'code',
'name',
'unit',
'category_id',
'product_type',
'description',
// 플래그
'is_sellable',
'is_purchasable',
'is_producible',
'is_variable_size',
'is_active',
// 하이브리드 고정 필드
'safety_stock',
'lead_time',
'product_category',
'part_type',
// 파일 관련
'bending_diagram',
'bending_details',
'specification_file',
'specification_file_name',
'certification_file',
'certification_file_name',
'certification_number',
'certification_start_date',
'certification_end_date',
// JSON 필드
'attributes',
'attributes_archive',
'options',
];
/**
* materials 테이블 고정 컬럼
*/
public const MATERIALS = [
// 기본 정보
'name',
'item_name',
'specification',
'material_code',
'material_type',
'unit',
'category_id',
// 플래그
'is_inspection',
'is_active',
// 기타
'search_tag',
'remarks',
// JSON 필드
'attributes',
'options',
];
/**
* 공통 시스템 컬럼 (모든 테이블에 적용)
*/
public const COMMON = [
'id',
'tenant_id',
'created_by',
'updated_by',
'deleted_by',
'created_at',
'updated_at',
'deleted_at',
];
/**
* source_table 기반 예약어 목록 조회
*/
public static function getReservedKeys(string $sourceTable): array
{
$tableFields = match ($sourceTable) {
self::SOURCE_TABLE_PRODUCTS => self::PRODUCTS,
self::SOURCE_TABLE_MATERIALS => self::MATERIALS,
default => []
};
// 공통 시스템 컬럼 병합
return array_unique(array_merge(self::COMMON, $tableFields));
}
/**
* 특정 field_key가 시스템 필드인지 확인
*/
public static function isReserved(string $fieldKey, string $sourceTable): bool
{
return in_array($fieldKey, self::getReservedKeys($sourceTable), true);
}
/**
* group_id에 속한 모든 테이블의 예약어 목록 조회
* (item_type을 모를 안전하게 모든 예약어 체크)
*/
public static function getAllReservedKeysForGroup(int $groupId): array
{
$allFields = self::COMMON;
if ($groupId === self::GROUP_ITEM_MASTER) {
$allFields = array_merge($allFields, self::PRODUCTS, self::MATERIALS);
}
return array_unique($allFields);
}
/**
* 특정 field_key가 그룹 어떤 테이블에서든 시스템 필드인지 확인
*/
public static function isReservedInGroup(string $fieldKey, int $groupId): bool
{
return in_array($fieldKey, self::getAllReservedKeysForGroup($groupId), true);
}
}