- 소유권 게이팅(common/authz): 변경 액션 본인∪OWNER, 협력사 삭제 OWNER 전용 - 견적 수동 낙찰(award) + 작성자명(creatorName) 표시 + 전화번호 입력 컴포넌트 + 카드 엑셀 업로드 - supplier_type 은 이번 커밋 미변경(다음 커밋에서 코드부터 정리 예정) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
137 lines
4.3 KiB
Python
137 lines
4.3 KiB
Python
import uuid
|
||
from datetime import datetime
|
||
from typing import Optional
|
||
|
||
from pydantic import ConfigDict
|
||
|
||
from common.enums import DeliveryType
|
||
from common.models.gmodel import Res_PageProtocol, Res_WebPacketProtocol, WebPacketProtocol
|
||
|
||
|
||
class ItemProtocol(WebPacketProtocol):
|
||
pass
|
||
|
||
|
||
class Req_CreateItem(ItemProtocol):
|
||
name: str = ""
|
||
code: Optional[str] = None
|
||
category: Optional[str] = None
|
||
category_type: int = 1
|
||
image_url: Optional[str] = None
|
||
model_name: Optional[str] = None
|
||
spec: Optional[str] = None
|
||
manufacturer: Optional[str] = None
|
||
made_in: Optional[str] = None
|
||
price: Optional[int] = None
|
||
internet_lowest_price_yn: bool = False
|
||
internet_lowest_price: Optional[int] = None # 인터넷 최저가 실값(원). 목표가 산정용
|
||
purchase_price: Optional[int] = None # 매입가(원). 재견적 목표가 후보(그대로)
|
||
selling_price: Optional[int] = None # 판매가(원). 유통형 목표가 후보(×(1−마진율))
|
||
moq: Optional[str] = None
|
||
lead_time: Optional[int] = None
|
||
quantity_unit: Optional[str] = None
|
||
delivery_type: Optional[int] = None
|
||
vat_yn: Optional[bool] = None
|
||
delivery_fee_yn: Optional[bool] = None
|
||
|
||
|
||
class Req_UpdateItem(ItemProtocol):
|
||
name: Optional[str] = None
|
||
code: Optional[str] = None
|
||
category: Optional[str] = None
|
||
category_type: Optional[int] = None
|
||
image_url: Optional[str] = None
|
||
model_name: Optional[str] = None
|
||
spec: Optional[str] = None
|
||
manufacturer: Optional[str] = None
|
||
made_in: Optional[str] = None
|
||
price: Optional[int] = None
|
||
internet_lowest_price_yn: Optional[bool] = None
|
||
internet_lowest_price: Optional[int] = None # 인터넷 최저가 실값(원). 목표가 산정용
|
||
purchase_price: Optional[int] = None # 매입가(원). 재견적 목표가 후보(그대로)
|
||
selling_price: Optional[int] = None # 판매가(원). 유통형 목표가 후보(×(1−마진율))
|
||
moq: Optional[str] = None
|
||
lead_time: Optional[int] = None
|
||
quantity_unit: Optional[str] = None
|
||
delivery_type: Optional[int] = None
|
||
vat_yn: Optional[bool] = None
|
||
delivery_fee_yn: Optional[bool] = None
|
||
|
||
|
||
class ItemData(WebPacketProtocol):
|
||
model_config = ConfigDict(from_attributes=True)
|
||
|
||
item_id: uuid.UUID
|
||
company_id: uuid.UUID
|
||
user_id: uuid.UUID
|
||
creator_name: Optional[str] = None # 등록자(작성자) 이름. user_id→company.users.name 조인
|
||
name: str
|
||
code: Optional[str] = None
|
||
category: Optional[str] = None
|
||
category_type: int = 1
|
||
image_url: Optional[str] = None
|
||
model_name: Optional[str] = None
|
||
spec: Optional[str] = None
|
||
manufacturer: Optional[str] = None
|
||
made_in: Optional[str] = None
|
||
price: Optional[int] = None
|
||
internet_lowest_price_yn: bool = False
|
||
internet_lowest_price: Optional[int] = None # 인터넷 최저가 실값(원). 목표가 산정용
|
||
purchase_price: Optional[int] = None # 매입가(원). 재견적 목표가 후보(그대로)
|
||
selling_price: Optional[int] = None # 판매가(원). 유통형 목표가 후보(×(1−마진율))
|
||
moq: Optional[str] = None
|
||
lead_time: Optional[int] = None
|
||
quantity_unit: Optional[str] = None
|
||
delivery_type: Optional[DeliveryType] = None
|
||
vat_yn: Optional[bool] = None
|
||
delivery_fee_yn: Optional[bool] = None
|
||
created_at: Optional[datetime] = None
|
||
updated_at: Optional[datetime] = None
|
||
|
||
|
||
class Res_Item(Res_WebPacketProtocol):
|
||
item: Optional[ItemData] = None
|
||
|
||
|
||
class Res_ItemList(Res_PageProtocol):
|
||
items: list[ItemData] = []
|
||
|
||
|
||
class ItemCategory(WebPacketProtocol):
|
||
name: str
|
||
category_type: int = 1
|
||
|
||
|
||
class Res_ItemCategories(Res_WebPacketProtocol):
|
||
categories: list[ItemCategory] = []
|
||
|
||
|
||
class Req_CheckCodes(ItemProtocol):
|
||
codes: list[str] = []
|
||
|
||
|
||
class Res_CheckCodes(Res_WebPacketProtocol):
|
||
existing: list[str] = [] # codes 중 이미 DB(같은 회사)에 존재하는 코드들
|
||
|
||
|
||
class Res_DeleteItem(Res_WebPacketProtocol):
|
||
pass
|
||
|
||
|
||
class Res_ItemImage(Res_WebPacketProtocol):
|
||
image_url: Optional[str] = None
|
||
filename: Optional[str] = None
|
||
size: Optional[int] = None
|
||
|
||
|
||
class Res_LowestPriceTrigger(Res_WebPacketProtocol):
|
||
item_id: str = ""
|
||
status: str = ""
|
||
message: str = ""
|
||
|
||
|
||
class Res_LowestPriceResult(Res_WebPacketProtocol):
|
||
item_id: str = ""
|
||
results: list = []
|
||
message: str = ""
|