UNPKG

moysklad-ts

Version:

Полностью типизированный, современный и лёгкий клиент МойСклад JSON API

1,435 lines (1,344 loc) 358 kB
import { ConditionalKeys } from 'type-fest'; import { EmptyObject } from 'type-fest'; import { HasOptionalKeys } from 'type-fest'; import { IsEmptyObject } from 'type-fest'; import { IsEqual } from 'type-fest'; import { IsNever } from 'type-fest'; import { OptionalKeysOf } from 'type-fest'; import { Primitive } from 'type-fest'; import { ReadonlyKeysOf } from 'type-fest'; import { RequireExactlyOne } from 'type-fest'; import { SetOptional } from 'type-fest'; import { SetRequired } from 'type-fest'; /** Счёт юрлциа / контрагента */ export declare interface Account extends Idable, Meta<Entity.Account> { /** ID учетной записи */ readonly accountId: string; /** Номер счета */ accountNumber: string; /** Адрес банка */ bankLocation?: string; /** Наименование банка */ bankName?: string; /** БИК */ bic?: string; /** Является ли счет основным */ isDefault: boolean; /** Момент последнего обновления */ readonly updated: DateTime; } export declare interface AccountModel extends Model { object: Account; requiredCreateFields: "accountNumber"; } declare type AddAttributesFilters<M extends Model, F> = "attributes" extends keyof M["object"] ? IsNever<F> extends false ? F & { [attributeUrl: string]: Filter; } : { [attributeUrl: string]: Filter; } : F; export declare type AllAssortmentOptions = Omit<ListAssortmentOptions, "pagination">; export declare type AllBonusTransactionsOptions = Omit<ListBonusTransactionsOptions, "pagination">; export declare type AllCounterpartiesOptions = Omit<ListCounterpartiesOptions, "pagination">; export declare type AllCustomerOrdersOptions = Omit<ListCustomerOrdersOptions, "pagination">; export declare type AllDemandsOptions = Omit<ListDemandsOptions, "pagination">; export declare type AllEntersOptions = Omit<ListEntersOptions, "pagination">; export declare type AllInventoryOptions = Omit<ListInventoryOptions, "pagination">; export declare type AllInvoiceOutsOptions = Omit<ListInvoiceOutsOptions, "pagination">; export declare type AllPaymentInsOptions = Omit<ListPaymentInsOptions, "pagination">; export declare type AllPaymentOutsOptions = Omit<ListPaymentOutsOptions, "pagination">; export declare type AllProcessingPlansOptions = Omit<ListProcessingPlansOptions, "pagination">; export declare type AllProductionStageCompletionMaterialOptions = Omit<ListProductionStageCompletionMaterialsOptions, "pagination">; export declare type AllProductionStageCompletionOptions = Omit<ListProductionStageCompletionsOptions, "pagination">; export declare type AllProductionStageCompletionResultOptions = Omit<ListProductionStageCompletionResultsOptions, "pagination">; export declare type AllProductionStagesOptions = Omit<ListProductionStagesOptions, "pagination">; export declare type AllProductionTaskMaterialsOptions = Omit<ListProductionTaskMaterialsOptions, "pagination">; export declare type AllProductionTasksOptions = Omit<ListProductionTasksOptions, "pagination">; export declare type AllProductsOptions = Omit<ListProductsOptions, "pagination">; export declare type AllPurchaseOrdersOptions = Omit<ListPurchaseOrdersOptions, "pagination">; /** * Опции для получения всех Возвратов покупателей */ export declare type AllSalesReturnsOptions = Omit<ListSalesReturnsOptions, "pagination">; export declare type AllSuppliesOptions = Omit<ListSuppliesOptions, "pagination">; export declare type AllVariantsOptions = Omit<ListVariantsOptions, "pagination">; /** API клиент */ declare class ApiClient { private baseUrl; private userAgent; private auth; private batchGetOptions; constructor(options: ApiClientOptions); /** * Сделать запрос к API МойСклад. * * @param endpoint - относительный путь до ресурса * @param options - опции запроса * * @example * ```ts * const response = await apiClient.request("/entity/counterparty", { method: "POST", body: { name: "ООО Ромашка" } }); * ``` */ request(endpoint: string, { searchParameters, ...options }?: RequestOptions): Promise<Response>; /** * Shorthand для GET запроса. * * {@linkcode request} * */ get(url: string, options?: RequestOptionsWithoutMethod): Promise<Response>; /** * Shorthand для POST запроса. * * {@linkcode request} */ post(url: string, options?: RequestOptionsWithoutMethod): Promise<Response>; /** * Shorthand для PUT запроса. * * {@linkcode request} */ put(url: string, options?: RequestOptionsWithoutMethod): Promise<Response>; /** * Shorthand для DELETE запроса. * * {@linkcode request} */ delete(url: string, options?: RequestOptionsWithoutMethod): Promise<Response>; /** * Нормализует URL, удаляя лишние слеши. * * @param url - URL * * @returns Нормализованный URL */ private normalizeUrl; /** * Строит объект типа `URL` из строки. * * @param url - URL * * @returns Объект типа `URL` */ private buildStringUrl; /** * Cтроит объект типа `URL` из массива строк. * * @param url - массив строк URL * * @returns Объект типа `URL` */ private buildArrayUrl; /** * Строит URL из строки или массива строк. * * @param url - строка или массив строк URL * * @returns Объект типа `URL` с нормализованным URL и базовым адресом, указанным в опциях инциализации * * @example С массивом строк * ```ts * buildUrl(["entity", "counterparty", "5427bc76-b95f-11eb-0a80-04bb000cd583"]) * // "https://api.moysklad.ru/api/remap/1.2/entity/counterparty/5427bc76-b95f-11eb-0a80-04bb000cd583" * ``` * * @example Со строкой * ```ts * buildUrl("entity/counterparty/5427bc76-b95f-11eb-0a80-04bb000cd583") * // "https://api.moysklad.ru/api/remap/1.2/entity/counterparty/5427bc76-b95f-11eb-0a80-04bb000cd583" * ``` */ buildUrl(url: string | string[]): URL; /** * Получить все сущности из API. Но лучше используйте метод `.all()` в эндпоинтах (например, `moysklad.counterparty.all()`). * * @param fetcher - функция, которая делает запрос к API и возвращает список сущностей * @param hasExpand - флаг, указывающий на наличие expand в запросе * * @returns Объект с массивом сущностей и контекстом */ batchGet<T, E extends Entity>(fetcher: (limit: number, offset: number) => Promise<ListResponse<T, E>>, hasExpand?: boolean): Promise<BatchGetResult<T, E>>; } /** * Опции для инициализации API клиента * * @see https://github.com/MonsterDeveloper/moysklad-ts?tab=readme-ov-file#%D0%BE%D0%BF%D1%86%D0%B8%D0%B8-%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8 */ export declare type ApiClientOptions = { /** * Базовый URL * * @default https://api.moysklad.ru/api/remap/1.2 */ baseUrl?: string; /** * User-Agent header * * @default `moysklad-ts/${version} (+https://github.com/MonsterDeveloper/moysklad-ts)`, где `{version}` - версия библиотеки */ userAgent?: string; /** * Опции авторизации * * {@linkcode Auth} */ auth: Auth; /** * Опции для получения всех сущностей из API (метод `.all()`). * * Устанавливает ограничения на размер запросов с expand и без него, а также ограничение на количество одновременных запросов. * * @default { limit: 1000, expandLimit: 100, concurrencyLimit: 3 } */ batchGetOptions?: BatchGetOptions; }; /** * Ассортимент * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-assortiment */ export declare interface AssortmentEndpoint { /** * Получить список товаров, комплектов, услуг и модификаций в виде списка. * * @param options - Опции для получения списка {@linkcode ListAssortmentOptions} * @returns Объект с списком * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-assortiment-poluchit-assortiment * * @example * ```ts * const { rows } = await moysklad.assortment.list(); * ``` */ list<T extends ListAssortmentOptions>(options?: Subset<T, ListAssortmentOptions>): Promise<ListResponse<AssortmentModel["object"], Entity.Assortment>>; /** * Получить все товары, комплекты, услуги и модификации. * * @param options - Опции для получения всех позиций {@linkcode AllAssortmentOptions} * @returns Объект с всеми позициями * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-assortiment-poluchit-assortiment * * @example * ```ts * const { rows } = await moysklad.assortment.all(); * ``` */ all<T extends AllAssortmentOptions>(options?: Subset<T, AllAssortmentOptions>): Promise<BatchGetResult<AssortmentModel["object"], Entity.Assortment>>; /** * Получить первую позицию в списке. * * @param options - Опции для получения первой позиции {@linkcode FirstAssortmentOptions} * @returns Объект с первой позицией * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-assortiment-poluchit-assortiment * * @example * ```ts * const { rows } = await moysklad.assortment.first(); * ``` */ first<T extends FirstAssortmentOptions>(options?: Subset<T, FirstAssortmentOptions>): Promise<ListResponse<AssortmentModel["object"], Entity.Assortment>>; /** * Получить общее количество ассортимента. * * @returns Общее количество ассортимента */ size(): Promise<number>; } export declare type AssortmentEntity = Entity.Product | Entity.Service | Entity.Bundle | Entity.Variant | Entity.Consignment; declare type AssortmentFields = { /** Остаток */ readonly stock: number; /** Резерв */ readonly reserve: number; /** Ожидание */ readonly inTransit: number; /** Доступно */ readonly quantity: number; }; /** * Ассортимент * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-assortiment */ export declare type AssortmentModel = ProductAssortmentModel | VariantAssortmentModel | BundleAssortmentModel | ConsignmentAssortmentModel | ServiceAssortmentModel; export declare type Attribute = TimeAttribute | LinkAttribute | StringAttribute | TextAttribute | FileAttribute | BooleanAttribute | DoubleAttribute | LongAttribute | ContractAttribute | CounterpartyAttribute | ProjectAttribute | StoreAttribute | EmployeeAttribute | ProductAttribute | CustomEntityAttribute; export declare enum AttributeType { Time = "time", Link = "link", String = "string", Text = "text", File = "file", Boolean = "boolean", Double = "double", Long = "long", Contract = "contract", Counterparty = "counterparty", Project = "project", Store = "store", Employee = "employee", Product = "product", CustomEntity = "customentity" } /** * Опции для авторизации * * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-autentifikaciq */ export declare type Auth = BasicAuth | TokenAuth; export declare type Barcodes = { ean13?: string; ean8?: string; code128?: string; gtin?: string; }[]; declare interface BaseAttribute extends Idable, Meta<Entity.AttributeMetadata> { name: string; type: AttributeType; value: boolean | string | number | (Meta<Entity> & { name: string; }); } declare interface BaseBonusProgram extends Idable, Meta<Entity.BonusProgram> { readonly accountId: string; active: boolean; agentTags: string[]; allAgents: boolean; allProducts: boolean; earnRateRoublesToPoint?: number; earnWhileRedeeming: boolean; maxPaidRatePercents?: number; name?: string; postponedBonusesDelayDays?: number; spendRatePointsToRouble?: number; welcomeBonusesEnabled: boolean; } declare interface BaseCounterparty extends Idable, Meta<Entity.Counterparty> { readonly accountId: string; accounts: unknown; actualAddress?: string; actualAddressFull?: { addInfo?: string; apartment?: string; city?: string; comment?: string; country?: Meta<never>; house?: string; postalCode?: string; region?: Meta<never>; street?: string; }; archived: boolean; attributes?: Attribute[]; bonusPoints?: number; bonusProgram?: unknown; code?: string; companyType: CounterpartyCompanyType; contactpersons?: unknown; created: DateTime; description?: string; discountCardNumber?: string; discounts?: unknown; email?: string; externalCode: string; fax?: string; files: unknown; group: Meta<Entity.Group>; name: string; notes?: unknown; owner?: Meta<Entity.Employee>; phone?: string; priceType?: unknown; readonly salesAmount: number; shared: boolean; state?: unknown; syncId?: string; tags?: string[]; readonly updated: DateTime; } declare interface BaseOptions<A extends WizardAction> { action: A; /** Ссылка на юрлицо в формате Метаданных. Обязателен со значением `evaluate_vat` параметра `action` */ organization: Meta<Entity.Organization>; /** Ссылка на контрагента в формате Метаданных. Обязателен со значениями `evaluate_price`, `evaluate_discount` параметра `action` */ agent: Meta<Entity.Counterparty>; /** Учитывается ли НДС */ vatEnabled: boolean; /** Включен ли НДС в цену */ vatIncluded?: boolean; /** Валюта. Если не передано, заполняется валютой учета */ rate: { currency: Meta<Entity.Currency>; }; /** Ссылка на склад в формате Метаданных. Обязателен со значением `evaluate_cost` параметра `action` */ store: Meta<Entity.Store>; /** Дата проведения документа. Влияет на расчет себестоимости */ moment: DateTime; /** Позиции документа */ positions: { /** Ссылка на товар/услугу/серию/модификацию/комплект, которую представляет собой позиция, в формате Метаданных */ assortment: Meta<AssortmentEntity>; /** Количество товаров/услуг данного вида в позиции. Если позиция - товар, у которого включен учет по серийным номерам, то значение в этом поле всегда будет равно количеству серийных номеров для данной позиции в документе. */ quantity?: number; }[]; } declare interface BaseOrganization extends Idable, Meta<Entity.Organization> { readonly accountId: string; actualAddress?: string; actualAddressFull?: { addInfo?: string; apartment?: string; city?: string; comment?: string; country?: Meta<never>; house?: string; postalCode?: string; region?: Meta<never>; street?: string; }; archived: boolean; readonly bonusPoints?: number; bonusProgram?: Meta<Entity.BonusProgram>; code?: string; companyType: OrganizationCompanyType; created: DateTime; description?: string; externalCode: string; group: Meta<Entity.Group>; name: string; owner?: Meta<Entity.Employee>; shared: boolean; syncId?: string; trackingContractDate?: DateTime; trackingContractNumber?: string; readonly updated: DateTime; } /** * Опции для Basic авторизации * * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-autentifikaciq */ export declare type BasicAuth = { /** Логин */ login: string; /** Пароль */ password: string; }; export declare interface BatchDeleteResult { info: string; } /** * Опции для получения всех сущностей из API (метод `.all()`). */ export declare interface BatchGetOptions { /** URL параметр `limit` для каждого запроса */ limit?: number; /** URL параметр `limit` для каждого запроса с `expand` */ expandLimit?: number; /** Ограничение количества одновременных запросов */ concurrencyLimit?: number; } export declare type BatchGetResult<T, E extends Entity> = Pick<ListResponse<T, E>, "rows" | "context">; /** * Бонусная программа * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-bonusnaq-programma-bonusnye-programmy */ export declare type BonusProgram = BonusProgramWithoutWelcomeBonuses | BonusProgramWithWelcomeBonuses; /** * Модель бонусной программы * * {@linkcode BonusProgram} */ export declare interface BonusProgramModel extends Model { object: BonusProgram; expandable: EmptyObject; filters: EmptyObject; } declare interface BonusProgramWithoutWelcomeBonuses extends BaseBonusProgram { welcomeBonusesEnabled: false; } declare interface BonusProgramWithWelcomeBonuses extends BaseBonusProgram { welcomeBonusesEnabled: true; welcomeBonusesMode: WelcomeBonusMode; welcomeBonusesValue: number; } /** * Бонусная операция * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-bonusnaq-operaciq-bonusnye-operacii */ export declare interface BonusTransaction extends Idable, Meta<Entity.BonusTransaction> { /** ID учетной записи */ readonly accountId: string; /** Метаданные Контрагента, связанного с бонусной операцией */ agent: Meta<Entity.Counterparty>; /** Отметка о проведении */ applicable: boolean; /** Метаданные бонусной программы */ bonusProgram?: Meta<Entity.BonusProgram>; /** Количество бонусных баллов */ bonusValue?: number; /** * Категория бонусной операции. * * {@linkcode BonusTransactionCategoryType} */ readonly categoryType?: BonusTransactionCategoryType; /** Код Бонусной операции */ code?: string; /** Момент создания Бонусной операции */ created: DateTime; /** * Дата обработки операции. * * При создании или редактировании бонусной операции начисления данный атрибут позволяет указать дату обработки операции. Если атрибут не указан, то операция будет обработана сразу, без задержки. * Для возможности указания даты обработки в будущем должна быть включена тарифная опция "Расширенная бонусная программа". */ executionDate?: DateTime; /** Внешний код Бонусной операции */ externalCode: string; /** Отдел сотрудника */ group: Meta<Entity.Group>; /** Время проведения бонусной операции */ moment?: DateTime; /** Наименование Бонусной операции */ name?: string; /** Метаданные юрлица */ organization?: Meta<Entity.Organization>; /** Владелец (Сотрудник) */ owner?: Meta<Entity.Employee>; /** Метаданные связанного документа бонусной операции */ parentDocument?: Meta<never>; /** Общий доступ */ shared: boolean; /** * Статус бонусной операции * * {@linkcode BonusTransactionStatus} */ readonly transactionStatus?: BonusTransactionStatus; /** * Тип бонусной операции * * {@linkcode BonusTransactionType} */ transactionType: BonusTransactionType; /** Момент последнего обновления Бонусной операции */ updated: DateTime; } /** Категория бонусной операции */ export declare enum BonusTransactionCategoryType { Regular = "REGULAR", Welcome = "WELCOME" } /** * Бонусные операции * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-bonusnaq-operaciq-bonusnye-operacii */ export declare interface BonusTransactionEndpoint { /** * Получить список бонусных операций. * * @param options - Опции для получения списка {@linkcode ListBonusTransactionsOptions} * @returns Объект с списком бонусных операций * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-bonusnaq-operaciq-poluchit-bonusnye-operacii * * @example * ```ts * const { rows } = await moysklad.bonusTransaction.list(); * ``` */ list<T extends ListBonusTransactionsOptions = Record<string, unknown>>(options?: Subset<T, ListBonusTransactionsOptions>): Promise<ListResponse<GetFindResult<BonusTransactionModel, T["expand"]>, Entity.BonusTransaction>>; /** * Получить все бонусные операции * * @param options - Опции для получения списка {@linkcode ListBonusTransactionsOptions} * @returns Массив бонусных операций * * @example * ```ts * const { rows } = await moysklad.bonusTransaction.all(); * ``` */ all<T extends ListBonusTransactionsOptions = Record<string, unknown>>(options?: Subset<T, ListBonusTransactionsOptions>): Promise<BatchGetResult<GetFindResult<BonusTransactionModel, T["expand"]>, Entity.BonusTransaction>>; /** * Получить первую бонусную операцию, соответствующую фильтру * * @param options - Опции для поиска {@linkcode FirstBonusTransactionOptions} * @returns Бонусная операция * * @example * ```ts * const { rows: [transaction] } = await moysklad.bonusTransaction.first({ filter: { bonusValue: 100 } }); * ``` */ first<T extends FirstBonusTransactionOptions = Record<string, unknown>>(options?: Subset<T, FirstBonusTransactionOptions>): Promise<GetFindResult<BonusTransactionModel, T["expand"]>>; /** * Получить бонусную операцию по ID * * @param id - ID бонусной операции * @param options - Опции для получения {@linkcode GetBonusTransactionOptions} * @returns Бонусная операция * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-bonusnaq-operaciq-poluchit-bonusnuu-operaciu * * @example * ```ts * const transaction = await moysklad.bonusTransaction.get("a7404397-83a7-11ed-0a80-0e9700500d7e"); * ``` */ get<T extends GetBonusTransactionOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetBonusTransactionOptions>): Promise<GetFindResult<BonusTransactionModel, T["expand"]>>; /** * Создать новую бонусную операцию * * @param data - Данные для создания бонусной операции * @param options - Опции для создания {@linkcode CreateBonusTransactionOptions} * @returns Созданная бонусная операция * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-bonusnaq-operaciq-sozdat-bonusnuu-operaciu * * @example * ```ts * const transaction = await moysklad.bonusTransaction.create({ * agent: { meta: { href: "..." } }, * bonusValue: 100 * }); * ``` */ create<T extends CreateBonusTransactionOptions = Record<string, unknown>>(data: GetModelCreatableFields<BonusTransactionModel>, options?: Subset<T, CreateBonusTransactionOptions>): Promise<GetFindResult<BonusTransactionModel, T["expand"]>>; /** * Обновить бонусную операцию * * @param id - ID бонусной операции * @param data - Данные для обновления * @param options - Опции для обновления {@linkcode UpdateBonusTransactionOptions} * @returns Обновленная бонусная операция * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-bonusnaq-operaciq-izmenit-bonusnuu-operaciu * * @example * ```ts * const transaction = await moysklad.bonusTransaction.update( * "a7404397-83a7-11ed-0a80-0e9700500d7e", * { bonusValue: 200 } * ); * ``` */ update<T extends UpdateBonusTransactionOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<BonusTransactionModel>, options?: Subset<T, UpdateBonusTransactionOptions>): Promise<GetFindResult<BonusTransactionModel, T["expand"]>>; /** * Создать или обновить бонусную операцию * * @param data - Данные для создания или обновления * @param options - Опции для операции {@linkcode UpsertBonusTransactionOptions} * @returns Созданная или обновленная бонусная операция (или массив операций) * * @example * ```ts * const transaction = await moysklad.bonusTransaction.upsert({ * meta: { * href: "https://api.moysklad.ru/api/remap/1.2/entity/bonustransaction/a7404397-83a7-11ed-0a80-0e9700500d7e", * type: Entity.BonusTransaction, * mediaType: MediaType.Json, * }, * bonusValue: 300 * }); * ``` * * @example * ```ts * const transactions = await moysklad.bonusTransaction.upsert([ * // Создание * { * bonusValue: 100 * }, * // Обновление * { * meta: { * href: "https://api.moysklad.ru/api/remap/1.2/entity/bonustransaction/b8515408-94b8-12fe-1b91-1f8811600e8f", * type: Entity.BonusTransaction, * mediaType: MediaType.Json, * }, * bonusValue: 200 * } * ]); * ``` */ upsert<TData extends ModelCreateOrUpdateData<BonusTransactionModel>, TOptions extends UpsertBonusTransactionOptions = Record<string, unknown>>(data: TData, options?: Subset<TOptions, UpsertBonusTransactionOptions>): Promise<MatchArrayType<TData, GetFindResult<BonusTransactionModel, TOptions["expand"]>>>; /** * Удалить бонусную операцию * * @param id - ID бонусной операции * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-bonusnaq-operaciq-udalit-bonusnuu-operaciu * * @example * ```ts * await moysklad.bonusTransaction.delete("a7404397-83a7-11ed-0a80-0e9700500d7e"); * ``` */ delete(id: string): Promise<void>; /** * Удалить несколько бонусных операций * * @param ids - Массив ID бонусных операций * * @example * ```ts * await moysklad.bonusTransaction.batchDelete([ * "a7404397-83a7-11ed-0a80-0e9700500d7e", * "b8515408-94b8-12fe-1b91-1f8811600e8f" * ]); * ``` */ batchDelete(ids: string[]): Promise<void>; } export declare interface BonusTransactionModel extends Model { /** Основная сущность бонусной операции {@linkcode BonusTransaction} */ object: BonusTransaction; expandable: { agent: CounterpartyModel; owner: EmployeeModel; group: GroupModel; bonusProgram: BonusProgramModel; organization: OrganizationModel; }; orderableFields: "id" | "applicable" | "bonusValue" | "code" | "created" | "executionDate" | "externalCode" | "moment" | "name" | "shared" | "updated"; requiredCreateFields: "agent" | "transactionType"; filters: { accountId: IdFilter; agent: IdFilter; applicable: BooleanFilter; bonusProgram: IdFilter; bonusValue: NumberFilter; code: StringFilter; created: DateTimeFilter; externalCode: StringFilter; group: IdFilter; id: IdFilter; moment: DateTimeFilter; name: StringFilter; organization: IdFilter; owner: IdFilter; shared: BooleanFilter; updated: DateTimeFilter; updatedBy: IdFilter; }; } /** Статус бонусной операции */ export declare enum BonusTransactionStatus { WaitProcessing = "WAIT_PROCESSING", Completed = "COMPLETED", Canceled = "CANCELED" } /** Тип бонусной операции */ export declare enum BonusTransactionType { Earning = "EARNING", Spending = "SPENDING" } export declare interface BooleanAttribute extends BaseAttribute { type: AttributeType.Boolean; value: boolean; } export declare type BooleanFilter = Partial<EqualityFilter<boolean>> | boolean; /** * Комлект * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-komplekt */ export declare interface Bundle extends Idable, Meta<Entity.Bundle> { /** ID учетной записи */ readonly accountId: string; /** Добавлен ли Комплект в архив */ archived: boolean; /** Артикул */ article?: string; /** Коллекция доп. полей */ attributes?: Attribute[]; /** * Штрихкоды Комплекта * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-komplekt-komplekty-komponenty-komplekta-shtrihkody */ barcodes?: Barcodes; /** Код Комплекта */ code?: string; /** Массив компонентов Комплекта */ components: ListMeta<Entity.BundleComponent>; /** Метаданные Страны */ country?: Meta<Entity.Country>; /** Описание Комплекта */ description?: string; /** Признак запрета скидок */ discountProhibited: boolean; /** Реальный НДС % */ readonly effectiveVat?: number; /** * Дополнительный признак для определения разграничения реального НДС. * * - (`effectiveVat` = `0`, `effectiveVatEnabled` = `false`) -> "без НДС" * - (`effectiveVat` = `0`, `effectiveVatEnabled` = `true`) -> `0%` */ readonly effectiveVatEnabled?: boolean; /** Внешний код Комплекта */ externalCode: string; /** Метаданные массива Файлов */ files?: unknown[]; /** Метаданные отдела сотрудника */ group: Meta<Entity.Group>; /** Массив метаданных Изображений */ images?: unknown[]; /** * Минимальная цена * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-komplekt-komplekty-atributy-wlozhennyh-suschnostej-minimal-naq-cena */ minPrice?: { value: number; currency: Meta<Entity.Currency>; }; /** Наименование Комплекта */ name: string; /** * Дополнительные расходы * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-komplekt-komplekty-atributy-wlozhennyh-suschnostej-dopolnitel-nye-rashody */ overhead?: { value: number; currency: Meta<Entity.Currency>; }; /** Метаданные владельца (Сотрудника) */ owner?: Meta<Entity.Employee>; /** Управление состоянием частичного выбытия маркированного товара */ partialDisposal?: boolean; /** Наименование группы, в которую входит Комплект */ readonly pathName?: string; /** * Признак предмета расчета * * {@linkcode BundlePaymentItemType} */ paymentItemType?: BundlePaymentItemType; /** Метаданные группы Комплекта */ productFolder?: Meta<Entity.ProductFolder>; /** Цены продажи */ salePrices?: { value: number; currency: Meta<Entity.Currency>; priceType: Meta<Entity.PriceType>; }[]; /** Общий доступ */ shared: boolean; /** ID синхронизации */ readonly syncId?: string; /** * Код системы налогообложения * * {@linkcode TaxSystem} */ taxSystem?: TaxSystem; /** Код ТН ВЭД */ tnved?: string; /** * Тип маркируемой продукции * * {@linkcode TrackingType} */ trackingType?: TrackingType; /** Единицы измерения */ uom?: Meta<Entity.Uom>; /** Момент последнего обновления сущности */ readonly updated: string; /** Используется ли ставка НДС родительской группы */ useParentVat: boolean; /** НДС % */ vat?: number; /** Включен ли НДС для товара */ vatEnabled?: boolean; /** Объем */ volume?: number; /** Вес */ weight?: number; } export declare type BundleAssortmentModel = BundleModel & { object: AssortmentFields; }; /** * Компонент комплекта * * {@linkcode Bundle} */ export declare interface BundleComponent extends Idable, Meta<Entity.BundleComponent> { /** ID учетной записи */ readonly accountId: string; /** Метаданные товара/услуги/серии, которую представляет собой компонент */ assortment: Meta<AssortmentEntity>; /** Количество товаров/услуг данного вида в компоненте */ readonly quantity: number; } /** * Модель компонента комплекта * * {@linkcode BundleComponent} */ export declare interface BundleComponentModel extends Model { object: BundleComponent; expandable: { assortment: AssortmentModel; }; } /** * Модель комплекта * * {@linkcode Bundle} */ export declare interface BundleModel extends Model { object: Bundle; expandable: { group: GroupModel; owner: EmployeeModel; components: BundleComponentModel; }; filters: { id: IdFilter; accountId: IdFilter; archived: BooleanFilter; article: StringFilter; code: StringFilter; description: StringFilter; externalCode: StringFilter; group: IdFilter; name: StringFilter; owner: IdFilter; pathName: StringFilter; shared: BooleanFilter; syncId: IdFilter; updated: DateTimeFilter; volume: NumberFilter; weight: NumberFilter; }; } /** * Признак предмета расчёта комплекта * * {@linkcode Bundle} */ export declare enum BundlePaymentItemType { /** Товар */ Good = "GOOD", /** Подакцизный товар */ ExcisableGood = "EXCISABLE_GOOD", /** Составной предмет расчета */ CompoundPaymentItem = "COMPOUND_PAYMENT_ITEM", /** Иной предмет расчета */ AnotherPaymentItem = "ANOTHER_PAYMENT_ITEM" } /** * Прибыльность по модификациям * * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-pribyl-nost-poluchit-pribyl-nost-po-modifikaciqm */ export declare interface ByVariantProfitReport { /** Краткое представление Модификации, Услуги или Комплекта в отчете. */ assortment: { /** Метаданные Модификации, Услуги или Комплекта */ meta: Metadata<AssortmentEntity>; /** Наименование сущности */ name: string; /** Код сущности */ code: string; /** Артикул Модификации или Комплекта */ article?: string; /** Изображение Модификации */ image?: unknown; /** Единица измерения */ uom: { meta: Metadata<Entity.Uom>; name: string; }; }; /** Рентабельность */ margin: number; /** Прибыль */ profit: number; /** Себестоимость возвратов в копейках */ returnCost: number; /** Сумма себестоимостей возвратов в копейках */ returnCostSum: number; /** Цена возвратов */ returnPrice: number; /** Возвращенное количество */ returnQuantity: number; /** Сумма возвратов */ returnSum: number; /** Себестоимость в копейках */ sellCost: number; /** Сумма себестоимостей продаж в копейках */ sellCostSum: number; /** Цена продаж (средняя) */ sellPrice: number; /** Проданное количество */ sellQuantity: number; /** Сумма продаж */ sellSum: number; } export declare interface ByVariantProfitReportListOptions { pagination?: PaginationOptions; filter?: FilterOptions<ByVariantProfitReportModel>; /** * При отсутствии параметров `momentFrom` и `momentTo` отображаются отчеты за последний месяц. * * При отсутствии параметра `momentFrom` и указании параметра `momentTo` отображаются отчеты с начала текущего года по `momentTo`. * * При отсутствии параметра `momentTo` и указании параметра `momentFrom` отображаются отчеты с `momentFrom` по текущий день. */ momentFrom?: DateTime; /** * При отсутствии параметров `momentFrom` и `momentTo` отображаются отчеты за последний месяц. * * При отсутствии параметра `momentFrom` и указании параметра `momentTo` отображаются отчеты с начала текущего года по `momentTo`. * * При отсутствии параметра `momentTo` и указании параметра `momentFrom` отображаются отчеты с `momentFrom` по текущий день. */ momentTo?: DateTime; } export declare interface ByVariantProfitReportModel extends Model { object: ByVariantProfitReport; filters: { /** ссылка на товар, услугу, комплект, модификацию или серию, по которой нужно произвести фильтрацию. Можно передать несколько значений. Одновременная фильтрация по `product` и `productFolder` не поддерживается. */ product: IdFilter; /** параметр для фильтрации по нескольким группам товаров. Значение параметра - ссылка на группу товаров, которая должна быть включена в выборку или исключена из нее. Можно передать несколько значений. Одновременная фильтрация по `product` и `productFolder` не поддерживается. */ productFolder: IdFilter; /** параметр учета вложенных подгрупп. Работает только при наличии фильтра по `productFolder`. По умолчанию `true`, выводятся товары из дочерних подгрупп фильтруемой группы / групп товаров. При передаче `false` выводятся только товары из фильтруемой группы / групп, без учета подгрупп. */ withSubFolders: BooleanFilter; /** строка с названием группы контрагентов, по которой нужно произвести фильтрацию. */ agentTag: EqualityFilter<string>; /** ссылка на контрагента, по которому нужно произвести фильтрацию. */ counterparty: IdFilter; /** ссылка на юрлицо, по которому нужно произвести фильтрацию. */ organization: IdFilter; /** ссылка на склад, по которому нужно произвести фильтрацию. */ store: IdFilter; /** ссылка на проект, по которому нужно произвести фильтрацию. */ project: IdFilter; /** ссылка на точку продаж, по которой нужно произвести фильтрацию. */ retailStore: IdFilter; /** параметр для фильтрации по поставщику. Значение параметра - ссылка на контрагента или организацию. В выборку будут включены товары с указанным поставщиком. */ supplier: IdFilter; /** ссылка на канал продаж, по которому нужно провести фильтрацию. Допустимо повторное использование фильтра, когда требуется фильтрация по нескольким каналам продаж. */ salesChannel: IdFilter; }; } /** * Composes a datetime string in the format "YYYY-MM-DD HH:mm:ss.SSS". * @param date - The date or milliseconds (`Date.getTime()`) to compose the string from. * @param shouldIncludeMs - Whether to include milliseconds in the string. * @returns The composed datetime string. */ export declare function composeDateTime(date: Date | number, shouldIncludeMs?: boolean): DateTime; /** * Серия * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-seriq */ export declare interface Consignment extends Idable, Meta<Entity.Consignment> { /** ID учетной записи */ readonly accountId: string; /** Доп. поля */ attributes?: Attribute[]; /** Ассортимент */ assortment: Meta<AssortmentEntity>; /** Штрихкоды */ barcodes?: Barcodes; /** Код */ code?: string; /** Описание */ description?: string; /** Внешний код серии */ externalCode?: string; image?: Meta<Entity.Image>; /** Метка Серии */ label: string; /** * Наименование Серии. * * "Собирается" и отображается как "Наименование товара / Метка Серии" */ readonly name: string; /** Момент последнего изменения */ readonly updated: DateTime; } export declare type ConsignmentAssortmentModel = ConsignmentModel & { object: AssortmentFields; }; /** * Модель Серии * * {@linkcode Consignment} */ export declare interface ConsignmentModel extends Model { object: Consignment; expandable: { assortment: AssortmentModel; }; requiredFields: "label" | "assortment"; filters: { id: IdFilter; accountId: IdFilter; barcodes: StringFilter; code: StringFilter; description: StringFilter; externalCode: StringFilter; name: StringFilter; updated: DateTimeFilter; }; } export declare interface Context { employee: Meta<Entity.Employee>; } export declare interface ContractAttribute extends BaseAttribute { type: AttributeType.Contract; value: Meta<Entity.Contract> & { name: string; }; } /** * Counterparty / Контрагент * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-kontragent-kontragenty */ export declare type Counterparty = LegalCounterparty | EntrepreneurCounterparty | IndividualCounterparty; export declare interface CounterpartyAttribute extends BaseAttribute { type: AttributeType.Counterparty; value: Meta<Entity.Counterparty> & { name: string; }; } export declare enum CounterpartyCompanyType { Legal = "legal", Entrepreneur = "entrepreneur", Individual = "individual" } /** * Контрагенты * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-kontragent */ export declare interface CounterpartyEndpoint { /** * Получить список контрагентов. * * @param options - Опции для получения списка {@linkcode ListCounterpartiesOptions} * @returns Объект с списком контрагентов * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-kontragent-poluchit-kontragentow * * @example * ```ts * const { rows } = await moysklad.counterparty.list(); * ``` */ list<T extends ListCounterpartiesOptions = Record<string, unknown>>(options?: Subset<T, ListCounterpartiesOptions>): Promise<ListResponse<GetFindResult<CounterpartyModel, T["expand"]>, Entity.Counterparty>>; /** * Получить все контрагенты. * * @param options - Опции для получения всех контрагентов {@linkcode AllCounterpartiesOptions} * @returns Объект с массивом контрагентов * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-kontragent-poluchit-kontragentow * * @example * ```ts * const { rows } = await moysklad.counterparty.all(); * ``` */ all<T extends AllCounterpartiesOptions = Record<string, unknown>>(options?: Subset<T, AllCounterpartiesOptions>): Promise<BatchGetResult<GetFindResult<CounterpartyModel, T["expand"]>, Entity.Counterparty>>; /** * Получить контрагента по id. * * @param id - id контрагента * @param options - Опции для получения контрагента {@linkcode GetCounterpartyOptions} * @returns Объект с контрагентом {@linkcode CounterpartyModel} * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-kontragent-poluchit-kontragenta * * @example * ```ts * const counterparty = await moysklad.counterparty.get("5427bc76-b95f-11eb-0a80-04bb000cd583"); * ``` */ get<T extends GetCounterpartyOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetCounterpartyOptions>): Promise<GetFindResult<CounterpartyModel, T["expand"]>>; /** * Изменить контрагента. * * @param id - id контрагента * @param data - данные для изменения контрагента * @param options - Опции для изменения контрагента {@linkcode UpdateCounterpartyOptions} * @returns Объект с обновленным контрагентом {@linkcode CounterpartyModel} * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-kontragent-izmenit-kontragenta * * @example * ```ts * await moysklad.counterparty.update("5427bc76-b95f-11eb-0a80-04bb000cd583", { * name: "ООО Ромашка", * }); * ``` */ update<T extends UpdateCounterpartyOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<CounterpartyModel>, options?: Subset<T, UpdateCounterpartyOptions>): Promise<GetFindResult<CounterpartyModel, T["expand"]>>; /** * Получить первого контрагента из списка. * * @param options - Опции для получения первого контрагента {@linkcode FirstCounterpartyOptions} * @returns Объект с первым контрагентом * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-kontragent-poluchit-kontragentow * * @example * ```ts * const { rows } = await moysklad.counterparty.first(); * const firstCounterparty = rows[0]; * ``` */ first<T extends FirstCounterpartyOptions = Record<string, unknown>>(options?: Subset<T, FirstCounterpartyOptions>): Promise<ListResponse<GetFindResult<CounterpartyModel, T["expand"]>, Entity.Counterparty>>; /** * Получить количество контрагентов. * * @returns Количество контрагентов * * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-kontragent-poluchit-kontragentow * * @example * ```ts * const count = await moysklad.counterparty.size(); * ``` */ size(): Promise<number>; /** * Создать или обновить контрагента. * * @param data - Данные для создания или обновления контрагента * @param options - Опции для создания или обновления контрагента {@linkcode UpsertCounterpartyOptions} * @returns Созданный или обновленный контрагент (или массив контрагентов) * * @example * ```ts * const counterparty = await moysklad.counterparty.upsert({ * id: "5427bc76-b95f-11eb-0a80-04bb000cd583", * name: "ООО Ромашка", * }); * ``` */ upsert<TData extends ModelCreateOrUpdateData<CounterpartyModel>, TOptions extends UpsertCounterpartyOptions = Record<string, unknown>>(data: TData, options?: Subset<TOptions, UpsertCounterpartyOptions>): Promise<MatchArrayType<TData, GetFindResult<CounterpartyModel, TOptions["expand"]>>>; } export declare interface CounterpartyModel extends Model { object: Counterparty; expandable: { owner: EmployeeModel; group: GroupModel; }; filters: { accountId: IdFilter; actualAddress: StringFilter; archived: BooleanFilter; code: StringFilter; companyType: EnumFilter<CounterpartyCompanyType>; created: DateTimeFilter; description: StringFilter; discountCardNumber: StringFilter; email: StringFilter; externalCode: StringFilter; fax: StringFilter; group: IdFilter; id: IdFilter; name: StringFilter; owner: IdFilter; priceType: IdFilter; shared: BooleanFilter; syncId: IdFilter; tags: StringFilter; updated: DateTimeFilter; }; orderableFields: "id" | "version" | "updated" | "updatedBy" | "name" | "description" | "code" | "externalCode" | "archived" | "created" | "phone" | "email" | "fax"; } export declare interface CreateBonusTransactionOptions { /** * Замена ссылок объектами с помощью expand * * @example * ```ts * const { rows } = await moysklad.bonusTransaction.create({...}, { * expand: { * owner: { * group: true * }, * organization: true, * } * }); * ``` * * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-zamena-ssylok-ob-ektami-s-pomosch-u-expand */ expand?: ExpandOptions<BonusTransactionModel>; } export declare interface CreateCustomerOrderOptions { expand?: ExpandOptions<CustomerOrderModel>; } export declare interface CreateEnterOptions { expand?: ExpandOptions<EnterModel>; } export declare interface CreateInventoryOptions { expand?: ExpandOptions<InventoryModel>; } export declare interface CreateInvoiceOutOptions { expand?: ExpandOptions<InvoiceOutModel>; } export declare const createMoysklad: (options: ApiClientOptions) => Moysklad; export declare interface CreatePaymentInOptions { expand?: ExpandOptions<PaymentInModel>; } export declare interface CreatePaymentOutOptions { expand?: ExpandOptions<PaymentOutModel>; } export declare interface CreateProductionStageCompletionMaterialOptions { expand?: ExpandOptions<ProductionStageCompletionMaterialModel>; } export declare interface CreateProductionStageCompletionOptions { expand?: ExpandOptions<ProductionStageCompletionModel>; } export declare interface CreateProductionTaskMaterialOptions { expand?: ExpandOptions<ProductionTaskMaterialModel>; } export declare interface CreateProductionTaskOptions { /** * Замена ссылок объектами с помощью expand * * @example * ```ts * const { rows } = await moysklad.productionTask.create({...}, { * expand: { * owner: { * group: true * }, * organization: true, * } * }); * ``` * * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-zamena-ssylok-ob-ektami-s-pomosch-u-expand */ expand?: ExpandOptions<ProductionTaskModel>; } export declare interface CreatePurchaseOrderOptions { expand?: ExpandOptions<PurchaseOrderModel>; } export declare interface CreateVariantOptions { expand?: ExpandOptions<VariantModel>; } export declare interface CustomEntity extends Idable, Meta<Entity.CustomEntity> { readonly accountId: string; readonly u