Изменены текстовые метки и комментарии в коде для замены термина "Оптовик" на "Поставщик" во всех компонентах и файлах, включая интерфейсы, мутации и резолверы. Обновлены соответствующие комментарии для улучшения понимания кода и его структуры.

This commit is contained in:
Bivekich
2025-07-28 10:01:48 +03:00
parent 5bd09fbca2
commit 3a5e4f30f6
41 changed files with 100 additions and 100 deletions

View File

@ -806,10 +806,10 @@ export function BusinessDemo() {
</CardContent> </CardContent>
</Card> </Card>
{/* Карточки оптовиков */} {/* Карточки поставщиков */}
<Card className="glass-card border-white/10"> <Card className="glass-card border-white/10">
<CardHeader> <CardHeader>
<CardTitle className="text-white">Карточки оптовиков</CardTitle> <CardTitle className="text-white">Карточки поставщиков</CardTitle>
</CardHeader> </CardHeader>
<CardContent className="space-y-6"> <CardContent className="space-y-6">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6"> <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">

View File

@ -370,7 +370,7 @@ export function BusinessProcessesDemo() {
}, },
{ {
id: "wholesale", id: "wholesale",
name: "Оптовик", name: "Поставщик",
description: "Оптовые продажи", description: "Оптовые продажи",
icon: Building2, icon: Building2,
color: "bg-cyan-500/20 text-cyan-400 border-cyan-500/30", color: "bg-cyan-500/20 text-cyan-400 border-cyan-500/30",
@ -454,7 +454,7 @@ export function BusinessProcessesDemo() {
E["🚛 Логистика<br/>Логистические решения<br/>• Перевозки<br/>• Заявки"] E["🚛 Логистика<br/>Логистические решения<br/>• Перевозки<br/>• Заявки"]
F["🏭 Оптовик<br/>Оптовые продажи<br/>• Отгрузки<br/>• Склад"] F["🏭 Поставщик<br/>Оптовые продажи<br/>• Отгрузки<br/>• Склад"]
%% Общие модули %% Общие модули
G["💬 Мессенджер<br/>Общение между участниками<br/>• Чаты<br/>• Файлы<br/>• Голосовые"] G["💬 Мессенджер<br/>Общение между участниками<br/>• Чаты<br/>• Файлы<br/>• Голосовые"]
@ -628,7 +628,7 @@ export function BusinessProcessesDemo() {
Процесс заказа Процесс заказа
</h4> </h4>
<p className="text-white/70 text-sm"> <p className="text-white/70 text-sm">
Селлер Маркет Оптовик Фулфилмент Логистика Селлер Маркет Поставщик Фулфилмент Логистика
</p> </p>
</div> </div>
@ -704,7 +704,7 @@ export function BusinessProcessesDemo() {
</div> </div>
<div> <div>
<p className="text-white text-sm font-medium"> <p className="text-white text-sm font-medium">
Оптовик одобряет Поставщик одобряет
</p> </p>
<p className="text-white/60 text-xs"> <p className="text-white/60 text-xs">
Подтверждает наличие товара Подтверждает наличие товара
@ -782,7 +782,7 @@ export function BusinessProcessesDemo() {
<span className="text-green-400">Мессенджер</span> <span className="text-green-400">Мессенджер</span>
</div> </div>
<div className="flex items-center justify-between text-xs"> <div className="flex items-center justify-between text-xs">
<span className="text-cyan-400">Оптовик</span> <span className="text-cyan-400">Поставщик</span>
<ArrowRight className="h-3 w-3 text-white/30" /> <ArrowRight className="h-3 w-3 text-white/30" />
<span className="text-green-400">Мессенджер</span> <span className="text-green-400">Мессенджер</span>
</div> </div>

View File

@ -201,7 +201,7 @@ export function FormsDemo() {
<SelectItem value="fulfillment">Фулфилмент</SelectItem> <SelectItem value="fulfillment">Фулфилмент</SelectItem>
<SelectItem value="seller">Селлер</SelectItem> <SelectItem value="seller">Селлер</SelectItem>
<SelectItem value="logist">Логистика</SelectItem> <SelectItem value="logist">Логистика</SelectItem>
<SelectItem value="wholesale">Оптовик</SelectItem> <SelectItem value="wholesale">Поставщик</SelectItem>
</SelectContent> </SelectContent>
</Select> </Select>
</div> </div>
@ -500,7 +500,7 @@ export function FormsDemo() {
<SelectItem value="fulfillment">Фулфилмент</SelectItem> <SelectItem value="fulfillment">Фулфилмент</SelectItem>
<SelectItem value="seller">Селлер</SelectItem> <SelectItem value="seller">Селлер</SelectItem>
<SelectItem value="logist">Логистика</SelectItem> <SelectItem value="logist">Логистика</SelectItem>
<SelectItem value="wholesale">Оптовик</SelectItem> <SelectItem value="wholesale">Поставщик</SelectItem>
</SelectContent> </SelectContent>
</Select> </Select>
</div> </div>

View File

@ -447,7 +447,7 @@ export function IconsDemo() {
Логистика Логистика
</Badge> </Badge>
<Badge className="bg-orange-500/20 text-orange-400 border-orange-500/50"> <Badge className="bg-orange-500/20 text-orange-400 border-orange-500/50">
Оптовик Поставщик
</Badge> </Badge>
</div> </div>
</div> </div>

View File

@ -504,7 +504,7 @@ export function InteractiveDemo() {
<div className="text-white/80"> <div className="text-white/80">
<p className="mb-4"> <p className="mb-4">
SferaV - современная система управления бизнесом для фулфилмент-центров, SferaV - современная система управления бизнесом для фулфилмент-центров,
селлеров, логистических компаний и оптовиков. селлеров, логистических компаний и поставщиков.
</p> </p>
<div className="space-y-2 text-sm"> <div className="space-y-2 text-sm">

View File

@ -113,7 +113,7 @@ export function SpecializedDemo() {
<div className="flex-1"> <div className="flex-1">
<div className="flex items-center space-x-2"> <div className="flex items-center space-x-2">
<span className="text-white font-medium text-sm">ОптТорг</span> <span className="text-white font-medium text-sm">ОптТорг</span>
<Badge className="bg-purple-500/20 text-purple-300 text-xs">Оптовик</Badge> <Badge className="bg-purple-500/20 text-purple-300 text-xs">Поставщик</Badge>
</div> </div>
<p className="text-white/60 text-xs">Новый прайс готов</p> <p className="text-white/60 text-xs">Новый прайс готов</p>
</div> </div>
@ -333,7 +333,7 @@ export function SpecializedDemo() {
</Avatar> </Avatar>
<div className="flex-1"> <div className="flex-1">
<div className="text-white text-xs font-medium">ОптТорг</div> <div className="text-white text-xs font-medium">ОптТорг</div>
<Badge className="bg-purple-500/20 text-purple-300 text-xs">Оптовик</Badge> <Badge className="bg-purple-500/20 text-purple-300 text-xs">Поставщик</Badge>
</div> </div>
</div> </div>
</div> </div>

View File

@ -75,7 +75,7 @@ export function SuppliesDemo() {
<Tabs defaultValue="product-cards" className="w-full"> <Tabs defaultValue="product-cards" className="w-full">
<TabsList className="grid grid-cols-4 bg-white/5 backdrop-blur border-white/10 mb-6"> <TabsList className="grid grid-cols-4 bg-white/5 backdrop-blur border-white/10 mb-6">
<TabsTrigger value="product-cards">Карточки товаров</TabsTrigger> <TabsTrigger value="product-cards">Карточки товаров</TabsTrigger>
<TabsTrigger value="wholesaler-cards">Карточки оптовиков</TabsTrigger> <TabsTrigger value="wholesaler-cards">Карточки поставщиков</TabsTrigger>
<TabsTrigger value="floating-cart">Плавающая корзина</TabsTrigger> <TabsTrigger value="floating-cart">Плавающая корзина</TabsTrigger>
<TabsTrigger value="supply-types">Типы поставок</TabsTrigger> <TabsTrigger value="supply-types">Типы поставок</TabsTrigger>
</TabsList> </TabsList>
@ -274,13 +274,13 @@ export function SuppliesDemo() {
<TabsContent value="wholesaler-cards" className="space-y-6"> <TabsContent value="wholesaler-cards" className="space-y-6">
<div> <div>
<h3 className="text-xl font-semibold text-white mb-4">Карточки оптовиков</h3> <h3 className="text-xl font-semibold text-white mb-4">Карточки поставщиков</h3>
<p className="text-white/60 mb-6"> <p className="text-white/60 mb-6">
Информационные карточки поставщиков и оптовиков Информационные карточки поставщиков и поставщиков
</p> </p>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{/* Главная карточка оптовика */} {/* Главная карточка поставщика */}
<Card className="bg-white/10 backdrop-blur border-white/20 p-6 hover:bg-white/15 hover:border-white/30 transition-all duration-300 hover:scale-105"> <Card className="bg-white/10 backdrop-blur border-white/20 p-6 hover:bg-white/15 hover:border-white/30 transition-all duration-300 hover:scale-105">
<div className="space-y-4"> <div className="space-y-4">
<div className="flex items-start justify-between"> <div className="flex items-start justify-between">
@ -540,7 +540,7 @@ export function SuppliesDemo() {
</div> </div>
</Card> </Card>
{/* Вариант 2: Оптовик */} {/* Вариант 2: Поставщик */}
<Card <Card
className="bg-white/10 backdrop-blur border-white/20 p-6 cursor-pointer transition-all hover:bg-white/15 hover:border-white/30" className="bg-white/10 backdrop-blur border-white/20 p-6 cursor-pointer transition-all hover:bg-white/15 hover:border-white/30"
> >
@ -549,9 +549,9 @@ export function SuppliesDemo() {
<Users className="h-8 w-8 text-green-400" /> <Users className="h-8 w-8 text-green-400" />
</div> </div>
<div> <div>
<h3 className="text-xl font-semibold text-white mb-2">Оптовик</h3> <h3 className="text-xl font-semibold text-white mb-2">Поставщик</h3>
<p className="text-white/60 text-sm"> <p className="text-white/60 text-sm">
Создание поставки через выбор товаров у оптовиков Создание поставки через выбор товаров у поставщиков
</p> </p>
</div> </div>
<Badge className="bg-green-500/20 text-green-300 border-green-500/30"> <Badge className="bg-green-500/20 text-green-300 border-green-500/30">

View File

@ -90,7 +90,7 @@ export function UsersSection() {
FULFILLMENT: { label: 'Фулфилмент', variant: 'default' as const }, FULFILLMENT: { label: 'Фулфилмент', variant: 'default' as const },
SELLER: { label: 'Селлер', variant: 'secondary' as const }, SELLER: { label: 'Селлер', variant: 'secondary' as const },
LOGIST: { label: 'Логистика', variant: 'outline' as const }, LOGIST: { label: 'Логистика', variant: 'outline' as const },
WHOLESALE: { label: 'Оптовик', variant: 'destructive' as const } WHOLESALE: { label: 'Поставщик', variant: 'destructive' as const }
} }
return typeMap[type as keyof typeof typeMap] || { label: type, variant: 'outline' as const } return typeMap[type as keyof typeof typeMap] || { label: type, variant: 'outline' as const }
} }

View File

@ -175,7 +175,7 @@ export function AuthFlow({ partnerCode }: AuthFlowProps = {}) {
{ {
authData.cabinetType === 'fulfillment' ? 'Фулфилмент' : authData.cabinetType === 'fulfillment' ? 'Фулфилмент' :
authData.cabinetType === 'logist' ? 'Логистика' : authData.cabinetType === 'logist' ? 'Логистика' :
authData.cabinetType === 'wholesale' ? 'Оптовик' : authData.cabinetType === 'wholesale' ? 'Поставщик' :
'Селлер' 'Селлер'
} }
</p> </p>

View File

@ -39,8 +39,8 @@ export function CabinetSelectStep({ onNext, onBack }: CabinetSelectStepProps) {
}, },
{ {
id: 'wholesale' as const, id: 'wholesale' as const,
title: 'Оптовик', title: 'Поставщик',
description: 'Оптовые продажи', description: 'Поставки товаров',
icon: Building2, icon: Building2,
features: ['Опт', 'Поставки', 'ИНН'], features: ['Опт', 'Поставки', 'ИНН'],
color: 'orange' color: 'orange'

View File

@ -139,7 +139,7 @@ export function ConfirmationStep({ data, onConfirm, onBack }: ConfirmationStepPr
<span className="text-white/70 text-sm"> <span className="text-white/70 text-sm">
{data.cabinetType === 'fulfillment' ? 'Фулфилмент' : {data.cabinetType === 'fulfillment' ? 'Фулфилмент' :
data.cabinetType === 'logist' ? 'Логистика' : data.cabinetType === 'logist' ? 'Логистика' :
data.cabinetType === 'wholesale' ? 'Оптовик' : data.cabinetType === 'wholesale' ? 'Поставщик' :
'Селлер'} 'Селлер'}
</span> </span>
<Badge <Badge

View File

@ -31,7 +31,7 @@ import {
function NewOrdersNotification() { function NewOrdersNotification() {
const { user } = useAuth(); const { user } = useAuth();
// Загружаем заказы поставок для оптовика // Загружаем заказы поставок для поставщика
const { data: ordersData } = useQuery(GET_SUPPLY_ORDERS, { const { data: ordersData } = useQuery(GET_SUPPLY_ORDERS, {
pollInterval: 30000, // Обновляем каждые 30 секунд для заявок pollInterval: 30000, // Обновляем каждые 30 секунд для заявок
fetchPolicy: "cache-first", fetchPolicy: "cache-first",
@ -42,7 +42,7 @@ function NewOrdersNotification() {
if (user?.organization?.type !== "WHOLESALE") return null; if (user?.organization?.type !== "WHOLESALE") return null;
const orders = ordersData?.supplyOrders || []; const orders = ordersData?.supplyOrders || [];
// Считаем заявки в статусе PENDING (ожидают одобрения оптовика) // Считаем заявки в статусе PENDING (ожидают одобрения поставщика)
const pendingOrders = orders.filter( const pendingOrders = orders.filter(
(order) => (order) =>
order.status === "PENDING" && order.partnerId === user?.organization?.id order.status === "PENDING" && order.partnerId === user?.organization?.id
@ -114,7 +114,7 @@ export function Sidebar() {
case "LOGIST": case "LOGIST":
return "Логистика"; return "Логистика";
case "WHOLESALE": case "WHOLESALE":
return "Оптовик"; return "Поставщик";
default: default:
return "Кабинет"; return "Кабинет";
} }
@ -553,7 +553,7 @@ export function Sidebar() {
</Button> </Button>
)} )}
{/* Заявки - для оптовиков */} {/* Заявки - для поставщиков */}
{user?.organization?.type === "WHOLESALE" && ( {user?.organization?.type === "WHOLESALE" && (
<Button <Button
variant={isSuppliesActive ? "secondary" : "ghost"} variant={isSuppliesActive ? "secondary" : "ghost"}
@ -595,7 +595,7 @@ export function Sidebar() {
</Button> </Button>
)} )}
{/* Склад - только для оптовиков */} {/* Склад - только для поставщиков */}
{user?.organization?.type === "WHOLESALE" && ( {user?.organization?.type === "WHOLESALE" && (
<Button <Button
variant={isWarehouseActive ? "secondary" : "ghost"} variant={isWarehouseActive ? "secondary" : "ghost"}

View File

@ -172,7 +172,7 @@ export function UserSettings() {
case 'LOGIST': case 'LOGIST':
return 'Логистика' return 'Логистика'
case 'WHOLESALE': case 'WHOLESALE':
return 'Оптовик' return 'Поставщик'
default: default:
return 'Не указан' return 'Не указан'
} }

View File

@ -106,7 +106,7 @@ export function CreateFulfillmentConsumablesSupplyPage() {
// Мутация для создания заказа поставки расходников // Мутация для создания заказа поставки расходников
const [createSupplyOrder] = useMutation(CREATE_SUPPLY_ORDER); const [createSupplyOrder] = useMutation(CREATE_SUPPLY_ORDER);
// Фильтруем только поставщиков расходников (оптовиков) // Фильтруем только поставщиков расходников (поставщиков)
const consumableSuppliers = ( const consumableSuppliers = (
counterpartiesData?.myCounterparties || [] counterpartiesData?.myCounterparties || []
).filter((org: FulfillmentConsumableSupplier) => org.type === "WHOLESALE"); ).filter((org: FulfillmentConsumableSupplier) => org.type === "WHOLESALE");

View File

@ -50,7 +50,7 @@ interface Organization {
type: string; type: string;
} }
// Новый интерфейс для поставщика/оптовика // Новый интерфейс для поставщика/поставщика
interface Supplier { interface Supplier {
id: string; id: string;
name: string; name: string;
@ -1213,7 +1213,7 @@ export function FulfillmentGoodsTab() {
</div> </div>
</div> </div>
{/* Третий уровень - Поставщики/Оптовики */} {/* Третий уровень - Поставщики/Поставщики */}
{isRouteExpanded && {isRouteExpanded &&
route?.suppliers && route?.suppliers &&
Array.isArray(route.suppliers) && Array.isArray(route.suppliers) &&
@ -1222,7 +1222,7 @@ export function FulfillmentGoodsTab() {
<div className="mb-3"> <div className="mb-3">
<h5 className="text-white font-medium text-sm flex items-center gap-2"> <h5 className="text-white font-medium text-sm flex items-center gap-2">
<Building2 className="h-4 w-4 text-purple-400" /> <Building2 className="h-4 w-4 text-purple-400" />
Поставщики/Оптовики ( Поставщики/Поставщики (
{route?.suppliers?.length || 0}) {route?.suppliers?.length || 0})
</h5> </h5>
</div> </div>
@ -1294,7 +1294,7 @@ export function FulfillmentGoodsTab() {
> >
{supplier?.type === {supplier?.type ===
"WHOLESALE" "WHOLESALE"
? "Оптовик" ? "Поставщик"
: "Поставщик"} : "Поставщик"}
</Badge> </Badge>
</div> </div>

View File

@ -81,7 +81,7 @@ export function MaterialsOrderForm() {
const [searchQuery, setSearchQuery] = useState(""); const [searchQuery, setSearchQuery] = useState("");
const [deliveryDate, setDeliveryDate] = useState(""); const [deliveryDate, setDeliveryDate] = useState("");
// Загружаем контрагентов-оптовиков // Загружаем контрагентов-поставщиков
const { data: counterpartiesData, loading: counterpartiesLoading } = useQuery( const { data: counterpartiesData, loading: counterpartiesLoading } = useQuery(
GET_MY_COUNTERPARTIES GET_MY_COUNTERPARTIES
); );
@ -98,7 +98,7 @@ export function MaterialsOrderForm() {
// Мутация для создания заказа поставки // Мутация для создания заказа поставки
const [createSupplyOrder, { loading: isCreatingOrder }] = useMutation(CREATE_SUPPLY_ORDER); const [createSupplyOrder, { loading: isCreatingOrder }] = useMutation(CREATE_SUPPLY_ORDER);
// Фильтруем только оптовиков из партнеров // Фильтруем только поставщиков из партнеров
const wholesalePartners = (counterpartiesData?.myCounterparties || []).filter( const wholesalePartners = (counterpartiesData?.myCounterparties || []).filter(
(org: Partner) => org.type === "WHOLESALE" (org: Partner) => org.type === "WHOLESALE"
); );
@ -490,7 +490,7 @@ export function MaterialsOrderForm() {
Заказ расходников Заказ расходников
</h1> </h1>
<p className="text-white/60"> <p className="text-white/60">
Выберите партнера-оптовика для заказа расходников Выберите партнера-поставщика для заказа расходников
</p> </p>
</div> </div>
</div> </div>
@ -522,7 +522,7 @@ export function MaterialsOrderForm() {
<Building2 className="h-12 w-12 text-white/20 mx-auto mb-4" /> <Building2 className="h-12 w-12 text-white/20 mx-auto mb-4" />
<p className="text-white/60"> <p className="text-white/60">
{wholesalePartners.length === 0 {wholesalePartners.length === 0
? "У вас пока нет партнеров-оптовиков" ? "У вас пока нет партнеров-поставщиков"
: "Партнеры не найдены"} : "Партнеры не найдены"}
</p> </p>
<p className="text-white/40 text-sm mt-2"> <p className="text-white/40 text-sm mt-2">

View File

@ -63,7 +63,7 @@ export function MarketCategories({ onSelectCategory, onShowCart, onShowFavorites
Каталог товаров Каталог товаров
</h1> </h1>
<p className="text-white/60"> <p className="text-white/60">
Выберите категорию для просмотра товаров от оптовиков Выберите категорию для просмотра товаров от поставщиков
</p> </p>
</div> </div>
</div> </div>

View File

@ -234,7 +234,7 @@ export function MarketCounterparties() {
case 'FULFILLMENT': return 'Фулфилмент' case 'FULFILLMENT': return 'Фулфилмент'
case 'SELLER': return 'Селлер' case 'SELLER': return 'Селлер'
case 'LOGIST': return 'Логистика' case 'LOGIST': return 'Логистика'
case 'WHOLESALE': return 'Оптовик' case 'WHOLESALE': return 'Поставщик'
default: return type default: return type
} }
} }
@ -300,7 +300,7 @@ export function MarketCounterparties() {
<SelectItem value="FULFILLMENT">Фулфилмент</SelectItem> <SelectItem value="FULFILLMENT">Фулфилмент</SelectItem>
<SelectItem value="SELLER">Селлер</SelectItem> <SelectItem value="SELLER">Селлер</SelectItem>
<SelectItem value="LOGIST">Логистика</SelectItem> <SelectItem value="LOGIST">Логистика</SelectItem>
<SelectItem value="WHOLESALE">Оптовик</SelectItem> <SelectItem value="WHOLESALE">Поставщик</SelectItem>
</SelectContent> </SelectContent>
</Select> </Select>

View File

@ -166,7 +166,7 @@ export function MarketProducts({ selectedCategoryId, selectedCategoryName, onBac
<div className="flex items-center space-x-3"> <div className="flex items-center space-x-3">
<ShoppingBag className="h-6 w-6 text-purple-400" /> <ShoppingBag className="h-6 w-6 text-purple-400" />
<div> <div>
<h3 className="text-lg font-semibold text-white">Товары оптовиков</h3> <h3 className="text-lg font-semibold text-white">Товары поставщиков</h3>
<p className="text-white/60 text-sm"> <p className="text-white/60 text-sm">
Найдено {totalProducts} товаров, доступно {availableCount} Найдено {totalProducts} товаров, доступно {availableCount}
</p> </p>
@ -221,7 +221,7 @@ export function MarketProducts({ selectedCategoryId, selectedCategoryName, onBac
<p className="text-white/40 text-sm mt-2"> <p className="text-white/40 text-sm mt-2">
{searchTerm || selectedCategory {searchTerm || selectedCategory
? 'Попробуйте изменить условия поиска или фильтры' ? 'Попробуйте изменить условия поиска или фильтры'
: 'Оптовики еще не добавили свои товары' : 'Поставщики еще не добавили свои товары'
} }
</p> </p>
</div> </div>

View File

@ -89,7 +89,7 @@ export function MarketRequests({ onBackToCategories }: MarketRequestsProps) {
<Package className="h-24 w-24 text-white/20 mb-6" /> <Package className="h-24 w-24 text-white/20 mb-6" />
<h2 className="text-xl font-semibold text-white mb-2">Нет заявок</h2> <h2 className="text-xl font-semibold text-white mb-2">Нет заявок</h2>
<p className="text-white/60 mb-6 max-w-md"> <p className="text-white/60 mb-6 max-w-md">
Добавьте товары в заявки из раздела &quot;Товары&quot;, чтобы создать заявку для оптовика Добавьте товары в заявки из раздела &quot;Товары&quot;, чтобы создать заявку для поставщика
</p> </p>
</div> </div>
)} )}

View File

@ -91,7 +91,7 @@ export function MarketWholesale() {
<div className="flex items-center space-x-3 flex-shrink-0 mb-4"> <div className="flex items-center space-x-3 flex-shrink-0 mb-4">
<Boxes className="h-6 w-6 text-purple-400" /> <Boxes className="h-6 w-6 text-purple-400" />
<div> <div>
<h3 className="text-lg font-semibold text-white">Оптовики</h3> <h3 className="text-lg font-semibold text-white">Поставщики</h3>
<p className="text-white/60 text-sm">Найдите и добавьте оптовые компании в контрагенты</p> <p className="text-white/60 text-sm">Найдите и добавьте оптовые компании в контрагенты</p>
</div> </div>
</div> </div>
@ -107,7 +107,7 @@ export function MarketWholesale() {
<div className="text-center"> <div className="text-center">
<Boxes className="h-12 w-12 text-white/20 mx-auto mb-4" /> <Boxes className="h-12 w-12 text-white/20 mx-auto mb-4" />
<p className="text-white/60"> <p className="text-white/60">
{searchTerm ? 'Оптовые компании не найдены' : 'Введите запрос для поиска оптовиков'} {searchTerm ? 'Поставщики не найдены' : 'Введите запрос для поиска поставщиков'}
</p> </p>
<p className="text-white/40 text-sm mt-2"> <p className="text-white/40 text-sm mt-2">
Попробуйте изменить условия поиска Попробуйте изменить условия поиска

View File

@ -90,7 +90,7 @@ export function OrganizationCard({
case 'FULFILLMENT': return 'Фулфилмент' case 'FULFILLMENT': return 'Фулфилмент'
case 'SELLER': return 'Селлер' case 'SELLER': return 'Селлер'
case 'LOGIST': return 'Логистика' case 'LOGIST': return 'Логистика'
case 'WHOLESALE': return 'Оптовик' case 'WHOLESALE': return 'Поставщик'
default: return type default: return type
} }
} }

View File

@ -112,7 +112,7 @@ function getTypeLabel(type: string): string {
case 'LOGIST': case 'LOGIST':
return 'Логистика' return 'Логистика'
case 'WHOLESALE': case 'WHOLESALE':
return 'Оптовик' return 'Поставщик'
default: default:
return type return type
} }

View File

@ -191,7 +191,7 @@ export function MessengerChat({ counterparty, onMessagesRead }: MessengerChatPro
case 'LOGIST': case 'LOGIST':
return 'Логистика' return 'Логистика'
case 'WHOLESALE': case 'WHOLESALE':
return 'Оптовик' return 'Поставщик'
default: default:
return type return type
} }

View File

@ -109,7 +109,7 @@ export function MessengerConversations({
case 'LOGIST': case 'LOGIST':
return 'Логистика' return 'Логистика'
case 'WHOLESALE': case 'WHOLESALE':
return 'Оптовик' return 'Поставщик'
default: default:
return type return type
} }

View File

@ -65,7 +65,7 @@ export function PartnersDashboard() {
value="wholesale" value="wholesale"
className="data-[state=active]:bg-white/20 data-[state=active]:text-white text-white/70" className="data-[state=active]:bg-white/20 data-[state=active]:text-white text-white/70"
> >
Оптовик Поставщик
</TabsTrigger> </TabsTrigger>
</TabsList> </TabsList>

View File

@ -36,7 +36,7 @@ export function CartSummary({
return null return null
} }
// Группируем товары по оптовикам // Группируем товары по поставщикам
const groupedProducts = selectedProducts.reduce((acc, product) => { const groupedProducts = selectedProducts.reduce((acc, product) => {
if (!acc[product.wholesalerId]) { if (!acc[product.wholesalerId]) {
acc[product.wholesalerId] = { acc[product.wholesalerId] = {
@ -86,7 +86,7 @@ export function CartSummary({
</Button> </Button>
</div> </div>
{/* Группировка по оптовикам */} {/* Группировка по поставщикам */}
{Object.entries(groupedProducts).map(([wholesalerId, group]) => ( {Object.entries(groupedProducts).map(([wholesalerId, group]) => (
<div key={wholesalerId} className="mb-4 last:mb-0"> <div key={wholesalerId} className="mb-4 last:mb-0">
<div className="flex items-center mb-2 pb-1 border-b border-white/10"> <div className="flex items-center mb-2 pb-1 border-b border-white/10">

View File

@ -106,7 +106,7 @@ export function CreateConsumablesSupplyPage() {
// Мутация для создания заказа поставки расходников // Мутация для создания заказа поставки расходников
const [createSupplyOrder] = useMutation(CREATE_SUPPLY_ORDER); const [createSupplyOrder] = useMutation(CREATE_SUPPLY_ORDER);
// Фильтруем только поставщиков расходников (оптовиков) // Фильтруем только поставщиков расходников (поставщиков)
const consumableSuppliers = ( const consumableSuppliers = (
counterpartiesData?.myCounterparties || [] counterpartiesData?.myCounterparties || []
).filter((org: ConsumableSupplier) => org.type === "WHOLESALE"); ).filter((org: ConsumableSupplier) => org.type === "WHOLESALE");

View File

@ -40,7 +40,7 @@ interface CreateSupplyFormProps {
onSupplyCreated: () => void onSupplyCreated: () => void
} }
// Моковые данные оптовиков // Моковые данные поставщиков
const mockWholesalers: Wholesaler[] = [ const mockWholesalers: Wholesaler[] = [
{ {
id: '1', id: '1',
@ -126,7 +126,7 @@ export function CreateSupplyForm({ onClose, onSupplyCreated }: CreateSupplyFormP
Назад Назад
</Button> </Button>
<div> <div>
<h2 className="text-2xl font-bold text-white mb-1">Товары оптовика</h2> <h2 className="text-2xl font-bold text-white mb-1">Товары поставщика</h2>
<p className="text-white/60">{selectedWholesaler.name}</p> <p className="text-white/60">{selectedWholesaler.name}</p>
</div> </div>
</div> </div>
@ -140,7 +140,7 @@ export function CreateSupplyForm({ onClose, onSupplyCreated }: CreateSupplyFormP
</Button> </Button>
</div> </div>
<div className="text-center py-12"> <div className="text-center py-12">
<p className="text-white/60">Компонент товаров оптовика в разработке...</p> <p className="text-white/60">Компонент товаров поставщика в разработке...</p>
</div> </div>
</div> </div>
) )
@ -160,8 +160,8 @@ export function CreateSupplyForm({ onClose, onSupplyCreated }: CreateSupplyFormP
Назад Назад
</Button> </Button>
<div> <div>
<h2 className="text-2xl font-bold text-white mb-1">Выбор оптовика</h2> <h2 className="text-2xl font-bold text-white mb-1">Выбор поставщика</h2>
<p className="text-white/60">Выберите оптовика для создания поставки</p> <p className="text-white/60">Выберите поставщика для создания поставки</p>
</div> </div>
</div> </div>
<Button <Button
@ -294,7 +294,7 @@ export function CreateSupplyForm({ onClose, onSupplyCreated }: CreateSupplyFormP
</div> </div>
</Card> </Card>
{/* Вариант 2: Оптовик */} {/* Вариант 2: Поставщик */}
<Card <Card
className="bg-white/10 backdrop-blur border-white/20 p-6 cursor-pointer transition-all hover:bg-white/15 hover:border-white/30" className="bg-white/10 backdrop-blur border-white/20 p-6 cursor-pointer transition-all hover:bg-white/15 hover:border-white/30"
onClick={() => setSelectedVariant('wholesaler')} onClick={() => setSelectedVariant('wholesaler')}
@ -304,9 +304,9 @@ export function CreateSupplyForm({ onClose, onSupplyCreated }: CreateSupplyFormP
<Users className="h-8 w-8 text-green-400" /> <Users className="h-8 w-8 text-green-400" />
</div> </div>
<div> <div>
<h3 className="text-xl font-semibold text-white mb-2">Оптовик</h3> <h3 className="text-xl font-semibold text-white mb-2">Поставщик</h3>
<p className="text-white/60 text-sm"> <p className="text-white/60 text-sm">
Создание поставки через выбор товаров у оптовиков Создание поставки через выбор товаров у поставщиков
</p> </p>
</div> </div>
<Badge className="bg-green-500/20 text-green-300 border-green-500/30"> <Badge className="bg-green-500/20 text-green-300 border-green-500/30">

View File

@ -604,7 +604,7 @@ export function FulfillmentGoodsTab() {
<div className="w-1 h-1 rounded-full bg-green-400 mr-1"></div> <div className="w-1 h-1 rounded-full bg-green-400 mr-1"></div>
<Building2 className="h-3 w-3 text-green-400" /> <Building2 className="h-3 w-3 text-green-400" />
<span className="text-white font-medium text-sm"> <span className="text-white font-medium text-sm">
Оптовик Поставщик
</span> </span>
</div> </div>
<div className="absolute left-0 top-0 w-0.5 h-full bg-green-400/30"></div> <div className="absolute left-0 top-0 w-0.5 h-full bg-green-400/30"></div>

View File

@ -106,13 +106,13 @@ export function RealSupplyOrdersTab() {
} }
); );
// Получаем ID текущей организации (оптовика) // Получаем ID текущей организации (поставщика)
const currentOrganizationId = user?.organization?.id; const currentOrganizationId = user?.organization?.id;
// Фильтруем заказы где текущая организация является поставщиком (заказы К оптовику) // Фильтруем заказы где текущая организация является поставщиком (заказы К поставщику)
const incomingSupplyOrders: SupplyOrder[] = (data?.supplyOrders || []).filter( const incomingSupplyOrders: SupplyOrder[] = (data?.supplyOrders || []).filter(
(order: SupplyOrder) => { (order: SupplyOrder) => {
// Показываем заказы где текущий оптовик указан как поставщик (partnerId) // Показываем заказы где текущий поставщик указан как поставщик (partnerId)
return order.partner.id === currentOrganizationId; return order.partner.id === currentOrganizationId;
} }
); );
@ -208,7 +208,7 @@ export function RealSupplyOrdersTab() {
}); });
}; };
// Статистика для оптовика // Статистика для поставщика
const totalOrders = incomingSupplyOrders.length; const totalOrders = incomingSupplyOrders.length;
const totalAmount = incomingSupplyOrders.reduce( const totalAmount = incomingSupplyOrders.reduce(
(sum, order) => sum + order.totalAmount, (sum, order) => sum + order.totalAmount,

View File

@ -630,7 +630,7 @@ export function SuppliesGoodsTab() {
</Button> </Button>
<Building2 className="h-4 w-4 text-green-400" /> <Building2 className="h-4 w-4 text-green-400" />
<span className="text-white font-medium"> <span className="text-white font-medium">
Оптовик Поставщик
</span> </span>
</div> </div>
</td> </td>

View File

@ -36,8 +36,8 @@ export function ProductGrid({
<div className="flex items-center justify-center p-8"> <div className="flex items-center justify-center p-8">
<div className="text-center"> <div className="text-center">
<Package className="h-12 w-12 text-white/20 mx-auto mb-4" /> <Package className="h-12 w-12 text-white/20 mx-auto mb-4" />
<p className="text-white/60">У этого оптовика нет товаров</p> <p className="text-white/60">У этого поставщика нет товаров</p>
<p className="text-white/40 text-sm mt-2">Выберите другого оптовика</p> <p className="text-white/40 text-sm mt-2">Выберите другого поставщика</p>
</div> </div>
</div> </div>
) )

View File

@ -95,7 +95,7 @@ export function TabsHeader({
}`} }`}
> >
<Users className="h-4 w-4 mr-1 inline" /> <Users className="h-4 w-4 mr-1 inline" />
Оптовики Поставщики
</button> </button>
</div> </div>
</div> </div>

View File

@ -21,7 +21,7 @@ export function WholesalerGrid({
onSearchChange, onSearchChange,
loading = false loading = false
}: WholesalerGridProps) { }: WholesalerGridProps) {
// Фильтруем оптовиков по поисковому запросу // Фильтруем поставщиков по поисковому запросу
const filteredWholesalers = wholesalers.filter((wholesaler) => const filteredWholesalers = wholesalers.filter((wholesaler) =>
wholesaler.name?.toLowerCase().includes(searchQuery.toLowerCase()) || wholesaler.name?.toLowerCase().includes(searchQuery.toLowerCase()) ||
wholesaler.fullName?.toLowerCase().includes(searchQuery.toLowerCase()) || wholesaler.fullName?.toLowerCase().includes(searchQuery.toLowerCase()) ||
@ -50,7 +50,7 @@ export function WholesalerGrid({
<div className="flex items-center justify-center p-8"> <div className="flex items-center justify-center p-8">
<div className="text-center"> <div className="text-center">
<div className="animate-spin rounded-full h-12 w-12 border-4 border-white border-t-transparent mx-auto mb-4"></div> <div className="animate-spin rounded-full h-12 w-12 border-4 border-white border-t-transparent mx-auto mb-4"></div>
<p className="text-white/60">Загружаем оптовиков...</p> <p className="text-white/60">Загружаем поставщиков...</p>
</div> </div>
</div> </div>
) )
@ -63,7 +63,7 @@ export function WholesalerGrid({
<div className="relative max-w-md"> <div className="relative max-w-md">
<Search className="absolute left-3 top-3 h-4 w-4 text-white/40" /> <Search className="absolute left-3 top-3 h-4 w-4 text-white/40" />
<Input <Input
placeholder="Поиск оптовиков..." placeholder="Поиск поставщиков..."
value={searchQuery} value={searchQuery}
onChange={(e) => onSearchChange(e.target.value)} onChange={(e) => onSearchChange(e.target.value)}
className="pl-10 glass-input text-white placeholder:text-white/40 h-10" className="pl-10 glass-input text-white placeholder:text-white/40 h-10"
@ -75,10 +75,10 @@ export function WholesalerGrid({
<div className="text-center p-8"> <div className="text-center p-8">
<Users className="h-12 w-12 text-white/20 mx-auto mb-4" /> <Users className="h-12 w-12 text-white/20 mx-auto mb-4" />
<p className="text-white/60"> <p className="text-white/60">
{searchQuery ? 'Оптовики не найдены' : 'У вас нет контрагентов-оптовиков'} {searchQuery ? 'Поставщики не найдены' : 'У вас нет контрагентов-поставщиков'}
</p> </p>
<p className="text-white/40 text-sm mt-2"> <p className="text-white/40 text-sm mt-2">
{searchQuery ? 'Попробуйте изменить условия поиска' : 'Добавьте оптовиков в разделе "Партнеры"'} {searchQuery ? 'Попробуйте изменить условия поиска' : 'Добавьте поставщиков в разделе "Партнеры"'}
</p> </p>
</div> </div>
) : ( ) : (

View File

@ -85,7 +85,7 @@ export function WholesalerProductsPage({
Назад Назад
</Button> </Button>
<div> <div>
<h1 className="text-3xl font-bold text-white mb-2">Товары оптовика</h1> <h1 className="text-3xl font-bold text-white mb-2">Товары поставщика</h1>
<p className="text-white/60">{selectedWholesaler.name} {products.length} товаров</p> <p className="text-white/60">{selectedWholesaler.name} {products.length} товаров</p>
</div> </div>
</div> </div>

View File

@ -233,7 +233,7 @@ export function WholesalerProducts({ wholesaler, onBack, onClose, onSupplyCreate
Назад Назад
</Button> </Button>
<div> <div>
<h2 className="text-2xl font-bold text-white mb-1">Товары оптовика</h2> <h2 className="text-2xl font-bold text-white mb-1">Товары поставщика</h2>
<p className="text-white/60">{wholesaler.name} {mockProducts.length} товаров</p> <p className="text-white/60">{wholesaler.name} {mockProducts.length} товаров</p>
</div> </div>
</div> </div>

View File

@ -35,7 +35,7 @@ interface WholesalerSelectionProps {
onSupplyCreated: () => void onSupplyCreated: () => void
} }
// Моковые данные оптовиков // Моковые данные поставщиков
const mockWholesalers: Wholesaler[] = [ const mockWholesalers: Wholesaler[] = [
{ {
id: '1', id: '1',
@ -129,7 +129,7 @@ export function WholesalerSelection({ onBack, onClose, onSupplyCreated }: Wholes
Назад Назад
</Button> </Button>
<div> <div>
<h2 className="text-2xl font-bold text-white mb-1">Товары оптовика</h2> <h2 className="text-2xl font-bold text-white mb-1">Товары поставщика</h2>
<p className="text-white/60">{selectedWholesaler.name}</p> <p className="text-white/60">{selectedWholesaler.name}</p>
</div> </div>
</div> </div>
@ -164,8 +164,8 @@ export function WholesalerSelection({ onBack, onClose, onSupplyCreated }: Wholes
Назад Назад
</Button> </Button>
<div> <div>
<h2 className="text-2xl font-bold text-white mb-1">Выбор оптовика</h2> <h2 className="text-2xl font-bold text-white mb-1">Выбор поставщика</h2>
<p className="text-white/60">Выберите оптовика для создания поставки</p> <p className="text-white/60">Выберите поставщика для создания поставки</p>
</div> </div>
</div> </div>
<Button <Button

View File

@ -791,7 +791,7 @@ export const DELETE_LOGISTICS = gql`
} }
`; `;
// Мутации для товаров оптовика // Мутации для товаров поставщика
export const CREATE_PRODUCT = gql` export const CREATE_PRODUCT = gql`
mutation CreateProduct($input: ProductInput!) { mutation CreateProduct($input: ProductInput!) {
createProduct(input: $input) { createProduct(input: $input) {

View File

@ -823,7 +823,7 @@ export const resolvers = {
}); });
}, },
// Мои товары (для оптовиков) // Мои товары (для поставщиков)
myProducts: async (_: unknown, __: unknown, context: Context) => { myProducts: async (_: unknown, __: unknown, context: Context) => {
if (!context.user) { if (!context.user) {
throw new GraphQLError("Требуется авторизация", { throw new GraphQLError("Требуется авторизация", {
@ -840,9 +840,9 @@ export const resolvers = {
throw new GraphQLError("У пользователя нет организации"); throw new GraphQLError("У пользователя нет организации");
} }
// Проверяем, что это оптовик // Проверяем, что это поставщик
if (currentUser.organization.type !== "WHOLESALE") { if (currentUser.organization.type !== "WHOLESALE") {
throw new GraphQLError("Товары доступны только для оптовиков"); throw new GraphQLError("Товары доступны только для поставщиков");
} }
return await prisma.product.findMany({ return await prisma.product.findMany({
@ -855,7 +855,7 @@ export const resolvers = {
}); });
}, },
// Все товары всех оптовиков для маркета // Все товары всех поставщиков для маркета
allProducts: async ( allProducts: async (
_: unknown, _: unknown,
args: { search?: string; category?: string }, args: { search?: string; category?: string },
@ -870,7 +870,7 @@ export const resolvers = {
const where: Record<string, unknown> = { const where: Record<string, unknown> = {
isActive: true, // Показываем только активные товары isActive: true, // Показываем только активные товары
organization: { organization: {
type: "WHOLESALE", // Только товары оптовиков type: "WHOLESALE", // Только товары поставщиков
}, },
}; };
@ -964,7 +964,7 @@ export const resolvers = {
}); });
}, },
// Публичные расходники контрагента (для оптовиков) // Публичные расходники контрагента (для поставщиков)
counterpartySupplies: async ( counterpartySupplies: async (
_: unknown, _: unknown,
args: { organizationId: string }, args: { organizationId: string },
@ -3189,7 +3189,7 @@ export const resolvers = {
} }
} }
// Проверяем, что партнер существует и является оптовиком // Проверяем, что партнер существует и является поставщиком
const partner = await prisma.organization.findFirst({ const partner = await prisma.organization.findFirst({
where: { where: {
id: args.input.partnerId, id: args.input.partnerId,
@ -3200,7 +3200,7 @@ export const resolvers = {
if (!partner) { if (!partner) {
return { return {
success: false, success: false,
message: "Партнер не найден или не является оптовиком", message: "Партнер не найден или не является поставщиком",
}; };
} }
@ -3425,9 +3425,9 @@ export const resolvers = {
throw new GraphQLError("У пользователя нет организации"); throw new GraphQLError("У пользователя нет организации");
} }
// Проверяем, что это оптовик // Проверяем, что это поставщик
if (currentUser.organization.type !== "WHOLESALE") { if (currentUser.organization.type !== "WHOLESALE") {
throw new GraphQLError("Товары доступны только для оптовиков"); throw new GraphQLError("Товары доступны только для поставщиков");
} }
// Проверяем уникальность артикула в рамках организации // Проверяем уникальность артикула в рамках организации

View File

@ -49,10 +49,10 @@ export const typeDefs = gql`
# Поставки Wildberries # Поставки Wildberries
myWildberriesSupplies: [WildberriesSupply!]! myWildberriesSupplies: [WildberriesSupply!]!
# Товары оптовика # Товары поставщика
myProducts: [Product!]! myProducts: [Product!]!
# Все товары всех оптовиков для маркета # Все товары всех поставщиков для маркета
allProducts(search: String, category: String): [Product!]! allProducts(search: String, category: String): [Product!]!
# Все категории # Все категории
@ -78,7 +78,7 @@ export const typeDefs = gql`
# Публичные услуги контрагента (для фулфилмента) # Публичные услуги контрагента (для фулфилмента)
counterpartyServices(organizationId: ID!): [Service!]! counterpartyServices(organizationId: ID!): [Service!]!
# Публичные расходники контрагента (для оптовиков) # Публичные расходники контрагента (для поставщиков)
counterpartySupplies(organizationId: ID!): [Supply!]! counterpartySupplies(organizationId: ID!): [Supply!]!
# Админ запросы # Админ запросы
@ -188,7 +188,7 @@ export const typeDefs = gql`
updateLogistics(id: ID!, input: LogisticsInput!): LogisticsResponse! updateLogistics(id: ID!, input: LogisticsInput!): LogisticsResponse!
deleteLogistics(id: ID!): Boolean! deleteLogistics(id: ID!): Boolean!
# Работа с товарами (для оптовиков) # Работа с товарами (для поставщиков)
createProduct(input: ProductInput!): ProductResponse! createProduct(input: ProductInput!): ProductResponse!
updateProduct(id: ID!, input: ProductInput!): ProductResponse! updateProduct(id: ID!, input: ProductInput!): ProductResponse!
deleteProduct(id: ID!): Boolean! deleteProduct(id: ID!): Boolean!
@ -621,7 +621,7 @@ export const typeDefs = gql`
updatedAt: DateTime! updatedAt: DateTime!
} }
# Типы для товаров оптовика # Типы для товаров поставщика
type Product { type Product {
id: ID! id: ID!
name: String! name: String!