fix: завершение модуляризации системы и финальная организация проекта

## Структурные изменения:

### 📁 Организация архивных файлов:
- Перенос всех устаревших правил в legacy-rules/
- Создание структуры docs-and-reports/ для отчетов
- Архивация backup файлов в legacy-rules/backups/

### 🔧 Критические компоненты:
- src/components/supplies/multilevel-supplies-table.tsx - многоуровневая таблица поставок
- src/components/supplies/components/recipe-display.tsx - отображение рецептур
- src/components/fulfillment-supplies/fulfillment-goods-orders-tab.tsx - вкладка товарных заказов

### 🎯 GraphQL обновления:
- Обновление mutations.ts, queries.ts, resolvers.ts, typedefs.ts
- Синхронизация с Prisma schema.prisma
- Backup файлы для истории изменений

### 🛠️ Утилитарные скрипты:
- 12 новых скриптов в scripts/ для анализа данных
- Скрипты проверки фулфилмент-пользователей
- Утилиты очистки и фиксации данных поставок

### 📊 Тестирование:
- test-fulfillment-filtering.js - тестирование фильтрации фулфилмента
- test-full-workflow.js - полный workflow тестирование

### 📝 Документация:
- logistics-statistics-warehouse-rules.md - объединенные правила модулей
- Обновление журналов модуляризации и разработки

###  Исправления ESLint:
- Исправлены критические ошибки в sidebar.tsx
- Исправлены ошибки типизации в multilevel-supplies-table.tsx
- Исправлены неиспользуемые переменные в goods-supplies-table.tsx
- Заменены типы any на строгую типизацию
- Исправлены console.log на console.warn

## Результат:
- Завершена полная модуляризация системы
- Организована архитектура legacy файлов
- Добавлены критически важные компоненты таблиц
- Создана полная инфраструктура тестирования
- Исправлены все критические ESLint ошибки
- Сохранены 103 незакоммиченных изменения

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Veronika Smirnova
2025-08-22 10:31:43 +03:00
parent 621770e765
commit 89257c75b5
86 changed files with 25406 additions and 942 deletions

View File

@ -0,0 +1,1321 @@
import { gql } from 'graphql-tag'
// Запрос для получения заявок покупателей на возврат от Wildberries
export const GET_WB_RETURN_CLAIMS = gql`
query GetWbReturnClaims($isArchive: Boolean!, $limit: Int, $offset: Int) {
wbReturnClaims(isArchive: $isArchive, limit: $limit, offset: $offset) {
claims {
id
claimType
status
statusEx
nmId
userComment
wbComment
dt
imtName
orderDt
dtUpdate
photos
videoPaths
actions
price
currencyCode
srid
sellerOrganization {
id
name
inn
}
}
total
}
}
`
export const GET_ME = gql`
query GetMe {
me {
id
phone
avatar
managerName
createdAt
organization {
id
inn
kpp
name
fullName
address
addressFull
ogrn
ogrnDate
type
market
status
actualityDate
registrationDate
liquidationDate
managementName
managementPost
opfCode
opfFull
opfShort
okato
oktmo
okpo
okved
employeeCount
revenue
taxSystem
phones
emails
apiKeys {
id
marketplace
apiKey
isActive
validationData
createdAt
updatedAt
}
}
}
}
`
export const GET_MY_SERVICES = gql`
query GetMyServices {
myServices {
id
name
description
price
imageUrl
createdAt
updatedAt
}
}
`
export const GET_MY_SUPPLIES = gql`
query GetMySupplies {
mySupplies {
id
name
description
pricePerUnit
unit
imageUrl
warehouseStock
isAvailable
warehouseConsumableId
createdAt
updatedAt
organization {
id
name
}
}
}
`
// Новый запрос для получения доступных расходников для рецептур селлеров
export const GET_AVAILABLE_SUPPLIES_FOR_RECIPE = gql`
query GetAvailableSuppliesForRecipe {
getAvailableSuppliesForRecipe {
id
name
pricePerUnit
unit
imageUrl
warehouseStock
}
}
`
// Получение карточек Wildberries для селекта
export const GET_MY_WILDBERRIES_CARDS = gql`
query GetMyWildberriesCards {
myWildberriesSupplies {
id
cards {
id
nmId
vendorCode
title
brand
mediaFiles
price
}
}
}
`
export const GET_MY_FULFILLMENT_SUPPLIES = gql`
query GetMyFulfillmentSupplies {
myFulfillmentSupplies {
id
name
article
description
price
quantity
unit
category
status
date
supplier
minStock
currentStock
usedStock
imageUrl
createdAt
updatedAt
}
}
`
export const GET_SELLER_SUPPLIES_ON_WAREHOUSE = gql`
query GetSellerSuppliesOnWarehouse {
sellerSuppliesOnWarehouse {
id
name
description
price
quantity
unit
category
status
date
supplier
minStock
currentStock
usedStock
imageUrl
type
shopLocation
createdAt
updatedAt
organization {
id
name
fullName
type
}
sellerOwner {
id
name
fullName
inn
type
}
}
}
`
export const GET_MY_LOGISTICS = gql`
query GetMyLogistics {
myLogistics {
id
fromLocation
toLocation
priceUnder1m3
priceOver1m3
description
createdAt
updatedAt
organization {
id
name
fullName
}
}
}
`
export const GET_LOGISTICS_PARTNERS = gql`
query GetLogisticsPartners {
logisticsPartners {
id
name
fullName
type
address
phones
emails
}
}
`
export const GET_MY_PRODUCTS = gql`
query GetMyProducts {
myProducts {
id
name
article
description
price
pricePerSet
quantity
setQuantity
ordered
inTransit
stock
sold
type
category {
id
name
}
brand
color
size
weight
dimensions
material
images
mainImage
isActive
createdAt
updatedAt
organization {
id
market
}
}
}
`
export const GET_WAREHOUSE_PRODUCTS = gql`
query GetWarehouseProducts {
warehouseProducts {
id
name
article
description
price
quantity
type
category {
id
name
}
brand
color
size
weight
dimensions
material
images
mainImage
isActive
organization {
id
name
fullName
}
createdAt
updatedAt
}
}
`
// Запросы для контрагентов
export const SEARCH_ORGANIZATIONS = gql`
query SearchOrganizations($type: OrganizationType, $search: String) {
searchOrganizations(type: $type, search: $search) {
id
inn
name
fullName
type
address
phones
emails
createdAt
isCounterparty
isCurrentUser
hasOutgoingRequest
hasIncomingRequest
users {
id
avatar
managerName
}
}
}
`
export const GET_MY_COUNTERPARTIES = gql`
query GetMyCounterparties {
myCounterparties {
id
inn
name
fullName
managementName
type
address
market
phones
emails
createdAt
users {
id
avatar
managerName
}
}
}
`
export const GET_SUPPLY_SUPPLIERS = gql`
query GetSupplySuppliers {
supplySuppliers {
id
name
contactName
phone
market
address
place
telegram
createdAt
}
}
`
export const GET_ORGANIZATION_LOGISTICS = gql`
query GetOrganizationLogistics($organizationId: ID!) {
organizationLogistics(organizationId: $organizationId) {
id
fromLocation
toLocation
priceUnder1m3
priceOver1m3
description
}
}
`
export const GET_INCOMING_REQUESTS = gql`
query GetIncomingRequests {
incomingRequests {
id
status
message
createdAt
sender {
id
inn
name
fullName
type
address
phones
emails
createdAt
users {
id
avatar
}
}
receiver {
id
inn
name
fullName
type
users {
id
avatar
}
}
}
}
`
export const GET_OUTGOING_REQUESTS = gql`
query GetOutgoingRequests {
outgoingRequests {
id
status
message
createdAt
sender {
id
inn
name
fullName
type
users {
id
avatar
}
}
receiver {
id
inn
name
fullName
type
address
phones
emails
createdAt
users {
id
avatar
}
}
}
}
`
export const GET_ORGANIZATION = gql`
query GetOrganization($id: ID!) {
organization(id: $id) {
id
inn
name
fullName
address
type
apiKeys {
id
marketplace
apiKey
isActive
validationData
createdAt
updatedAt
}
createdAt
updatedAt
}
}
`
// Запросы для сообщений
export const GET_MESSAGES = gql`
query GetMessages($counterpartyId: ID!, $limit: Int, $offset: Int) {
messages(counterpartyId: $counterpartyId, limit: $limit, offset: $offset) {
id
content
type
voiceUrl
voiceDuration
fileUrl
fileName
fileSize
fileType
senderId
senderOrganization {
id
name
fullName
type
users {
id
avatar
managerName
}
}
receiverOrganization {
id
name
fullName
type
users {
id
avatar
managerName
}
}
isRead
createdAt
updatedAt
}
}
`
export const GET_CONVERSATIONS = gql`
query GetConversations {
conversations {
id
counterparty {
id
inn
name
fullName
type
address
users {
id
avatar
managerName
}
}
lastMessage {
id
content
type
voiceUrl
voiceDuration
fileUrl
fileName
fileSize
fileType
senderId
isRead
createdAt
}
unreadCount
updatedAt
}
}
`
export const GET_CATEGORIES = gql`
query GetCategories {
categories {
id
name
createdAt
updatedAt
}
}
`
export const GET_ALL_PRODUCTS = gql`
query GetAllProducts($search: String, $category: String) {
allProducts(search: $search, category: $category) {
id
name
article
description
price
quantity
type
category {
id
name
}
brand
color
size
weight
dimensions
material
images
mainImage
isActive
createdAt
updatedAt
organization {
id
inn
name
fullName
type
address
phones
emails
users {
id
avatar
managerName
}
}
}
}
`
// Запрос товаров конкретной организации (для формы создания поставки)
export const GET_ORGANIZATION_PRODUCTS = gql`
query GetOrganizationProducts($organizationId: ID!, $search: String, $category: String, $type: String) {
organizationProducts(organizationId: $organizationId, search: $search, category: $category, type: $type) {
id
name
article
description
price
quantity
type
category {
id
name
}
brand
color
size
weight
dimensions
material
images
mainImage
isActive
createdAt
updatedAt
organization {
id
inn
name
fullName
type
address
phones
emails
users {
id
avatar
managerName
}
}
}
}
`
export const GET_MY_CART = gql`
query GetMyCart {
myCart {
id
totalPrice
totalItems
items {
id
quantity
totalPrice
isAvailable
availableQuantity
createdAt
updatedAt
product {
id
name
article
description
price
quantity
brand
color
size
images
mainImage
isActive
category {
id
name
}
organization {
id
inn
name
fullName
type
address
phones
emails
users {
id
avatar
managerName
}
}
}
}
createdAt
updatedAt
}
}
`
export const GET_MY_FAVORITES = gql`
query GetMyFavorites {
myFavorites {
id
name
article
description
price
quantity
brand
color
size
images
mainImage
isActive
createdAt
updatedAt
category {
id
name
}
organization {
id
inn
name
fullName
type
address
phones
emails
users {
id
avatar
managerName
}
}
}
}
`
// Запросы для сотрудников
export const GET_MY_EMPLOYEES = gql`
query GetMyEmployees {
myEmployees {
id
firstName
lastName
middleName
fullName
name
birthDate
avatar
passportSeries
passportNumber
passportIssued
passportDate
address
position
department
hireDate
salary
status
phone
email
telegram
whatsapp
passportPhoto
emergencyContact
emergencyPhone
createdAt
updatedAt
}
}
`
export const GET_EMPLOYEE = gql`
query GetEmployee($id: ID!) {
employee(id: $id) {
id
firstName
lastName
middleName
birthDate
avatar
passportSeries
passportNumber
passportIssued
passportDate
address
position
department
hireDate
salary
status
phone
email
emergencyContact
emergencyPhone
createdAt
updatedAt
}
}
`
export const GET_EMPLOYEE_SCHEDULE = gql`
query GetEmployeeSchedule($employeeId: ID!, $year: Int!, $month: Int!) {
employeeSchedule(employeeId: $employeeId, year: $year, month: $month) {
id
date
status
hoursWorked
notes
employee {
id
}
}
}
`
export const GET_MY_WILDBERRIES_SUPPLIES = gql`
query GetMyWildberriesSupplies {
myWildberriesSupplies {
id
deliveryDate
status
totalAmount
totalItems
createdAt
cards {
id
nmId
vendorCode
title
brand
price
discountedPrice
quantity
selectedQuantity
selectedMarket
selectedPlace
sellerName
sellerPhone
deliveryDate
mediaFiles
selectedServices
}
}
}
`
// Запросы для получения услуг и расходников от конкретных организаций-контрагентов
export const GET_COUNTERPARTY_SERVICES = gql`
query GetCounterpartyServices($organizationId: ID!) {
counterpartyServices(organizationId: $organizationId) {
id
name
description
price
imageUrl
createdAt
updatedAt
}
}
`
export const GET_COUNTERPARTY_SUPPLIES = gql`
query GetCounterpartySupplies($organizationId: ID!) {
counterpartySupplies(organizationId: $organizationId) {
id
name
description
price
quantity
unit
category
status
imageUrl
createdAt
updatedAt
}
}
`
// Wildberries запросы
export const GET_WILDBERRIES_STATISTICS = gql`
query GetWildberriesStatistics($period: String, $startDate: String, $endDate: String) {
getWildberriesStatistics(period: $period, startDate: $startDate, endDate: $endDate) {
success
message
data {
date
sales
orders
advertising
refusals
returns
revenue
buyoutPercentage
}
}
}
`
export const GET_WILDBERRIES_CAMPAIGN_STATS = gql`
query GetWildberriesCampaignStats($input: WildberriesCampaignStatsInput!) {
getWildberriesCampaignStats(input: $input) {
success
message
data {
advertId
views
clicks
ctr
cpc
sum
atbs
orders
cr
shks
sum_price
interval {
begin
end
}
days {
date
views
clicks
ctr
cpc
sum
atbs
orders
cr
shks
sum_price
apps {
views
clicks
ctr
cpc
sum
atbs
orders
cr
shks
sum_price
appType
nm {
views
clicks
ctr
cpc
sum
atbs
orders
cr
shks
sum_price
name
nmId
}
}
}
boosterStats {
date
nm
avg_position
}
}
}
}
`
export const GET_WILDBERRIES_CAMPAIGNS_LIST = gql`
query GetWildberriesCampaignsList {
getWildberriesCampaignsList {
success
message
data {
adverts {
type
status
count
advert_list {
advertId
changeTime
}
}
all
}
}
}
`
export const GET_EXTERNAL_ADS = gql`
query GetExternalAds($dateFrom: String!, $dateTo: String!) {
getExternalAds(dateFrom: $dateFrom, dateTo: $dateTo) {
success
message
externalAds {
id
name
url
cost
date
nmId
clicks
organizationId
createdAt
updatedAt
}
}
}
`
// Админ запросы
export const ADMIN_ME = gql`
query AdminMe {
adminMe {
id
username
email
isActive
lastLogin
createdAt
updatedAt
}
}
`
export const ALL_USERS = gql`
query AllUsers($search: String, $limit: Int, $offset: Int) {
allUsers(search: $search, limit: $limit, offset: $offset) {
users {
id
phone
managerName
avatar
createdAt
updatedAt
organization {
id
inn
name
fullName
type
status
createdAt
}
}
total
hasMore
}
}
`
export const GET_SUPPLY_ORDERS = gql`
query GetSupplyOrders {
supplyOrders {
id
organizationId
partnerId
deliveryDate
status
totalAmount
totalItems
fulfillmentCenterId
createdAt
updatedAt
partner {
id
name
fullName
inn
address
phones
emails
}
organization {
id
name
fullName
type
}
fulfillmentCenter {
id
name
fullName
type
}
logisticsPartner {
id
name
fullName
type
}
items {
id
quantity
price
totalPrice
product {
id
name
article
description
category {
id
name
}
}
}
}
}
`
export const GET_PENDING_SUPPLIES_COUNT = gql`
query GetPendingSuppliesCount {
pendingSuppliesCount {
supplyOrders
ourSupplyOrders
sellerSupplyOrders
incomingSupplierOrders
incomingRequests
total
}
}
`
// Запрос данных склада с партнерами (включая автосозданные записи)
export const GET_WAREHOUSE_DATA = gql`
query GetWarehouseData {
warehouseData {
stores {
id
storeName
storeOwner
storeImage
storeQuantity
partnershipDate
products {
id
productName
productQuantity
productPlace
variants {
id
variantName
variantQuantity
variantPlace
}
}
}
}
}
`
// Запросы для кеша склада WB
export const GET_WB_WAREHOUSE_DATA = gql`
query GetWBWarehouseData {
getWBWarehouseData {
success
message
fromCache
cache {
id
organizationId
cacheDate
data
totalProducts
totalStocks
totalReserved
createdAt
updatedAt
}
}
}
`
// Запросы для кеша статистики продаж
export const GET_SELLER_STATS_CACHE = gql`
query GetSellerStatsCache($period: String!, $dateFrom: String, $dateTo: String) {
getSellerStatsCache(period: $period, dateFrom: $dateFrom, dateTo: $dateTo) {
success
message
fromCache
cache {
id
organizationId
cacheDate
period
dateFrom
dateTo
productsData
productsTotalSales
productsTotalOrders
productsCount
advertisingData
advertisingTotalCost
advertisingTotalViews
advertisingTotalClicks
expiresAt
createdAt
updatedAt
}
}
}
`
// Запрос для получения статистики склада фулфилмента с изменениями за сутки
export const GET_FULFILLMENT_WAREHOUSE_STATS = gql`
query GetFulfillmentWarehouseStats {
fulfillmentWarehouseStats {
products {
current
change
percentChange
}
goods {
current
change
percentChange
}
defects {
current
change
percentChange
}
pvzReturns {
current
change
percentChange
}
fulfillmentSupplies {
current
change
percentChange
}
sellerSupplies {
current
change
percentChange
}
}
}
`
// Запрос для получения движений товаров (прибыло/убыло) за период
export const GET_SUPPLY_MOVEMENTS = gql`
query GetSupplyMovements($period: String = "24h") {
supplyMovements(period: $period) {
arrived {
products
goods
defects
pvzReturns
fulfillmentSupplies
sellerSupplies
}
departed {
products
goods
defects
pvzReturns
fulfillmentSupplies
sellerSupplies
}
}
}
`
// Запрос партнерской ссылки
export const GET_MY_PARTNER_LINK = gql`
query GetMyPartnerLink {
myPartnerLink
}
`
// Экспорт реферальных запросов
export {
GET_MY_REFERRAL_LINK,
GET_MY_REFERRAL_STATS,
GET_MY_REFERRALS,
GET_MY_REFERRAL_TRANSACTIONS,
GET_REFERRAL_DASHBOARD_DATA,
} from './referral-queries'