moysklad-ts
Version:
Полностью типизированный, современный и лёгкий клиент МойСклад JSON API
1,435 lines (1,344 loc) • 358 kB
TypeScript
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