Создан единый источник истины rules-complete.md v9.1 с полной интеграцией всех правил системы. Консолидированы правила создания предметов по ролям, уточнен статус брака (НЕ РЕАЛИЗОВАНО), обновлен механизм учета ПЛАН/ФАКТ с заменой брака на потери при пересчете. Добавлен экономический учет расходников фулфилмента для селлера через рецептуру. Удалены дублирующие файлы правил (CLAUDE.md, development-checklist.md, work-protocols.md, violation-prevention-protocol.md, self-validation.md, description.md). Интегрированы UI структуры создания поставок и концепция многоуровневых таблиц.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Veronika Smirnova
2025-08-05 15:29:41 +03:00
parent ee72a9488b
commit d30e3f9666
23 changed files with 2038 additions and 6162 deletions

View File

@ -27,7 +27,7 @@ import {
} from "lucide-react";
import {
GET_MY_COUNTERPARTIES,
GET_ALL_PRODUCTS,
GET_ORGANIZATION_PRODUCTS,
GET_SUPPLY_ORDERS,
GET_MY_SUPPLIES,
} from "@/graphql/queries";
@ -99,12 +99,17 @@ export function CreateConsumablesSupplyPage() {
GET_MY_COUNTERPARTIES
);
// Загружаем товары для выбранного поставщика
// Загружаем товары для выбранного поставщика с фильтрацией по типу CONSUMABLE
const { data: productsData, loading: productsLoading } = useQuery(
GET_ALL_PRODUCTS,
GET_ORGANIZATION_PRODUCTS,
{
skip: !selectedSupplier,
variables: { search: productSearchQuery || null, category: null },
variables: {
organizationId: selectedSupplier.id,
search: productSearchQuery || null,
category: null,
type: "CONSUMABLE" // Фильтруем только расходники согласно rules2.md
},
}
);
@ -134,13 +139,8 @@ export function CreateConsumablesSupplyPage() {
supplier.inn?.toLowerCase().includes(searchQuery.toLowerCase())
);
// Фильтруем товары по выбранному поставщику
const supplierProducts = selectedSupplier
? (productsData?.allProducts || []).filter(
(product: ConsumableProduct) =>
product.organization.id === selectedSupplier.id
)
: [];
// Получаем товары поставщика (уже отфильтрованы в GraphQL запросе)
const supplierProducts = productsData?.organizationProducts || [];
const formatCurrency = (amount: number) => {
return new Intl.NumberFormat("ru-RU", {
@ -415,11 +415,11 @@ export function CreateConsumablesSupplyPage() {
<div className="h-screen flex overflow-hidden">
<Sidebar />
<main
className={`flex-1 ${getSidebarMargin()} overflow-auto transition-all duration-300`}
className={`flex-1 ${getSidebarMargin()} overflow-auto transition-all duration-300 p-4`}
>
<div className="min-h-full w-full flex flex-col px-3 py-2">
<div className="min-h-full w-full flex flex-col gap-4">
{/* Заголовок */}
<div className="flex items-center justify-between mb-3 flex-shrink-0">
<div className="flex items-center justify-between flex-shrink-0">
<div>
<h1 className="text-xl font-bold text-white mb-1">
Создание поставки расходников
@ -440,9 +440,9 @@ export function CreateConsumablesSupplyPage() {
</div>
{/* Основной контент с двумя блоками */}
<div className="flex-1 flex gap-3 min-h-0">
<div className="flex-1 flex gap-4 min-h-0">
{/* Левая колонка - Поставщики и Расходники */}
<div className="flex-1 flex flex-col gap-3 min-h-0">
<div className="flex-1 flex flex-col gap-4 min-h-0">
{/* Блок "Поставщики" */}
<Card className="bg-gradient-to-r from-white/15 via-white/10 to-white/15 backdrop-blur-xl border border-white/30 shadow-2xl flex-shrink-0 sticky top-0 z-10 rounded-xl overflow-hidden">
<div className="p-3 bg-gradient-to-r from-purple-500/10 to-pink-500/10">