feat(marketplace): обогащение заказов реквизитами товара и ПВЗ

Заказ ссылается на предложение и ПВЗ по id и не нёс отображаемых реквизитов —
карточки столов показывали сырой offer_id и служебный braname. Резолверы
listMyOrders/listSupplierOrders/getOrder теперь обогащают DTO заказа:
product_name и unit_of_measure из предложения (батч offerRepo.findByIds без
N+1), delivery_point_address из детализации ПВЗ (kuRepo.findByCoopname).
Поля nullable, best-effort: нет предложения/ПВЗ — остаются пустыми, клиент
показывает запасной вид.

Схема и zeus-клиент перегенерированы, orderSelector дополнен; offer-репо
получил findByIds (+ моки в unit-тестах).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ant
2026-05-30 07:46:43 +00:00
parent 140310df49
commit e5aec26665
14 changed files with 179 additions and 6 deletions
+11
View File
@@ -8374,6 +8374,11 @@ type MarketplaceOrder {
"""Имя пункта выдачи (ПВЗ), куда пайщик хочет получить заказ."""
delivery_braname: String!
"""
Адрес пункта выдачи — для отображения вместо служебного идентификатора ПВЗ.
"""
delivery_point_address: String
"""
Учётная запись стороны кооператива, поставившей подпись вместе с заказчиком.
"""
@@ -8408,6 +8413,9 @@ type MarketplaceOrder {
"""Цена за единицу товара на момент заказа."""
price_per_unit: String!
"""Название товара из предложения — для отображения в карточке заказа."""
product_name: String
"""Количество единиц товара в заказе."""
quantity: Int!
@@ -8429,6 +8437,9 @@ type MarketplaceOrder {
"""Общая сумма заказа."""
total_cost: String!
"""Единица измерения товара из предложения (шт., кг, л, упак.)."""
unit_of_measure: String
"""Когда запись о заказе последний раз изменялась."""
updated_at: DateTime!
@@ -107,12 +107,30 @@ export class MarketplaceOrderDTO {
@Field(() => String, { description: 'Хеш предложения в блокчейне (snapshot на момент заказа).' })
public readonly offer_hash!: string;
@Field(() => String, {
nullable: true,
description: 'Название товара из предложения — для отображения в карточке заказа.',
})
public readonly product_name!: string | null;
@Field(() => String, {
nullable: true,
description: 'Единица измерения товара из предложения (шт., кг, л, упак.).',
})
public readonly unit_of_measure!: string | null;
@Field(() => String, { description: 'Аккаунт поставщика.' })
public readonly supplier_account!: string;
@Field(() => String, { description: 'Имя пункта выдачи (ПВЗ), куда пайщик хочет получить заказ.' })
public readonly delivery_braname!: string;
@Field(() => String, {
nullable: true,
description: 'Адрес пункта выдачи — для отображения вместо служебного идентификатора ПВЗ.',
})
public readonly delivery_point_address!: string | null;
@Field(() => Int, { description: 'Количество единиц товара в заказе.' })
public readonly quantity!: number;
@@ -312,7 +330,23 @@ export function toMarketplaceOrderCreateTxSnapshotDTO(
return new MarketplaceOrderCreateTxSnapshotDTO(s);
}
export function toMarketplaceOrderDTO(o: MarketplaceOrderDomainEntity): MarketplaceOrderDTO {
/**
* Отображаемые реквизиты, которыми резолвер обогащает заказ для UI: название
* товара и единица измерения берутся из предложения, адрес — из детализации
* ПВЗ. Не хранятся на самом заказе (заказ ссылается на предложение/ПВЗ по id),
* поэтому подмешиваются в DTO на чтении. Best-effort: если предложение/ПВЗ не
* найдены — поля остаются null, клиент показывает запасной вид.
*/
export interface MarketplaceOrderDisplayFields {
product_name?: string | null;
unit_of_measure?: string | null;
delivery_point_address?: string | null;
}
export function toMarketplaceOrderDTO(
o: MarketplaceOrderDomainEntity,
display?: MarketplaceOrderDisplayFields
): MarketplaceOrderDTO {
return new MarketplaceOrderDTO({
id: o.id,
coopname: o.coopname,
@@ -320,8 +354,11 @@ export function toMarketplaceOrderDTO(o: MarketplaceOrderDomainEntity): Marketpl
orderer_account: o.orderer_account,
offer_id: o.offer_id,
offer_hash: o.offer_hash,
product_name: display?.product_name ?? null,
unit_of_measure: display?.unit_of_measure ?? null,
supplier_account: o.supplier_account,
delivery_braname: o.delivery_braname,
delivery_point_address: display?.delivery_point_address ?? null,
quantity: o.quantity,
price_per_unit: o.price_per_unit,
total_cost: o.total_cost,
@@ -231,7 +231,7 @@ export class MarketplaceIssuanceResolver {
coopname,
data.delivery_braname
);
return orders.map(toMarketplaceOrderDTO);
return orders.map((order) => toMarketplaceOrderDTO(order));
}
@Query(() => [MarketplaceOrderDTO], {
@@ -248,6 +248,6 @@ export class MarketplaceIssuanceResolver {
config.coopname,
member.username
);
return orders.map(toMarketplaceOrderDTO);
return orders.map((order) => toMarketplaceOrderDTO(order));
}
}
@@ -19,6 +19,7 @@ import {
MarketplaceOrderPaginationResultDTO,
MarketplaceSupplierOrderActionResultDTO,
toMarketplaceOrderDTO,
type MarketplaceOrderDisplayFields,
} from '../dto/marketplace-order.dto';
import { toMarketplaceConsolidatedRequestDTO } from '../dto/marketplace-consolidated-request.dto';
import {
@@ -37,6 +38,14 @@ import {
type MarketplaceOrderDomainRepository,
type MarketplaceOrderListFilter,
} from '../../domain/repositories/marketplace-order.repository';
import {
MARKETPLACE_OFFER_REPOSITORY,
type MarketplaceOfferDomainRepository,
} from '../../domain/repositories/marketplace-offer.repository';
import {
KU_DETAILS_DOMAIN_REPOSITORY,
type KuDetailsDomainRepository,
} from '../../domain/repositories/ku-details-domain.repository';
import { canAccess } from '../access/marketplace-access-matrix';
import type { MarketplaceRole } from '../membership/marketplace-roles.mapper';
import type { MarketplaceOrderStatus } from '../../domain/entities/marketplace-order.types';
@@ -78,7 +87,11 @@ export class MarketplaceOrderResolver {
@Inject(MARKETPLACE_ORDER_SUPPLIER_ACTION_SERVICE)
private readonly supplierActionService: MarketplaceOrderSupplierActionService,
@Inject(MARKETPLACE_ORDER_REPOSITORY)
private readonly orderRepo: MarketplaceOrderDomainRepository
private readonly orderRepo: MarketplaceOrderDomainRepository,
@Inject(MARKETPLACE_OFFER_REPOSITORY)
private readonly offerRepo: MarketplaceOfferDomainRepository,
@Inject(KU_DETAILS_DOMAIN_REPOSITORY)
private readonly kuRepo: KuDetailsDomainRepository
) {}
@Mutation(() => MarketplaceCreateOrderResultDTO, {
@@ -302,7 +315,15 @@ export class MarketplaceOrderResolver {
if (!canReadOwn && !canReadToSelf && !canReadAll) {
throw new ForbiddenException('Нет прав на просмотр заказа.');
}
return toOrderDTO(order);
const [offer, ku] = await Promise.all([
this.offerRepo.findById(order.offer_id),
this.kuRepo.findByCoreBraname(config.coopname, order.delivery_braname),
]);
return toOrderDTO(order, {
product_name: offer?.product_name ?? null,
unit_of_measure: offer?.unit_of_measure ?? null,
delivery_point_address: ku?.addressFull ?? null,
});
}
private async runListQuery(
@@ -315,11 +336,43 @@ export class MarketplaceOrderResolver {
sortBy: options?.sortBy ?? 'updated_at',
sortOrder: options?.sortOrder ?? 'DESC',
});
const displayByOrderId = await this.buildDisplayFields(result.items);
const dto = new MarketplaceOrderPaginationResultDTO();
dto.items = result.items.map(toOrderDTO);
dto.items = result.items.map((o) => toOrderDTO(o, displayByOrderId.get(o.id)));
dto.totalCount = result.totalCount;
dto.totalPages = result.totalPages;
dto.currentPage = result.currentPage;
return dto;
}
/**
* Обогащение страницы заказов отображаемыми реквизитами товара и ПВЗ.
* Offer'ы тянутся одним батчем по уникальным offer_id, детализация ПВЗ —
* одной выборкой по кооперативу; оба маппятся в адреса/названия. Best-effort:
* отсутствующее предложение/ПВЗ оставляет соответствующие поля пустыми.
*/
private async buildDisplayFields(
orders: MarketplaceOrderDomainEntity[]
): Promise<Map<string, MarketplaceOrderDisplayFields>> {
const result = new Map<string, MarketplaceOrderDisplayFields>();
if (orders.length === 0) return result;
const offerIds = [...new Set(orders.map((o) => o.offer_id))];
const [offers, kuList] = await Promise.all([
this.offerRepo.findByIds(offerIds),
this.kuRepo.findByCoopname(config.coopname),
]);
const offerById = new Map(offers.map((offer) => [offer.id, offer]));
const addressByBraname = new Map(kuList.map((ku) => [ku.coreBraname, ku.addressFull]));
for (const order of orders) {
const offer = offerById.get(order.offer_id);
result.set(order.id, {
product_name: offer?.product_name ?? null,
unit_of_measure: offer?.unit_of_measure ?? null,
delivery_point_address: addressByBraname.get(order.delivery_braname) ?? null,
});
}
return result;
}
}
@@ -90,6 +90,12 @@ export interface OfferCountersDeltaResult {
export interface MarketplaceOfferDomainRepository {
findById(id: string): Promise<MarketplaceOfferDomainEntity | null>;
/**
* Батч-выборка Offer'ов по набору id одним запросом. Используется для
* обогащения списков заказов отображаемыми реквизитами товара
* (название, единица измерения) без N+1.
*/
findByIds(ids: string[]): Promise<MarketplaceOfferDomainEntity[]>;
list(
filter: OfferListFilter,
pagination: PaginationInputDomainInterface
@@ -30,6 +30,12 @@ export class MarketplaceOfferRepositoryAdapter implements MarketplaceOfferDomain
return row ? this.mapper.toDomain(row) : null;
}
async findByIds(ids: string[]): Promise<MarketplaceOfferDomainEntity[]> {
if (ids.length === 0) return [];
const rows = await this.repo.find({ where: { id: In(ids) } });
return rows.map((r) => this.mapper.toDomain(r));
}
async list(
filter: OfferListFilter,
pagination: PaginationInputDomainInterface
@@ -75,6 +75,7 @@ function makeLog(overrides: Partial<MarketplaceModerationLogDomainEntity> = {}):
function makeOfferRepo(): jest.Mocked<MarketplaceOfferDomainRepository> {
return {
findById: jest.fn(),
findByIds: jest.fn(),
list: jest.fn(),
countByCategory: jest.fn(),
countRecentCreatedBy: jest.fn(),
@@ -63,6 +63,7 @@ function makeOffer(overrides: Partial<MarketplaceOfferDomainEntity> = {}): Marke
function makeRepo(): jest.Mocked<MarketplaceOfferDomainRepository> {
return {
findById: jest.fn(),
findByIds: jest.fn(),
list: jest.fn(),
countByCategory: jest.fn(),
countRecentCreatedBy: jest.fn(),
@@ -65,6 +65,7 @@ function makeOffer(overrides: Partial<MarketplaceOfferDomainEntity> = {}): Marke
function makeOfferRepo(): jest.Mocked<MarketplaceOfferDomainRepository> {
return {
findById: jest.fn(),
findByIds: jest.fn(),
list: jest.fn(),
countByCategory: jest.fn(),
countRecentCreatedBy: jest.fn(),
+3
View File
@@ -4192,6 +4192,7 @@ export const ReturnTypes: Record<string,any> = {
cycle_id:"String",
cycle_type:"MarketplaceOrderCycleType",
delivery_braname:"String",
delivery_point_address:"String",
delivery_signer_account:"String",
id:"String",
issuance_fact:"MarketplaceOrderIssuanceFactSnapshot",
@@ -4202,6 +4203,7 @@ export const ReturnTypes: Record<string,any> = {
orderer_account:"String",
orderer_signed_at:"DateTime",
price_per_unit:"String",
product_name:"String",
quantity:"Int",
received_at:"DateTime",
signiss1_tx_hash:"String",
@@ -4209,6 +4211,7 @@ export const ReturnTypes: Record<string,any> = {
status:"MarketplaceOrderStatus",
supplier_account:"String",
total_cost:"String",
unit_of_measure:"String",
updated_at:"DateTime",
warranty_period_secs:"Int",
warranty_until:"DateTime"
+24
View File
@@ -7081,6 +7081,8 @@ export type ValueTypes = {
cycle_type?:boolean | `@${string}`,
/** Имя пункта выдачи (ПВЗ), куда пайщик хочет получить заказ. */
delivery_braname?:boolean | `@${string}`,
/** Адрес пункта выдачи — для отображения вместо служебного идентификатора ПВЗ. */
delivery_point_address?:boolean | `@${string}`,
/** Учётная запись стороны кооператива, поставившей подпись вместе с заказчиком. */
delivery_signer_account?:boolean | `@${string}`,
/** Идентификатор заказа. */
@@ -7101,6 +7103,8 @@ export type ValueTypes = {
orderer_signed_at?:boolean | `@${string}`,
/** Цена за единицу товара на момент заказа. */
price_per_unit?:boolean | `@${string}`,
/** Название товара из предложения — для отображения в карточке заказа. */
product_name?:boolean | `@${string}`,
/** Количество единиц товара в заказе. */
quantity?:boolean | `@${string}`,
/** Когда пайщик получил заказ. */
@@ -7115,6 +7119,8 @@ export type ValueTypes = {
supplier_account?:boolean | `@${string}`,
/** Общая сумма заказа. */
total_cost?:boolean | `@${string}`,
/** Единица измерения товара из предложения (шт., кг, л, упак.). */
unit_of_measure?:boolean | `@${string}`,
/** Когда запись о заказе последний раз изменялась. */
updated_at?:boolean | `@${string}`,
/** Срок гарантии в секундах с момента получения. */
@@ -17111,6 +17117,8 @@ export type ResolverInputTypes = {
cycle_type?:boolean | `@${string}`,
/** Имя пункта выдачи (ПВЗ), куда пайщик хочет получить заказ. */
delivery_braname?:boolean | `@${string}`,
/** Адрес пункта выдачи — для отображения вместо служебного идентификатора ПВЗ. */
delivery_point_address?:boolean | `@${string}`,
/** Учётная запись стороны кооператива, поставившей подпись вместе с заказчиком. */
delivery_signer_account?:boolean | `@${string}`,
/** Идентификатор заказа. */
@@ -17131,6 +17139,8 @@ export type ResolverInputTypes = {
orderer_signed_at?:boolean | `@${string}`,
/** Цена за единицу товара на момент заказа. */
price_per_unit?:boolean | `@${string}`,
/** Название товара из предложения — для отображения в карточке заказа. */
product_name?:boolean | `@${string}`,
/** Количество единиц товара в заказе. */
quantity?:boolean | `@${string}`,
/** Когда пайщик получил заказ. */
@@ -17145,6 +17155,8 @@ export type ResolverInputTypes = {
supplier_account?:boolean | `@${string}`,
/** Общая сумма заказа. */
total_cost?:boolean | `@${string}`,
/** Единица измерения товара из предложения (шт., кг, л, упак.). */
unit_of_measure?:boolean | `@${string}`,
/** Когда запись о заказе последний раз изменялась. */
updated_at?:boolean | `@${string}`,
/** Срок гарантии в секундах с момента получения. */
@@ -26816,6 +26828,8 @@ export type ModelTypes = {
cycle_type: ModelTypes["MarketplaceOrderCycleType"],
/** Имя пункта выдачи (ПВЗ), куда пайщик хочет получить заказ. */
delivery_braname: string,
/** Адрес пункта выдачи — для отображения вместо служебного идентификатора ПВЗ. */
delivery_point_address?: string | undefined | null,
/** Учётная запись стороны кооператива, поставившей подпись вместе с заказчиком. */
delivery_signer_account?: string | undefined | null,
/** Идентификатор заказа. */
@@ -26836,6 +26850,8 @@ export type ModelTypes = {
orderer_signed_at?: ModelTypes["DateTime"] | undefined | null,
/** Цена за единицу товара на момент заказа. */
price_per_unit: string,
/** Название товара из предложения — для отображения в карточке заказа. */
product_name?: string | undefined | null,
/** Количество единиц товара в заказе. */
quantity: number,
/** Когда пайщик получил заказ. */
@@ -26850,6 +26866,8 @@ export type ModelTypes = {
supplier_account: string,
/** Общая сумма заказа. */
total_cost: string,
/** Единица измерения товара из предложения (шт., кг, л, упак.). */
unit_of_measure?: string | undefined | null,
/** Когда запись о заказе последний раз изменялась. */
updated_at: ModelTypes["DateTime"],
/** Срок гарантии в секундах с момента получения. */
@@ -37466,6 +37484,8 @@ export type GraphQLTypes = {
cycle_type: GraphQLTypes["MarketplaceOrderCycleType"],
/** Имя пункта выдачи (ПВЗ), куда пайщик хочет получить заказ. */
delivery_braname: string,
/** Адрес пункта выдачи — для отображения вместо служебного идентификатора ПВЗ. */
delivery_point_address?: string | undefined | null,
/** Учётная запись стороны кооператива, поставившей подпись вместе с заказчиком. */
delivery_signer_account?: string | undefined | null,
/** Идентификатор заказа. */
@@ -37486,6 +37506,8 @@ export type GraphQLTypes = {
orderer_signed_at?: GraphQLTypes["DateTime"] | undefined | null,
/** Цена за единицу товара на момент заказа. */
price_per_unit: string,
/** Название товара из предложения — для отображения в карточке заказа. */
product_name?: string | undefined | null,
/** Количество единиц товара в заказе. */
quantity: number,
/** Когда пайщик получил заказ. */
@@ -37500,6 +37522,8 @@ export type GraphQLTypes = {
supplier_account: string,
/** Общая сумма заказа. */
total_cost: string,
/** Единица измерения товара из предложения (шт., кг, л, упак.). */
unit_of_measure?: string | undefined | null,
/** Когда запись о заказе последний раз изменялась. */
updated_at: GraphQLTypes["DateTime"],
/** Срок гарантии в секундах с момента получения. */
@@ -36,8 +36,11 @@ const rawOrderSelector = {
orderer_account: true,
offer_id: true,
offer_hash: true,
product_name: true,
unit_of_measure: true,
supplier_account: true,
delivery_braname: true,
delivery_point_address: true,
quantity: true,
price_per_unit: true,
total_cost: true,
+3
View File
@@ -4192,6 +4192,7 @@ export const ReturnTypes: Record<string,any> = {
cycle_id:"String",
cycle_type:"MarketplaceOrderCycleType",
delivery_braname:"String",
delivery_point_address:"String",
delivery_signer_account:"String",
id:"String",
issuance_fact:"MarketplaceOrderIssuanceFactSnapshot",
@@ -4202,6 +4203,7 @@ export const ReturnTypes: Record<string,any> = {
orderer_account:"String",
orderer_signed_at:"DateTime",
price_per_unit:"String",
product_name:"String",
quantity:"Int",
received_at:"DateTime",
signiss1_tx_hash:"String",
@@ -4209,6 +4211,7 @@ export const ReturnTypes: Record<string,any> = {
status:"MarketplaceOrderStatus",
supplier_account:"String",
total_cost:"String",
unit_of_measure:"String",
updated_at:"DateTime",
warranty_period_secs:"Int",
warranty_until:"DateTime"
+24
View File
@@ -7081,6 +7081,8 @@ export type ValueTypes = {
cycle_type?:boolean | `@${string}`,
/** Имя пункта выдачи (ПВЗ), куда пайщик хочет получить заказ. */
delivery_braname?:boolean | `@${string}`,
/** Адрес пункта выдачи — для отображения вместо служебного идентификатора ПВЗ. */
delivery_point_address?:boolean | `@${string}`,
/** Учётная запись стороны кооператива, поставившей подпись вместе с заказчиком. */
delivery_signer_account?:boolean | `@${string}`,
/** Идентификатор заказа. */
@@ -7101,6 +7103,8 @@ export type ValueTypes = {
orderer_signed_at?:boolean | `@${string}`,
/** Цена за единицу товара на момент заказа. */
price_per_unit?:boolean | `@${string}`,
/** Название товара из предложения — для отображения в карточке заказа. */
product_name?:boolean | `@${string}`,
/** Количество единиц товара в заказе. */
quantity?:boolean | `@${string}`,
/** Когда пайщик получил заказ. */
@@ -7115,6 +7119,8 @@ export type ValueTypes = {
supplier_account?:boolean | `@${string}`,
/** Общая сумма заказа. */
total_cost?:boolean | `@${string}`,
/** Единица измерения товара из предложения (шт., кг, л, упак.). */
unit_of_measure?:boolean | `@${string}`,
/** Когда запись о заказе последний раз изменялась. */
updated_at?:boolean | `@${string}`,
/** Срок гарантии в секундах с момента получения. */
@@ -17111,6 +17117,8 @@ export type ResolverInputTypes = {
cycle_type?:boolean | `@${string}`,
/** Имя пункта выдачи (ПВЗ), куда пайщик хочет получить заказ. */
delivery_braname?:boolean | `@${string}`,
/** Адрес пункта выдачи — для отображения вместо служебного идентификатора ПВЗ. */
delivery_point_address?:boolean | `@${string}`,
/** Учётная запись стороны кооператива, поставившей подпись вместе с заказчиком. */
delivery_signer_account?:boolean | `@${string}`,
/** Идентификатор заказа. */
@@ -17131,6 +17139,8 @@ export type ResolverInputTypes = {
orderer_signed_at?:boolean | `@${string}`,
/** Цена за единицу товара на момент заказа. */
price_per_unit?:boolean | `@${string}`,
/** Название товара из предложения — для отображения в карточке заказа. */
product_name?:boolean | `@${string}`,
/** Количество единиц товара в заказе. */
quantity?:boolean | `@${string}`,
/** Когда пайщик получил заказ. */
@@ -17145,6 +17155,8 @@ export type ResolverInputTypes = {
supplier_account?:boolean | `@${string}`,
/** Общая сумма заказа. */
total_cost?:boolean | `@${string}`,
/** Единица измерения товара из предложения (шт., кг, л, упак.). */
unit_of_measure?:boolean | `@${string}`,
/** Когда запись о заказе последний раз изменялась. */
updated_at?:boolean | `@${string}`,
/** Срок гарантии в секундах с момента получения. */
@@ -26816,6 +26828,8 @@ export type ModelTypes = {
cycle_type: ModelTypes["MarketplaceOrderCycleType"],
/** Имя пункта выдачи (ПВЗ), куда пайщик хочет получить заказ. */
delivery_braname: string,
/** Адрес пункта выдачи — для отображения вместо служебного идентификатора ПВЗ. */
delivery_point_address?: string | undefined | null,
/** Учётная запись стороны кооператива, поставившей подпись вместе с заказчиком. */
delivery_signer_account?: string | undefined | null,
/** Идентификатор заказа. */
@@ -26836,6 +26850,8 @@ export type ModelTypes = {
orderer_signed_at?: ModelTypes["DateTime"] | undefined | null,
/** Цена за единицу товара на момент заказа. */
price_per_unit: string,
/** Название товара из предложения — для отображения в карточке заказа. */
product_name?: string | undefined | null,
/** Количество единиц товара в заказе. */
quantity: number,
/** Когда пайщик получил заказ. */
@@ -26850,6 +26866,8 @@ export type ModelTypes = {
supplier_account: string,
/** Общая сумма заказа. */
total_cost: string,
/** Единица измерения товара из предложения (шт., кг, л, упак.). */
unit_of_measure?: string | undefined | null,
/** Когда запись о заказе последний раз изменялась. */
updated_at: ModelTypes["DateTime"],
/** Срок гарантии в секундах с момента получения. */
@@ -37466,6 +37484,8 @@ export type GraphQLTypes = {
cycle_type: GraphQLTypes["MarketplaceOrderCycleType"],
/** Имя пункта выдачи (ПВЗ), куда пайщик хочет получить заказ. */
delivery_braname: string,
/** Адрес пункта выдачи — для отображения вместо служебного идентификатора ПВЗ. */
delivery_point_address?: string | undefined | null,
/** Учётная запись стороны кооператива, поставившей подпись вместе с заказчиком. */
delivery_signer_account?: string | undefined | null,
/** Идентификатор заказа. */
@@ -37486,6 +37506,8 @@ export type GraphQLTypes = {
orderer_signed_at?: GraphQLTypes["DateTime"] | undefined | null,
/** Цена за единицу товара на момент заказа. */
price_per_unit: string,
/** Название товара из предложения — для отображения в карточке заказа. */
product_name?: string | undefined | null,
/** Количество единиц товара в заказе. */
quantity: number,
/** Когда пайщик получил заказ. */
@@ -37500,6 +37522,8 @@ export type GraphQLTypes = {
supplier_account: string,
/** Общая сумма заказа. */
total_cost: string,
/** Единица измерения товара из предложения (шт., кг, л, упак.). */
unit_of_measure?: string | undefined | null,
/** Когда запись о заказе последний раз изменялась. */
updated_at: GraphQLTypes["DateTime"],
/** Срок гарантии в секундах с момента получения. */