refactor(supplies): extract types for create-suppliers component
ЭТАП 1.1: Безопасное выделение интерфейсов и типов - Create supply-creation.types.ts with all interfaces from create-suppliers-supply-page.tsx - Establish modular folder structure: blocks/, hooks/, types/ - Define comprehensive TypeScript types for supply creation workflow - Add props interfaces for future block components - Include state management and action types - Maintain full backward compatibility No functional changes - pure type extraction for better maintainability. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -0,0 +1,206 @@
|
|||||||
|
/**
|
||||||
|
* ТИПЫ ДЛЯ СОЗДАНИЯ ПОСТАВОК ПОСТАВЩИКОВ
|
||||||
|
*
|
||||||
|
* Выделены из create-suppliers-supply-page.tsx
|
||||||
|
* Согласно rules-complete.md 9.7
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Основные сущности
|
||||||
|
export interface GoodsSupplier {
|
||||||
|
id: string
|
||||||
|
inn: string
|
||||||
|
name?: string
|
||||||
|
fullName?: string
|
||||||
|
type: 'FULFILLMENT' | 'SELLER' | 'LOGIST' | 'WHOLESALE'
|
||||||
|
address?: string
|
||||||
|
phones?: Array<{ value: string }>
|
||||||
|
emails?: Array<{ value: string }>
|
||||||
|
users?: Array<{ id: string; avatar?: string; managerName?: string }>
|
||||||
|
createdAt: string
|
||||||
|
rating?: number
|
||||||
|
market?: string // Принадлежность к рынку согласно rules-complete.md v10.0
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface GoodsProduct {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
description?: string
|
||||||
|
price: number
|
||||||
|
category?: { name: string }
|
||||||
|
images: string[]
|
||||||
|
mainImage?: string
|
||||||
|
article: string // Артикул поставщика
|
||||||
|
organization: {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
}
|
||||||
|
quantity?: number
|
||||||
|
unit?: string
|
||||||
|
weight?: number
|
||||||
|
dimensions?: {
|
||||||
|
length: number
|
||||||
|
width: number
|
||||||
|
height: number
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SelectedGoodsItem {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
sku: string
|
||||||
|
price: number
|
||||||
|
selectedQuantity: number
|
||||||
|
unit?: string
|
||||||
|
category?: string
|
||||||
|
supplierId: string
|
||||||
|
supplierName: string
|
||||||
|
completeness?: string // Комплектность согласно rules2.md 9.7.2
|
||||||
|
recipe?: string // Рецептура/состав
|
||||||
|
specialRequirements?: string // Особые требования
|
||||||
|
parameters?: Array<{ name: string; value: string }> // Параметры товара
|
||||||
|
}
|
||||||
|
|
||||||
|
// Компоненты рецептуры
|
||||||
|
export interface FulfillmentService {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
description?: string
|
||||||
|
price: number
|
||||||
|
category?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FulfillmentConsumable {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
price: number
|
||||||
|
quantity: number
|
||||||
|
unit?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SellerConsumable {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
pricePerUnit: number
|
||||||
|
warehouseStock: number
|
||||||
|
unit?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WBCard {
|
||||||
|
id: string
|
||||||
|
title: string
|
||||||
|
nmID: string
|
||||||
|
vendorCode?: string
|
||||||
|
brand?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ProductRecipe {
|
||||||
|
productId: string
|
||||||
|
selectedServices: string[]
|
||||||
|
selectedFFConsumables: string[]
|
||||||
|
selectedSellerConsumables: string[]
|
||||||
|
selectedWBCard?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Состояния компонента
|
||||||
|
export interface SupplyCreationState {
|
||||||
|
selectedSupplier: GoodsSupplier | null
|
||||||
|
selectedGoods: SelectedGoodsItem[]
|
||||||
|
searchQuery: string
|
||||||
|
productSearchQuery: string
|
||||||
|
deliveryDate: string
|
||||||
|
selectedLogistics: string
|
||||||
|
selectedFulfillment: string
|
||||||
|
allSelectedProducts: Array<GoodsProduct & { selectedQuantity: number }>
|
||||||
|
productRecipes: Record<string, ProductRecipe>
|
||||||
|
productQuantities: Record<string, number>
|
||||||
|
}
|
||||||
|
|
||||||
|
// Действия для управления состоянием
|
||||||
|
export interface SupplyCreationActions {
|
||||||
|
setSelectedSupplier: (supplier: GoodsSupplier | null) => void
|
||||||
|
setSelectedGoods: (goods: SelectedGoodsItem[] | ((prev: SelectedGoodsItem[]) => SelectedGoodsItem[])) => void
|
||||||
|
setSearchQuery: (query: string) => void
|
||||||
|
setDeliveryDate: (date: string) => void
|
||||||
|
setSelectedLogistics: (logistics: string) => void
|
||||||
|
setSelectedFulfillment: (fulfillment: string) => void
|
||||||
|
setAllSelectedProducts: (
|
||||||
|
products:
|
||||||
|
| Array<GoodsProduct & { selectedQuantity: number }>
|
||||||
|
| ((
|
||||||
|
prev: Array<GoodsProduct & { selectedQuantity: number }>,
|
||||||
|
) => Array<GoodsProduct & { selectedQuantity: number }>),
|
||||||
|
) => void
|
||||||
|
setProductRecipes: (
|
||||||
|
recipes: Record<string, ProductRecipe> | ((prev: Record<string, ProductRecipe>) => Record<string, ProductRecipe>),
|
||||||
|
) => void
|
||||||
|
setProductQuantities: (
|
||||||
|
quantities: Record<string, number> | ((prev: Record<string, number>) => Record<string, number>),
|
||||||
|
) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
// Пропсы для блок-компонентов
|
||||||
|
export interface SuppliersBlockProps {
|
||||||
|
suppliers: GoodsSupplier[]
|
||||||
|
selectedSupplier: GoodsSupplier | null
|
||||||
|
searchQuery: string
|
||||||
|
loading: boolean
|
||||||
|
onSupplierSelect: (supplier: GoodsSupplier) => void
|
||||||
|
onSearchChange: (query: string) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ProductCardsBlockProps {
|
||||||
|
products: GoodsProduct[]
|
||||||
|
selectedSupplier: GoodsSupplier | null
|
||||||
|
onProductAdd: (product: GoodsProduct) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DetailedCatalogBlockProps {
|
||||||
|
allSelectedProducts: Array<GoodsProduct & { selectedQuantity: number }>
|
||||||
|
productRecipes: Record<string, ProductRecipe>
|
||||||
|
fulfillmentServices: FulfillmentService[]
|
||||||
|
fulfillmentConsumables: FulfillmentConsumable[]
|
||||||
|
sellerConsumables: SellerConsumable[]
|
||||||
|
deliveryDate: string
|
||||||
|
selectedFulfillment: string
|
||||||
|
allCounterparties: GoodsSupplier[]
|
||||||
|
onQuantityChange: (productId: string, quantity: number) => void
|
||||||
|
onRecipeChange: (productId: string, recipe: ProductRecipe) => void
|
||||||
|
onDeliveryDateChange: (date: string) => void
|
||||||
|
onFulfillmentChange: (fulfillment: string) => void
|
||||||
|
onProductRemove: (productId: string) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CartBlockProps {
|
||||||
|
selectedGoods: SelectedGoodsItem[]
|
||||||
|
selectedSupplier: GoodsSupplier | null
|
||||||
|
deliveryDate: string
|
||||||
|
selectedFulfillment: string
|
||||||
|
selectedLogistics: string
|
||||||
|
allCounterparties: GoodsSupplier[]
|
||||||
|
totalAmount: number
|
||||||
|
isFormValid: boolean
|
||||||
|
isCreatingSupply: boolean
|
||||||
|
onLogisticsChange: (logistics: string) => void
|
||||||
|
onCreateSupply: () => void
|
||||||
|
onItemRemove: (itemId: string) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
// Утилиты для расчетов
|
||||||
|
export interface RecipeCostCalculation {
|
||||||
|
services: number
|
||||||
|
consumables: number
|
||||||
|
total: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SupplyCreationFormData {
|
||||||
|
supplierId: string
|
||||||
|
fulfillmentCenterId: string
|
||||||
|
items: Array<{
|
||||||
|
productId: string
|
||||||
|
quantity: number
|
||||||
|
recipe: ProductRecipe
|
||||||
|
}>
|
||||||
|
deliveryDate: string
|
||||||
|
logistics: string
|
||||||
|
specialRequirements?: string
|
||||||
|
}
|
Reference in New Issue
Block a user