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 updated: DateTime;
    name: string;
    externalCode: string;
    owner?: Meta<Entity.Employee>;
    shared: boolean;
    group: Meta<Entity.Group>;
}

export declare interface CustomEntityAttribute extends BaseAttribute {
    description?: string;
    type: AttributeType.CustomEntity;
    customEntityMeta: Metadata<Entity.CustomEntityMetadata>;
    value: Meta<Entity.CustomEntityMetadata> & {
        name: string;
    };
}

/**
 * Пользовательские справочники
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-pol-zowatel-skij-sprawochnik
 */
export declare interface CustomEntityEndpoint {
    /**
     * Получить пользовательский справочник по id.
     *
     * @param id - id пользовательского справочника
     * @returns Объект с пользовательским справочником
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-pol-zowatel-skij-sprawochnik-poluchit-sprawochnik
     */
    get(id: string): Promise<ListResponse<GetFindResult<CustomEntityModel, false>, Entity.CustomEntity>>;
}

export declare interface CustomEntityModel extends Model {
    object: CustomEntity;
}

export declare interface CustomerOrder extends Idable, Meta<Entity.CustomerOrder> {
    readonly accountId: string;
    agent: Meta<Entity.Counterparty>;
    agentAccount?: Meta<Entity.Account>;
    applicable: boolean;
    attributes?: Attribute[];
    code?: string;
    contract?: Meta<Entity.Contract>;
    readonly created: DateTime;
    readonly deleted?: DateTime;
    deliveryPlannedMoment?: DateTime;
    description?: string;
    externalCode: string;
    files: unknown[];
    group: Meta<Entity.Group>;
    readonly invoicedSum: number;
    moment: DateTime;
    name: string;
    organization: Meta<Entity.Organization>;
    organizationAccount?: Meta<Entity.Account>;
    owner?: Meta<Entity.Employee>;
    readonly payedSum: number;
    positions: ListMeta<Entity.CustomerOrderPosition>;
    readonly printed: boolean;
    project?: Meta<Entity.Project>;
    readonly published: boolean;
    rate: DocumentRate;
    readonly reservedSum: number;
    salesChannel?: Meta<Entity.SalesChannel>;
    shared: boolean;
    shipmentAddress?: string;
    shipmentAddressFull?: {
        addInfo?: string;
        apartment?: string;
        city?: string;
        comment?: string;
        country?: Meta<Entity.Country>;
        house?: string;
        postalCode?: string;
        region?: Meta<Entity.Region>;
        street?: string;
    };
    readonly shippedSum: number;
    state?: Meta<Entity.State>;
    store?: Meta<Entity.Store>;
    readonly sum: number;
    syncId?: string;
    taxSystem?: TaxSystem;
    readonly updated: DateTime;
    vatEnabled: boolean;
    vatIncluded: boolean;
    readonly vatSum: number;
    purchaseOrders?: unknown;
    demands?: Meta<Entity.Demand>[];
    payments?: unknown;
    invoicesOut?: unknown;
    moves?: unknown;
    prepayments?: unknown;
}

/**
 * Заказы покупателей
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq
 */
export declare interface CustomerOrderEndpoint {
    /**
     * Получить массив заказов покупателей.
     *
     * @param options - Опции для получения заказов покупателей {@linkcode ListCustomerOrdersOptions}
     * @returns Объект с массивом заказов покупателей
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-poluchit-spisok-zakazow-pokupatelej
     *
     * @example Без опций (по умолчанию первые 1000 сущностей)
     * ```ts
     * const { rows } = await moysklad.customerOrder.list();
     * ```
     *
     * @example С expand
     * ```ts
     * const { rows } = await moysklad.customerOrder.list({
     *  expand: ["agent", "organization"],
     * });
     * ```
     *
     * @example С фильтрами, сортировкой и пагинацией
     * ```ts
     * moysklad.customerOrder.list({
     *   filter: {
     *     accountId: "123",
     *   },
     *   order: { field: "moment", direction: "desc" },
     *   pagination: {
     *     limit: 5,
     *     offset: 100,
     *   },
     * });
     * ```
     */
    list<T extends ListCustomerOrdersOptions = Record<string, unknown>>(options?: Subset<T, ListCustomerOrdersOptions>): Promise<ListResponse<GetFindResult<CustomerOrderModel, T["expand"]>, Entity.CustomerOrder>>;
    /**
     * Получить все заказы покупателей.
     *
     * @param options - Опции для получения всех заказов покупателей {@linkcode AllCustomerOrdersOptions}
     * @returns Объект с массивом заказов покупателей
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-poluchit-spisok-zakazow-pokupatelej
     *
     * @example С expand
     * ```ts
     * const { rows } = await moysklad.customerOrder.all({ expand: ["agent", "organization"] });
     * ```
     */
    all<T extends AllCustomerOrdersOptions = Record<string, unknown>>(options?: Subset<T, AllCustomerOrdersOptions>): Promise<BatchGetResult<GetFindResult<CustomerOrderModel, T["expand"]>, Entity.BonusTransaction>>;
    /**
     * Получить первый заказ покупателя.
     *
     * @param options - Опции для получения первого заказа покупателя {@linkcode FirstCustomerOrderOptions}
     * @returns Объект с первым заказом покупателя
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-poluchit-spisok-zakazow-pokupatelej
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.customerOrder.first({
     *  expand: ["agent", "organization"],
     *  search: "123"
     * });
     * ```
     */
    first<T extends FirstCustomerOrderOptions = Record<string, unknown>>(options?: Subset<T, FirstCustomerOrderOptions>): Promise<ListResponse<GetFindResult<CustomerOrderModel, T["expand"]>, Entity.CustomerOrder>>;
    /**
     * Получить заказ покупателя по id.
     *
     * @param id - id заказа покупателя
     * @param options - Опции для получения заказа покупателя {@linkcode GetCustomerOrderOptions}
     * @returns Объект с заказом покупателя {@linkcode CustomerOrderModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-poluchit-zakaz-pokupatelq
     *
     * @example
     * ```ts
     * const order = await moysklad.customerOrder.get("5427bc76-b95f-11eb-0a80-04bb000cd583");
     * ```
     */
    get<T extends GetCustomerOrderOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetCustomerOrderOptions>): Promise<GetFindResult<CustomerOrderModel, T["expand"]>>;
    /**
     * Получить общее количество заказов покупателей.
     *
     * @returns Общее количество заказов покупателей
     */
    size(): Promise<number>;
    /**
     * Удалить заказ покупателя по id.
     * @param id - id заказа покупателя
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-udalit-zakaz-pokupatelq
     */
    delete(id: string): Promise<void>;
    /**
     * Изменить заказ покупателя.
     *
     * @param id - id заказа покупателя
     * @param data - данные для изменения заказа покупателя
     * @param options - Опции для изменения заказа покупателя {@linkcode UpdateCustomerOrderOptions}
     * @returns Объект с обновленным заказом покупателя {@linkcode CustomerOrderModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-izmenit-zakaz-pokupatelq
     *
     * @example
     * ```ts
     * await moysklad.customerOrder.update("5427bc76-b95f-11eb-0a80-04bb000cd583", {
     *   name: "new name"
     * });
     * ```
     */
    update<T extends UpdateCustomerOrderOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<CustomerOrderModel>, options?: Subset<T, UpdateCustomerOrderOptions>): Promise<GetFindResult<CustomerOrderModel, T["expand"]>>;
    /**
     * Создать заказ покупателя.
     *
     * @param data - данные для создания заказа покупателя
     * @param options - Опции для создания заказа покупателя {@linkcode CreateCustomerOrderOptions}
     * @returns Объект с созданным заказом покупателя {@linkcode CustomerOrderModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-sozdat-zakaz-pokupatelq
     *
     * @example
     * ```ts
     * await moysklad.customerOrder.create({
     *   organization: {
     *     meta: {
     *       href: moysklad.client.buildUrl(["entity", "organization", "5427bc76-b95f-11eb-0a80-04bb000cd583"]),
     *       mediaType: MediaType.Json,
     *       type: Entity.Organization
     *     }
     *   },
     *   agent: {
     *     meta: {
     *       href: moysklad.client.buildUrl(["entity", "counterparty", "5427bc76-b95f-11eb-0a80-04bb000cd583"]),
     *       mediaType: MediaType.Json,
     *       type: Entity.Counterparty
     *     }
     *   }
     * });
     * ```
     */
    create<T extends CreateCustomerOrderOptions = Record<string, unknown>>(data: GetModelCreatableFields<CustomerOrderModel>, options?: Subset<T, CreateCustomerOrderOptions>): Promise<GetFindResult<CustomerOrderModel, T["expand"]>>;
    /**
     * Массово удалить заказы покупателей.
     *
     * @param ids - массив id заказов покупателей
     * @returns Массив с результатами удаления заказов покупателей
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-massowoe-udalenie-zakazow-pokupatelej
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
    /**
     * Переместить заказ покупателя в корзину.
     *
     * @param id - id заказа покупателя
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-peremestit-zakaz-pokupatelq-w-korzinu
     */
    trash(id: string): Promise<void>;
    /**
     * Массово создать и обновить заказы покупателей
     *
     * @param data - массив из объектов для создания и обновления заказов покупателей
     * @param options - Опции для создания и обновления заказов покупателей {@linkcode CreateCustomerOrderOptions}
     * @returns Массив с созданными и обновленными заказами покупателей {@linkcode CustomerOrderModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-massowoe-sozdanie-i-obnowlenie-zakazow-pokupatelej
     *
     * @example
     * ```ts
     * await moysklad.customerOrder.upsert([
     *   // создать заказ покупателя
     *   {
     *     agent: {
     *       meta: {
     *         type: Entity.Counterparty,
     *         href: moysklad.client
     *           .buildUrl([
     *             "entity",
     *             Entity.Counterparty,
     *             "b0e1f1d1-0b1d-11ec-80e9-0b5808000a0e",
     *           ])
     *           .toString(),
     *         mediaType: MediaType.Json,
     *       },
     *     },
     *     organization: {
     *       meta: {
     *         type: Entity.Organization,
     *         href: moysklad.client
     *           .buildUrl([
     *             "entity",
     *             Entity.Organization,
     *             "b0e1f1d1-0b1d-11ec-80e9-0b5808000a0e",
     *           ])
     *           .toString(),
     *         mediaType: MediaType.Json,
     *       },
     *     },
     *   },
     *   // обновить существующий заказ покупателя
     *   {
     *     meta: {
     *       type: Entity.CustomerOrder,
     *       href: moysklad.client
     *         .buildUrl([
     *           "entity",
     *           Entity.CustomerOrder,
     *           "b0e1f1d1-0b1d-11ec-80e9-0b5808000a0e",
     *         ])
     *         .toString(),
     *       mediaType: MediaType.Json,
     *     },
     *     description: "Новое описание",
     *   },
     * ]);
     * ```
     */
    upsert<T extends CreateCustomerOrderOptions = Record<string, unknown>>(data: (GetModelCreatableFields<CustomerOrderModel> | (GetModelUpdatableFields<CustomerOrderModel> & UpdateMeta<Entity.CustomerOrder>))[], options?: Subset<T, CreateCustomerOrderOptions>): Promise<GetFindResult<CustomerOrderModel, T["expand"]>[]>;
}

export declare interface CustomerOrderModel extends Model {
    object: CustomerOrder;
    expandable: {
        agent: CounterpartyModel;
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        demands: DemandModel;
        organizationAccount: AccountModel;
        agentAccount: AccountModel;
        positions: CustomerOrderPositionModel;
    };
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        agent: IdFilter;
        applicable: BooleanFilter;
        code: StringFilter;
        contract: IdFilter;
        deleted: DateTimeFilter;
        deliveryPlannedMoment: DateTimeFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        moment: DateTimeFilter;
        name: StringFilter;
        organization: IdFilter;
        owner: IdFilter;
        printed: BooleanFilter;
        project: IdFilter;
        published: BooleanFilter;
        salesChannel: IdFilter;
        shared: BooleanFilter;
        shipmentAddress: StringFilter;
        state: IdFilter;
        store: IdFilter;
        sum: NumberFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
        isDeleted: BooleanFilter;
    };
    orderableFields: "id" | "syncId" | "updated" | "updatedBy" | "name" | "description" | "externalCode" | "moment" | "applicable" | "sum" | "created" | "deliveryPlannedMoment";
    requiredCreateFields: "agent" | "organization";
}

/**
 * Позиция заказа покупателя.
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-zakazy-pokupatelej
 */
export declare interface CustomerOrderPosition extends Idable, Meta<Entity.CustomerOrderPosition> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные товара/услуги/серии/модификации/комплекта, которую представляет собой позиция */
    assortment: Meta<AssortmentEntity>;
    /** Процент скидки или наценки. Наценка указывается отрицательным числом, т.е. -10 создаст наценку в 10% */
    discount?: number;
    /**
     * Упаковка Товара.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-towary-atributy-wlozhennyh-suschnostej-upakowki-towara
     */
    pack?: unknown;
    /** Цена товара/услуги в копейках */
    price: number;
    /**
     * Количество товаров/услуг данного вида в позиции.
     *
     * Если позиция - товар, у которого включен учет по серийным номерам, то значение в этом поле всегда будет равно количеству серийных номеров для данной позиции в документе. */
    quantity: number;
    /** Резерв данной позиции */
    reserve?: number;
    /** Доставлено */
    readonly shipped: number;
    /** Код системы налогообложения */
    taxSystem?: TaxSystem;
    /** НДС, которым облагается текущая позиция */
    vat: number;
    /** Включен ли НДС для позиции. С помощью этого флага для позиции можно выставлять НДС = 0 или НДС = "без НДС". (`vat` = `0`, `vatEnabled` = `false`) -> `vat` = "без НДС", (`vat` = `0`, `vatEnabled` = `true`) -> `vat` = 0%. */
    vatEnabled: boolean;
}

/**
 * Модель позиции заказа покупателя
 *
 * {@linkcode CustomerOrderPosition}
 * */
export declare interface CustomerOrderPositionModel extends Model {
    object: CustomerOrderPosition;
    expandable: {
        assortment: AssortmentModel;
    };
}

export declare type DateTime = string;

export declare type DateTimeFilter = Partial<EqualityFilter<DateTime> & GreaterThanFilter<DateTime> & GreaterOrEqualsFilter<DateTime> & LessThanFilter<DateTime> & LessOrEqualsFilter<DateTime>> | DateTime | DateTime[];

export declare interface Demand extends Idable, Meta<Entity.Demand> {
    readonly accountId: string;
    agent: Meta<Entity.Counterparty>;
    agentAccount?: Meta<Entity.Account>;
    applicable: boolean;
    attributes: unknown;
    code?: string;
    contract?: Meta<Entity.Contract>;
    readonly created: DateTime;
    readonly deleted?: DateTime;
    description?: string;
    externalCode: string;
    files: unknown[];
    group: Meta<Entity.Group>;
    moment: DateTime;
    name: string;
    organization: Meta<Entity.Organization>;
    organizationAccount?: Meta<Entity.Account>;
    overhead?: DemandOverhead;
    owner: Meta<Entity.Employee>;
    readonly payedSum: number;
    positions: ListMeta<Entity.DemandPosition>;
    readonly printed: boolean;
    project?: Meta<Entity.Project>;
    readonly published: boolean;
    rate: DocumentRate;
    salesChannel?: Meta<Entity.SalesChannel>;
    shared: boolean;
    shipmentAddress?: string;
    shipmentAddressFull?: {
        addInfo?: string;
        apartment?: string;
        city?: string;
        comment?: string;
        country?: Meta<Entity.Country>;
        house?: string;
        postalCode?: string;
        region?: Meta<Entity.Region>;
        street?: string;
    };
    state?: Meta<Entity.State>;
    store: Meta<Entity.Store>;
    readonly sum: number;
    syncId?: string;
    readonly updated: DateTime;
    vatEnabled: boolean;
    vatIncluded?: boolean;
    vatSum?: number;
    customerOrder?: Meta<Entity.CustomerOrder>;
    factureOut?: Meta<Entity.FactureOut>;
    returns?: unknown[];
    payments?: Meta<Entity.PaymentIn | Entity.PaymentOut>[];
    invoicesOut?: Meta<Entity.InvoiceOut>[];
    cargoName?: string;
    carrier?: Meta<Entity.Counterparty> | Meta<Entity.Organization>;
    consignee?: Meta<Entity.Counterparty> | Meta<Entity.Organization>;
    goodPackQuantity?: number;
    shippingInstructions?: string;
    stateContractId?: string;
    transportFacility?: string;
    transportFacilityNumber?: string;
}

/**
 * Отгрузки
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-otgruzka
 */
export declare interface DemandEndpoint {
    /**
     * Получить список отгрузок.
     *
     * @param options - Опции для получения списка
     * @returns Объект с списком отгрузок
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-otgruzka-poluchit-otgruzki
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.demand.list();
     * ```
     */
    list<T extends ListDemandsOptions = Record<string, unknown>>(options?: Subset<T, ListDemandsOptions>): Promise<ListResponse<GetFindResult<DemandModel, T["expand"], T["fields"]>, Entity.Demand>>;
    /**
     * Получить все отгрузки с учетом пагинации.
     *
     * @param options - Опции для получения списка
     * @returns Массив отгрузок
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-otgruzka-poluchit-otgruzki
     *
     * @example
     * ```ts
     * const demands = await moysklad.demand.all();
     * ```
     */
    all<T extends AllDemandsOptions = Record<string, unknown>>(options?: Subset<T, AllDemandsOptions>): Promise<BatchGetResult<GetFindResult<DemandModel, T["expand"], T["fields"]>, Entity.Demand>>;
    /**
     * Получить отгрузку по ID.
     *
     * @param id - ID отгрузки
     * @param options - Опции для получения отгрузки
     * @returns Отгрузка
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-otgruzka-poluchit-otgruzku
     *
     * @example
     * ```ts
     * const demand = await moysklad.demand.get("a7404318-550f-11e8-56c0-000800000006");
     * ```
     */
    get<T extends GetDemandOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetDemandOptions>): Promise<GetFindResult<DemandModel, T["expand"], T["fields"]>>;
    /**
     * Получить первую отгрузку из списка.
     *
     * @param options - Опции для получения списка
     * @returns Объект с списком отгрузок (с одним элементом)
     *
     * @example
     * ```ts
     * const { rows: [demand] } = await moysklad.demand.first();
     * ```
     */
    first<T extends FirstDemandOptions = Record<string, unknown>>(options?: Subset<T, FirstDemandOptions>): Promise<ListResponse<GetFindResult<DemandModel, T["expand"], T["fields"]>, Entity.Demand>>;
    /**
     * Получить количество отгрузок.
     *
     * @returns Количество отгрузок
     *
     * @example
     * ```ts
     * const count = await moysklad.demand.size();
     * ```
     */
    size(): Promise<number>;
    /**
     * Удалить отгрузку.
     *
     * @param id - ID отгрузки
     * @returns Promise, который разрешается, когда отгрузка удалена
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-otgruzka-udalit-otgruzku
     *
     * @example
     * ```ts
     * await moysklad.demand.delete("a7404318-550f-11e8-56c0-000800000006");
     * ```
     */
    delete(id: string): Promise<void>;
    /**
     * Удалить несколько отгрузок.
     *
     * @param ids - Массив ID отгрузок
     * @returns Результат удаления
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-otgruzka-massowoe-udalenie-otgruzok
     *
     * @example
     * ```ts
     * await moysklad.demand.batchDelete(["a7404318-550f-11e8-56c0-000800000006", "a7404318-550f-11e8-56c0-000800000007"]);
     * ```
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
    /**
     * Переместить отгрузку в корзину.
     *
     * @param id - ID отгрузки
     * @returns Promise, который разрешается, когда отгрузка перемещена в корзину
     *
     * @example
     * ```ts
     * await moysklad.demand.trash("a7404318-550f-11e8-56c0-000800000006");
     * ```
     */
    trash(id: string): Promise<void>;
    /**
     * Создать или обновить отгрузку.
     *
     * @param data - Данные для создания или обновления отгрузки
     * @param options - Опции для создания или обновления отгрузки
     * @returns Созданная или обновленная отгрузка
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-otgruzka-sozdat-otgruzku
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-otgruzka-izmenit-otgruzku
     *
     * @example
     * ```ts
     * const demand = await moysklad.demand.upsert({
     *   organization: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/organization/a7404318-550f-11e8-56c0-000800000001", type: "organization", mediaType: "application/json" } },
     *   agent: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/counterparty/a7404318-550f-11e8-56c0-000800000002", type: "counterparty", mediaType: "application/json" } },
     *   store: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/store/a7404318-550f-11e8-56c0-000800000003", type: "store", mediaType: "application/json" } },
     * });
     * ```
     */
    upsert<TData extends ModelCreateOrUpdateData<DemandModel>, TOptions extends UpsertDemandsOptions = Record<string, unknown>>(data: TData, options?: Subset<TOptions, UpsertDemandsOptions>): Promise<MatchArrayType<TData, GetFindResult<DemandModel, TOptions["expand"]>>>;
    /**
     * Получить шаблон отгрузки на основе заказа покупателя или счета покупателю.
     *
     * @param data - Данные для создания шаблона
     * @returns Шаблон отгрузки
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-otgruzka-shablon-otgruzki-na-osnowe-zakaza-ili-scheta-pokupatelu
     *
     * @example
     * ```ts
     * const template = await moysklad.demand.template({
     *   customerOrder: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/a7404318-550f-11e8-56c0-000800000001", type: "customerorder", mediaType: "application/json" } },
     * });
     * ```
     */
    template(data: DemandTemplateData): Promise<GetFindResult<DemandModel, {
        positions: true;
    }>>;
}

export declare interface DemandModel extends Model {
    object: Demand;
    expandable: {
        agent: CounterpartyModel;
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        positions: DemandPositionModel;
        agentAccount: AccountModel;
        organizationAccount: AccountModel;
    };
    filters: {
        assortment: IdFilter;
        id: IdFilter;
        accountId: IdFilter;
        agent: IdFilter;
        applicable: BooleanFilter;
        code: StringFilter;
        contract: IdFilter;
        created: DateTimeFilter;
        deleted: DateTimeFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        moment: DateTimeFilter;
        name: StringFilter;
        organization: IdFilter;
        owner: IdFilter;
        printed: BooleanFilter;
        project: IdFilter;
        published: BooleanFilter;
        salesChannel: IdFilter;
        shared: BooleanFilter;
        shipmentAddress: StringFilter;
        state: IdFilter;
        store: IdFilter;
        sum: NumberFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
        isDeleted: BooleanFilter;
    };
    orderableFields: "id" | "syncId" | "updated" | "updatedBy" | "name" | "description" | "externalCode" | "moment" | "applicable" | "sum" | "created";
    requiredCreateFields: "agent" | "organization" | "store";
}

export declare interface DemandOverhead {
    sum: number;
    distribution: DemandOverheadDistribution;
}

export declare enum DemandOverheadDistribution {
    Weight = "weight",
    Volume = "volume",
    Price = "price"
}

export declare interface DemandPosition extends Idable, Meta<Entity.DemandPosition> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные товара/услуги/серии/модификации/комплекта, которую представляет собой позиция */
    assortment: Meta<AssortmentEntity>;
    /** Себестоимость (только для услуг) */
    cost?: number;
    /** Процент скидки или наценки. Наценка указывается отрицательным числом, т.е. -10 создаст наценку в 10% */
    discount?: number;
    /**
     * Упаковка Товара.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-towary-atributy-wlozhennyh-suschnostej-upakowki-towara
     */
    pack?: unknown;
    /** Цена товара/услуги в копейках */
    price: number;
    /**
     * Количество товаров/услуг данного вида в позиции.
     *
     * Если позиция - товар, у которого включен учет по серийным номерам, то значение в этом поле всегда будет равно количеству серийных номеров для данной позиции в документе. */
    quantity: number;
    /** Ячейка на складе. */
    slot?: Meta<Entity.Slot>;
    /** Серийные номера. Значение данного атрибута игнорируется, если товар позиции не находится на серийном учете. В ином случае количество товаров в позиции будет равно количеству серийных номеров, переданных в значении атрибута. */
    things?: string[];
    /** Коды маркировки товаров и транспортных упаковок. */
    trackingCodes?: unknown;
    /** Коды маркировки товаров в формате тега 1162. */
    trackingCodes_1162?: unknown;
    /** Накладные расходы. Если Позиции Отгрузки не заданы, то накладные расходы нельзя задать. */
    readonly overhead: number;
    /** НДС, которым облагается текущая позиция */
    vat: number;
    /** Включен ли НДС для позиции. С помощью этого флага для позиции можно выставлять НДС = 0 или НДС = "без НДС". (`vat` = `0`, `vatEnabled` = `false`) -> `vat` = "без НДС", (`vat` = `0`, `vatEnabled` = `true`) -> `vat` = 0%. */
    vatEnabled: boolean;
    /** Данные по себестоимости и остаткам. */
    stock?: undefined;
}

export declare interface DemandPositionModel extends Model {
    object: DemandPosition;
}

export declare type DemandTemplateData = RequireExactlyOne<{
    customerOrder: UpdateMeta<Entity.CustomerOrder>;
    invoiceOut: UpdateMeta<Entity.InvoiceOut>;
}>;

export declare interface DocumentRate {
    currency: Meta<Entity.Currency>;
    value?: number;
}

export declare interface DoubleAttribute extends BaseAttribute {
    type: AttributeType.Double;
    value: number;
}

export declare interface Employee extends Idable, Meta<Entity.Employee> {
    readonly accountId: string;
    archived: boolean;
    attributes?: unknown;
    readonly cashiers?: unknown;
    code?: string;
    readonly created?: DateTime;
    description?: string;
    email?: string;
    externalCode: string;
    firstName?: string;
    readonly fullName?: string;
    group: Meta<Entity.Group>;
    image?: unknown;
    inn?: string;
    lastName: string;
    middleName?: string;
    name: string;
    owner: Employee;
    phone?: string;
    position?: string;
    shared: boolean;
    readonly shortFio?: string;
    readonly uid?: string;
    readonly updated: DateTime;
}

export declare interface EmployeeAttribute extends BaseAttribute {
    type: AttributeType.Employee;
    value: Meta<Entity.Employee> & {
        name: string;
    };
}

export declare interface EmployeeModel extends Model {
    object: Employee;
    expandable: {
        owner: EmployeeModel;
        group: GroupModel;
    };
}

export declare interface EndsWithFilter {
    /** Заканчивается на (`=~`) */
    ew: string;
}

/**
 * Оприходование
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie
 */
export declare interface Enter extends Idable, Meta<Entity.Enter> {
    /** ID учетной записи */
    readonly accountId: string;
    /**
     * Коллекция метаданных доп. полей.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-rabota-s-dopolnitel-nymi-polqmi
     */
    attributes?: unknown[];
    /** Отметка о проведении */
    applicable: boolean;
    /** Код оприходования */
    code?: string;
    /** Дата создания */
    readonly created: DateTime;
    /** Момент последнего удаления Оприходования */
    readonly deleted?: DateTime;
    /** Комментарий Оприходования */
    description?: string;
    /** Внешний код Оприходования */
    externalCode: string;
    /**
     * Метаданные массива Файлов
     *
     * Максимальное количество файлов - 100
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-fajly
     */
    files: unknown[];
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Дата документа */
    moment: DateTime;
    /** Номер оприходования */
    name: string;
    /** Метаданные юрлица */
    organization: Meta<Entity.Organization>;
    /** Накладные расходы */
    overhead?: EnterOverhead;
    /** Владелец-сотрудник */
    owner?: Meta<Entity.Employee>;
    /** Метаданные позиций */
    positions: ListMeta<Entity.EnterPosition>;
    /** Напечатан ли документ */
    readonly printed: boolean;
    /** Метаданные проекта */
    project?: Meta<Entity.Project>;
    /** Опубликован ли документ */
    readonly published: boolean;
    /**
     * Валюта.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-obschie-swedeniq-valuta-w-dokumentah
     */
    rate: DocumentRate;
    /** Общий доступ */
    shared: boolean;
    /** Метаданные статуса оприходования */
    state?: Meta<Entity.State>;
    /** Метаданные склада */
    store: Meta<Entity.Store>;
    /** Сумма оприходования в копейках */
    readonly sum: number;
    /**
     * ID синхронизации
     *
     * После заполнения недоступен для изменения. */
    syncId?: string;
    /** Момент последнего обновления оприходования */
    readonly updated: DateTime;
}

/**
 * Оприходования
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie
 */
export declare interface EnterEndpoint {
    /**
     * Получить список оприходований.
     *
     * @param options - Опции для получения списка {@linkcode ListEntersOptions}
     * @returns Объект с списком оприходований
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie-poluchit-oprihodowaniq
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.enter.list();
     * ```
     */
    list<T extends ListEntersOptions = Record<string, unknown>>(options?: Subset<T, ListEntersOptions>): Promise<ListResponse<GetFindResult<EnterModel, T["expand"]>, Entity.Enter>>;
    /**
     * Получить все оприходования с пагинацией.
     *
     * @param options - Опции для получения списка {@linkcode AllEntersOptions}
     * @returns Массив всех оприходований
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie-poluchit-oprihodowaniq
     *
     * @example
     * ```ts
     * const enters = await moysklad.enter.all();
     * ```
     */
    all<T extends AllEntersOptions = Record<string, unknown>>(options?: Subset<T, AllEntersOptions>): Promise<BatchGetResult<GetFindResult<EnterModel, T["expand"]>, Entity.Enter>>;
    /**
     * Получить оприходование по ID.
     *
     * @param id - ID оприходования
     * @param options - Опции для получения оприходования {@linkcode GetEnterOptions}
     * @returns Оприходование
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie-poluchit-oprihodowanie
     *
     * @example
     * ```ts
     * const enter = await moysklad.enter.get("a7404318-550f-11e8-56c0-000800000006");
     * ```
     */
    get<T extends GetEnterOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetEnterOptions>): Promise<GetFindResult<EnterModel, T["expand"]>>;
    /**
     * Обновить оприходование.
     *
     * @param id - ID оприходования
     * @param data - Данные для обновления
     * @param options - Опции для обновления оприходования {@linkcode UpdateEnterOptions}
     * @returns Обновленное оприходование
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie-izmenit-oprihodowanie
     *
     * @example
     * ```ts
     * const enter = await moysklad.enter.update(
     *   "a7404318-550f-11e8-56c0-000800000006",
     *   { name: "00002" }
     * );
     * ```
     */
    update<T extends UpdateEnterOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<EnterModel>, options?: Subset<T, UpdateEnterOptions>): Promise<GetFindResult<EnterModel, T["expand"]>>;
    /**
     * Создать оприходование.
     *
     * @param data - Данные для создания
     * @param options - Опции для создания оприходования {@linkcode CreateEnterOptions}
     * @returns Созданное оприходование
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie-sozdat-oprihodowanie
     *
     * @example
     * ```ts
     * const enter = await moysklad.enter.create({
     *   organization: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/organization/a1331985-a1c8-11e6-5bed-427b00000084", type: "organization", mediaType: "application/json" } },
     *   store: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/store/a1321a08-a1c8-11e6-5bed-427b00000073", type: "store", mediaType: "application/json" } }
     * });
     * ```
     */
    create<T extends CreateEnterOptions = Record<string, unknown>>(data: GetModelCreatableFields<EnterModel>, options?: Subset<T, CreateEnterOptions>): Promise<GetFindResult<EnterModel, T["expand"]>>;
    /**
     * Создать или обновить оприходование.
     *
     * @param data - Массив данных для создания или обновления
     * @param options - Опции для создания оприходования {@linkcode CreateEnterOptions}
     * @returns Массив созданных или обновленных оприходований
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie-sozdat-oprihodowanie
     *
     * @example
     * ```ts
     * const enters = await moysklad.enter.upsert([
     *   {
     *     organization: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/organization/a1331985-a1c8-11e6-5bed-427b00000084", type: "organization", mediaType: "application/json" } },
     *     store: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/store/a1321a08-a1c8-11e6-5bed-427b00000073", type: "store", mediaType: "application/json" } }
     *   }
     * ]);
     * ```
     */
    upsert<T extends CreateEnterOptions = Record<string, unknown>>(data: (GetModelCreatableFields<EnterModel> | (GetModelUpdatableFields<EnterModel> & UpdateMeta<Entity.Enter>))[], options?: Subset<T, CreateEnterOptions>): Promise<GetFindResult<EnterModel, T["expand"]>[]>;
    /**
     * Получить первое оприходование из списка.
     *
     * @param options - Опции для получения списка {@linkcode FirstEnterOptions}
     * @returns Объект с списком оприходований (максимум 1)
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie-poluchit-oprihodowaniq
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.enter.first();
     * const enter = rows[0];
     * ```
     */
    first<T extends FirstEnterOptions = Record<string, unknown>>(options?: Subset<T, FirstEnterOptions>): Promise<ListResponse<GetFindResult<EnterModel, T["expand"]>, Entity.Enter>>;
    /**
     * Получить размер списка оприходований.
     *
     * @returns Размер списка
     *
     * @example
     * ```ts
     * const size = await moysklad.enter.size();
     * ```
     */
    size(): Promise<number>;
    /**
     * Удалить оприходование.
     *
     * @param id - ID оприходования
     * @returns Promise, который разрешается после успешного удаления
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie-udalit-oprihodowanie
     *
     * @example
     * ```ts
     * await moysklad.enter.delete("a7404318-550f-11e8-56c0-000800000006");
     * ```
     */
    delete(id: string): Promise<void>;
    /**
     * Массовое удаление оприходований.
     *
     * @param ids - Массив ID оприходований
     * @returns Результат удаления
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie-massowoe-udalenie-oprihodowanij
     *
     * @example
     * ```ts
     * const result = await moysklad.enter.batchDelete([
     *   "a7404318-550f-11e8-56c0-000800000006",
     *   "a7404318-550f-11e8-56c0-000800000007"
     * ]);
     * ```
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
}

/**
 * Модель оприходования
 *
 * {@linkcode Enter}
 */
export declare interface EnterModel extends Model {
    object: Enter;
    expandable: {
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        positions: EnterPositionModel;
    };
    filters: {
        id: IdFilter;
        assortment: IdFilter;
        accountId: IdFilter;
        applicable: BooleanFilter;
        code: StringFilter;
        created: DateTimeFilter;
        deleted: DateTimeFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        moment: DateTimeFilter;
        name: StringFilter;
        organization: IdFilter;
        owner: IdFilter;
        printed: BooleanFilter;
        project: IdFilter;
        published: BooleanFilter;
        shared: BooleanFilter;
        state: IdFilter;
        store: IdFilter;
        sum: NumberFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
    };
    orderableFields: "id" | "syncId" | "updated" | "updatedBy" | "name" | "description" | "externalCode" | "moment" | "applicable" | "sum" | "created";
    requiredCreateFields: "organization" | "store";
}

/** Накладные расходы оприходования */
export declare interface EnterOverhead {
    /** Сумма накладных расходов в копейках */
    sum: number;
    /** Распределение накладных расходов */
    distribution: EnterOverheadDistribution;
}

/** Распределение накладных расходов оприходования */
export declare enum EnterOverheadDistribution {
    /** По весу */
    Weight = "weight",
    /** По объёму */
    Volume = "volume",
    /** По цене */
    Price = "price"
}

/**
 * Позиция оприходования
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie-pozicii-oprihodowanij
 */
export declare interface EnterPosition extends Idable, Meta<Entity.EnterPosition> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные товара/услуги/серии/модификации/комплекта, которую представляет собой позиция */
    assortment: Meta<AssortmentEntity>;
    /** Метаданные страны */
    country?: Meta<Entity.Country>;
    /** Грузовая таможенная декларация (ГТД) */
    gtd?: Gtd;
    /**
     * Накладные расходы
     *
     * Если Позиции Оприходования не заданы, то накладные расходы нельзя задать
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie-oprihodowaniq-nakladnye-rashody
     */
    overhead: number;
    /**
     * Упаковка Товара.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-towary-atributy-wlozhennyh-suschnostej-upakowki-towara
     */
    pack?: unknown;
    /** Цена товара/услуги в копейках */
    price: number;
    /**
     * Количество товаров/услуг данного вида в позиции.
     *
     * Если позиция - товар, у которого включен учет по серийным номерам, то значение в этом поле всегда будет равно количеству серийных номеров для данной позиции в документе.
     */
    quantity: number;
    /** Причина оприходования данной позиции */
    reason?: string;
    /**
     * Ячейка на складе
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-sklad-yachejki-sklada
     */
    slot?: Meta<Entity.Slot>;
    /**
     * Серийные номера
     *
     * Значение данного атрибута игнорируется, если товар позиции не находится на серийном учете. В ином случае количество товаров в позиции будет равно количеству серийных номеров, переданных в значении атрибута.
     */
    things?: string[];
}

/**
 * Модель позиции оприходования
 *
 * {@linkcode EnterPosition}
 */
export declare interface EnterPositionModel extends Model {
    object: EnterPosition;
}

export declare const EntitiesActions: {
    readonly salesreturn: "evaluate_cost";
};

export declare enum Entity {
    Assortment = "assortment",
    Account = "account",
    Demand = "demand",
    DemandPosition = "demandposition",
    Contract = "contract",
    Project = "project",
    SalesChannel = "saleschannel",
    Country = "country",
    Region = "region",
    FactureOut = "factureout",
    PaymentOut = "paymentout",
    PaymentIn = "paymentin",
    InvoiceOut = "invoiceout",
    Counterparty = "counterparty",
    CustomerOrder = "customerorder",
    CustomerOrderState = "customerorderstate",
    CustomerOrderPosition = "customerorderposition",
    Product = "product",
    Service = "service",
    Bundle = "bundle",
    BundleComponent = "bundlecomponent",
    Variant = "variant",
    Consignment = "consignment",
    ProcessingPlan = "processingplan",
    ProcessingPlanResult = "processingplanresult",
    ProcessingPlanMaterial = "processingplanmaterial",
    ProcessingPlanFolder = "processingplanfolder",
    ProcessingOrder = "processingorder",
    ProcessingOrderPosition = "processingorderposition",
    NamedFilter = "namedfilter",
    Files = "files",
    ProductFolder = "productfolder",
    AttributeMetadata = "attributemetadata",
    CustomEntityMetadata = "customentitymetadata",
    CustomEntity = "customentity",
    Store = "store",
    Organization = "organization",
    PurchaseOrder = "purchaseorder",
    PurchaseOrderPosition = "purchaseorderposition",
    Supply = "supply",
    Processing = "processing",
    ProcessingPositionResult = "processingpositionresult",
    ProcessingPositionMaterial = "processingpositionmaterial",
    ProductionTaskMaterial = "productiontaskmaterial",
    ProcessingProcess = "processingprocess",
    ProcessingStage = "processingstage",
    ProcessingProcessPosition = "processingprocessposition",
    ProcessingPlanStages = "processingplanstages",
    ProductionTask = "productiontask",
    ProductionRow = "productionrow",
    ProductionTaskResult = "productiontaskresult",
    ProductionStageCompletion = "productionstagecompletion",
    ProductionStage = "productionstage",
    ProductionStageCompletionMaterial = "productionstagecompletionmaterial",
    ProductionStageCompletionResult = "productionstagecompletionresult",
    State = "state",
    PriceType = "pricetype",
    Uom = "uom",
    Currency = "currency",
    BonusTransaction = "bonustransaction",
    BonusProgram = "bonusprogram",
    Employee = "employee",
    Group = "group",
    Image = "image",
    Stock = "stock",
    Enter = "enter",
    SalesReturn = "salesreturn",
    RetailSalesReturn = "retailsalesreturn",
    SalesByVariant = "salesbyvariant",
    Slot = "slot",
    ExpenseItem = "expenseitem",
    InvoicePosition = "invoiceposition",
    EnterPosition = "enterposition",
    SupplyPosition = "supplyposition",
    Inventory = "inventory",
    InventoryPosition = "inventoryposition",
    Loss = "loss",
    MoneyPlotSeries = "moneyplotseries",
    MoneyReport = "moneyreport"
}

export declare interface EntrepreneurCounterparty extends BaseCounterparty {
    companyType: CounterpartyCompanyType.Entrepreneur;
    certificateDate?: DateTime;
    certificateNumber?: string;
    inn?: string;
    legalAddress?: string;
    legalFirstName?: string;
    legalLastName?: string;
    legalMiddleName?: string;
    legalTitle?: string;
    ogrnip?: string;
    okpo?: string;
}

export declare interface EntrepreneurOrganization extends BaseOrganization {
    companyType: OrganizationCompanyType.Entrepreneur;
    certificateDate?: DateTime;
    certificateNumber?: string;
    inn?: string;
    legalAddress?: string;
    legalFirstName?: string;
    legalLastName?: string;
    legalMiddleName?: string;
    legalTitle?: string;
    ogrnip?: string;
    okpo?: string;
}

export declare type EnumFilter<T extends Primitive> = Partial<EqualityFilter<T>> | T | T[];

/**
 * A type that is used to ensure that equality and inequality filters are not used together.
 */
export declare type EqualityFilter<T extends Primitive> = EqualsFilter<T> | NotEqualsFilter<T> | IsNullFilter | IsNotNullFilter;

export declare interface EqualsFilter<T extends Primitive> {
    /** Равно (`=`) */
    eq: T | T[];
    ne: never;
    gt: never;
    gte: never;
    lt: never;
    lte: never;
}

/**
 * Given a model `M`, get an option for `expand` query parameter.
 */
export declare type ExpandOptions<M extends Model> = IsEmptyObject<M["expandable"]> extends false ? {
    [key in keyof M["expandable"]]?: key extends "assortment" ? boolean : M["expandable"][key] extends Model ? boolean | ExpandOptions<M["expandable"][key]> : never;
} : never;

export declare interface FileAttribute extends BaseAttribute {
    type: AttributeType.File;
    value: string;
}

export declare type Filter = IdFilter | BooleanFilter | NumberFilter | StringFilter | DateTimeFilter;

export declare type FilterOptions<M extends Model> = AddAttributesFilters<M, GetFiltersForModel<M>>;

export declare type FirstAssortmentOptions = Omit<ListAssortmentOptions, "pagination">;

export declare type FirstBonusTransactionOptions = Omit<ListBonusTransactionsOptions, "pagination">;

export declare type FirstCounterpartyOptions = Omit<ListCounterpartiesOptions, "pagination">;

export declare type FirstCustomerOrderOptions = Omit<ListCustomerOrdersOptions, "pagination">;

export declare type FirstDemandOptions = Omit<ListDemandsOptions, "pagination">;

export declare type FirstEnterOptions = Omit<ListEntersOptions, "pagination">;

export declare type FirstInventoryOptions = Omit<ListInventoryOptions, "pagination">;

export declare type FirstInvoiceOutOptions = Omit<ListInvoiceOutsOptions, "pagination">;

export declare type FirstPaymentInOptions = Omit<ListPaymentInsOptions, "pagination">;

export declare type FirstPaymentOutOptions = Omit<ListPaymentOutsOptions, "pagination">;

export declare type FirstProcessingPlanOptions = Omit<ListProcessingPlansOptions, "pagination">;

export declare type FirstProductionStageCompletionMaterialOptions = Omit<ListProductionStageCompletionMaterialsOptions, "pagination">;

export declare type FirstProductionStageCompletionOptions = Omit<ListProductionStageCompletionsOptions, "pagination">;

export declare type FirstProductionStageCompletionResultOptions = Omit<ListProductionStageCompletionResultsOptions, "pagination">;

export declare type FirstProductionStageOptions = Omit<ListProductionStagesOptions, "pagination">;

export declare type FirstProductionTaskMaterialOptions = Omit<ListProductionTaskMaterialsOptions, "pagination">;

export declare type FirstProductionTaskOptions = Omit<ListProductionTasksOptions, "pagination">;

export declare type FirstProductOptions = Omit<ListProductsOptions, "pagination">;

export declare type FirstPurchaseOrderOptions = Omit<ListPurchaseOrdersOptions, "pagination">;

/**
 * Опции для получения первого Возврата покупателя из списка
 */
export declare type FirstSalesReturnOptions = Omit<ListSalesReturnsOptions, "pagination">;

export declare type FirstSupplyOptions = Omit<ListSuppliesOptions, "pagination">;

export declare type FirstVariantOptions = Omit<ListVariantsOptions, "pagination">;

declare type GetAssortmentObject<T extends AssortmentEntity> = T extends Entity.Variant ? VariantAssortmentModel["object"] : T extends Entity.Product ? ProductAssortmentModel["object"] : T extends Entity.Bundle ? BundleAssortmentModel["object"] : T extends Entity.Consignment ? ConsignmentAssortmentModel["object"] : T extends Entity.Service ? ServiceAssortmentModel["object"] : never;

export declare interface GetBonusTransactionOptions {
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.bonusTransaction.get("123", {
     *   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>;
}

/**
 * Отчёт Остатки денежных средств
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-den-gi-ostatki-denezhnyh-sredstw
 * */
export declare interface GetCashBalanceResponse extends Meta<Entity.MoneyReport> {
    rows: {
        /** Юрлицо */
        organization: Meta<Entity.Organization> & {
            /** Наименование */
            name: string;
        };
        /**
         * Счёт организации
         *
         * Не выводится для остатка кассы, так как касса одна на организацию.
         */
        account?: Meta<Entity.Account> & {
            /** Номер счёта */
            name: string;
        };
        /** Текущий остаток */
        balance: number;
    }[];
}

export declare interface GetCashFlowOptions {
    filter?: {
        /** ссылка на юр. лицо */
        organization?: EqualsFilter<string>;
        /** ссылка на проект */
        project?: EqualsFilter<string>;
    };
    /** Начало периода отчета */
    momentFrom: DateTime;
    /** Конец периода отчета */
    momentTo: DateTime;
    /** Интервал, с которым будет построен отчет.
     *
     * Может принимать значения `hour`, `day`, `month` для разбиения указанного периода по часам, дням и месяцам соответственно */
    interval: "hour" | "day" | "month";
}

export declare interface GetCashFlowResponse extends Meta<Entity.MoneyPlotSeries> {
    /** Доход */
    credit: number;
    /** Расход */
    debit: number;
    /** Массив показателей */
    series: {
        /** Дата */
        date: DateTime;
        /** Доход за период */
        credit: number;
        /** Расход за период */
        debit: number;
        /** Баланс (доход - расход) */
        balance: number;
    }[];
}

export declare interface GetCounterpartyOptions {
    expand?: ExpandOptions<CounterpartyModel>;
}

export declare interface GetCustomerOrderOptions {
    expand?: ExpandOptions<CustomerOrderModel>;
}

export declare interface GetDemandOptions {
    expand?: ExpandOptions<DemandModel>;
    fields?: PositionFields;
}

export declare interface GetEnterOptions {
    expand?: ExpandOptions<EnterModel>;
}

declare type GetFiltersForModel<M extends Model> = IsEmptyObject<M["filters"]> extends true ? never : Partial<M["filters"]>;

export declare type GetFindResult<M extends Model, E, F extends PositionFields | undefined = undefined> = IsEqual<E, any> extends true ? IncludeFields<M["object"], M, F> : IsEmptyObject<E> extends true ? IncludeFields<M["object"], M, F> : E extends object ? RestoreExpandableFieldsOptionality<M, {
    [K in keyof E as E[K] extends false | undefined ? never : K]: K extends keyof M["expandable"] ? K extends keyof M["object"] ? M["expandable"][K] extends Model ? E[K] extends object ? M["object"][K] extends ListMeta<infer O> ? ListMeta<O> & {
        rows: GetFindResult<M["expandable"][K], E[K], F>[];
    } : GetFindResult<M["expandable"][K], E[K], F> : M["object"][K] extends ListMeta<infer O> ? ListMeta<O> & {
        rows: IncludeFields<M["expandable"][K]["object"], M["expandable"][K], F>[];
    } : NonNullable<M["object"][K]> extends Array<unknown> ? M["expandable"][K]["object"][] : M["expandable"][K]["object"] : never : never : never;
}> & Omit<M["object"], ConditionalKeys<E, true | object>> : IncludeFields<M["object"], M, F>;

export declare interface GetInventoryOptions {
    expand?: ExpandOptions<InventoryModel>;
}

export declare interface GetInvoiceOutOptions {
    expand?: ExpandOptions<InvoiceOutModel>;
    fields?: PositionFields;
}

/**
 * Given model M, get the fields for creating a new object.
 */
export declare type GetModelCreatableFields<M extends Model, R = GetModelRequiredCreateFields<M>> = R & Omit<GetModelUpdatableFields<M>, keyof R>;

/**
 * Given model M, get the required fields for creating a new object.
 */
export declare type GetModelRequiredCreateFields<M extends Model> = {
    [Key in Extract<M["requiredCreateFields"], keyof M["object"]>]-?: M["object"][Key] extends Meta<infer T> ? UpdateMeta<T> : NonNullable<M["object"][Key]>;
};

/**
 * Extract the updatable fields from a model's object and replace the Meta with UpdateMeta.
 */
export declare type GetModelUpdatableFields<M extends Model> = {
    [Key in keyof M["object"] as Exclude<Key, ReadonlyKeysOf<M["object"]> | "meta" | "id" | "accountId">]?: M["object"][Key] extends ListMeta<infer T> ? Key extends keyof M["expandable"] ? M["expandable"][Key] extends Model ? ({
        rows: GetModelUpdatableFields<M["expandable"][Key]>[];
    }) | (GetModelUpdatableFields<M["expandable"][Key]>[]) : never : UpdateMeta<T>[] : M["object"][Key] extends Meta<infer T> ? UpdateMeta<T> : M["object"][Key] extends Meta<infer T> | undefined ? UpdateMeta<T> | null : NonNullable<M["object"][Key]> extends Array<infer T> ? T extends Attribute ? (UpdateMeta<Entity.AttributeMetadata> & Pick<Attribute, "value">)[] : T extends Meta<infer U> ? UpdateMeta<U>[] : T[] : undefined extends M["object"][Key] ? M["object"][Key] | null : M["object"][Key];
};

export declare interface GetPaymentInOptions {
    expand?: ExpandOptions<PaymentInModel>;
}

export declare interface GetPaymentOutOptions {
    expand?: ExpandOptions<PaymentOutModel>;
}

export declare interface GetProcessingPlanOptions {
    expand?: ExpandOptions<ProcessingPlanModel>;
}

export declare interface GetProductionStageCompletionOptions {
    expand?: ExpandOptions<ProductionStageCompletionModel>;
}

export declare interface GetProductionStageOptions {
    expand?: ExpandOptions<ProductionStageModel>;
}

export declare interface GetProductionTaskMaterialOptions {
    expand?: ExpandOptions<ProductionTaskMaterialModel>;
}

export declare interface GetProductionTaskOptions {
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productionTask.get("123", {
     *   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 GetProductOptions {
    expand?: ExpandOptions<ProductModel>;
}

export declare interface GetPurchaseOrderOptions {
    expand?: ExpandOptions<PurchaseOrderModel>;
}

/**
 * Опции для получения Возврата покупателя
 */
export declare interface GetSalesReturnOptions {
    expand?: ExpandOptions<SalesReturnModel>;
    fields?: PositionFields;
}

export declare interface GetSupplyOptions {
    expand?: ExpandOptions<SupplyModel>;
}

export declare interface GetVariantOptions {
    expand?: ExpandOptions<VariantModel>;
}

export declare interface GreaterOrEqualsFilter<T extends Primitive> {
    /** Больше либо равно (`>=`) */
    gte: T;
}

export declare interface GreaterThanFilter<T extends Primitive> {
    /** Больше (`>`) */
    gt: T;
}

export declare interface Group extends Idable, Meta<Entity.Group> {
    readonly accountId: string;
    index?: number;
    name: string;
}

export declare interface GroupModel extends Model {
    object: Group;
    expandable: EmptyObject;
}

/**
 * Грузовая таможенная декларация (ГТД)
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-gruzowaq-tamozhennaq-deklaraciq-gtd
 */
export declare interface Gtd {
    /** Номер ГТД */
    name: string;
}

export declare interface Idable {
    readonly id: string;
}

export declare type IdFilter = Partial<EqualityFilter<string>> | string | string[];

export declare type IncludeFields<Result, M extends Model, F extends PositionFields | undefined> = F extends PositionFields ? F[number] extends "stock" ? "stock" extends keyof M["object"] ? Omit<Result, "stock"> & {
    stock: PositionStockData;
} : Result : Result : Result;

export declare interface IndividualCounterparty extends BaseCounterparty {
    companyType: CounterpartyCompanyType.Individual;
    birthDate?: DateTime;
    inn?: string;
    legalAddress?: string;
    legalFirstName?: string;
    legalLastName?: string;
    legalMiddleName?: string;
    legalTitle?: string;
    sex?: IndividualCounterpartySex;
}

export declare enum IndividualCounterpartySex {
    Male = "male",
    Female = "female"
}

export declare interface IndividualOrganization extends BaseOrganization {
    companyType: OrganizationCompanyType.Individual;
    inn?: string;
    legalAddress?: string;
    legalFirstName?: string;
    legalLastName?: string;
    legalMiddleName?: string;
    legalTitle?: string;
}

export declare interface Inventory extends Idable, Meta<Entity.Inventory> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Коллекция метаданных доп. полей */
    attributes?: Attribute[];
    /** Код */
    code?: string;
    /** Дата создания */
    readonly created: DateTime;
    /** Момент последнего удаления */
    readonly deleted?: DateTime;
    /** Комментарий */
    description?: string;
    /** Внешний код */
    externalCode: string;
    /** Метаданные массива Файлов */
    files: unknown[];
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Дата документа */
    moment: DateTime;
    /** Наименование */
    name: string;
    /** Метаданные юрлица */
    organization: Meta<Entity.Organization>;
    /** Владелец (Сотрудник) */
    owner?: Meta<Entity.Employee>;
    /** Метаданные позиций Инвентаризации */
    positions: ListMeta<Entity.InventoryPosition>;
    /** Напечатан ли документ */
    readonly printed: boolean;
    /** Опубликован ли документ */
    readonly published: boolean;
    /** Общий доступ */
    shared: boolean;
    /** Метаданные статуса Инвентаризации */
    state?: Meta<Entity.State>;
    /** Метаданные склада */
    store: Meta<Entity.Store>;
    /** Сумма Инвентаризации в копейках */
    readonly sum: number;
    /** ID синхронизации */
    syncId?: string;
    /** Момент последнего обновления */
    readonly updated: DateTime;
    /** Связанные оприходования */
    enters?: Meta<Entity.Enter>[];
    /** Связанные списания */
    losses?: Meta<Entity.Loss>[];
}

/**
 * Инвентаризации
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-inwentarizaciq
 */
export declare interface InventoryEndpoint {
    /**
     * Получить массив инвентаризаций.
     *
     * @param options - Опции для получения инвентаризаций {@linkcode ListInventoryOptions}
     * @returns Объект с массивом инвентаризаций
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-inwentarizaciq-poluchit-inwentarizacii
     */
    list<T extends ListInventoryOptions = Record<string, unknown>>(options?: Subset<T, ListInventoryOptions>): Promise<ListResponse<GetFindResult<InventoryModel, T["expand"]>, Entity.Inventory>>;
    /**
     * Получить все инвентаризации.
     *
     * @param options - Опции для получения всех инвентаризаций {@linkcode AllInventoryOptions}
     * @returns Объект с массивом инвентаризаций
     */
    all<T extends AllInventoryOptions = Record<string, unknown>>(options?: Subset<T, AllInventoryOptions>): Promise<BatchGetResult<GetFindResult<InventoryModel, T["expand"]>, Entity.Inventory>>;
    /**
     * Получить первую инвентаризацию.
     *
     * @param options - Опции для получения первой инвентаризации {@linkcode FirstInventoryOptions}
     * @returns Объект с первой инвентаризацией
     */
    first<T extends FirstInventoryOptions = Record<string, unknown>>(options?: Subset<T, FirstInventoryOptions>): Promise<ListResponse<GetFindResult<InventoryModel, T["expand"]>, Entity.Inventory>>;
    /**
     * Получить инвентаризацию по id.
     *
     * @param id - id инвентаризации
     * @param options - Опции для получения инвентаризации {@linkcode GetInventoryOptions}
     * @returns Объект с инвентаризацией {@linkcode InventoryModel}
     */
    get<T extends GetInventoryOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetInventoryOptions>): Promise<GetFindResult<InventoryModel, T["expand"]>>;
    /**
     * Создать инвентаризацию.
     *
     * @param data - данные для создания инвентаризации
     * @param options - Опции для создания инвентаризации {@linkcode CreateInventoryOptions}
     * @returns Объект с созданной инвентаризацией {@linkcode InventoryModel}
     */
    create<T extends CreateInventoryOptions = Record<string, unknown>>(data: GetModelCreatableFields<InventoryModel>, options?: Subset<T, CreateInventoryOptions>): Promise<GetFindResult<InventoryModel, T["expand"]>>;
    /**
     * Обновить инвентаризацию.
     *
     * @param id - id инвентаризации
     * @param data - данные для обновления инвентаризации
     * @param options - Опции для обновления инвентаризации {@linkcode UpdateInventoryOptions}
     * @returns Объект с обновленной инвентаризацией {@linkcode InventoryModel}
     */
    update<T extends UpdateInventoryOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<InventoryModel>, options?: Subset<T, UpdateInventoryOptions>): Promise<GetFindResult<InventoryModel, T["expand"]>>;
    /**
     * Массово создать или обновить инвентаризации.
     *
     * @param data - массив данных для создания или обновления инвентаризаций
     * @param options - Опции для создания инвентаризаций {@linkcode CreateInventoryOptions}
     * @returns Массив с созданными или обновленными инвентаризациями {@linkcode InventoryModel}
     */
    upsert<T extends CreateInventoryOptions = Record<string, unknown>>(data: (GetModelCreatableFields<InventoryModel> | (GetModelUpdatableFields<InventoryModel> & UpdateMeta<Entity.Inventory>))[], options?: Subset<T, CreateInventoryOptions>): Promise<GetFindResult<InventoryModel, T["expand"]>[]>;
    /**
     * Массово удалить инвентаризации.
     *
     * @param ids - массив id инвентаризаций
     * @returns Массив с результатами удаления инвентаризаций
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
}

export declare interface InventoryModel extends Model {
    object: Inventory;
    expandable: {
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        enters: EnterModel;
        positions: InventoryPositionModel;
    };
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        code: StringFilter;
        created: DateTimeFilter;
        deleted: DateTimeFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        moment: DateTimeFilter;
        name: StringFilter;
        organization: IdFilter;
        owner: IdFilter;
        printed: BooleanFilter;
        published: BooleanFilter;
        shared: BooleanFilter;
        state: IdFilter;
        store: IdFilter;
        sum: NumberFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
        isDeleted: BooleanFilter;
    };
    orderableFields: "id" | "syncId" | "updated" | "name" | "description" | "externalCode" | "moment" | "sum" | "created";
    requiredCreateFields: "organization" | "store";
}

export declare interface InventoryPosition extends Idable, Meta<Entity.InventoryPosition> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные товара/услуги/серии/модификации, которую представляет собой позиция */
    assortment: Meta<AssortmentEntity>;
    /** Расчетный остаток */
    calculatedQuantity: number;
    /** Разница между расчетным остатком и фактическим */
    readonly correctionAmount: number;
    /** Избыток/недостача */
    readonly correctionSum: number;
    /**
     * Упаковка Товара.
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-towary-atributy-wlozhennyh-suschnostej-upakowki-towara
     */
    pack?: unknown;
    /** Цена товара/услуги в копейках */
    price: number;
    /** Количество товаров/услуг данного вида в позиции */
    quantity: number;
}

export declare interface InventoryPositionModel extends Model {
    object: InventoryPosition;
    expandable: {
        assortment: AssortmentModel;
    };
}

/**
 * Счёт покупателю
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-scheta-pokupatelqm
 */
export declare interface InvoiceOut extends Idable, Meta<Entity.InvoiceOut> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные контрагента */
    agent: Meta<Entity.Counterparty>;
    /** Метаданные счета контрагента */
    agentAccount?: Meta<Entity.Account>;
    /** Отметка о проведении */
    applicable: boolean;
    /**
     * Коллекция метаданных доп. полей.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-rabota-s-dopolnitel-nymi-polqmi
     */
    attributes?: unknown[];
    /** Код Счета покупателю */
    code?: string;
    /** Метаданные договора */
    contract?: Meta<Entity.Contract>;
    /** Дата создания */
    readonly created: DateTime;
    /** Момент последнего удаления Счета покупателю */
    readonly deleted?: DateTime;
    /** Комментарий Счета покупателю */
    description?: string;
    /** Внешний код Счета покупателю */
    externalCode: string;
    /**
     * Метаданные массива Файлов (Максимальное количество файлов - 100)
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-fajly
     */
    files: unknown[];
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Дата документа */
    moment: DateTime;
    /** Наименование Счета покупателю */
    name: string;
    /** Метаданные юрлица */
    organization: Meta<Entity.Organization>;
    /** Метаданные счета юрлица */
    organizationAccount?: Meta<Entity.Account>;
    /** Владелец (Сотрудник) */
    owner?: Meta<Entity.Employee>;
    /** Сумма входящих платежей по Счету покупателю */
    readonly payedSum: number;
    /** Планируемая дата оплаты */
    paymentPlannedMoment?: DateTime;
    /** Метаданные позиций Счета покупателю */
    positions: ListMeta<Entity.InvoicePosition>;
    /** Напечатан ли документ */
    readonly printed: boolean;
    /** Метаданные проекта */
    project?: Meta<Entity.Project>;
    /** Опубликован ли документ */
    readonly published: boolean;
    /**
     * Валюта.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-obschie-swedeniq-valuta-w-dokumentah
     */
    rate: DocumentRate;
    /** Метаданные канала продаж */
    salesChannel?: Meta<Entity.SalesChannel>;
    /** Общий доступ */
    shared: boolean;
    /** Сумма отгруженного */
    readonly shippedSum: number;
    /** Метаданные статуса счета */
    state?: Meta<Entity.State>;
    /** Метаданные склада */
    store?: Meta<Entity.Store>;
    /** Сумма Счета в установленной валюте */
    readonly sum: number;
    /** ID синхронизации. После заполнения недоступен для изменения */
    syncId?: string;
    /** Момент последнего обновления Счета покупателю */
    readonly updated: DateTime;
    /** Учитывается ли НДС */
    vatEnabled: boolean;
    /** Включен ли НДС в цену */
    vatIncluded?: boolean;
    /** Сумма НДС */
    readonly vatSum: number;
}

/**
 * Счета покупателям
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-scheta-pokupatelqm
 */
export declare interface InvoiceOutEndpoint {
    /**
     * Получить список счетов покупателям.
     *
     * @param options - Опции для получения списка
     * @returns Объект с списком счетов покупателям
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-poluchit-scheta-pokupatelqm
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.invoiceOut.list();
     * ```
     */
    list<T extends ListInvoiceOutsOptions = Record<string, unknown>>(options?: Subset<T, ListInvoiceOutsOptions>): Promise<ListResponse<GetFindResult<InvoiceOutModel, T["expand"]>, Entity.InvoiceOut>>;
    /**
     * Получить все счета покупателям с пагинацией.
     *
     * @param options - Опции для получения списка
     * @returns Массив счетов покупателям
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-poluchit-scheta-pokupatelqm
     *
     * @example
     * ```ts
     * const invoices = await moysklad.invoiceOut.all();
     * ```
     */
    all<T extends AllInvoiceOutsOptions = Record<string, unknown>>(options?: Subset<T, AllInvoiceOutsOptions>): Promise<BatchGetResult<GetFindResult<InvoiceOutModel, T["expand"]>, Entity.InvoiceOut>>;
    /**
     * Получить счет покупателю по ID.
     *
     * @param id - ID счета покупателю
     * @param options - Опции для получения счета покупателю
     * @returns Счет покупателю
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-poluchit-schet-pokupatelu
     *
     * @example
     * ```ts
     * const invoice = await moysklad.invoiceOut.get("a7404318-550f-11e8-56c0-001b21c78cd9");
     * ```
     */
    get<T extends GetInvoiceOutOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetInvoiceOutOptions>): Promise<GetFindResult<InvoiceOutModel, T["expand"]>>;
    /**
     * Обновить счет покупателю.
     *
     * @param id - ID счета покупателю
     * @param data - Данные для обновления счета покупателю
     * @param options - Опции для обновления счета покупателю
     * @returns Обновленный счет покупателю
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-izmenit-schet-pokupatelu
     *
     * @example
     * ```ts
     * const updatedInvoice = await moysklad.invoiceOut.update(
     *   "a7404318-550f-11e8-56c0-001b21c78cd9",
     *   { name: "Новое название" }
     * );
     * ```
     */
    update<T extends UpdateInvoiceOutOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<InvoiceOutModel>, options?: Subset<T, UpdateInvoiceOutOptions>): Promise<GetFindResult<InvoiceOutModel, T["expand"]>>;
    /**
     * Создать счет покупателю.
     *
     * @param data - Данные для создания счета покупателю
     * @param options - Опции для создания счета покупателю
     * @returns Созданный счет покупателю
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-sozdat-schet-pokupatelu
     *
     * @example
     * ```ts
     * const newInvoice = await moysklad.invoiceOut.create({
     *   organization: { meta: { href: "...", type: "organization" } },
     *   agent: { meta: { href: "...", type: "counterparty" } },
     *   name: "Счет покупателю"
     * });
     * ```
     */
    create<T extends CreateInvoiceOutOptions = Record<string, unknown>>(data: GetModelCreatableFields<InvoiceOutModel>, options?: Subset<T, CreateInvoiceOutOptions>): Promise<GetFindResult<InvoiceOutModel, T["expand"]>>;
    /**
     * Создать или обновить несколько счетов покупателям.
     *
     * @param data - Массив данных для создания или обновления счетов покупателям
     * @param options - Опции для создания или обновления счетов покупателям
     * @returns Массив созданных или обновленных счетов покупателям
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-sozdat-neskolxko-schetow-pokupatelqm
     *
     * @example
     * ```ts
     * const invoices = await moysklad.invoiceOut.upsert([
     *   {
     *     organization: { meta: { href: "...", type: "organization" } },
     *     agent: { meta: { href: "...", type: "counterparty" } },
     *     name: "Счет покупателю 1"
     *   },
     *   {
     *     meta: { href: "...", type: "invoiceout" },
     *     name: "Обновленный счет покупателю"
     *   }
     * ]);
     * ```
     */
    upsert<T extends CreateInvoiceOutOptions = Record<string, unknown>>(data: (GetModelCreatableFields<InvoiceOutModel> | (GetModelUpdatableFields<InvoiceOutModel> & UpdateMeta<Entity.InvoiceOut>))[], options?: Subset<T, CreateInvoiceOutOptions>): Promise<GetFindResult<InvoiceOutModel, T["expand"]>[]>;
    /**
     * Получить первый счет покупателю из списка.
     *
     * @param options - Опции для получения счета покупателю
     * @returns Объект с списком счетов покупателям (с ограничением в 1 элемент)
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-poluchit-scheta-pokupatelqm
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.invoiceOut.first({ filter: { name: "Счет" } });
     * const invoice = rows[0];
     * ```
     */
    first<T extends FirstInvoiceOutOptions = Record<string, unknown>>(options?: Subset<T, FirstInvoiceOutOptions>): Promise<ListResponse<GetFindResult<InvoiceOutModel, T["expand"]>, Entity.InvoiceOut>>;
    /**
     * Получить размер списка счетов покупателям.
     *
     * @returns Количество счетов покупателям
     *
     * @example
     * ```ts
     * const count = await moysklad.invoiceOut.size();
     * ```
     */
    size(): Promise<number>;
    /**
     * Удалить счет покупателю.
     *
     * @param id - ID счета покупателю
     * @returns Void
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-udalit-schet-pokupatelu
     *
     * @example
     * ```ts
     * await moysklad.invoiceOut.delete("a7404318-550f-11e8-56c0-001b21c78cd9");
     * ```
     */
    delete(id: string): Promise<void>;
    /**
     * Удалить несколько счетов покупателям.
     *
     * @param ids - Массив ID счетов покупателям
     * @returns Результат массового удаления
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-udalit-neskolxko-schetow-pokupatelqm
     *
     * @example
     * ```ts
     * const result = await moysklad.invoiceOut.batchDelete([
     *   "a7404318-550f-11e8-56c0-001b21c78cd9",
     *   "a7404318-550f-11e8-56c0-001b21c78cd8"
     * ]);
     * ```
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
}

/**
 * Модель счета покупателю
 *
 * {@linkcode InvoiceOut}
 */
export declare interface InvoiceOutModel extends Model {
    object: InvoiceOut;
    expandable: {
        agent: CounterpartyModel;
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        positions: InvoiceOutPositionModel;
        agentAccount: AccountModel;
        organizationAccount: AccountModel;
    };
    filters: {
        id: IdFilter;
        assortment: IdFilter;
        accountId: IdFilter;
        agent: IdFilter;
        applicable: BooleanFilter;
        code: StringFilter;
        contract: IdFilter;
        created: DateTimeFilter;
        deleted: DateTimeFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        moment: DateTimeFilter;
        name: StringFilter;
        organization: IdFilter;
        owner: IdFilter;
        paymentPlannedMoment: DateTimeFilter;
        printed: BooleanFilter;
        project: IdFilter;
        published: BooleanFilter;
        salesChannel: IdFilter;
        state: IdFilter;
        store: IdFilter;
        sum: NumberFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
    };
    orderableFields: "id" | "syncId" | "updated" | "updatedBy" | "name" | "description" | "externalCode" | "moment" | "applicable" | "sum" | "created" | "paymentPlannedMoment";
    requiredCreateFields: "agent" | "organization";
}

/**
 * Позиция счёта покупателю
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-pozicii-scheta-pokupatelu
 */
export declare interface InvoiceOutPosition extends Idable, Meta<Entity.InvoicePosition> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные товара/услуги/серии/модификации/комплекта, которую представляет собой позиция */
    assortment: Meta<AssortmentEntity>;
    /** Процент скидки или наценки. Наценка указывается отрицательным числом, т.е. -10 создаст наценку в 10% */
    discount?: number;
    /**
     * Упаковка Товара.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-towary-atributy-wlozhennyh-suschnostej-upakowki-towara
     */
    pack?: unknown;
    /** Цена товара/услуги в копейках */
    price: number;
    /**
     * Количество товаров/услуг данного вида в позиции.
     *
     * Если позиция - товар, у которого включен учет по серийным номерам, то значение в этом поле всегда будет равно количеству серийных номеров для данной позиции в документе. */
    quantity: number;
    /** НДС, которым облагается текущая позиция */
    vat: number;
    /** Включен ли НДС для позиции. С помощью этого флага для позиции можно выставлять НДС = 0 или НДС = "без НДС". (`vat` = `0`, `vatEnabled` = `false`) -> `vat` = "без НДС", (`vat` = `0`, `vatEnabled` = `true`) -> `vat` = 0%. */
    vatEnabled: boolean;
}

/**
 * Модель позиции счёта покупателю
 *
 * {@linkcode InvoiceOutPosition}
 */
export declare interface InvoiceOutPositionModel extends Model {
    object: InvoiceOutPosition;
}

/**
 * Проверяет, является ли ассортимент определенного типа.
 *
 * Поскольку TypeScript [пока не поддерживает сужение типа по вложенным полям](https://github.com/microsoft/TypeScript/issues/18758), эта функция сужает тип ассортимента на основе `metadata.type`.
 *
 * @param assortment Ассортимент
 * @param entity Тип сущности
 * @returns Является ли ассортимент определенного типа
 *
 * @example
 * ```ts
 * if (isAssortmentOfType(assortment, Entity.Service)) {
 *   // Теперь assortment имеет тип Service
 * }
 * ```
 */
export declare function isAssortmentOfType<T extends AssortmentEntity>(assortment: AssortmentModel["object"], entity: T): assortment is GetAssortmentObject<T>;

export declare interface IsNotNullFilter {
    /** Не пустое */
    isNotNull: boolean;
}

export declare interface IsNullFilter {
    isNull: boolean;
    isNotNull: never;
    eq: never;
    ne: never;
}

export declare interface LegalCounterparty extends BaseCounterparty {
    companyType: CounterpartyCompanyType.Legal;
    inn?: string;
    kpp?: string;
    legalAddress?: string;
    legalTitle?: string;
    ogrn?: string;
    okpo?: string;
}

export declare interface LegalOrganization extends BaseOrganization {
    companyType: OrganizationCompanyType.Legal;
    legalTitle?: string;
    legalAddress?: string;
    inn?: string;
    kpp?: string;
    ogrn?: string;
    okpo?: string;
}

export declare interface LessOrEqualsFilter<T extends Primitive> {
    /** Меньше либо равно (`<=`) */
    lte: T;
}

export declare interface LessThanFilter<T extends Primitive> {
    /** Меньше (`<`) */
    lt: T;
}

export declare interface LikeFilter {
    /** Содержит (`~`) */
    like: string;
}

export declare interface LinkAttribute extends BaseAttribute {
    type: AttributeType.Link;
    value: string;
}

export declare interface ListAssortmentOptions {
    /** Получить вместе с сериями. */
    groupBy?: "consignment";
    filter?: {
        barcode?: EqualityFilter<string> | string | string[];
    };
    pagination?: PaginationOptions;
}

export declare interface ListBonusTransactionsOptions {
    /**
     * Опции пагинации
     *
     * {@linkcode PaginationOptions}
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.bonusTransaction.list({
     *  pagination: { limit: 10, offset: 0 },
     * })
     * ```
     */
    pagination?: PaginationOptions;
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.bonusTransaction.list({
     *   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>;
    /**
     * Опции сортировки
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/workbook/#workbook-fil-traciq-listanie-poisk-i-sortirowka-sortirowka
     *
     * @example Одно поле
     * ```ts
     * const { rows } = await moysklad.bonusTransaction.list({
     *   order: { field: "moment", direction: "asc" },
     * })
     * ```
     *
     * @example Несколько полей
     * ```ts
     * const { rows } = await moysklad.bonusTransaction.list({
     *   order: [
     *     { field: "moment", direction: "asc" },
     *     { field: "created", direction: "desc" },
     *   ],
     * })
     * ```
     */
    order?: OrderOptions<BonusTransactionModel>;
    /**
     * Контекстный поиск
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-kontextnyj-poisk
     */
    search?: string;
    /**
     * Фильтры
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-fil-traciq-wyborki-s-pomosch-u-parametra-filter
     *
     * @example
     * ```ts
     * await moysklad.bonusTransaction.list({
     *   filter: {
     *     name: {
     *       sw: "test",
     *     }
     *   }
     * });
     * ```
     */
    filter?: FilterOptions<BonusTransactionModel>;
}

export declare interface ListCounterpartiesOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<CounterpartyModel>;
    order?: OrderOptions<CounterpartyModel>;
    search?: string;
    filter?: FilterOptions<CounterpartyModel>;
}

export declare interface ListCustomerOrdersOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<CustomerOrderModel>;
    order?: OrderOptions<CustomerOrderModel>;
    search?: string;
    filter?: FilterOptions<CustomerOrderModel>;
    namedfilter?: string;
}

export declare interface ListDemandsOptions {
    pagination?: PaginationOptions;
    fields?: PositionFields;
    expand?: ExpandOptions<DemandModel>;
    order?: OrderOptions<DemandModel>;
    search?: string;
    filter?: FilterOptions<DemandModel>;
}

export declare interface ListEntersOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<EnterModel>;
    order?: OrderOptions<EnterModel>;
    search?: string;
    filter?: FilterOptions<EnterModel>;
}

export declare interface ListInventoryOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<InventoryModel>;
    order?: OrderOptions<InventoryModel>;
    search?: string;
    filter?: FilterOptions<InventoryModel>;
    namedfilter?: string;
}

export declare interface ListInvoiceOutsOptions {
    pagination?: PaginationOptions;
    fields?: PositionFields;
    expand?: ExpandOptions<InvoiceOutModel>;
    order?: OrderOptions<InvoiceOutModel>;
    search?: string;
    filter?: FilterOptions<InvoiceOutModel>;
}

export declare interface ListMeta<T extends Entity> {
    meta: ListMetadata<T>;
}

export declare interface ListMetadata<T extends Entity> extends Metadata<T> {
    size: number;
    limit: number;
    offset: number;
    nextHref?: string;
    previousHref?: string;
}

export declare interface ListPaymentInsOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<PaymentInModel>;
    order?: OrderOptions<PaymentInModel>;
    search?: string;
    filter?: FilterOptions<PaymentInModel>;
}

export declare interface ListPaymentOutsOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<PaymentOutModel>;
    order?: OrderOptions<PaymentOutModel>;
    search?: string;
    filter?: FilterOptions<PaymentOutModel>;
}

export declare interface ListProcessingPlansOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<ProcessingPlanModel>;
    order?: OrderOptions<ProcessingPlanModel>;
    search?: string;
    filter?: FilterOptions<ProcessingPlanModel>;
}

export declare interface ListProductionStageCompletionMaterialsOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<ProductionStageCompletionMaterialModel>;
}

export declare interface ListProductionStageCompletionResultsOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<ProductionStageCompletionResultModel>;
}

export declare interface ListProductionStageCompletionsOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<ProductionStageCompletionModel>;
    order?: OrderOptions<ProductionStageCompletionModel>;
    filter?: FilterOptions<ProductionStageCompletionModel>;
}

export declare interface ListProductionStagesOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<ProductionStageModel>;
    order?: OrderOptions<ProductionStageModel>;
    search?: string;
    filter: SetRequired<FilterOptions<ProductionStageModel>, "productionTask">;
}

export declare interface ListProductionTaskMaterialsOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<ProductionTaskMaterialModel>;
    order?: OrderOptions<ProductionTaskMaterialModel>;
    search?: string;
    filter?: FilterOptions<ProductionTaskMaterialModel>;
}

export declare interface ListProductionTasksOptions {
    /**
     * Опции пагинации
     *
     * {@linkcode PaginationOptions}
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productionTask.list({
     *  pagination: { limit: 10, offset: 0 },
     * })
     * ```
     */
    pagination?: PaginationOptions;
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productionTask.list({
     *   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>;
    /**
     * Опции сортировки
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/workbook/#workbook-fil-traciq-listanie-poisk-i-sortirowka-sortirowka
     *
     * @example Одно поле
     * ```ts
     * const { rows } = await moysklad.productionTask.list({
     *   order: { field: "moment", direction: "asc" },
     * })
     * ```
     *
     * @example Несколько полей
     * ```ts
     * const { rows } = await moysklad.productionTask.list({
     *   order: [
     *     { field: "moment", direction: "asc" },
     *     { field: "created", direction: "desc" },
     *   ],
     * })
     * ```
     */
    order?: OrderOptions<ProductionTaskModel>;
    /**
     * Контекстный поиск
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-kontextnyj-poisk
     */
    search?: string;
    /**
     * Фильтры
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-fil-traciq-wyborki-s-pomosch-u-parametra-filter
     *
     * @example
     * ```ts
     * await moysklad.productionTask.list({
     *   filter: {
     *     name: {
     *       sw: "test",
     *     }
     *   }
     * });
     * ```
     */
    filter?: FilterOptions<ProductionTaskModel>;
}

export declare interface ListProductsOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<ProductModel>;
    order?: OrderOptions<ProductModel>;
    search?: string;
    filter?: FilterOptions<ProductModel>;
}

export declare interface ListPurchaseOrdersOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<PurchaseOrderModel>;
    order?: OrderOptions<PurchaseOrderModel>;
    search?: string;
    filter?: FilterOptions<PurchaseOrderModel>;
}

export declare interface ListResponse<T, E extends Entity> extends ListMeta<E> {
    context: Context;
    rows: T[];
}

/**
 * Опции для получения списка Возвратов покупателей
 */
export declare interface ListSalesReturnsOptions {
    pagination?: PaginationOptions;
    fields?: PositionFields;
    expand?: ExpandOptions<SalesReturnModel>;
    order?: OrderOptions<SalesReturnModel>;
    search?: string;
    filter?: FilterOptions<SalesReturnModel>;
}

export declare interface ListSuppliesOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<SupplyModel>;
    order?: OrderOptions<SupplyModel>;
    search?: string;
    filter?: FilterOptions<SupplyModel>;
}

export declare interface ListVariantsOptions {
    pagination?: PaginationOptions;
    expand?: ExpandOptions<VariantModel>;
    order?: OrderOptions<VariantModel>;
    search?: string;
    filter?: FilterOptions<VariantModel>;
}

export declare interface LongAttribute extends BaseAttribute {
    type: AttributeType.Long;
    value: number;
}

export declare type MatchArrayType<TInput, TOutput> = TInput extends Array<any> ? TOutput[] : TOutput;

export declare enum MediaType {
    Json = "application/json"
}

export declare interface Meta<T extends Entity> {
    meta: Metadata<T>;
}

export declare interface Metadata<T extends Entity> {
    href: string;
    metadataHref: string;
    mediaType: MediaType;
    type: T;
    uuidHref?: string;
    downloadHref?: string;
}

export declare interface Model<T extends object = object> {
    object: T;
    expandable: {
        [ObjectName in string]?: unknown;
    };
    filters: Record<string, Filter>;
    orderableFields?: string;
    requiredCreateFields?: string;
}

/**
 * Data for creating or batch updating a model.
 */
export declare type ModelCreateOrUpdateData<M extends Model> = "meta" extends keyof M["object"] ? M["object"]["meta"] extends Metadata<infer T> ? GetModelCreatableFields<M> | Array<GetModelCreatableFields<M> | (GetModelUpdatableFields<M> & UpdateMeta<T>)> : never : never;

/** Клиент МойСклад */
export declare interface Moysklad {
    /**
     * API клиент
     *
     * {@linkcode ApiClient}
     */
    client: ApiClient;
    /**
     * Бонусные операции
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-bonusnaq-operaciq
     */
    bonusTransaction: BonusTransactionEndpoint;
    /**
     * Безопасность (токены)
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-autentifikaciq
     */
    security: SecurityEndpoint;
    /**
     * Контрагенты
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-kontragent
     */
    counterparty: CounterpartyEndpoint;
    /**
     * Пользовательские справочники
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-pol-zowatel-skij-sprawochnik
     */
    customEntity: CustomEntityEndpoint;
    /**
     * Ассортимент
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-assortiment
     */
    assortment: AssortmentEndpoint;
    /**
     * Заказы покупателей
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq
     */
    customerOrder: CustomerOrderEndpoint;
    /**
     * Отгрузки
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-otgruzka
     */
    demand: DemandEndpoint;
    /**
     * Приёмки
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-priemki
     */
    supply: SupplyEndpoint;
    /**
     * Оприходования
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-oprihodowanie
     */
    enter: EnterEndpoint;
    /**
     * Товары
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar
     */
    product: ProductEndpoint;
    /**
     * Техкарты
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-tehkarty
     */
    processingPlan: ProcessingPlanEndpoint;
    /**
     * Входящие платежи
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vhodqschij-platezh
     */
    paymentIn: PaymentInEndpoint;
    /**
     * Исходящие платежи
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-ishodqschie-platezhi
     */
    paymentOut: PaymentOutEndpoint;
    /**
     * Счета покупателям
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-pokupatelu-scheta-pokupatelqm
     */
    invoiceOut: InvoiceOutEndpoint;
    /**
     * Автозаполнение
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-awtozapolnenie
     */
    wizard: WizardEndpoint;
    /**
     * Отчёты
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety
     */
    report: ReportEndpoint;
    /**
     * Заказ поставщику
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-postawschiku
     */
    purchaseOrder: PurchaseOrderEndpoint;
    /**
     * Производственные этапы
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-proizwodstwennye-atapy
     */
    productionStage: ProductionStageEndpoint;
    /**
     * Выполнения этапов производства
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vypolnenie-atapa-proizwodstwa
     */
    productionStageCompletion: ProductionStageCompletionEndpoint;
    /**
     * Инвентаризации
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-inwentarizaciq
     */
    inventory: InventoryEndpoint;
    /**
     * Производственные задания
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie
     */
    productionTask: ProductionTaskEndpoint;
    /**
     * Модификации
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-modifikaciq
     */
    variant: VariantEndpoint;
    /**
     * Возвраты покупателей
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq
     */
    salesReturn: SalesReturnEndpoint;
}

export declare class MoyskladApiError extends MoyskladError {
    code?: number;
    moreInfo?: string;
    constructor(message: string, response: Response, code?: number, moreInfo?: string);
}

export declare class MoyskladError extends Error {
    response: Response;
    constructor(message: string, response: Response);
}

export declare interface NotEqualsFilter<T extends Primitive> {
    /** Не равно (`!=`) */
    ne: T | T[];
}

export declare type NumberFilter = Partial<EqualityFilter<number> & GreaterThanFilter<number> & GreaterOrEqualsFilter<number> & LessThanFilter<number> & LessOrEqualsFilter<number>> | number | number[];

export declare interface OrderObject<T extends string> {
    field: T;
    direction: "asc" | "desc";
}

export declare type OrderOption<T extends string> = OrderObject<T> | T;

export declare type OrderOptions<M extends Model> = M["orderableFields"] extends string ? OrderOption<M["orderableFields"]> | OrderOption<M["orderableFields"]>[] : never;

export declare type Organization = LegalOrganization | EntrepreneurOrganization | IndividualOrganization;

export declare enum OrganizationCompanyType {
    Legal = "legal",
    Entrepreneur = "entrepreneur",
    Individual = "individual"
}

export declare interface OrganizationModel extends Model {
    object: Organization;
    expandable: {
        bonusProgram: BonusProgramModel;
        group: GroupModel;
        owner: EmployeeModel;
    };
}

/**
 * Опции пагинации
 */
export declare interface PaginationOptions {
    /**
     * Максимальное количество элементов, которое вернется в одной странице. Мин 1, макс 1000.
     * @default 1000
     */
    limit?: number;
    /**
     * Количество элементов, которые нужно пропустить перед началом сбора результирующего набора.
     * @default 0
     */
    offset?: number;
}

/**
 * Parses a string representation of a date and time in Moysklad format.
 * @param dateTime A string representation of a date and time ("2017-04-08 13:33:00.123").
 * @returns A Date object representing the parsed date and time.
 * @throws An error if the input string is not in the correct format.
 */
export declare function parseDateTime(dateTime: DateTime): Date;

export declare interface PaymentIn extends Idable, Meta<Entity.PaymentIn> {
    readonly accountId: string;
    agent: Meta<Entity.Counterparty>;
    agentAccount?: Meta<Entity.Account>;
    applicable: boolean;
    attributes?: unknown;
    code?: string;
    contract?: Meta<Entity.Contract>;
    readonly created: DateTime;
    readonly deleted?: DateTime;
    description?: string;
    externalCode: string;
    files?: unknown[];
    group: Meta<Entity.Group>;
    incomingDate?: DateTime;
    incomingNumber?: number;
    moment: DateTime;
    name: string;
    organization: Meta<Entity.Organization>;
    organizationAccount?: Meta<Entity.Account>;
    owner?: Meta<Entity.Employee>;
    paymentPurpose: string;
    readonly printed: boolean;
    project?: Meta<Entity.Project>;
    readonly published: boolean;
    rate: DocumentRate;
    shared: boolean;
    salesChannel?: Meta<Entity.SalesChannel>;
    state?: Meta<Entity.State>;
    sum: number;
    syncId?: string;
    readonly updated: DateTime;
}

/**
 * Входящие платежи
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vhodqschij-platezh
 */
export declare interface PaymentInEndpoint {
    /**
     * Получить список входящих платежей
     *
     * @param options - Опции для получения списка
     * @returns Список входящих платежей
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vhodqschij-platezh-poluchit-vhodqschie-platezhi
     */
    list<T extends ListPaymentInsOptions = Record<string, unknown>>(options?: Subset<T, ListPaymentInsOptions>): Promise<ListResponse<GetFindResult<PaymentInModel, T["expand"]>, Entity.PaymentIn>>;
    /**
     * Получить все входящие платежи
     *
     * @param options - Опции для получения списка
     * @returns Список всех входящих платежей
     */
    all<T extends AllPaymentInsOptions = Record<string, unknown>>(options?: Subset<T, AllPaymentInsOptions>): Promise<BatchGetResult<GetFindResult<PaymentInModel, T["expand"]>, Entity.PaymentIn>>;
    /**
     * Получить входящий платеж по ID
     *
     * @param id - ID входящего платежа
     * @param options - Опции для получения входящего платежа
     * @returns Входящий платеж
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vhodqschij-platezh-poluchit-vhodqschij-platezh
     */
    get<T extends GetPaymentInOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetPaymentInOptions>): Promise<GetFindResult<PaymentInModel, T["expand"]>>;
    /**
     * Обновить входящий платеж
     *
     * @param id - ID входящего платежа
     * @param data - Данные для обновления
     * @param options - Опции для обновления
     * @returns Обновленный входящий платеж
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vhodqschij-platezh-izmenit-vhodqschij-platezh
     */
    update<T extends UpdatePaymentInOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<PaymentInModel>, options?: Subset<T, UpdatePaymentInOptions>): Promise<GetFindResult<PaymentInModel, T["expand"]>>;
    /**
     * Создать входящий платеж
     *
     * @param data - Данные для создания
     * @param options - Опции для создания
     * @returns Созданный входящий платеж
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vhodqschij-platezh-sozdat-vhodqschij-platezh
     */
    create<T extends CreatePaymentInOptions = Record<string, unknown>>(data: GetModelCreatableFields<PaymentInModel>, options?: Subset<T, CreatePaymentInOptions>): Promise<GetFindResult<PaymentInModel, T["expand"]>>;
    /**
     * Создать или обновить входящие платежи
     *
     * @param data - Данные для создания или обновления
     * @param options - Опции для создания или обновления
     * @returns Созданные или обновленные входящие платежи
     */
    upsert<T extends CreatePaymentInOptions = Record<string, unknown>>(data: (GetModelCreatableFields<PaymentInModel> | (GetModelUpdatableFields<PaymentInModel> & UpdateMeta<Entity.PaymentIn>))[], options?: Subset<T, CreatePaymentInOptions>): Promise<GetFindResult<PaymentInModel, T["expand"]>[]>;
    /**
     * Получить первый входящий платеж из списка
     *
     * @param options - Опции для получения
     * @returns Первый входящий платеж
     */
    first<T extends FirstPaymentInOptions = Record<string, unknown>>(options?: Subset<T, FirstPaymentInOptions>): Promise<ListResponse<GetFindResult<PaymentInModel, T["expand"]>, Entity.PaymentIn>>;
    /**
     * Получить количество входящих платежей
     *
     * @returns Количество входящих платежей
     */
    size(): Promise<number>;
    /**
     * Удалить входящий платеж
     *
     * @param id - ID входящего платежа
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vhodqschij-platezh-udalit-vhodqschij-platezh
     */
    delete(id: string): Promise<void>;
    /**
     * Массовое удаление входящих платежей
     *
     * @param ids - Массив ID входящих платежей
     * @returns Результат удаления
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
    /**
     * Переместить входящий платеж в корзину
     *
     * @param id - ID входящего платежа
     */
    trash(id: string): Promise<void>;
}

export declare interface PaymentInModel extends Model {
    object: PaymentIn;
    expandable: {
        agent: CounterpartyModel;
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        agentAccount: AccountModel;
        organizationAccount: AccountModel;
    };
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        agent: IdFilter;
        agentAccount: IdFilter;
        applicable: BooleanFilter;
        code: StringFilter;
        contract: IdFilter;
        created: DateTimeFilter;
        deleted: DateTimeFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        incomingDate: DateTimeFilter;
        incomingNumber: NumberFilter;
        moment: DateTimeFilter;
        name: StringFilter;
        organization: IdFilter;
        organizationAccount: IdFilter;
        owner: IdFilter;
        paymentPurpose: StringFilter;
        printed: BooleanFilter;
        project: IdFilter;
        published: BooleanFilter;
        shared: BooleanFilter;
        salesChannel: IdFilter;
        state: IdFilter;
        sum: NumberFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
    };
    orderableFields: "id" | "syncId" | "updated" | "updatedBy" | "name" | "description" | "externalCode" | "moment" | "applicable" | "sum" | "created" | "paymentPurpose" | "incomingDate" | "incomingNumber";
    requiredCreateFields: "agent" | "organization";
}

/**
 * Исходящий платёж
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-ishodqschie-platezhi
 */
export declare interface PaymentOut extends Idable, Meta<Entity.PaymentOut> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные контрагента, сотрудника или юр.лица */
    agent: Meta<Entity.Counterparty>;
    /** Метаданные счета контрагента или юр.лица */
    agentAccount?: Meta<Entity.Account>;
    /** Отметка о проведении */
    applicable: boolean;
    /**
     * Коллекция метаданных доп. полей.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-rabota-s-dopolnitel-nymi-polqmi
     */
    attributes?: unknown[];
    /** Код Исходящего платежа */
    code?: string;
    /** Метаданные договора */
    contract?: Meta<Entity.Contract>;
    /** Дата создания */
    readonly created: DateTime;
    /** Момент последнего удаления Исходящего платежа */
    readonly deleted?: DateTime;
    /** Комментарий Исходящего платежа */
    description?: string;
    /** Метаданные Статьи расходов */
    expenseItem: Meta<Entity.ExpenseItem>;
    /** Внешний код Исходящего платежа */
    externalCode: string;
    /**
     * Метаданные массива Файлов (Максимальное количество файлов - 100)
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-fajly
     */
    files: Meta<never>[];
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Дата документа */
    moment: DateTime;
    /** Наименование Исходящего платежа */
    name: string;
    /** Метаданные юрлица */
    organization: Meta<Entity.Organization>;
    /** Метаданные счета юрлица */
    organizationAccount?: Meta<Entity.Account>;
    /** Владелец (Сотрудник) */
    owner?: Meta<Entity.Employee>;
    /** Назначение платежа */
    paymentPurpose: string;
    /** Напечатан ли документ */
    readonly printed: boolean;
    /** Метаданные проекта */
    project?: Meta<Entity.Project>;
    /**
     * Валюта
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-obschie-swedeniq-valuta-w-dokumentah
     */
    rate: DocumentRate;
    /** Метаданные канала продаж */
    salesChannel?: Meta<Entity.SalesChannel>;
    /** Общий доступ */
    shared: boolean;
    /** Метаданные статуса Исходящего платежа */
    state?: Meta<Entity.State>;
    /** Сумма Входящего платежа в установленной валюте */
    sum: number;
    /** ID синхронизации. После заполнения недоступен для изменения */
    syncId?: string;
    /** Момент последнего обновления Исходящего платежа */
    readonly updated: DateTime;
    /** Сумма НДС */
    vatSum: number;
}

/**
 * Исходящие платежи
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-ishodqschie-platezhi
 */
export declare interface PaymentOutEndpoint {
    /**
     * Получить список исходящих платежей.
     *
     * @param options - Опции для получения списка
     * @returns Объект с списком исходящих платежей
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-poluchit-ishodqschie-platezhi
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.paymentOut.list();
     * ```
     */
    list<T extends ListPaymentOutsOptions = Record<string, unknown>>(options?: Subset<T, ListPaymentOutsOptions>): Promise<ListResponse<GetFindResult<PaymentOutModel, T["expand"]>, Entity.Product>>;
    /**
     * Получить все исходящие платежи с пагинацией.
     *
     * @param options - Опции для получения списка
     * @returns Массив исходящих платежей
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-poluchit-ishodqschie-platezhi
     *
     * @example
     * ```ts
     * const paymentOuts = await moysklad.paymentOut.all();
     * ```
     */
    all<T extends AllPaymentOutsOptions = Record<string, unknown>>(options?: Subset<T, AllPaymentOutsOptions>): Promise<BatchGetResult<GetFindResult<PaymentOutModel, T["expand"]>, Entity.BonusTransaction>>;
    /**
     * Получить первый исходящий платеж.
     *
     * @param options - Опции для получения списка
     * @returns Объект с списком исходящих платежей (лимит 1)
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-poluchit-ishodqschie-platezhi
     *
     * @example
     * ```ts
     * const { rows: [paymentOut] } = await moysklad.paymentOut.first();
     * ```
     */
    first<T extends FirstPaymentOutOptions = Record<string, unknown>>(options?: Subset<T, FirstPaymentOutOptions>): Promise<ListResponse<GetFindResult<PaymentOutModel, T["expand"]>, Entity.Product>>;
    /**
     * Получить исходящий платеж по ID.
     *
     * @param id - ID исходящего платежа
     * @param options - Опции для получения
     * @returns Исходящий платеж
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-poluchit-ishodqschij-platezh
     *
     * @example
     * ```ts
     * const paymentOut = await moysklad.paymentOut.get("a7404318-550f-11e8-56c0-001b21c78cd9");
     * ```
     */
    get<T extends GetPaymentOutOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetPaymentOutOptions>): Promise<GetFindResult<PaymentOutModel, T["expand"]>>;
    /**
     * Получить размер списка исходящих платежей.
     *
     * @returns Размер списка исходящих платежей
     *
     * @example
     * ```ts
     * const size = await moysklad.paymentOut.size();
     * ```
     */
    size(): Promise<number>;
    /**
     * Удалить исходящий платеж.
     *
     * @param id - ID исходящего платежа
     * @returns Void
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-udalit-ishodqschij-platezh
     *
     * @example
     * ```ts
     * await moysklad.paymentOut.delete("a7404318-550f-11e8-56c0-001b21c78cd9");
     * ```
     */
    delete(id: string): Promise<void>;
    /**
     * Обновить исходящий платеж.
     *
     * @param id - ID исходящего платежа
     * @param data - Данные для обновления
     * @param options - Опции для обновления
     * @returns Обновленный исходящий платеж
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-izmenit-ishodqschij-platezh
     *
     * @example
     * ```ts
     * const updatedPaymentOut = await moysklad.paymentOut.update(
     *   "a7404318-550f-11e8-56c0-001b21c78cd9",
     *   { name: "00002" }
     * );
     * ```
     */
    update<T extends UpdatePaymentOutOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<PaymentOutModel>, options?: Subset<T, UpdatePaymentOutOptions>): Promise<GetFindResult<PaymentOutModel, T["expand"]>>;
    /**
     * Создать исходящий платеж.
     *
     * @param data - Данные для создания
     * @param options - Опции для создания
     * @returns Созданный исходящий платеж
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-sozdat-ishodqschij-platezh
     *
     * @example
     * ```ts
     * const newPaymentOut = await moysklad.paymentOut.create({
     *   organization: {
     *     meta: {
     *       href: "https://api.moysklad.ru/api/remap/1.2/entity/organization/a7404318-550f-11e8-56c0-001b21c78cd9",
     *       type: "organization",
     *       mediaType: "application/json"
     *     }
     *   },
     *   agent: {
     *     meta: {
     *       href: "https://api.moysklad.ru/api/remap/1.2/entity/counterparty/a7404318-550f-11e8-56c0-001b21c78cd9",
     *       type: "counterparty",
     *       mediaType: "application/json"
     *     }
     *   },
     *   sum: 100000
     * });
     * ```
     */
    create<T extends CreatePaymentOutOptions = Record<string, unknown>>(data: ModelCreateOrUpdateData<PaymentOutModel>, options?: Subset<T, CreatePaymentOutOptions>): Promise<GetFindResult<PaymentOutModel, T["expand"]>>;
    /**
     * Массовое удаление исходящих платежей.
     *
     * @param ids - Массив ID исходящих платежей
     * @returns Результат массового удаления
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-massowoe-udalenie-ishodqschih-platezhej
     *
     * @example
     * ```ts
     * const result = await moysklad.paymentOut.batchDelete([
     *   "a7404318-550f-11e8-56c0-001b21c78cd9",
     *   "a7404318-550f-11e8-56c0-001b21c78cd8"
     * ]);
     * ```
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
    /**
     * Переместить исходящий платеж в корзину.
     *
     * @param id - ID исходящего платежа
     * @returns Void
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-ishodqschij-platezh-ishodqschij-platezh-peremestit-w-korzinu
     *
     * @example
     * ```ts
     * await moysklad.paymentOut.trash("a7404318-550f-11e8-56c0-001b21c78cd9");
     * ```
     */
    trash(id: string): Promise<void>;
}

/**
 * Модель исходящего платежа
 *
 * {@linkcode PaymentOut}
 */
export declare interface PaymentOutModel extends Model {
    object: PaymentOut;
    expandable: {
        agent: CounterpartyModel;
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        agentAccount: AccountModel;
        organizationAccount: AccountModel;
    };
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        agent: IdFilter;
        agentAccount: IdFilter;
        applicable: BooleanFilter;
        code: StringFilter;
        contract: IdFilter;
        created: DateTimeFilter;
        deleted: DateTimeFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        incomingDate: DateTimeFilter;
        incomingNumber: NumberFilter;
        moment: DateTimeFilter;
        name: StringFilter;
        organization: IdFilter;
        organizationAccount: IdFilter;
        owner: IdFilter;
        paymentPurpose: StringFilter;
        printed: BooleanFilter;
        project: IdFilter;
        published: BooleanFilter;
        shared: BooleanFilter;
        salesChannel: IdFilter;
    };
    orderableFields: "id" | "syncId" | "updated" | "updatedBy" | "name" | "description" | "externalCode" | "moment" | "applicable" | "sum";
    requiredCreateFields: "agent" | "expenseItem" | "organization";
}

export declare type PositionFields = "stock"[];

/**
 * Остатки и себестоимость в позициях документов
 *
 * Для получения остатков и себестоимости в позициях документа в запросе нужно передать дополнительный параметр `fields=stock`.
 *
 * Остатки и себестоимость для документов Отгрузка, Розничная продажа, Приемка, Возврат поставщику, Возврат покупателя, Розничный возврат расчитываются на момент поля `moment` в данных документах. Для Заказа покупателя, Счета покупателя, Заказа поставщика, Счета поставщика рассчитываются на текущий момент времени.
 *
 * При составлении запроса на получение списка операций нужно дополнительно передать параметр `limit` со значением, не превышающем 100.
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-ostatki-i-sebestoimost-w-poziciqh-dokumentow
 */
export declare interface PositionStockData {
    /** Сумма себестоимости. Для возврата покупателя без основания и розничного возврата без основания будет отсутствовать. */
    cost?: number;
    /** Количество */
    quantity: number;
    /** Зарезервировано */
    reserve: number;
    /** В транзите */
    intransit: number;
    /** Доступно */
    available: number;
}

export declare type PpeType = "2400001225408" | "2400001225606" | "2400001226108" | "2400001226306" | "2400001226405" | "2400001323807" | "2400001368105" | "2400001393107" | "2400001393503" | "2400001393602" | "2400001565306" | "2400001807703" | "2400001818303" | "2400001857005" | "2400001857203" | "2400001858309" | "2400001858507" | "2400002015909" | "2400002016005" | "2400002016104" | "2400002052805" | "2400002052904" | "2400002186203" | "2400002886707" | "2400002886806" | "2400002984502" | "2400003117107" | "2400003117206" | "2400003161209" | "2400003207907" | "2400003215308" | "2400003227806" | "2400003237409" | "2400003263408" | "2400003297700" | "2400003356704" | "2400003356803" | "2400003356902" | "2400003433108" | "2400003492303" | "2400003495700" | "2400003495809" | "2400003495908" | "2400003496004" | "2400003496103" | "2400003675805";

export declare interface PriceType extends Idable, Meta<Entity.PriceType> {
    name: string;
    externalCode: string;
}

/**
 * Техкарта
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-tehkarty
 */
export declare interface ProcessingPlan extends Idable, Meta<Entity.ProcessingPlan> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Добавлена ли Техкарта в архив */
    archived: boolean;
    /** Код Техкарты */
    code?: string;
    /** Стоимость производства */
    cost?: number;
    /** Тип распределения себестоимости */
    readonly costDistributionType: ProcessingPlanCostDistributionType;
    /** Внешний код техкарты */
    externalCode: string;
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Коллекция метаданных этапов Техкарты */
    stages: ListMeta<Entity.ProcessingPlanStages>;
    /** Коллекция метаданных материалов Техкарты */
    materials: ListMeta<Entity.ProcessingPlanMaterial>;
    /** Наименование техкарты */
    name: string;
    /** Владелец (Сотрудник) */
    owner: Meta<Entity.Employee>;
    /** Метаданные группы Техкарты */
    parent: Meta<Entity.ProcessingPlanFolder>;
    /** Наименование группы, в которую входит Техкарта */
    readonly pathName: string;
    /** Метаданные Техпроцесса */
    processingProcess: Meta<Entity.ProcessingProcess>;
    /** Коллекция метаданных готовых продуктов Техкарты */
    products: ListMeta<Entity.ProcessingPlanResult>;
    /** Общий доступ */
    shared: boolean;
    /** Дополнительные поля */
    attributes?: Attribute[];
    /** Момент последнего обновления техкарты */
    readonly updated: DateTime;
}

/** Тип распределения себестоимости */
export declare enum ProcessingPlanCostDistributionType {
    ByPrice = "BY_PRICE",
    ByProduction = "BY_PRODUCTION"
}

/**
 * Техкарты
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-tehkarty
 */
export declare interface ProcessingPlanEndpoint {
    /**
     * Получить массив техкарт.
     *
     * @param options - Опции для получения техкарт {@linkcode ListProcessingPlansOptions}
     * @returns Объект с массивом техкарт
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-poluchit-tehkarty
     *
     * @example Без опций (по умолчанию первые 1000 сущностей)
     * ```ts
     * const { rows } = await moysklad.processingPlan.list();
     * ```
     *
     * @example С expand
     * ```ts
     * const { rows } = await moysklad.processingPlan.list({
     *  expand: ["group", "owner"],
     * });
     * ```
     *
     * @example С фильтрами, сортировкой и пагинацией
     * ```ts
     * moysklad.processingPlan.list({
     *   filter: {
     *     archived: false,
     *   },
     *   order: { field: "name", direction: "desc" },
     *   pagination: {
     *     limit: 5,
     *     offset: 100,
     *   },
     * });
     * ```
     */
    list<T extends ListProcessingPlansOptions = Record<string, unknown>>(options?: Subset<T, ListProcessingPlansOptions>): Promise<ListResponse<GetFindResult<ProcessingPlanModel, T["expand"]>, Entity.ProcessingPlan>>;
    /**
     * Получить все техкарты.
     *
     * @param options - Опции для получения всех техкарт {@linkcode AllProcessingPlansOptions}
     * @returns Объект с массивом техкарт
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-poluchit-tehkarty
     *
     * @example С expand
     * ```ts
     * const { rows } = await moysklad.processingPlan.all({ expand: ["group", "owner"] });
     * ```
     */
    all<T extends AllProcessingPlansOptions = Record<string, unknown>>(options?: Subset<T, AllProcessingPlansOptions>): Promise<BatchGetResult<GetFindResult<ProcessingPlanModel, T["expand"]>, Entity.ProcessingPlan>>;
    /**
     * Получить техкарту по id.
     *
     * @param id - id техкарты
     * @param options - Опции для получения техкарты {@linkcode GetProcessingPlanOptions}
     * @returns Объект с техкартой {@linkcode ProcessingPlanModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-poluchit-tehkartu
     *
     * @example
     * ```ts
     * const processingPlan = await moysklad.processingPlan.get("5427bc76-b95f-11eb-0a80-04bb000cd583");
     * ```
     */
    get<T extends GetProcessingPlanOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetProcessingPlanOptions>): Promise<GetFindResult<ProcessingPlanModel, T["expand"]>>;
    /**
     * Изменить техкарту.
     *
     * @param id - id техкарты
     * @param data - данные для изменения техкарты
     * @param options - Опции для изменения техкарты {@linkcode UpdateProcessingPlanOptions}
     * @returns Объект с обновленной техкартой {@linkcode ProcessingPlanModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-izmenit-tehkartu
     */
    update<T extends UpdateProcessingPlanOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<ProcessingPlanModel>, options?: Subset<T, UpdateProcessingPlanOptions>): Promise<GetFindResult<ProcessingPlanModel, T["expand"]>>;
    /**
     * Получить первую техкарту.
     *
     * @param options - Опции для получения первой техкарты {@linkcode FirstProcessingPlanOptions}
     * @returns Объект с первой техкартой
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-poluchit-tehkarty
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.processingPlan.first({
     *  expand: ["group", "owner"],
     *  search: "123"
     * });
     * ```
     */
    first<T extends FirstProcessingPlanOptions = Record<string, unknown>>(options?: Subset<T, FirstProcessingPlanOptions>): Promise<ListResponse<GetFindResult<ProcessingPlanModel, T["expand"]>, Entity.ProcessingPlan>>;
    /**
     * Получить общее количество техкарт.
     *
     * @returns Общее количество техкарт
     */
    size(): Promise<number>;
    /**
     * Создать техкарту.
     *
     * @param data - данные для создания техкарты
     * @param options - Опции для создания техкарты {@linkcode UpdateProcessingPlanOptions}
     * @returns Объект с созданной техкартой {@linkcode ProcessingPlanModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-sozdat-tehkartu
     */
    create<T extends UpdateProcessingPlanOptions = Record<string, unknown>>(data: GetModelCreatableFields<ProcessingPlanModel>, options?: Subset<T, UpdateProcessingPlanOptions>): Promise<GetFindResult<ProcessingPlanModel, T["expand"]>>;
    /**
     * Массово создать и обновить техкарты.
     *
     * @param data - массив из объектов для создания и обновления техкарт
     * @param options - Опции для создания и обновления техкарт {@linkcode UpdateProcessingPlanOptions}
     * @returns Массив с созданными и обновленными техкартами {@linkcode ProcessingPlanModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-massowoe-sozdanie-i-obnowlenie-tehkart
     */
    upsert<T extends UpdateProcessingPlanOptions = Record<string, unknown>>(data: (GetModelCreatableFields<ProcessingPlanModel> | (GetModelUpdatableFields<ProcessingPlanModel> & UpdateMeta<Entity.ProcessingPlan>))[], options?: Subset<T, UpdateProcessingPlanOptions>): Promise<GetFindResult<ProcessingPlanModel, T["expand"]>[]>;
    /**
     * Удалить техкарту по id.
     * @param id - id техкарты
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-udalit-tehkartu
     */
    delete(id: string): Promise<void>;
    /**
     * Массово удалить техкарты.
     *
     * @param ids - массив id техкарт
     * @returns Массив с результатами удаления техкарт
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-massowoe-udalenie-tehkart
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
}

/** Группа техкарт
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-gruppa-tehkart
 */
export declare interface ProcessingPlanFolder extends Idable, Meta<Entity.ProcessingPlanFolder> {
    /** ID учётной записи */
    readonly accountId: string;
    /** Добавлена ли Группа техкарт в архив */
    archived: boolean;
    /** Внешний код Группы техкарт */
    externalCode: string;
    /** Код Группы техкарт */
    code?: string;
    /** Описание Группы техкарт */
    description?: string;
    /** Метаданные отдела сотрудника */
    group: Meta<Entity.Group>;
    /** Наименование Группы техкарт */
    name: string;
    /** Владелец (Сотрудник) */
    owner: Meta<Entity.Employee>;
    /** Наименование Группы техкарт, в которую входит данная Группа техкарт */
    readonly pathName: string;
    /** Общий доступ */
    shared: boolean;
    /** Момент последнего обновления сущности */
    readonly updated: DateTime;
}

export declare interface ProcessingPlanFolderModel extends Model {
    object: ProcessingPlanFolder;
    expandable: {
        group: GroupModel;
        owner: EmployeeModel;
    };
}

/**
 * Материал техкарты
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-materialy-tehkarty
 */
export declare interface ProcessingPlanMaterial extends Idable, Meta<Entity.ProcessingPlanMaterial> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные товара или модификации позиции */
    assortment: Meta<AssortmentEntity>;
    /** Метаданные товара позиции.
     *
     * В случае, если в поле assortment указана модификация, то это поле содержит товар, к которому относится эта модификация
     */
    product: Meta<Entity.Product>;
    /** Количество товаров данного вида в позиции */
    quantity: number;
    /** Метаданные позиции Техпроцесса */
    processingProcessPosition: Meta<Entity.ProcessingProcessPosition>;
    /** Метаданные техкарты материала  */
    readonly materialProcessingPlan?: Meta<Entity.ProcessingPlan>;
}

export declare interface ProcessingPlanMaterialModel extends Model {
    object: ProcessingPlanMaterial;
    expandable: {
        assortment: AssortmentModel;
        product: ProductModel;
    };
}

export declare interface ProcessingPlanModel extends Model {
    object: ProcessingPlan;
    expandable: {
        group: GroupModel;
        stages: ProcessingPlanStageModel;
        materials: ProcessingPlanMaterialModel;
        owner: EmployeeModel;
        parent: ProcessingPlanFolderModel;
        processingProcess: ProcessingProcessModel;
        products: ProcessingPlanProductModel;
    };
}

/**
 * Продукт техкарты
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-produkty-tehkarty
 */
export declare interface ProcessingPlanProduct extends Idable, Meta<Entity.ProcessingPlanResult> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные товара или модификации позиции */
    assortment: Meta<AssortmentEntity>;
    /** Метаданные товара позиции.
     *
     * В случае, если в поле assortment указана модификация, то это поле содержит товар, к которому относится эта модификация
     */
    product: Meta<Entity.Product>;
    /** Количество товаров данного вида в позиции */
    quantity: number;
}

export declare interface ProcessingPlanProductModel extends Model {
    object: ProcessingPlanProduct;
    expandable: {
        assortment: AssortmentModel;
        product: ProductModel;
    };
}

/**
 * Этап техкарты
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehkarta-jetapy-tehkarty
 */
export declare interface ProcessingPlanStage extends Idable, Meta<Entity.ProcessingPlanStages> {
    /** Стоимость производства, на определенном этапе */
    cost: number;
    /** Оплата труда, на определенном этапе */
    labourCost: number;
    /** Нормо-часы, на определенном этапе */
    standardHour: number;
    /** Метаданные позиции техпроцесса */
    processingProcessPosition: Meta<Entity.ProcessingProcessPosition>;
}

export declare interface ProcessingPlanStageModel extends Model {
    object: ProcessingPlanStage;
}

/**
 * Техпроцесс
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehprocess-tehprocessy
 */
export declare interface ProcessingProcess extends Idable, Meta<Entity.ProcessingProcess> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Добавлен ли Техпроцесс в архив */
    archived: boolean;
    /** Комментарий Техпроцесса */
    description?: string;
    /** Внешний код Техпроцесса */
    externalCode: string;
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Наименование Техпроцесса */
    name: string;
    /** Владелец (Сотрудник) */
    owner: Meta<Entity.Employee>;
    /** Метаданные позиций Техпроцесса */
    positions: ListMeta<Entity.ProcessingProcessPosition>;
    /** Общий доступ */
    shared: boolean;
    /** Момент последнего обновления сущности */
    readonly updated: DateTime;
}

export declare interface ProcessingProcessModel extends Model {
    object: ProcessingProcess;
    expandable: {
        group: GroupModel;
        owner: EmployeeModel;
    };
}

/**
 * Позиция техпроцесса
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-tehprocess-poluchit-pozicii-tehprocessa
 */
export declare interface ProcessingProcessPosition extends Idable, Meta<Entity.ProcessingProcessPosition> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные этапа, который представляет собой позиция */
    processingstage: Meta<Entity.ProcessingStage>;
}

export declare interface ProcessingProcessPositionModel extends Model {
    object: ProcessingProcessPosition;
    expandable: {
        processingstage: ProcessingStageModel;
    };
}

/**
 * Этап производства
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jetap-proizwodstwa
 */
export declare interface ProcessingStage extends Idable, Meta<Entity.ProcessingStage> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Признак доступности назначения на этап любого сотрудника */
    allPerformers: boolean;
    /** Добавлен ли Этап в архив */
    archived: boolean;
    /** Комментарий Этапа */
    description?: string;
    /** Внешний код ЭтапаВнешний код Этапа */
    externalCode: string;
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Метаданные склада материалов */
    materialStore: Meta<Entity.Store>;
    /** Наименование Этапа */
    name: string;
    /** Владелец (Сотрудник) */
    owner: Meta<Entity.Employee>;
    /** Метаданные возможных исполнителей */
    performers: ListMeta<Entity.Employee>;
    /** Общий доступ */
    shared: boolean;
    /** Момент последнего обновления этапа */
    readonly updated: DateTime;
}

export declare interface ProcessingStageModel extends Model {
    object: ProcessingStage;
    expandable: {
        group: GroupModel;
        owner: EmployeeModel;
    };
}

export declare interface Product extends Idable, Meta<Entity.Product> {
    readonly accountId: string;
    alcoholic?: {
        excise?: number;
        type?: number;
        strength?: number;
        volume?: number;
    };
    archived: boolean;
    article?: string;
    attributes?: Attribute[];
    barcodes?: Barcodes;
    buyPrice?: {
        value: number;
        currency: Meta<Entity.Currency>;
    };
    code?: string;
    country?: Meta<Entity.Country>;
    description?: string;
    discountProhibited: boolean;
    readonly effectiveVat?: number;
    readonly effectiveVatEnabled?: boolean;
    externalCode: string;
    files?: unknown[];
    group: Meta<Entity.Group>;
    images?: unknown[];
    isSerialTrackable?: boolean;
    minimumBalance?: number;
    name: string;
    owner?: Meta<Entity.Employee>;
    packs?: {
        barcodes?: Barcodes;
        readonly id: string;
        quantity: number;
        uom: Meta<Entity.Uom>;
    }[];
    partialDisposal?: boolean;
    readonly pathName: string;
    paymentItemType?: ProductPaymentItemType;
    ppeType?: PpeType;
    productFolder?: Meta<Entity.ProductFolder>;
    salePrices?: {
        value: number;
        currency: Meta<Entity.Currency>;
        priceType: PriceType;
    }[];
    shared: boolean;
    supplier?: Meta<Entity.Counterparty>;
    readonly syncId?: string;
    taxSystem?: TaxSystem;
    things?: string[];
    tnved?: string;
    trackingType?: TrackingType;
    uom?: Meta<Entity.Uom>;
    readonly updated: DateTime;
    useParentVat: boolean;
    readonly variantsCount: number;
    vat?: number;
    vatEnabled?: boolean;
    volume?: number;
    weight?: number;
}

export declare type ProductAssortmentModel = ProductModel & {
    object: AssortmentFields;
};

export declare interface ProductAttribute extends BaseAttribute {
    type: AttributeType.Product;
    value: Meta<Entity.Product> & {
        name: string;
    };
}

/**
 * Товары
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar
 */
export declare interface ProductEndpoint {
    /**
     * Получить список товаров.
     *
     * @param options - Опции для получения списка
     * @returns Объект с списком товаров
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-poluchit-spisok-towarow
     */
    list<T extends ListProductsOptions = Record<string, unknown>>(options?: Subset<T, ListProductsOptions>): Promise<ListResponse<GetFindResult<ProductModel, T["expand"]>, Entity.Product>>;
    /**
     * Получить все товары.
     *
     * @param options - Опции для получения списка
     * @returns Массив товаров
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-poluchit-spisok-towarow
     */
    all<T extends AllProductsOptions = Record<string, unknown>>(options?: Subset<T, AllProductsOptions>): Promise<BatchGetResult<GetFindResult<ProductModel, T["expand"]>, Entity.BonusTransaction>>;
    /**
     * Получить первый товар из списка.
     *
     * @param options - Опции для получения списка
     * @returns Объект с списком товаров (с ограничением в 1 элемент)
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-poluchit-spisok-towarow
     */
    first<T extends FirstProductOptions = Record<string, unknown>>(options?: Subset<T, FirstProductOptions>): Promise<ListResponse<GetFindResult<ProductModel, T["expand"]>, Entity.Product>>;
    /**
     * Получить товар по ID.
     *
     * @param id - ID товара
     * @param options - Опции для получения товара
     * @returns Товар
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-poluchit-towar
     */
    get<T extends GetProductOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetProductOptions>): Promise<GetFindResult<ProductModel, T["expand"]>>;
    /**
     * Получить размер списка товаров.
     *
     * @returns Количество товаров
     */
    size(): Promise<number>;
    /**
     * Удалить товар.
     *
     * @param id - ID товара
     * @returns Void
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-udalit-towar
     */
    delete(id: string): Promise<void>;
    /**
     * Обновить товар.
     *
     * @param id - ID товара
     * @param data - Данные для обновления
     * @param options - Опции для обновления
     * @returns Обновленный товар
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-izmenit-towar
     */
    update<T extends UpdateProductOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<ProductModel>, options?: Subset<T, UpdateProductOptions>): Promise<GetFindResult<ProductModel, T["expand"]>>;
    /**
     * Создать или обновить товар.
     *
     * @param data - Данные для создания или обновления
     * @param options - Опции для создания или обновления
     * @returns Созданный или обновленный товар
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-sozdat-towar
     */
    upsert<TData extends ModelCreateOrUpdateData<ProductModel>, TOptions extends UpsertProductsOptions = Record<string, unknown>>(data: TData, options?: Subset<TOptions, UpsertProductsOptions>): Promise<MatchArrayType<TData, GetFindResult<ProductModel, TOptions["expand"]>>>;
    /**
     * Массовое удаление товаров.
     *
     * @param ids - Массив ID товаров
     * @returns Результат удаления
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-massowoe-udalenie-towarow
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
    /**
     * Переместить товар в корзину.
     *
     * @param id - ID товара
     * @returns Void
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-towar-w-korzinu
     */
    trash(id: string): Promise<void>;
}

/**
 * Позиция производственного задания
 *
 * {@linkcode ProductionTask}
 */
export declare interface ProductionRow extends Idable, Meta<Entity.ProductionRow> {
    /** ID учётной записи */
    readonly accountId: string;
    /** Внешний код */
    externalCode?: string;
    /** Наименование */
    name?: string;
    /** Метаданные техкарты */
    processingPlan: Meta<Entity.ProcessingPlan>;
    /** Объём производства */
    productionVolume: number;
    /** Момент последнего обновления производственного задания */
    readonly updated: DateTime;
}

/**
 * Модель позиции производственного задания
 *
 * {@linkcode ProductionRow}
 */
export declare interface ProductionRowModel extends Model {
    object: ProductionRow;
}

/**
 * Производственные этапы
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-proizwodstwennye-atapy
 */
export declare interface ProductionStage extends Idable, Meta<Entity.ProductionStage> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Затраты на оплату труда за единицу объема производства */
    labourUnitCost?: number;
    /** Метаданные Материалов производственного этапа */
    materials: {
        /** ID учетной записи */
        readonly accountId: string;
        /** Метаданные товара/услуги/серии/модификации */
        assortment: Meta<Entity.Assortment>;
        /** ID позиции */
        readonly id: string;
        /** Количество товаров/модификаций данного вида в позиции */
        planQuantity: number;
    }[];
    /** Метаданные склада материалов */
    readonly materialStore?: Meta<Entity.Store>;
    /** Индекс Производственного этапа в Позиции производственного задания */
    readonly orderingPosition: number;
    /** Метаданные Этапа производства */
    readonly stage: Meta<Entity.ProcessingStage>;
    /** Метаданные Позиции производственного задания */
    readonly productionRow: Meta<Entity.ProductionRow>;
    /** Объем Производственного этапа. Соответствует объему Позиции производственного задания */
    readonly totalQuantity?: number;
    /** Выполненное количество */
    readonly completedQuantity?: number;
    /** Количество, доступное к выполнению */
    readonly availableQuantity?: number;
    /** Количество, которое на данный момент выполнять нельзя */
    readonly blockedQuantity?: number;
    /** Количество, которое не будет выполнено */
    readonly skippedQuantity?: number;
    /** Затраты на единицу объема производства */
    processingUnitCost?: number;
    /** Нормо-часы единицы объема производства */
    standardHourUnit?: number;
}

declare interface ProductionStageComletionMethods {
    materials: {
        /**
         * Получить материалы выполнения этапа производства.
         *
         * @param options - Опции для получения материалов выполнения этапа производства {@linkcode ListProductionStageCompletionMaterialsOptions}
         * @returns Объект с массивом материалов выполнения этапа производства
         */
        list<T extends ListProductionStageCompletionMaterialsOptions = Record<string, unknown>>(options?: Subset<T, ListProductionStageCompletionMaterialsOptions>): Promise<ListResponse<GetFindResult<ProductionStageCompletionMaterialModel, T["expand"]>, Entity.ProductionStageCompletionMaterial>>;
        /**
         * Добавить материал выполнения этапа производства.
         *
         * @param data - данные для создания материала выполнения этапа производства
         * @param options - Опции для создания материала выполнения этапа производства {@linkcode CreateProductionStageCompletionMaterialOptions}
         * @returns Объект с созданным материалом выполнения этапа производства {@linkcode ProductionStageCompletionMaterialModel}
         */
        create<T extends CreateProductionStageCompletionMaterialOptions = Record<string, unknown>>(data: GetModelCreatableFields<ProductionStageCompletionMaterialModel>, options?: Subset<T, CreateProductionStageCompletionMaterialOptions>): Promise<GetFindResult<ProductionStageCompletionMaterialModel, T["expand"]>>;
        /**
         * Обновить материал выполнения этапа производства.
         *
         * @param id - id материала выполнения этапа производства
         * @param data - данные для обновления материала выполнения этапа производства
         * @param options - Опции для обновления материала выполнения этапа производства {@linkcode UpdateProductionStageCompletionMaterialOptions}
         * @returns Объект с обновленным материалом выполнения этапа производства {@linkcode ProductionStageCompletionMaterialModel}
         */
        update<T extends UpdateProductionStageCompletionMaterialOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<ProductionStageCompletionMaterialModel>, options?: Subset<T, UpdateProductionStageCompletionMaterialOptions>): Promise<GetFindResult<ProductionStageCompletionMaterialModel, T["expand"]>>;
        /**
         * Получить первый материал выполнения этапа производства.
         *
         * @param options - Опции для получения первого материала выполнения этапа производства {@linkcode FirstProductionStageCompletionMaterialOptions}
         * @returns Объект с первым материалом выполнения этапа производства
         */
        first<T extends FirstProductionStageCompletionMaterialOptions = Record<string, unknown>>(options?: Subset<T, FirstProductionStageCompletionMaterialOptions>): Promise<ListResponse<GetFindResult<ProductionStageCompletionMaterialModel, T["expand"]>, Entity.ProductionStageCompletionMaterial>>;
        /**
         * Получить общее количество материалов выполнения этапа производства.
         *
         * @returns Общее количество материалов выполнения этапа производства
         */
        size(): Promise<number>;
    };
    products: {
        /**
         * Получить продукты выполнения этапа производства.
         *
         * @param options - Опции для получения продуктов выполнения этапа производства {@linkcode ListProductionStageCompletionResultsOptions}
         * @returns Объект с массивом продуктов выполнения этапа производства
         */
        list<T extends ListProductionStageCompletionResultsOptions = Record<string, unknown>>(options?: Subset<T, ListProductionStageCompletionResultsOptions>): Promise<ListResponse<GetFindResult<ProductionStageCompletionResultModel, T["expand"]>, Entity.ProductionStageCompletionResult>>;
        /**
         * Обновить продукт выполнения этапа производства.
         *
         * @param id - id продукта выполнения этапа производства
         * @param data - данные для обновления продукта выполнения этапа производства
         * @param options - Опции для обновления продукта выполнения этапа производства {@linkcode UpdateProductionStageCompletionResultOptions}
         * @returns Объект с обновленным продуктом выполнения этапа производства {@linkcode ProductionStageCompletionResultModel}
         */
        update<T extends UpdateProductionStageCompletionResultOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<ProductionStageCompletionResultModel>, options?: Subset<T, UpdateProductionStageCompletionResultOptions>): Promise<GetFindResult<ProductionStageCompletionResultModel, T["expand"]>>;
        /**
         * Получить первый продукт выполнения этапа производства.
         *
         * @param options - Опции для получения первого продукта выполнения этапа производства {@linkcode FirstProductionStageCompletionResultOptions}
         * @returns Объект с первым продуктом выполнения этапа производства
         */
        first<T extends FirstProductionStageCompletionResultOptions = Record<string, unknown>>(options?: Subset<T, FirstProductionStageCompletionResultOptions>): Promise<ListResponse<GetFindResult<ProductionStageCompletionResultModel, T["expand"]>, Entity.ProductionStageCompletionResult>>;
        /**
         * Получить общее количество продуктов выполнения этапа производства.
         *
         * @returns Общее количество продуктов выполнения этапа производства
         */
        size(): Promise<number>;
    };
}

/**
 * Выполнение этапа производства
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vypolnenie-atapa-proizwodstwa-vypolneniq-atapow-proizwodstwa
 */
export declare interface ProductionStageCompletion extends Idable, Meta<Entity.ProductionStageCompletion> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Дата создания */
    readonly created: DateTime;
    /** Внешний код Выполнения этапа производства */
    externalCode: string;
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Оплата труда за единицу объема производства */
    labourUnitCost: number;
    /** Нормо-часы единицы объема производства */
    standardHourUnit: number;
    /** Метаданные Материалов выполнения этапа производства */
    materials?: ListMeta<AssortmentEntity>;
    /** Дата документа */
    moment: DateTime;
    /** Наименование Выполнения этапа производства */
    name: string;
    /** Владелец (Сотрудник) */
    owner?: Meta<Entity.Employee>;
    /** Исполнитель (Сотрудник) */
    performer?: Meta<Entity.Employee>;
    /** Затраты на единицу объема производства */
    processingUnitCost: number;
    /** Производственный этап */
    readonly productionStage: Meta<Entity.ProductionStage>;
    /** Объем производства */
    productionVolume: number;
    /** Метаданные Продуктов выполнения этапа производства */
    products?: ListMeta<AssortmentEntity>;
    /** Общий доступ */
    shared: boolean;
    /** Момент последнего обновления Выполнения этапа производства */
    readonly updated: DateTime;
}

/**
 * Выполнения этапов производства
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vypolnenie-atapa-proizwodstwa
 */
export declare type ProductionStageCompletionEndpoint = {
    /**
     * Получить массив выполнения этапов производства.
     *
     * @param options - Опции для получения выполнения этапов производства {@linkcode ListProductionStageCompletionsOptions}
     * @returns Объект с массивом выполнений этапов производства
     */
    list<T extends ListProductionStageCompletionsOptions = Record<string, unknown>>(options?: Subset<T, ListProductionStageCompletionsOptions>): Promise<ListResponse<GetFindResult<ProductionStageCompletionModel, T["expand"]>, Entity.ProductionStageCompletion>>;
    /**
     * Получить все выполнения этапов производства.
     *
     * @param options - Опции для получения всех выполнений этапов производства {@linkcode AllProductionStageCompletionsOptions}
     * @returns Объект с массивом выполнений этапов производства
     */
    all<T extends AllProductionStageCompletionOptions = Record<string, unknown>>(options?: Subset<T, AllProductionStageCompletionOptions>): Promise<BatchGetResult<GetFindResult<ProductionStageCompletionModel, T["expand"]>, Entity.ProductionStageCompletion>>;
    /**
     * Получить выполнение этапа производства по id.
     *
     * @param id - id выполнения этапа производства
     * @param options - Опции для получения выполнения этапа производства {@linkcode GetProductionStageCompletionOptions}
     * @returns Объект с выполнением этапа производства {@linkcode ProductionStageCompletionModel}
     */
    get<T extends GetProductionStageCompletionOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetProductionStageCompletionOptions>): Promise<GetFindResult<ProductionStageCompletionModel, T["expand"]>>;
    /**
     * Изменить выполнение этапа производства.
     *
     * @param id - id выполнения этапа производства
     * @param data - данные для изменения выполнения этапа производства
     * @param options - Опции для изменения выполнения этапа производства {@linkcode UpdateProductionStageCompletionOptions}
     * @returns Объект с обновленным выполнением этапа производства {@linkcode ProductionStageCompletionModel}
     */
    update<T extends UpdateProductionStageCompletionOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<ProductionStageCompletionModel>, options?: Subset<T, UpdateProductionStageCompletionOptions>): Promise<GetFindResult<ProductionStageCompletionModel, T["expand"]>>;
    /**
     * Создать выполнение этапа производства.
     *
     * @param data - данные для создания выполнения этапа производства
     * @param options - Опции для создания выполнения этапа производства {@linkcode CreateProductionStageCompletionOptions}
     * @returns Объект с созданным выполнением этапа производства {@linkcode ProductionStageCompletionModel}
     */
    create<T extends CreateProductionStageCompletionOptions = Record<string, unknown>>(data: GetModelCreatableFields<ProductionStageCompletionModel>, options?: Subset<T, CreateProductionStageCompletionOptions>): Promise<GetFindResult<ProductionStageCompletionModel, T["expand"]>>;
    /**
     * Массово создать и обновить выполнения этапов производства
     *
     * @param data - массив из объектов для создания и обновления выполнения этапов производства
     * @param options - Опции для создания и обновления выполнения этапов производства {@linkcode CreateProductionStageCompletionOptions}
     * @returns Массив с созданными и обновленными выполнения этапов производства {@linkcode ProductionStageCompletionModel}
     */
    upsert<T extends CreateProductionStageCompletionOptions = Record<string, unknown>>(data: (GetModelCreatableFields<ProductionStageCompletionModel> | (GetModelUpdatableFields<ProductionStageCompletionModel> & UpdateMeta<Entity.ProductionStageCompletion>))[], options?: Subset<T, CreateProductionStageCompletionOptions>): Promise<GetFindResult<ProductionStageCompletionModel, T["expand"]>[]>;
    /**
     * Получить первое выполнение этапа производства.
     *
     * @param options - Опции для получения первого выполнения этапа производства {@linkcode FirstProductionStageCompletionOptions}
     * @returns Объект с первым выполнением этапа производства
     */
    first<T extends FirstProductionStageCompletionOptions = Record<string, unknown>>(options?: Subset<T, FirstProductionStageCompletionOptions>): Promise<ListResponse<GetFindResult<ProductionStageCompletionModel, T["expand"]>, Entity.ProductionStageCompletion>>;
    /**
     * Получить общее количество выполнений этапов производства.
     * @returns Общее количество выполнений этапов производства
     */
    size(): Promise<number>;
    /**
     * Удалить выполнение этапа производства по id.
     *
     * @param id - id выполнения этапа производства
     */
    delete(id: string): Promise<void>;
    /**
     * Массово удалить выполнения этапов производства.
     *
     * @param ids - массив id выполнений этапов производства
     * @returns Массив с результатами удаления выполнений этапов производства
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
} & {
    [key: string]: ProductionStageComletionMethods;
};

/**
 * Материал выполнения этапа производства
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vypolnenie-atapa-proizwodstwa-materialy-wypolneniq-atapa-proizwodstwa
 */
export declare interface ProductionStageCompletionMaterial extends Idable, Meta<Entity.ProductionStageCompletionMaterial> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Израсходованное количество */
    consumedQuantity: number;
    /** Метаданные ассортимента */
    assortment: Meta<AssortmentEntity>;
    /** Серийные номера (только для товаров с серийным учетом) */
    things?: string[];
}

export declare interface ProductionStageCompletionMaterialModel extends Model {
    object: ProductionStageCompletionMaterial;
    expandable: {
        assortment: AssortmentModel;
    };
    requiredCreateFields: "consumedQuantity" | "assortment";
}

export declare interface ProductionStageCompletionModel extends Model {
    object: ProductionStageCompletion;
    expandable: {
        group: GroupModel;
        materials: AssortmentModel;
        owner: EmployeeModel;
        performer: EmployeeModel;
        products: AssortmentModel;
    };
    filters: {
        id: IdFilter;
        moment: DateTimeFilter;
    };
    requiredCreateFields: "productionStage" | "productionVolume";
}

/**
 * Продукт выполнения этапа производства
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vypolnenie-atapa-proizwodstwa-produkty-wypolneniq-atapa-proizwodstwa
 */
export declare interface ProductionStageCompletionResult extends Idable, Meta<Entity.ProductionStageCompletionResult> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Произведённое количество */
    producedQuantity: number;
    /** Метаданные ассортимента */
    readonly assortment: Meta<AssortmentEntity>;
    /** Серийные номера (только для товаров с серийным учетом) */
    things?: string[];
}

export declare interface ProductionStageCompletionResultModel extends Model {
    object: ProductionStageCompletionResult;
    expandable: {
        assortment: AssortmentModel;
    };
}

/**
 * Производственные этапы
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-proizwodstwennye-atapy
 */
export declare interface ProductionStageEndpoint {
    /**
     * Получить массив производственных этапов.
     *
     * @param options - Опции для получения производственных этапов {@linkcode ListProductionStagesOptions}
     * @returns Объект с массивом производственных этапов
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-proizwodstwennye-atapy-poluchit-proizwodstwennye-atapy
     *
     * @example С фильтрами, сортировкой и пагинацией
     * ```ts
     * const { rows } = await moysklad.productionStage.list({
     *   filter: {
     *     productionTask: "5427bc76-b95f-11eb-0a80-04bb000cd583"
     *   },
     *   order: { field: "orderingPosition", direction: "asc" },
     *   pagination: {
     *     limit: 5,
     *     offset: 10
     *   }
     * });
     * ```
     */
    list<T extends ListProductionStagesOptions>(options: Subset<T, ListProductionStagesOptions>): Promise<ListResponse<GetFindResult<ProductionStageModel, T["expand"]>, Entity.ProductionStage>>;
    /**
     * Получить все производственные этапы.
     *
     * @param options - Опции для получения всех производственных этапов {@linkcode AllProductionStagesOptions}
     * @returns Объект с массивом производственных этапов
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-proizwodstwennye-atapy-poluchit-proizwodstwennye-atapy
     *
     * @example С фильтром по производственному заданию
     * ```ts
     * const { rows } = await moysklad.productionStage.all({
     *   filter: {
     *     productionTask: "5427bc76-b95f-11eb-0a80-04bb000cd583"
     *   }
     * });
     * ```
     */
    all<T extends AllProductionStagesOptions>(options: Subset<T, AllProductionStagesOptions>): Promise<BatchGetResult<GetFindResult<ProductionStageModel, T["expand"]>, Entity.ProductionStage>>;
    /**
     * Получить производственный этап по id.
     *
     * @param id - id производственного этапа
     * @param options - Опции для получения производственного этапа {@linkcode GetProductionStageOptions}
     * @returns Объект с производственным этапом {@linkcode ProductionStageModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-proizwodstwennye-atapy-poluchit-proizwodstwennyj-atap
     *
     * @example
     * ```ts
     * const stage = await moysklad.productionStage.get("5427bc76-b95f-11eb-0a80-04bb000cd583");
     * ```
     */
    get<T extends GetProductionStageOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetProductionStageOptions>): Promise<GetFindResult<ProductionStageModel, T["expand"]>>;
    /**
     * Изменить производственный этап.
     *
     * @param id - id производственного этапа
     * @param data - данные для изменения производственного этапа
     * @param options - Опции для изменения производственного этапа {@linkcode UpdateProductionStageOptions}
     * @returns Объект с обновленным производственным этапом {@linkcode ProductionStageModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-proizwodstwennye-atapy-izmenit-proizwodstwennyj-atap
     *
     * @example
     * ```ts
     * await moysklad.productionStage.update("5427bc76-b95f-11eb-0a80-04bb000cd583", {
     *   labourUnitCost: 100,
     *   processingUnitCost: 200
     * });
     * ```
     */
    update<T extends UpdateProductionStageOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<ProductionStageModel>, options?: Subset<T, UpdateProductionStageOptions>): Promise<GetFindResult<ProductionStageModel, T["expand"]>>;
    /**
     * Получить первый производственный этап.
     *
     * @param options - Опции для получения первого производственного этапа {@linkcode FirstProductionStageOptions}
     * @returns Объект с первым производственным этапом
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-proizwodstwennye-atapy-poluchit-proizwodstwennye-atapy
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productionStage.first({
     *   filter: {
     *     productionTask: "5427bc76-b95f-11eb-0a80-04bb000cd583"
     *   }
     * });
     * ```
     */
    first<T extends FirstProductionStageOptions>(options: Subset<T, FirstProductionStageOptions>): Promise<ListResponse<GetFindResult<ProductionStageModel, T["expand"]>, Entity.ProductionStage>>;
    /**
     * Получить общее количество производственных этапов.
     *
     * @param options - Опции для получения количества производственных этапов {@linkcode FirstProductionStageOptions}
     * @returns Общее количество производственных этапов
     */
    size(options: FirstProductionStageOptions): Promise<number>;
}

export declare interface ProductionStageModel extends Model {
    /** Основная сущность производственного этапа {@linkcode ProductionStage} */
    object: ProductionStage;
    expandable: {
        stage: ProcessingStageModel;
        productionRow: ProductionRowModel;
    };
    orderableFields: "id" | "accountId" | "labourUnitCost" | "orderingPosition" | "totalQuantity" | "completedQuantity" | "availableQuantity" | "blockedQuantity" | "skippedQuantity" | "processingUnitCost" | "standardHourUnit";
    requiredCreateFields: "stage" | "productionRow";
    filters: {
        accountId: IdFilter;
        id: IdFilter;
        productionTask: IdFilter;
        labourUnitCost: NumberFilter;
        materialStore: IdFilter;
        orderingPosition: NumberFilter;
        stage: IdFilter;
        productionRow: IdFilter;
        totalQuantity: NumberFilter;
        completedQuantity: NumberFilter;
        availableQuantity: NumberFilter;
        blockedQuantity: NumberFilter;
        skippedQuantity: NumberFilter;
        processingUnitCost: NumberFilter;
        standardHourUnit: NumberFilter;
    };
}

/**
 * Производственное задание
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie
 */
export declare interface ProductionTask extends Idable, Meta<Entity.ProductionTask> {
    /** ID учётной записи */
    readonly accountId: string;
    /** Отметка о проведении */
    applicable: boolean;
    /** Доп. поля */
    attributes?: Attribute[];
    /** Флаг ожидания продукта Производственного задания */
    awaiting?: boolean;
    /** Код */
    code?: string;
    /** Дата создания */
    readonly created: DateTime;
    /** Момент удаления */
    readonly deleted?: DateTime;
    /** Планируемая дата выполнения */
    deliveryPlannedMoment?: DateTime;
    /** Комментарий */
    description?: string;
    /** Внешний код */
    externalCode: string;
    /** Метаданные массива Файлов (Максимальное количество файлов - 100) */
    files: ListMeta<Entity.Files>;
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Метаданные склада материалов */
    materialsStore?: Meta<Entity.Store>;
    /** Дата документа */
    moment: DateTime;
    /** Наименование Производственного задания */
    name: string;
    /** Метаданные юрлица */
    organization: Meta<Entity.Organization>;
    /** Владелец (Сотрудник) */
    owner?: Meta<Entity.Employee>;
    /** Напечатан ли документ */
    readonly printed: boolean;
    /** Метаданные Позиций производственного задания */
    productionRows: ListMeta<Entity.ProductionRow>;
    /** Дата окончания производства */
    readonly productionEnd?: DateTime;
    /** Дата начала производства */
    productionStart?: DateTime;
    /** Метаданные производимой продукции */
    products: ListMeta<Entity.ProductionTaskResult>;
    /** Метаданные склада продукции */
    productsStore?: Meta<Entity.Store>;
    /** Опубликован ли документ */
    readonly published: boolean;
    /** Флаг резервирования материала Производственного задания */
    reserve?: boolean;
    /** Общий доступ */
    shared: boolean;
    /** Метаданные статуса Производственного задания */
    state?: Meta<Entity.State>;
    /** Момент последнего обновления Производственного задания */
    readonly updated: DateTime;
}

/**
 * Производственные задания
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie
 */
export declare interface ProductionTaskEndpoint {
    /**
     * Получить массив производственных заданий.
     *
     * @param options - Опции для получения производственных заданий {@linkcode ListProductionTasksOptions}
     * @returns Объект с массивом производственных заданий
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-poluchit-spisok-proizwodstwennyh-zadanij
     *
     * @example Без опций (по умолчанию первые 1000 сущностей)
     * ```ts
     * const { rows } = await moysklad.productionTask.list();
     * ```
     *
     * @example С expand
     * ```ts
     * const { rows } = await moysklad.productionTask.list({
     *  expand: ["owner", "organization"],
     * });
     * ```
     *
     * @example С фильтрами, сортировкой и пагинацией
     * ```ts
     * moysklad.productionTask.list({
     *   filter: {
     *     accountId: "123",
     *   },
     *   order: { field: "moment", direction: "desc" },
     *   pagination: {
     *    limit: 5,
     *     offset: 100,
     *   },
     * });
     * ```
     */
    list<T extends ListProductionTasksOptions = Record<string, unknown>>(options?: Subset<T, ListProductionTasksOptions>): Promise<ListResponse<GetFindResult<ProductionTaskModel, T["expand"]>, Entity.ProductionTask>>;
    /**
     * Получить все производственные задания.
     *
     * @param options - Опции для получения всех производственных заданий {@linkcode AllProductionTasksOptions}
     * @returns Объект с массивом производственных заданий
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-poluchit-spisok-proizwodstwennyh-zadanij
     *
     * @example С expand
     * ```ts
     * const { rows } = await moysklad.productionTask.all({ expand: ["owner", "organization"] });
     * ```
     */
    all<T extends AllProductionTasksOptions = Record<string, unknown>>(options?: Subset<T, AllProductionTasksOptions>): Promise<BatchGetResult<GetFindResult<ProductionTaskModel, T["expand"]>, Entity.ProductionTask>>;
    /**
     * Получить производственное задание по id.
     *
     * @param id - id производственного задания
     * @param options - Опции для получения производственного задания {@linkcode GetProductionTaskOptions}
     * @returns Объект с производственным заданием {@linkcode ProductionTaskModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-poluchit-proizwodstwennoe-zadanie
     *
     * @example
     * ```ts
     * const task = await moysklad.productionTask.get("5427bc76-b95f-11eb-0a80-04bb000cd583");
     * ```
     */
    get<T extends GetProductionTaskOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetProductionTaskOptions>): Promise<GetFindResult<ProductionTaskModel, T["expand"]>>;
    /**
     * Изменить производственное задание.
     *
     * @param id - id производственного задания
     * @param data - данные для изменения производственного задания
     * @param options - Опции для изменения производственного задания {@linkcode UpdateProductionTaskOptions}
     * @returns Объект с обновленным производственным заданием {@linkcode ProductionTaskModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-izmenit-proizwodstwennoe-zadanie
     *
     * @example
     * ```ts
     * await moysklad.productionTask.update("5427bc76-b95f-11eb-0a80-04bb000cd583", {
     *   shared: false,
     *     owner: {
     *      meta: {
     *        type: Entity.Employee,
     *        href: moysklad.client
     *           .buildUrl(["entity", "employee", "5427bc76-b95f-11eb-0a80-04bb000cd583"]).toString(),
     *        mediaType: MediaType.Json,
     *     },
     *   },
     * });
     * ```
     */
    update<T extends UpdateProductionTaskOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<ProductionTaskModel>, options?: Subset<T, UpdateProductionTaskOptions>): Promise<GetFindResult<ProductionTaskModel, T["expand"]>>;
    /**
     * Создать производственное задание.
     *
     * @param data - данные для создания производственного задания
     * @param options - Опции для создания производственного задания {@linkcode CreateProductionTaskOptions}
     * @returns Объект с созданным производственным заданием {@linkcode ProductionTaskModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-sozdat-proizwodstwennoe-zadanie
     *
     * @example
     * ```ts
     * await moysklad.productionTask.create({
     *   owner: {
     *     meta: {
     *       type: Entity.Employee,
     *       href: moysklad.client.buildUrl(["entity", Entity.Employee, "b0e1f1d1-0b1d-11ec-80e9-0b5808000a0e"]).toString(),
     *       mediaType: MediaType.Json,
     *     }
     *   },
     *   name: "New Production Task",
     * });
     * ```
     */
    create<T extends CreateProductionTaskOptions = Record<string, unknown>>(data: GetModelCreatableFields<ProductionTaskModel>, options?: Subset<T, CreateProductionTaskOptions>): Promise<GetFindResult<ProductionTaskModel, T["expand"]>>;
    /**
     * Массово создать и обновить производственные задания
     *
     * @param data - массив из объектов для создания и обновления производственных заданий
     * @param options - Опции для создания и обновления производственных заданий {@linkcode CreateProductionTaskOptions}
     * @returns Массив с созданными и обновленными производственными заданиями {@linkcode ProductionTaskModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-massowoe-sozdanie-i-obnowlenie-proizwodstwennyh-zadanij
     *
     * @example
     * ```ts
     * await moysklad.productionTask.upsert([
     *   // создать производственное задание
     *   {
     *     owner: {
     *       meta: {
     *         type: Entity.Employee,
     *         href: moysklad.client
     *           .buildUrl([
     *             "entity",
     *             Entity.Employee,
     *             "b0e1f1d1-0b1d-11ec-80e9-0b5808000a0e",
     *           ])
     *           .toString(),
     *         mediaType: MediaType.Json,
     *       },
     *     },
     *     name: "New Production Task",
     *   },
     *   // обновить существующее производственное задание
     *   {
     *     meta: {
     *       type: Entity.ProductionTask,
     *       href: moysklad.client
     *         .buildUrl([
     *           "entity",
     *           Entity.ProductionTask,
     *           "b0e1f1d1-0b1d-11ec-80e9-0b5808000a0e",
     *         ])
     *         .toString(),
     *       mediaType: MediaType.Json,
     *     },
     *     name: "Updated Production Task",
     *   },
     * ]);
     * ```
     */
    upsert<T extends CreateProductionTaskOptions = Record<string, unknown>>(data: (GetModelCreatableFields<ProductionTaskModel> | (GetModelUpdatableFields<ProductionTaskModel> & UpdateMeta<Entity.ProductionTask>))[], options?: Subset<T, CreateProductionTaskOptions>): Promise<GetFindResult<ProductionTaskModel, T["expand"]>[]>;
    /**
     * Получить первое производственное задание.
     *
     * @param options - Опции для получения первого производственного задания {@linkcode FirstProductionTaskOptions}
     * @returns Объект с первым производственным заданием
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-poluchit-spisok-proizwodstwennyh-zadanij
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productionTask.first({
     *  expand: ["owner", "organization"],
     *  search: "123"
     * });
     * ```
     */
    first<T extends FirstProductionTaskOptions = Record<string, unknown>>(options?: Subset<T, FirstProductionTaskOptions>): Promise<ListResponse<GetFindResult<ProductionTaskModel, T["expand"]>, Entity.ProductionTask>>;
    /**
     * Получить общее количество производственных заданий.
     * @returns Общее количество производственных заданий
     */
    size(): Promise<number>;
    /**
     * Удалить производственное задание по id.
     * @param id - id производственного задания
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-udalit-proizwodstwennoe-zadanie
     */
    delete(id: string): Promise<void>;
    /**
     * Массово удалить производственные задания.
     *
     * @param ids - массив id производственных заданий
     * @returns Массив с результатами удаления производственных заданий
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-massowoe-udalenie-proizwodstwennyh-zadanij
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
}

/**
 * Материалы производственного этапа
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-proizwodstwennoe-zadanie-proizwodstwennye-atapy
 */
export declare interface ProductionTaskMaterial extends Idable, Meta<Entity.ProductionTaskMaterial> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные товара/услуги/серии/модификации */
    assortment: Meta<Entity.Assortment>;
    /** Количество товаров/модификаций данного вида в позиции */
    planQuantity: number;
}

export declare interface ProductionTaskMaterialModel extends Model {
    object: ProductionTaskMaterial;
    expandable: {
        assortment: Model;
    };
    orderableFields: "id" | "accountId" | "planQuantity";
    requiredCreateFields: "assortment" | "planQuantity";
    filters: {
        accountId: IdFilter;
        id: IdFilter;
        planQuantity: NumberFilter;
    };
}

/**
 * Модель производственного задания
 *
 * {@linkcode ProductionTask}
 */
export declare interface ProductionTaskModel extends Model {
    object: ProductionTask;
    expandable: {
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        productionRows: ProductionRowModel;
        products: ProductionTaskResultModel;
    };
    requiredCreateFields: "organization";
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        code: StringFilter;
        deleted: DateTimeFilter;
        deliveryPlannedMoment: DateTimeFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        moment: DateTimeFilter;
        name: StringFilter;
        organization: IdFilter;
        owner: IdFilter;
        shared: BooleanFilter;
        updated: DateTimeFilter;
    };
}

/**
 * Продукт производственного задания
 *
 * {@linkcode ProductionTask}
 */
export declare interface ProductionTaskResult extends Idable, Meta<Entity.ProductionTaskResult> {
    /** ID учётной записи */
    readonly accountId: string;
    /** Ассортимент */
    assortment: Meta<AssortmentEntity>;
    /** Запланированное для производства количество продукта */
    planQuantity: number;
    /** Метаданные Позиции производственного задания */
    readonly productionRow: Meta<Entity.ProductionRow>;
}

/**
 * Модель продукта производственного задания
 *
 * {@linkcode ProductionTaskResult}
 */
export declare interface ProductionTaskResultModel extends Model {
    object: ProductionTaskResult;
    expandable: {
        assortment: AssortmentModel;
        productionRow: ProductionRowModel;
    };
}

export declare interface ProductModel extends Model {
    object: Product;
    expandable: {
        agent: CounterpartyModel;
        group: GroupModel;
        owner: CounterpartyModel;
    };
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        archived: BooleanFilter;
        article: StringFilter;
        barcodes: StringFilter;
        code: StringFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        isSerialTrackable: BooleanFilter;
        minimumBalance: NumberFilter;
        name: StringFilter;
        owner: IdFilter;
        pathName: StringFilter;
        shared: BooleanFilter;
        supplier: IdFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
        volume: NumberFilter;
        weight: NumberFilter;
    };
    orderableFields: "id" | "updated" | "name" | "code" | "externalCode" | "archived" | "pathName" | "isSerialTrackable" | "weighed" | "weight" | "volume" | "syncId";
    requiredCreateFields: "name";
}

export declare enum ProductPaymentItemType {
    Good = "GOOD",
    ExcisableGood = "EXCISABLE_GOOD",
    CompoundPaymentItem = "COMPOUND_PAYMENT_ITEM",
    AnotherPaymentItem = "ANOTHER_PAYMENT_ITEM"
}

export declare interface ProjectAttribute extends BaseAttribute {
    type: AttributeType.Project;
    value: Meta<Entity.Project> & {
        name: string;
    };
}

/**
 * Заказ поставщику
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq
 */
export declare interface PurchaseOrder extends Idable, Meta<Entity.PurchaseOrder> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные контрагента */
    agent: Meta<Entity.Counterparty>;
    /** Метаданные счета контрагента */
    agentAccount?: Meta<Entity.Account>;
    /** Отметка о проведении */
    applicable: boolean;
    /** Коллекция метаданных доп. полей */
    attributes?: unknown[];
    /** Код Заказа поставщику */
    code?: string;
    /** Метаданные договора */
    contract?: Meta<Entity.Contract>;
    /** Дата создания */
    readonly created: DateTime;
    /** Момент последнего удаления Заказа поставщику */
    readonly deleted?: DateTime;
    /** Планируемая дата отгрузки */
    deliveryPlannedMoment?: DateTime;
    /** Комментарий Заказа поставщику */
    description?: string;
    /** Внешний код Заказа поставщику */
    externalCode: string;
    /** Метаданные массива Файлов */
    files: unknown[];
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Сумма счетов поставщику */
    readonly invoicedSum: number;
    /** Дата документа */
    moment: DateTime;
    /** Наименование Заказа поставщику */
    name: string;
    /** Метаданные юрлица */
    organization: Meta<Entity.Organization>;
    /** Метаданные счета юрлица */
    organizationAccount?: Meta<Entity.Account>;
    /** Владелец (Сотрудник) */
    owner?: Meta<Entity.Employee>;
    /** Сумма входящих платежей по Заказу */
    readonly payedSum: number;
    /** Метаданные позиций Заказа поставщику */
    positions: ListMeta<Entity.PurchaseOrderPosition>;
    /** Напечатан ли документ */
    readonly printed: boolean;
    /** Метаданные проекта */
    project?: Meta<Entity.Project>;
    /** Опубликован ли документ */
    readonly published: boolean;
    /** Валюта */
    rate: DocumentRate;
    /** Общий доступ */
    shared: boolean;
    /** Сумма принятого */
    readonly shippedSum: number;
    /** Метаданные статуса заказа */
    state?: Meta<Entity.State>;
    /** Метаданные склада */
    store?: Meta<Entity.Store>;
    /** Сумма Заказа поставщику в установленной валюте */
    readonly sum: number;
    /** ID синхронизации */
    syncId?: string;
    /** Момент последнего обновления */
    readonly updated: DateTime;
    /** Учитывается ли НДС */
    vatEnabled: boolean;
    /** Включен ли НДС в цену */
    vatIncluded?: boolean;
    /** Сумма НДС */
    readonly vatSum: number;
    /** Сумма товаров в пути */
    readonly waitSum: number;
}

/**
 * Заказ поставщику
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-postawschiku
 */
export declare interface PurchaseOrderEndpoint {
    /**
     * Получить массив заказов поставщикам.
     *
     * @param options - Опции для получения заказов поставщикам {@linkcode ListPurchaseOrdersOptions}
     * @returns Объект с массивом заказов поставщикам
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-postawschiku-poluchit-spisok-zakazow-postawschikam
     *
     * @example Без опций (по умолчанию первые 1000 сущностей)
     * ```ts
     * const { rows } = await moysklad.purchaseOrder.list();
     * ```
     *
     * @example С expand
     * ```ts
     * const { rows } = await moysklad.purchaseOrder.list({
     *  expand: ["agent", "organization"],
     * });
     * ```
     *
     * @example С фильтрами, сортировкой и пагинацией
     * ```ts
     * moysklad.purchaseOrder.list({
     *   filter: {
     *     name: "00001",
     *   },
     *   order: { field: "moment", direction: "desc" },
     *   pagination: {
     *     limit: 5,
     *     offset: 100,
     *   },
     * });
     * ```
     */
    list<T extends ListPurchaseOrdersOptions = Record<string, unknown>>(options?: Subset<T, ListPurchaseOrdersOptions>): Promise<ListResponse<GetFindResult<PurchaseOrderModel, T["expand"]>, Entity.PurchaseOrder>>;
    /**
     * Получить все заказы поставщикам.
     *
     * @param options - Опции для получения всех заказов поставщикам {@linkcode AllPurchaseOrdersOptions}
     * @returns Объект с массивом заказов поставщикам
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-postawschiku-poluchit-spisok-zakazow-postawschikam
     *
     * @example С expand
     * ```ts
     * const { rows } = await moysklad.purchaseOrder.all({ expand: ["agent", "organization"] });
     * ```
     */
    all<T extends AllPurchaseOrdersOptions = Record<string, unknown>>(options?: Subset<T, AllPurchaseOrdersOptions>): Promise<BatchGetResult<GetFindResult<PurchaseOrderModel, T["expand"]>, Entity.PurchaseOrder>>;
    /**
     * Получить заказ поставщику по id.
     *
     * @param id - id заказа поставщику
     * @param options - Опции для получения заказа поставщику {@linkcode GetPurchaseOrderOptions}
     * @returns Объект с заказом поставщику {@linkcode PurchaseOrderModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-postawschiku-poluchit-zakaz-postawschiku
     *
     * @example
     * ```ts
     * const order = await moysklad.purchaseOrder.get("5427bc76-b95f-11eb-0a80-04bb000cd583");
     * ```
     */
    get<T extends GetPurchaseOrderOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetPurchaseOrderOptions>): Promise<GetFindResult<PurchaseOrderModel, T["expand"]>>;
    /**
     * Изменить заказ поставщику.
     *
     * @param id - id заказа поставщику
     * @param data - данные для изменения заказа поставщику
     * @param options - Опции для изменения заказа поставщику {@linkcode UpdatePurchaseOrderOptions}
     * @returns Объект с обновленным заказом поставщику {@linkcode PurchaseOrderModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-postawschiku-izmenit-zakaz-postawschiku
     *
     * @example
     * ```ts
     * await moysklad.purchaseOrder.update("5427bc76-b95f-11eb-0a80-04bb000cd583", {
     *   name: "new order name",
     *   description: "new order description"
     * });
     * ```
     */
    update<T extends UpdatePurchaseOrderOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<PurchaseOrderModel>, options?: Subset<T, UpdatePurchaseOrderOptions>): Promise<GetFindResult<PurchaseOrderModel, T["expand"]>>;
    /**
     * Создать заказ поставщику.
     *
     * @param data - данные для создания заказа поставщику
     * @param options - Опции для создания заказа поставщику {@linkcode CreatePurchaseOrderOptions}
     * @returns Объект с созданным заказом поставщику {@linkcode PurchaseOrderModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-postawschiku-sozdat-zakaz-postawschiku
     *
     * @example
     * ```ts
     * await moysklad.purchaseOrder.create({
     *   organization: {
     *     meta: {
     *       href: moysklad.client.buildUrl(["entity", "organization", "5427bc76-b95f-11eb-0a80-04bb000cd583"]),
     *       type: Entity.Organization,
     *       mediaType: MediaType.Json
     *     }
     *   },
     *   agent: {
     *     meta: {
     *       href: moysklad.client.buildUrl(["entity", "counterparty", "5427bc76-b95f-11eb-0a80-04bb000cd583"]),
     *       type: Entity.Counterparty,
     *       mediaType: MediaType.Json
     *     }
     *   }
     * });
     * ```
     */
    create<T extends CreatePurchaseOrderOptions = Record<string, unknown>>(data: GetModelCreatableFields<PurchaseOrderModel>, options?: Subset<T, CreatePurchaseOrderOptions>): Promise<GetFindResult<PurchaseOrderModel, T["expand"]>>;
    /**
     * Массово создать и обновить заказы поставщикам.
     *
     * @param data - массив из объектов для создания и обновления заказов поставщикам
     * @param options - Опции для создания и обновления заказов поставщикам {@linkcode CreatePurchaseOrderOptions}
     * @returns Массив с созданными и обновленными заказами поставщикам {@linkcode PurchaseOrderModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-postawschiku-massowoe-sozdanie-i-obnowlenie-zakazow-postawschikam
     *
     * @example
     * ```ts
     * await moysklad.purchaseOrder.upsert([
     *   // создать заказ поставщику
     *   {
     *     organization: {
     *       meta: {
     *         href: moysklad.client.buildUrl(["entity", "organization", "5427bc76-b95f-11eb-0a80-04bb000cd583"]),
     *         type: Entity.Organization,
     *         mediaType: MediaType.Json
     *       }
     *     },
     *     agent: {
     *       meta: {
     *         href: moysklad.client.buildUrl(["entity", "counterparty", "5427bc76-b95f-11eb-0a80-04bb000cd583"]),
     *         type: Entity.Counterparty,
     *         mediaType: MediaType.Json
     *       }
     *     }
     *   },
     *   // обновить существующий заказ поставщику
     *   {
     *     meta: {
     *       href: moysklad.client.buildUrl(["entity", "purchaseorder", "5427bc76-b95f-11eb-0a80-04bb000cd583"]),
     *       type: Entity.PurchaseOrder,
     *       mediaType: MediaType.Json
     *     },
     *     name: "new name"
     *   }
     * ]);
     * ```
     */
    upsert<T extends CreatePurchaseOrderOptions = Record<string, unknown>>(data: (GetModelCreatableFields<PurchaseOrderModel> | (GetModelUpdatableFields<PurchaseOrderModel> & UpdateMeta<Entity.PurchaseOrder>))[], options?: Subset<T, CreatePurchaseOrderOptions>): Promise<GetFindResult<PurchaseOrderModel, T["expand"]>[]>;
    /**
     * Получить первый заказ поставщику.
     *
     * @param options - Опции для получения первого заказа поставщику {@linkcode FirstPurchaseOrderOptions}
     * @returns Объект с первым заказом поставщику
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-postawschiku-poluchit-spisok-zakazow-postawschikam
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.purchaseOrder.first({
     *  expand: ["agent", "organization"],
     *  search: "00001"
     * });
     * ```
     */
    first<T extends FirstPurchaseOrderOptions = Record<string, unknown>>(options?: Subset<T, FirstPurchaseOrderOptions>): Promise<ListResponse<GetFindResult<PurchaseOrderModel, T["expand"]>, Entity.PurchaseOrder>>;
    /**
     * Получить общее количество заказов поставщикам.
     *
     * @returns Общее количество заказов поставщикам
     */
    size(): Promise<number>;
    /**
     * Удалить заказ поставщику по id.
     * @param id - id заказа поставщику
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-postawschiku-udalit-zakaz-postawschiku
     */
    delete(id: string): Promise<void>;
    /**
     * Массово удалить заказы поставщикам.
     *
     * @param ids - массив id заказов поставщикам
     * @returns Массив с результатами удаления заказов поставщикам
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-postawschiku-massowoe-udalenie-zakazow-postawschikam
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
}

/**
 * Модель заказа поставщику
 */
export declare interface PurchaseOrderModel extends Model {
    object: PurchaseOrder;
    expandable: {
        agent: CounterpartyModel;
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        positions: PurchaseOrderPositionModel;
        agentAccount: AccountModel;
        organizationAccount: AccountModel;
    };
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        agent: IdFilter;
        applicable: BooleanFilter;
        code: StringFilter;
        contract: IdFilter;
        created: DateTimeFilter;
        deleted: DateTimeFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        moment: DateTimeFilter;
        name: StringFilter;
        organization: IdFilter;
        owner: IdFilter;
        printed: BooleanFilter;
        project: IdFilter;
        published: BooleanFilter;
        shared: BooleanFilter;
        state: IdFilter;
        store: IdFilter;
        sum: NumberFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
    };
    orderableFields: "id" | "syncId" | "updated" | "updatedBy" | "name" | "description" | "externalCode" | "moment" | "applicable" | "sum";
    requiredCreateFields: "agent" | "organization";
}

/**
 * Позиция заказа поставщику
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-zakazy-pokupatelqm-pozicii-zakaza-pokupatelq
 */
export declare interface PurchaseOrderPosition extends Idable, Meta<Entity.PurchaseOrderPosition> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные товара/услуги/серии/модификации, которую представляет собой позиция */
    assortment: Meta<AssortmentEntity>;
    /** Процент скидки или наценки */
    discount: number;
    /** Упаковка Товара */
    pack?: unknown;
    /** Цена товара/услуги в копейках */
    price: number;
    /** Количество товаров/услуг данного вида в позиции */
    quantity: number;
    /** Принято */
    shipped: number;
    /** Ожидание */
    inTransit: number;
    /** НДС, которым облагается текущая позиция */
    vat: number;
    /** Включен ли НДС для позиции */
    vatEnabled: boolean;
}

/**
 * Модель позиции заказа поставщику
 */
export declare interface PurchaseOrderPositionModel extends Model {
    object: PurchaseOrderPosition;
    expandable: {
        assortment: AssortmentModel;
    };
}

export declare interface ReportEndpoint {
    stock: ReportStockEndpoint;
    profit: ReportProfitEndpoint;
    money: ReportMoneyEndpoint;
}

export declare interface ReportMoneyEndpoint {
    /**
     * Отчёт о движении денежных средств.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-den-gi-dwizhenie-denezhnyh-sredstw
     *
     * @param options Параметры запроса {@linkcode GetCashFlowOptions}
     * @returns Отчёт о движении денежных средств {@linkcode GetCashFlowResponse}
     */
    plotSeries: (options: GetCashFlowOptions) => Promise<GetCashFlowResponse>;
    /**
     * Получить отчёт Остатки денежных средств.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-den-gi-ostatki-denezhnyh-sredstw
     *
     * @returns Отчёт о движении денежных средств {@linkcode GetCashBalanceResponse}
     */
    byAccount: () => Promise<GetCashBalanceResponse>;
}

export declare interface ReportProfitEndpoint {
    byVariant: (options?: ByVariantProfitReportListOptions) => Promise<ListResponse<ByVariantProfitReport, Entity.SalesByVariant>>;
}

export declare interface ReportStockEndpoint {
    all(options?: StockAllOptions): Promise<ListResponse<StockAll, Entity.Stock>>;
    /**
     * Получить краткий отчёт об остатках.
     *
     * Эндпоинт предназначен для частого и быстрого обновления остатков, резервов и ожиданий для большого количества товаров.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-ostatki-poluchit-kratkij-otchet-ob-ostatkah
     *
     * @param options Параметры запроса
     * @returns Краткий отчёт об остатках
     */
    allCurrent<T extends StockAllCurrentStockType = StockAllCurrentStockType.Stock>(options?: StockAllCurrentOptions<T>): Promise<StockAllCurrent<T>>;
}

declare type RequestOptions = Omit<RequestInit, "body"> & {
    body?: object;
    searchParameters?: URLSearchParams;
};

declare type RequestOptionsWithoutMethod = Omit<RequestOptions, "method">;

/**
 * Given a model `M` and some type `T`, make fields in `T` optional based on their optionality in model's object.
 */
export declare type RestoreExpandableFieldsOptionality<M extends Model, T> = IsEmptyObject<T> extends true ? T : HasOptionalKeys<M["object"]> extends true ? SetOptional<T, Extract<OptionalKeysOf<M["object"]>, keyof T>> : T;

/**
 * Возврат покупателя
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq
 */
export declare interface SalesReturn extends Idable, Meta<Entity.SalesReturn> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные контрагента */
    agent: Meta<Entity.Counterparty>;
    /** Метаданные счета контрагента */
    agentAccount?: Meta<Entity.Account>;
    /** Отметка о проведении */
    applicable: boolean;
    /** Коллекция метаданных доп. полей */
    attributes?: unknown[];
    /** Код Возврата Покупателя */
    code?: string;
    /** Метаданные договора */
    contract?: Meta<Entity.Contract>;
    /** Дата создания */
    readonly created: DateTime;
    /** Момент последнего удаления Возврата Покупателя */
    readonly deleted?: DateTime;
    /** Комментарий Возврата Покупателя */
    description?: string;
    /** Внешний код Возврата Покупателя */
    externalCode: string;
    /** Метаданные массива Файлов (Максимальное количество файлов - 100) */
    files: unknown[];
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** ID Возврата Покупателя */
    readonly id: string;
    /** Метаданные Возврата Покупателя */
    readonly meta: Metadata<Entity.SalesReturn>;
    /** Дата документа */
    moment: DateTime;
    /** Наименование Возврата Покупателя */
    name: string;
    /** Метаданные юрлица */
    organization: Meta<Entity.Organization>;
    /** Метаданные счета юрлица */
    organizationAccount?: Meta<Entity.Account>;
    /** Владелец (Сотрудник) */
    owner?: Meta<Entity.Employee>;
    /** Метаданные позиций Возврата Покупателя */
    positions: ListMeta<Entity.SalesReturn>;
    /** Напечатан ли документ */
    readonly printed: boolean;
    /** Метаданные проекта */
    project?: Meta<Entity.Project>;
    /** Опубликован ли документ */
    readonly published: boolean;
    /** Валюта */
    rate: DocumentRate;
    /** Метаданные канала продаж */
    salesChannel?: Meta<Entity.SalesChannel>;
    /** Общий доступ */
    shared: boolean;
    /** Метаданные статуса Возврата Покупателя */
    state?: Meta<Entity.State>;
    /** Метаданные склада */
    store: Meta<Entity.Store>;
    /** Сумма Возврата Покупателя в копейках */
    readonly sum: number;
    /** ID синхронизации. После заполнения недоступен для изменения */
    syncId?: string;
    /** Момент последнего обновления Возврата Покупателя */
    readonly updated: DateTime;
    /** Учитывается ли НДС */
    vatEnabled: boolean;
    /** Включен ли НДС в цену */
    vatIncluded?: boolean;
    /** Сумма НДС */
    vatSum?: number;
    /** Ссылка на отгрузку, по которой произошел возврат */
    demand?: Meta<Entity.Demand>;
    /** Массив ссылок на связанные списания */
    losses?: Meta<Entity.Loss>[];
    /** Массив ссылок на связанные платежи */
    payments?: Meta<Entity.PaymentIn | Entity.PaymentOut>[];
    /** Сумма исходящих платежей по возврату покупателя */
    readonly payedSum?: number;
    /** Ссылка на Счет-фактуру выданный, с которым связан этот возврат */
    factureOut?: Meta<Entity.FactureOut>;
}

/**
 * Возвраты покупателей
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq
 */
export declare interface SalesReturnEndpoint {
    /**
     * Получить список возвратов покупателей.
     *
     * @param options - Опции для получения списка
     * @returns Объект с списком возвратов покупателей
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq-poluchit-vozwraty-pokupatelej
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.salesReturn.list();
     * ```
     */
    list<T extends ListSalesReturnsOptions = Record<string, unknown>>(options?: Subset<T, ListSalesReturnsOptions>): Promise<ListResponse<GetFindResult<SalesReturnModel, T["expand"], T["fields"]>, Entity.SalesReturn>>;
    /**
     * Получить все возвраты покупателей с учетом пагинации.
     *
     * @param options - Опции для получения списка
     * @returns Массив возвратов покупателей
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq-poluchit-vozwraty-pokupatelej
     *
     * @example
     * ```ts
     * const salesReturns = await moysklad.salesReturn.all();
     * ```
     */
    all<T extends AllSalesReturnsOptions = Record<string, unknown>>(options?: Subset<T, AllSalesReturnsOptions>): Promise<BatchGetResult<GetFindResult<SalesReturnModel, T["expand"], T["fields"]>, Entity.SalesReturn>>;
    /**
     * Получить возврат покупателя по ID.
     *
     * @param id - ID возврата покупателя
     * @param options - Опции для получения возврата покупателя
     * @returns Возврат покупателя
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq-poluchit-vozwrat-pokupatelq
     *
     * @example
     * ```ts
     * const salesReturn = await moysklad.salesReturn.get("a7404318-550f-11e8-56c0-000800000006");
     * ```
     */
    get<T extends GetSalesReturnOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetSalesReturnOptions>): Promise<GetFindResult<SalesReturnModel, T["expand"], T["fields"]>>;
    /**
     * Получить первый возврат покупателя из списка.
     *
     * @param options - Опции для получения списка
     * @returns Объект с списком возвратов покупателей (с одним элементом)
     *
     * @example
     * ```ts
     * const { rows: [salesReturn] } = await moysklad.salesReturn.first();
     * ```
     */
    first<T extends FirstSalesReturnOptions = Record<string, unknown>>(options?: Subset<T, FirstSalesReturnOptions>): Promise<ListResponse<GetFindResult<SalesReturnModel, T["expand"], T["fields"]>, Entity.SalesReturn>>;
    /**
     * Получить количество возвратов покупателей.
     *
     * @returns Количество возвратов покупателей
     *
     * @example
     * ```ts
     * const count = await moysklad.salesReturn.size();
     * ```
     */
    size(): Promise<number>;
    /**
     * Удалить возврат покупателя.
     *
     * @param id - ID возврата покупателя
     * @returns Promise, который разрешается, когда возврат покупателя удален
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq-udalit-vozwrat-pokupatelq
     *
     * @example
     * ```ts
     * await moysklad.salesReturn.delete("a7404318-550f-11e8-56c0-000800000006");
     * ```
     */
    delete(id: string): Promise<void>;
    /**
     * Удалить несколько возвратов покупателей.
     *
     * @param ids - Массив ID возвратов покупателей
     * @returns Результат удаления
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq-massowoe-udalenie-vozwratow-pokupatelej
     *
     * @example
     * ```ts
     * await moysklad.salesReturn.batchDelete(["a7404318-550f-11e8-56c0-000800000006", "a7404318-550f-11e8-56c0-000800000007"]);
     * ```
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
    /**
     * Переместить возврат покупателя в корзину.
     *
     * @param id - ID возврата покупателя
     * @returns Promise, который разрешается, когда возврат покупателя перемещен в корзину
     *
     * @example
     * ```ts
     * await moysklad.salesReturn.trash("a7404318-550f-11e8-56c0-000800000006");
     * ```
     */
    trash(id: string): Promise<void>;
    /**
     * Создать или обновить возврат покупателя.
     *
     * @param data - Данные для создания или обновления возврата покупателя
     * @param options - Опции для создания или обновления возврата покупателя
     * @returns Созданный или обновленный возврат покупателя
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq-sozdat-vozwrat-pokupatelq
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq-izmenit-vozwrat-pokupatelq
     *
     * @example
     * ```ts
     * const salesReturn = await moysklad.salesReturn.upsert({
     *   organization: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/organization/fae3561a-2e58-11e6-8a84-bae50000004e", type: "organization", mediaType: "application/json" } },
     *   agent: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/counterparty/147c1f1b-32ca-11e6-8a84-bae500000004", type: "counterparty", mediaType: "application/json" } },
     *   store: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/store/faf3ff5b-2e58-11e6-8a84-bae500000050", type: "store", mediaType: "application/json" } },
     * });
     * ```
     */
    upsert<TData extends ModelCreateOrUpdateData<SalesReturnModel>, TOptions extends UpsertSalesReturnsOptions = Record<string, unknown>>(data: TData, options?: Subset<TOptions, UpsertSalesReturnsOptions>): Promise<MatchArrayType<TData, GetFindResult<SalesReturnModel, TOptions["expand"]>>>;
    /**
     * Получить шаблон возврата покупателя на основе отгрузки.
     *
     * @param data - Данные для создания шаблона
     * @returns Шаблон возврата покупателя
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq-shablon-vozwrata-pokupatelq-na-osnowe-otgruzki
     *
     * @example
     * ```ts
     * const template = await moysklad.salesReturn.template({
     *   demand: { meta: { href: "https://api.moysklad.ru/api/remap/1.2/entity/demand/a7404318-550f-11e8-56c0-000800000001", type: "demand", mediaType: "application/json" } },
     * });
     * ```
     */
    template(data: SalesReturnTemplateData): Promise<GetFindResult<SalesReturnModel, {
        positions: true;
    }>>;
}

/**
 * Модель Возврата покупателя
 */
export declare interface SalesReturnModel extends Model {
    object: SalesReturn;
    expandable: {
        agent: CounterpartyModel;
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        positions: SalesReturnPositionModel;
        agentAccount: AccountModel;
        organizationAccount: AccountModel;
    };
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        agent: IdFilter;
        applicable: BooleanFilter;
        code: StringFilter;
        contract: IdFilter;
        created: DateTimeFilter;
        deleted: DateTimeFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        moment: DateTimeFilter;
        name: StringFilter;
        organization: IdFilter;
        owner: IdFilter;
        printed: BooleanFilter;
        project: IdFilter;
        published: BooleanFilter;
        salesChannel: IdFilter;
        shared: BooleanFilter;
        state: IdFilter;
        store: IdFilter;
        sum: NumberFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
        isDeleted: BooleanFilter;
    };
    orderableFields: "id" | "syncId" | "updated" | "updatedBy" | "name" | "description" | "externalCode" | "moment" | "applicable" | "sum" | "created";
    requiredCreateFields: "agent" | "organization" | "store";
}

/**
 * Позиция Возврата покупателя
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vozwrat-pokupatelq-pozicii-wozwrata-pokupatelq
 */
export declare interface SalesReturnPosition extends Idable, Meta<Entity.SalesReturn> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные товара/услуги/серии/модификации, которую представляет собой позиция */
    assortment: Meta<AssortmentEntity>;
    /**
     * Себестоимость
     *
     * Выводится, если документ был создан без основания
     */
    cost?: number;
    /** Метаданные Страны */
    country?: Meta<Entity.Country>;
    /** Процент скидки или наценки. Наценка указывается отрицательным числом, т.е. -10 создаст наценку в 10% */
    discount?: number;
    /** ГТД */
    gtd?: unknown;
    /** Упаковка Товара */
    pack?: unknown;
    /** Цена товара/услуги в копейках */
    price: number;
    /**
     * Количество товаров/услуг данного вида в позиции.
     *
     * Если позиция - товар, у которого включен учет по серийным номерам, то значение в этом поле всегда будет равно количеству серийных номеров для данной позиции в документе.
     */
    quantity: number;
    /** Ячейка на складе */
    slot?: Meta<Entity.Slot>;
    /**
     * Серийные номера.
     *
     * Значение данного атрибута игнорируется, если товар позиции не находится на серийном учете.
     * В ином случае количество товаров в позиции будет равно количеству серийных номеров, переданных в значении атрибута.
     */
    things?: string[];
    /** НДС, которым облагается текущая позиция */
    vat: number;
    /**
     * Включен ли НДС для позиции.
     *
     * С помощью этого флага для позиции можно выставлять НДС = 0 или НДС = "без НДС".
     * (vat = 0, vatEnabled = false) -> vat = "без НДС", (vat = 0, vatEnabled = true) -> vat = 0%.
     */
    vatEnabled: boolean;
}

/**
 * Модель позиции Возврата покупателя
 */
export declare interface SalesReturnPositionModel extends Model {
    object: SalesReturnPosition;
}

/**
 * Данные для создания Возврата покупателя на основе шаблона
 */
export declare type SalesReturnTemplateData = {
    demand: UpdateMeta<Entity.Demand>;
};

/**
 * Интерфейс для работы с безопасностью
 */
export declare interface SecurityEndpoint {
    /**
     * Токены безопасности
     */
    token: TokenEndpoint;
}

/**
 * Услуга
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-usluga-uslugi
 */
export declare interface Service extends Idable, Meta<Entity.Service> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Добавлена ли Услуга в архив */
    archived: boolean;
    /** Коллекция доп. полей */
    attributes?: Attribute[];
    /**
     * Штрихкоды Услуги
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-usluga-uslugi-metadannye-uslug-shtrihkody
     * */
    barcodes?: Barcodes;
    /**
     * Закупочная цена
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-usluga-uslugi-metadannye-uslug-zakupochnaq-cena
     */
    buyPrice?: {
        value: number;
        currency: Meta<Entity.Currency>;
    };
    /** Код Услуги */
    code?: string;
    /** Описание Услуги */
    description?: string;
    /** Признак запрета скидок */
    discountProhibited: boolean;
    /** Реальный НДС % */
    readonly effectiveVat?: number;
    /**
     * Дополнительный признак для определения разграничения реального НДС.
     *
     * - (`effectiveVat` = `0`, `effectiveVatEnabled` = `false`) -> "без НДС"
     * - (`effectiveVat` = `0`, `effectiveVatEnabled` = `true`) -> `0%`
     */
    readonly effectiveVatEnabled?: boolean;
    /** Внешний код Услуги */
    externalCode: string;
    /**
     * Метаданные массива Файлов.
     *
     * Максимальное количество файлов — 100
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-fajly
     */
    files?: unknown[];
    /** Метаданные отдела сотрудника */
    group: Meta<Entity.Group>;
    /**
     * Минимальная цена.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-usluga-uslugi-metadannye-uslug-minimal-naq-cena
     */
    minPrice?: {
        value: number;
        currency: Meta<Entity.Currency>;
    };
    /** Наименование Услуги */
    name: string;
    /** Метаданные владельца (Сотрудника) */
    owner?: Meta<Entity.Employee>;
    /**
     * Наименование группы, в которую входит Услуга
     *
     * Атрибут `pathName` сам по себе является атрибутом только для чтения, однако его можно изменить с помощью обновления атрибута `productFolder`.
     */
    readonly pathName?: string;
    /** Признак предмета расчета */
    paymentItemType?: ServicePaymentItemType;
    /** Метаданные группы */
    productFolder?: Meta<Entity.ProductFolder>;
    /**
     * Цены продажи
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-usluga-uslugi-metadannye-uslug-ceny-prodazhi
     */
    salePrices?: {
        value: number;
        currency: Meta<Entity.Currency>;
        priceType: PriceType;
    }[];
    /** Общий доступ */
    shared: boolean;
    /** ID синхронизации */
    readonly syncId?: string;
    /** Код системы налогообложения */
    taxSystem?: TaxSystem;
    /** Единицы измерения */
    uom?: Meta<Entity.Uom>;
    /** Момент последнего обновления сущности */
    readonly updated: DateTime;
    /** Используется ли ставка НДС родительской группы */
    useParentVat: boolean;
    /** НДС % */
    vat?: number;
    /**
     * Включен ли НДС для услуги
     *
     * С помощью этого флага для услуги можно выставлять НДС = 0 или НДС = "без НДС":
     * - (`vat` = 0, `vatEnabled` = false) -> `vat` = "без НДС"
     * - (`vat` = 0, `vatEnabled` = true) -> `vat` = 0%
     */
    vatEnabled?: boolean;
}

export declare type ServiceAssortmentModel = ServiceModel & {
    object: AssortmentFields;
};

export declare interface ServiceModel extends Model {
    object: Service;
    expandable: {
        group: GroupModel;
        owner: EmployeeModel;
    };
    requiredCreateFields: "name";
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        archived: BooleanFilter;
        barcodes: StringFilter;
        code: StringFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        name: StringFilter;
        owner: IdFilter;
        pathName: StringFilter;
        shared: BooleanFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
    };
}

/**
 * Признак предмета расчёта услуги.
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-usluga-uslugi-atributy-suschnosti-priznak-predmeta-rascheta
 */
export declare enum ServicePaymentItemType {
    /** Услуга */
    Service = "SERVICE",
    /** Работа */
    Work = "WORK",
    /** Предоставление РИД */
    ProvidingRid = "PROVIDING_RID",
    /** Составной предмет расчета */
    CompoundPaymentItem = "COMPOUND_PAYMENT_ITEM",
    /** Иной предмет расчета */
    AnotherPaymentItem = "ANOTHER_PAYMENT_ITEM"
}

export declare interface StartsWithFilter {
    /** Начинается с (`~=`) */
    sw: string;
}

/**
 * Атрибуты объекта отчёта
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-ostatki-rasshirennyj-otchet-ob-ostatkah-atributy-ob-ekta-otcheta
 */
export declare interface StockAll extends Meta<AssortmentEntity> {
    /** Артикул */
    readonly article?: string;
    /** Код */
    readonly code: string;
    /** Внешний код сущности, по которой выводится остаток */
    readonly externalCode: string;
    /**
     * Группа Товара/Модификации/Cерии
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-ostatki-rasshirennyj-otchet-ob-ostatkah-gruppa
     */
    readonly folder: Meta<Entity.ProductFolder> & {
        /** Наименование группы */
        readonly name: string;
        /** Наименование родительской группы */
        readonly pathName: string;
    };
    /** Метаданные изображения Товара/Модификации/Серии */
    readonly image?: Meta<Entity.Image>;
    /** Ожидание */
    readonly inTransit: number;
    /** Наименование */
    readonly name: string;
    /** Себестоимость в копейках */
    readonly price?: number;
    /** Доступно */
    readonly quantity: number;
    /** Резерв */
    readonly reserve: number;
    /** Цена продажи */
    readonly salePrice?: number;
    /** Остаток */
    readonly stock: number;
    /** Количество дней на складе */
    readonly stockDays: number;
    /**
     * Единица измерения
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-ostatki-rasshirennyj-otchet-ob-ostatkah-edinica-izmereniq
     */
    readonly uom: Meta<Entity.Uom> & {
        /** Наименование единицы измерений */
        readonly name: string;
    };
}

/**
 * Краткий отчёт об остатках
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-ostatki-kratkij-otchet-ob-ostatkah
 */
export declare type StockAllCurrent<T extends StockAllCurrentStockType> = StockAllCurrentRow<T>[];

export declare interface StockAllCurrentOptions<T extends StockAllCurrentStockType> {
    /** Фильтры отчёта Текущие Остатки */
    filter?: {
        /** Выдать в отчёте только указанные товары, модификации и серии */
        assortmentId?: IdFilter;
        /** Выдать в отчёте только указанные склады */
        storeId?: IdFilter;
    };
    /**
     * Вывод нулевых остатков.
     *
     * Укажите `include: "zeroLines"`, чтобы вывести нулевые остатки. По умолчанию выводятся только результаты с ненулевым значением остатка.
     */
    include?: "zeroLines";
    /**
     * Получить остатки, которые изменились в интервале между временем указанным в параметре `changedSince` и текущим моментом.
     *
     * По умолчанию выводятся остатки на текущий момент. Остатки в ответе это фактический остаток на текущий момент времени на всех складах и с разбивкой по складам соответственно, не дельта за период, не остаток на момент времени changedSince, а фактический остаток по номенклатуре, у которой изменился остаток за интервал.
     *
     * Ограничения и рекомендации, накладываемые на параметр:
     * - При использовании параметра `changedSince` всегда включен вывод нулевых остатков.
     * - Максимальное значение параметра `changedSince` в прошлое от текущего момента не должно превышать 24 часа.
     * - Минимальное значение параметра `changedSince` в прошлое от текущего момента не ограничено.
     * - Параметр `changedSince` не может превышать текущий момент.
     * - Небольшое перекрытие интервалов запросов поможет исключить потерю обновления остатков на границах интервалов (пример: запрос остатков каждые 30 минут за прошедшие 35 минут).
     * - Рекомендуется проводить полную синхронизацию остатков без параметра `changedSince` раз в сутки и чаще, в зависимости от частоты изменения остатков.
     *
     * **Важно**: если за запрашиваемый интервал был удален или архивирован товар или склад, то будет выведен остаток равный 0. Стоит учитывать, что по `id` запросить этот товар или склад уже не получится.
     */
    changedSince?: DateTime;
    /**
     * Тип остатка, резерва, ожидания, которые необходимо рассчитать.
     *
     * На данный момент возможно получить только один тип.
     *
     * @default StockAllCurrentStockType.Stock
     * {@linkcode StockAllCurrentStockType}
     */
    stockType?: T;
}

export declare type StockAllCurrentRow<T extends StockAllCurrentStockType> = {
    /** ID ассортимента */
    assortmentId: string;
} & {
    [K in T]: number;
};

/** Тип остатка, резерва, ожидания, которые необходимо рассчитать в кратком отчёте об остатках. */
export declare enum StockAllCurrentStockType {
    /** Физический остаток на складах, без учёта резерва и ожидания */
    Stock = "stock",
    /** Остаток на складах за вычетом резерва */
    FreeStock = "freeStock",
    /** Доступно. Учитывает резерв и ожидания */
    Quantity = "quantity",
    /** Резерв */
    Reserve = "reserve",
    /** Ожидание */
    InTransit = "inTransit"
}

export declare interface StockAllModel extends Model {
    object: StockAll;
    filters: {
        /** параметр для фильтрации по архивности товаров. Возможные значения: `true`, `false`. Для выдачи как архивных, так и не архивных товаров нужно передать сразу два значения true и false. */
        archived: BooleanFilter;
        /** параметр для фильтрации по нескольким сериям. Значение параметра - ссылка на серию, которая должна быть включена в выборку или исключена из нее. Можно передать несколько значений. Данный параметр фильтрации можно комбинировать с параметрами `product` и `variant`. */
        consignment: IdFilter;
        /** параметр для фильтрации по значению ожидания. Если передать `true`, в выборку попадут только товары с ожиданием. */
        inTransitOnly: BooleanFilter;
        /** момент времени, на который нужно вывести остатки. Передается в виде строки в формате дата-время */
        moment: DateTimeFilter;
        /** параметр для фильтрации по нескольким товарам. Значение параметра - ссылка на товар, который должен быть включен в выборку или исключен из нее. Можно передать несколько значений. Данный параметр фильтрации можно комбинировать с параметрами `consignment` и `variant`. */
        product: IdFilter;
        /** параметр для фильтрации по нескольким группам товаров. Значение параметра - ссылка на группу товаров, которая должна быть включена в выборку или исключена из нее. Можно передать несколько значений. */
        productFolder: IdFilter;
        /** параметр учета вложенных подгрупп. Работает только при наличии фильтра по `productFolder`. По умолчанию `true`, выводятся товары из дочерних подгрупп фильтруемой группы / групп товаров. При передаче `false` выводятся только товары из фильтруемой группы / групп, без учета подгрупп. */
        withSubFolders: BooleanFilter;
        /**
         * Параметр для фильтрации по значению доступно
         *
         * Возможные значения:
         * - `nonEmpty` - только ненулевые остатки
         * - `all` - все остатки
         * - `positiveOnly` - только положительные остатки
         * - `negativeOnly` - только отрицательные остатки
         * - `empty` - только нулевые остатки
         * - `underMinimum` - только остатки ниже неснижаемого
         *
         * @default `nonEmpty`
         */
        quantityMode: EnumFilter<"nonEmpty" | "all" | "positiveOnly" | "negativeOnly" | "empty" | "underMinimum">;
        /** параметр для фильтрации по значению резерва. Если передать `true`, в выборку попадут только товары с резервом. */
        reserveOnly: BooleanFilter;
        /** специальный параметр текстового поиска. Поиск осуществляется по вхождению подстроки в названия товаров, модификаций, серий. */
        search: StringFilter;
        /** параметр для фильтрации по признаку весового товара */
        soldByWeight: BooleanFilter;
        /** параметр для фильтрации по количеству дней на складе. Передавать нужно целое число. В выборку попадут товары, у которых количество дней на складе больше или равно указанному. Данный параметр фильтрации можно комбинировать с параметром `stockDaysTo`. */
        stockDaysFrom: NumberFilter;
        /** параметр для фильтрации по количеству дней на складе. Передавать нужно целое число. В выборку попадут товары, у которых количество дней на складе меньше или равно указанному. Данный параметр фильтрации можно комбинировать с параметром `stockDaysFrom`. */
        stockDaysTo: NumberFilter;
        /**
         * Параметр для фильтрации по значению остатка
         *
         * Возможные значения:
         * - `all` - все остатки
         * - `positiveOnly` - только положительные остатки
         * - `negativeOnly` - только отрицательные остатки
         * - `empty` - только нулевые остатки
         * - `nonEmpty` - только ненулевые остатки
         * - `underMinimum` - только остатки ниже неснижаемого
         *
         * @default `all`
         */
        stockMode: EnumFilter<"all" | "positiveOnly" | "negativeOnly" | "empty" | "nonEmpty" | "underMinimum">;
        /** параметр для фильтрации по нескольким складам. Значение параметра - ссылка на склад, который должен быть учтен в выборке или исключен из нее. Можно передать несколько значений. */
        store: IdFilter;
        /** параметр для фильтрации по нескольким поставщикам. Значение параметра - ссылка на контрагента или организацию. В выборку будут включены или исключены товары с указанными поставщиками. Можно передать пустое значение, тогда в выборку попадут товары с незаполненным или заполненным поставщиком. */
        supplier: IdFilter;
        /** параметр для фильтрации по нескольким модификациям. Значение параметра - ссылка на модификацию, которая должна быть включена в выборку или исключена из нее. Можно передать несколько значений. Данный параметр фильтрации можно комбинировать с параметрами `product` и `consignment`. */
        variant: IdFilter;
    };
    /**
     * Поля, по которым можно сортировать
     *
     * Возможные значения:
     * - `avgStockDays` - по количеству дней на складе
     * - `code` - по коду
     * - `inTransit` - по значению ожидания
     * - `minimumBalance` - по неснижаемому остатку
     * - `name` - по наименованию
     * - `pathName` - по группе товаров
     * - `price` - по себестоимости
     * - `productCode` - по артикулу
     * - `quantity` - по остатку
     * - `reserve` - по резерву
     * - `salePrice` - по цене продажи
     * - `stock` - по остатку
     * - `sumTotal` - по сумме себестоимости
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-ostatki-rasshirennyj-otchet-ob-ostatkah-atributy-dostupnye-dlq-sortirowki
     */
    orderableFields: "avgStockDays" | "code" | "inTransit" | "minimumBalance" | "name" | "pathName" | "price" | "productCode" | "quantity" | "reserve" | "salePrice" | "stock" | "sumTotal";
}

export declare interface StockAllOptions {
    pagination?: PaginationOptions;
    order?: OrderOptions<StockAllModel>;
    filter?: FilterOptions<StockAllModel>;
    /**
     * Тип, по которому нужно сгруппировать выдачу.
     *
     * Возможные значения:
     * - `product` - выдает только товары
     * - `variant` - выдает товары и модификации
     * - `consignment` - выдает товары, модификации, серии
     */
    groupBy?: "product" | "variant" | "consignment";
    /**
     * Вывод остатков по модификациям и сериям товаров. Параметр позволяет включить в выборку остатки по модификациям и сериям для товаров. Необходимым условием для применения параметра является обязательное наличие фильтрации по товарам или модификациям или их комбинации. При выбранном значении `includeRelated=true` будут включены все остатки для товаров, модификаций и серий, указанных в параметрах фильтрации.
     При использовании параметра устанавливается параметр группировки `groupBy=consignment`, переданные значения для groupBy будут проигнорированы.
     */
    includeRelated?: boolean;
}

export declare interface StoreAttribute extends BaseAttribute {
    type: AttributeType.Store;
    value: Meta<Entity.Store> & {
        name: string;
    };
}

export declare interface StringAttribute extends BaseAttribute {
    type: AttributeType.String;
    value: string;
}

export declare type StringFilter = Partial<EqualityFilter<string> & LikeFilter & StartsWithFilter & EndsWithFilter> | string | string[];

/**
 * From `T` pick properties that exist in `U`. Simple version of Intersection.
 */
export declare type Subset<T, U> = {
    [key in keyof T]: key extends keyof U ? T[key] : never;
};

/**
 * Приёмка
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-priemki
 */
export declare interface Supply extends Idable, Meta<Entity.Supply> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные контрагента */
    agent: Meta<Entity.Counterparty>;
    /** Метаданные счета контрагента */
    agentAccount?: Meta<Entity.Account>;
    /** Отметка о проведении */
    applicable: boolean;
    /**
     * Коллекция метаданных доп. полей.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-rabota-s-dopolnitel-nymi-polqmi
     */
    attributes?: Attribute[];
    /** Код Приемки */
    code?: string;
    /** Метаданные договора */
    contract?: Meta<Entity.Contract>;
    /** Дата создания */
    readonly created: DateTime;
    /** Момент последнего удаления Приемки */
    readonly deleted?: DateTime;
    /** Комментарий Приемки */
    description?: string;
    /** Внешний код Приемки */
    externalCode: string;
    /**
     * Метаданные массива Файлов
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-fajly
     */
    files: unknown[];
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Входящая дата */
    incomingDate?: DateTime;
    /** Входящий номер */
    incomingNumber?: string;
    /** Дата документа */
    moment: DateTime;
    /** Наименование прёмки */
    name: string;
    /** Метаданные юрлица */
    organization: Meta<Entity.Organization>;
    /** Метаданные счёта юрлица */
    organizationAccount?: Meta<Entity.Account>;
    /**
     * Накладные расходы
     *
     * Если Позиции Приемки не заданы, то накладные расходы нельзя задать.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-priemki-nakladnye-rashody
     */
    overhead?: SupplyOverhead;
    /** Владелец (сотдруник) */
    owner?: Meta<Entity.Employee>;
    /** Сумма входящих платежей по приёмке */
    readonly payedSum: number;
    /** Метаданные позиций */
    positions: ListMeta<Entity.SupplyPosition>;
    /** Напечатан ли документ */
    readonly printed: boolean;
    /** Метаданные проекта */
    project?: Meta<Entity.Project>;
    /** Опубликован ли документ */
    readonly published: boolean;
    /**
     * Валюта.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-obschie-swedeniq-valuta-w-dokumentah
     */
    rate: DocumentRate;
    /** Общий доступ */
    shared: boolean;
    /** Метаданные статуса приёмки */
    state?: Meta<Entity.State>;
    /** Метаданные склада */
    store: Meta<Entity.Store>;
    /** Сумма приёмки в копейках */
    readonly sum: number;
    /**
     * ID синхронизации
     *
     * После заполнения недоступен для изменения.
     * */
    syncId?: string;
    /** Момент последнего обновления приёмки */
    readonly updated: DateTime;
    /** Учитывается ли НДС */
    vatEnabled: boolean;
    /** Включен ли НДС в цену */
    vatIncluded?: boolean;
    /** Сумма НДС */
    vatSum: number;
    /**
     * Ссылка на связанный заказ поставщику в формате Метаданных
     *
     * {@linkcode PurchaseOrderModel}
     */
    purchaseOrder?: Meta<Entity.PurchaseOrder>;
}

/**
 * Приёмки
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-priemki
 */
export declare interface SupplyEndpoint {
    /**
     * Получить список приёмок
     *
     * @param options - Опции для получения списка {@linkcode ListSuppliesOptions}
     * @returns Объект с списком приёмок
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-poluchit-priemki
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.supply.list();
     * ```
     */
    list<T extends ListSuppliesOptions = Record<string, unknown>>(options?: Subset<T, ListSuppliesOptions>): Promise<ListResponse<GetFindResult<SupplyModel, T["expand"]>, Entity.Supply>>;
    /**
     * Получить все приёмки
     *
     * @param options - Опции для получения списка {@linkcode AllSuppliesOptions}
     * @returns Массив приёмок
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.supply.all();
     * ```
     */
    all<T extends AllSuppliesOptions = Record<string, unknown>>(options?: Subset<T, AllSuppliesOptions>): Promise<BatchGetResult<GetFindResult<SupplyModel, T["expand"]>, Entity.Supply>>;
    /**
     * Получить приёмку по ID
     *
     * @param id - ID приёмки
     * @param options - Опции для получения {@linkcode GetSupplyOptions}
     * @returns Приёмка
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-poluchit-priemku
     *
     * @example
     * ```ts
     * const supply = await moysklad.supply.get("a7404397-83a7-11ed-0a80-0e9700500d7e");
     * ```
     */
    get<T extends GetSupplyOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetSupplyOptions>): Promise<GetFindResult<SupplyModel, T["expand"]>>;
    /**
     * Обновить приёмку
     *
     * @param id - ID приёмки
     * @param data - Данные для обновления
     * @param options - Опции для обновления {@linkcode UpdateSupplyOptions}
     * @returns Обновленная приёмка
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-izmenit-priemku
     *
     * @example
     * ```ts
     * const supply = await moysklad.supply.update(
     *   "a7404397-83a7-11ed-0a80-0e9700500d7e",
     *   { name: "Новое название" }
     * );
     * ```
     */
    update<T extends UpdateSupplyOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<SupplyModel>, options?: Subset<T, UpdateSupplyOptions>): Promise<GetFindResult<SupplyModel, T["expand"]>>;
    /**
     * Создать или обновить приёмку
     *
     * @param data - Данные для создания или обновления
     * @param options - Опции для операции {@linkcode UpsertSuppliesOptions}
     * @returns Созданная или обновленная приёмка (или массив приёмок)
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-sozdat-priemku
     *
     * @example
     * ```ts
     * const supply = await moysklad.supply.upsert({
     *   organization: { meta: { href: "..." } },
     *   agent: { meta: { href: "..." } },
     *   store: { meta: { href: "..." } }
     * });
     * ```
     */
    upsert<TData extends ModelCreateOrUpdateData<SupplyModel>, TOptions extends UpsertSuppliesOptions = Record<string, unknown>>(data: TData, options?: Subset<TOptions, UpsertSuppliesOptions>): Promise<MatchArrayType<TData, GetFindResult<SupplyModel, TOptions["expand"]>>>;
    /**
     * Получить первую приёмку, соответствующую фильтру
     *
     * @param options - Опции для поиска {@linkcode FirstSupplyOptions}
     * @returns Приёмка
     *
     * @example
     * ```ts
     * const { rows: [supply] } = await moysklad.supply.first({ filter: { name: "Приёмка №1" } });
     * ```
     */
    first<T extends FirstSupplyOptions = Record<string, unknown>>(options?: Subset<T, FirstSupplyOptions>): Promise<ListResponse<GetFindResult<SupplyModel, T["expand"]>, Entity.Supply>>;
    /**
     * Получить количество приёмок
     *
     * @returns Количество приёмок
     *
     * @example
     * ```ts
     * const count = await moysklad.supply.size();
     * ```
     */
    size(): Promise<number>;
    /**
     * Удалить приёмку
     *
     * @param id - ID приёмки
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-udalit-priemku
     *
     * @example
     * ```ts
     * await moysklad.supply.delete("a7404397-83a7-11ed-0a80-0e9700500d7e");
     * ```
     */
    delete(id: string): Promise<void>;
    /**
     * Удалить несколько приёмок
     *
     * @param ids - Массив ID приёмок
     *
     * @example
     * ```ts
     * await moysklad.supply.batchDelete([
     *   "a7404397-83a7-11ed-0a80-0e9700500d7e",
     *   "b8515408-94b8-12fe-1b91-1f8811600e8f"
     * ]);
     * ```
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
    /**
     * Создать шаблон приёмки на основе заказа поставщику
     *
     * @param data - Данные для создания шаблона
     * @returns Шаблон приёмки
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-shablon-priemki-na-osnowe-zakaza-postawschiku
     *
     * @example
     * ```ts
     * const template = await moysklad.supply.template({
     *   purchaseOrder: { meta: { href: "..." } }
     * });
     * ```
     */
    template(data: SupplyTemplateData): Promise<GetFindResult<SupplyModel, {
        positions: true;
    }>>;
}

/**
 * Модель приёмки
 *
 * {@linkcode Supply}
 */
export declare interface SupplyModel extends Model {
    object: Supply;
    expandable: {
        agent: CounterpartyModel;
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        positions: SupplyPositionModel;
        agentAccount: AccountModel;
        organizationAccount: AccountModel;
        purchaseOrder: PurchaseOrderModel;
    };
    filters: {
        id: IdFilter;
        assortment: IdFilter;
        accountId: IdFilter;
        agent: IdFilter;
        applicable: BooleanFilter;
        code: StringFilter;
        contract: IdFilter;
        created: DateTimeFilter;
        deleted: DateTimeFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        moment: DateTimeFilter;
        name: StringFilter;
        organization: IdFilter;
        owner: IdFilter;
        printed: BooleanFilter;
        project: IdFilter;
        published: BooleanFilter;
        shared: BooleanFilter;
        state: IdFilter;
        store: IdFilter;
        sum: NumberFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
    };
    orderableFields: "id" | "syncId" | "updated" | "updatedBy" | "name" | "description" | "externalCode" | "moment" | "applicable" | "sum";
    requiredCreateFields: "agent" | "organization" | "store";
}

export declare interface SupplyOverhead {
    sum: number;
    distribution: SupplyOverheadDistribution;
}

export declare enum SupplyOverheadDistribution {
    Weight = "weight",
    Volume = "volume",
    Price = "price"
}

/**
 * Позиция приёмки
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-poziciq-priemki
 */
export declare interface SupplyPosition extends Idable, Meta<Entity.SupplyPosition> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные товара/услуги/серии/модификации/комплекта, которую представляет собой позиция */
    assortment: Meta<AssortmentEntity>;
    /** Метаданные страны */
    country?: Meta<Entity.Country>;
    /**
     * Процент скидки или наценки
     *
     * Наценка указывается отрицательным числом, т.е. -10 создаст наценку в 10%
     */
    discount: number;
    /** ГТД */
    gtd?: Gtd;
    /**
     * Упаковка Товара.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-towar-towary-atributy-wlozhennyh-suschnostej-upakowki-towara
     */
    pack?: unknown;
    /** Цена товара/услуги в копейках */
    price: number;
    /**
     * Количество товаров/услуг данного вида в позиции.
     *
     * Если позиция - товар, у которого включен учет по серийным номерам, то значение в этом поле всегда будет равно количеству серийных номеров для данной позиции в документе. */
    quantity: number;
    /**
     * Ячейка на складе
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-sklad-yachejki-sklada
     */
    slot?: Meta<Entity.Slot>;
    /**
     * Серийные номера
     *
     * Значение данного атрибута игнорируется, если товар позиции не находится на серийном учете. В ином случае количество товаров в позиции будет равно количеству серийных номеров, переданных в значении атрибута.
     */
    things?: string[];
    /**
     * Коды маркировки товаров и транспортных упаковок
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-priemki-kody-markirowki-towarow-i-transportnyh-upakowok
     */
    trackingCodes?: unknown;
    /**
     * Накладные расходы
     *
     * Если Позиции Приемки не заданы, то накладные расходы нельзя задать.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-priemka-priemki-nakladnye-rashody
     */
    readonly overhead: number;
    /** НДС, которым облагается текущая позиция */
    vat: number;
    /**
     * Включен ли НДС для позиции
     *
     * С помощью этого флага для позиции можно выставлять НДС = 0 или НДС = "без НДС". (`vat` = `0`, `vatEnabled` = `false`) -> `vat` = "без НДС", (`vat` = `0`, `vatEnabled` = `true`) -> `vat` = 0%. */
    vatEnabled: boolean;
}

/**
 * Модель позиции приёмки
 *
 * {@linkcode SupplyPosition}
 */
export declare interface SupplyPositionModel extends Model {
    object: SupplyPosition;
    expandable: {
        assortment: AssortmentModel;
    };
}

export declare interface SupplyTemplateData {
    purchaseOrder: UpdateMeta<Entity.PurchaseOrder>;
}

export declare enum TaxSystem {
    General = "GENERAL_TAX_SYSTEM",
    SimplifiedIncome = "SIMPLIFIED_TAX_SYSTEM_INCOME",
    SimplifiedIncomeOutcome = "SIMPLIFIED_TAX_SYSTEM_INCOME_OUTCOME",
    UnifiedAgricultural = "UNIFIED_AGRICULTURAL_TAX",
    Presumptive = "PRESUMPTIVE_TAX_SYSTEM",
    PatentBased = "PATENT_BASED"
}

export declare interface TextAttribute extends BaseAttribute {
    type: AttributeType.Text;
    value: string;
}

export declare interface TimeAttribute extends BaseAttribute {
    type: AttributeType.Time;
    value: string;
}

/**
 * Опции для авторизации по токену
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-autentifikaciq
 */
export declare type TokenAuth = {
    /** Токен */
    token: string;
};

/**
 * Интерфейс для работы с токенами безопасности
 */
declare interface TokenEndpoint {
    /**
     * Создать новый токен доступа
     *
     * @returns Объект с токеном доступа
     */
    create(): Promise<{
        access_token: string;
    }>;
}

/** Тип маркируемой продукции */
export declare enum TrackingType {
    /** Пиво и слабоалкогольная продукция */
    BeerAlcohol = "BEER_ALCOHOL",
    /** Фотокамеры и лампы-вспышки */
    Electronics = "ELECTRONICS",
    /** Биологически активные добавки к пище */
    FoodSupplement = "FOOD_SUPPLEMENT",
    /** Тип маркировки "Одежда" */
    LpClothes = "LP_CLOTHES",
    /** Тип маркировки "Постельное белье" */
    LpLinens = "LP_LINENS",
    /** Медизделия и кресла-коляски */
    MedicalDevices = "MEDICAL_DEVICES",
    /** Молочная продукция */
    Milk = "MILK",
    /** Никотиносодержащая продукция */
    Ncp = "NCP",
    /** Без маркировки */
    NotTracked = "NOT_TRACKED",
    /** Альтернативная табачная продукция */
    Otp = "OTP",
    /** Духи и туалетная вода */
    Perfumery = "PERFUMERY",
    /** Антисептики */
    Sanitizer = "SANITIZER",
    /** Тип маркировки "Обувь" */
    Shoes = "SHOES",
    /** Безалкогольные напитки */
    SoftDrinks = "SOFT_DRINKS",
    /** Шины и покрышки */
    Tires = "TIRES",
    /** Тип маркировки "Табак" */
    Tobacco = "TOBACCO",
    /** Упакованная вода */
    Water = "WATER"
}

export declare interface UpdateBonusTransactionOptions {
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.bonusTransaction.update("123", {...}, {
     *   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 UpdateCounterpartyOptions {
    expand?: ExpandOptions<CounterpartyModel>;
}

export declare interface UpdateCustomerOrderOptions {
    expand?: ExpandOptions<CustomerOrderModel>;
}

export declare interface UpdateEnterOptions {
    expand?: ExpandOptions<EnterModel>;
}

export declare interface UpdateInventoryOptions {
    expand?: ExpandOptions<InventoryModel>;
}

export declare interface UpdateInvoiceOutOptions {
    expand?: ExpandOptions<InvoiceOutModel>;
}

export declare interface UpdateMeta<T extends Entity> {
    meta: UpdateMetadata<T>;
}

export declare interface UpdateMetadata<T extends Entity> {
    type: T;
    href: string;
    mediaType: MediaType;
}

export declare interface UpdatePaymentInOptions {
    expand?: ExpandOptions<PaymentInModel>;
}

export declare interface UpdatePaymentOutOptions {
    expand?: ExpandOptions<PaymentOutModel>;
}

export declare interface UpdateProcessingPlanOptions {
    expand?: ExpandOptions<ProcessingPlanModel>;
}

export declare interface UpdateProductionStageCompletionMaterialOptions {
    expand?: ExpandOptions<ProductionStageCompletionMaterialModel>;
}

export declare interface UpdateProductionStageCompletionOptions {
    expand?: ExpandOptions<ProductionStageCompletionModel>;
}

export declare interface UpdateProductionStageCompletionResultOptions {
    expand?: ExpandOptions<ProductionStageCompletionResultModel>;
}

export declare interface UpdateProductionStageOptions {
    expand?: ExpandOptions<ProductionStageModel>;
}

export declare interface UpdateProductionTaskMaterialOptions {
    expand?: ExpandOptions<ProductionTaskMaterialModel>;
}

export declare interface UpdateProductionTaskOptions {
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productionTask.update("123", {...}, {
     *   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 UpdateProductOptions {
    expand?: ExpandOptions<ProductModel>;
}

export declare interface UpdatePurchaseOrderOptions {
    expand?: ExpandOptions<PurchaseOrderModel>;
}

export declare interface UpdateSupplyOptions {
    expand?: ExpandOptions<SupplyModel>;
}

export declare interface UpdateVariantOptions {
    expand?: ExpandOptions<VariantModel>;
}

export declare interface UpsertBonusTransactionOptions {
    expand?: ExpandOptions<BonusTransactionModel>;
}

/**
 * Опции для создания или обновления контрагента
 */
export declare interface UpsertCounterpartyOptions {
    expand?: ExpandOptions<CounterpartyModel>;
}

export declare interface UpsertDemandsOptions {
    expand?: ExpandOptions<DemandModel>;
}

export declare interface UpsertProductsOptions {
    expand?: ExpandOptions<ProductModel>;
}

/**
 * Опции для создания/обновления Возвратов покупателей
 */
export declare interface UpsertSalesReturnsOptions {
    expand?: ExpandOptions<SalesReturnModel>;
}

export declare interface UpsertSuppliesOptions {
    expand?: ExpandOptions<SupplyModel>;
}

export declare interface Variant extends Idable, Meta<Entity.Variant> {
    readonly accountId: string;
    archived: boolean;
    barcodes?: Barcodes;
    buyPrice?: {
        value: number;
        currency: Meta<Entity.Currency>;
    };
    characteristics: Attribute[];
    code?: string;
    description?: string;
    discountProhibited: boolean;
    externalCode: string;
    images?: unknown[];
    minPrice?: {
        value: number;
        currency: Meta<Entity.Currency>;
    };
    name: string;
    packs?: {
        barcodes?: Barcodes;
        readonly id: string;
        quantity: number;
        uom: Meta<Entity.Uom>;
    }[];
    product: Meta<Entity.Product>;
    salePrices?: {
        value: number;
        currency: Meta<Entity.Currency>;
        priceType: PriceType;
    }[];
    readonly things?: string[];
    readonly updated: DateTime;
}

export declare type VariantAssortmentModel = VariantModel & {
    object: AssortmentFields;
};

/**
 * Модификации
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-modifikaciq
 */
export declare interface VariantEndpoint {
    /**
     * Получить список модификаций.
     *
     * @param options - Опции для получения списка модификаций {@linkcode ListVariantsOptions}
     * @returns Объект с массивом модификаций
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-modifikaciq-poluchit-modifikacii
     *
     * @example Без опций (по умолчанию первые 1000 сущностей)
     * ```ts
     * const { rows } = await moysklad.variant.list();
     * ```
     *
     * @example С expand
     * ```ts
     * const { rows } = await moysklad.variant.list({
     *   expand: ["product"],
     * });
     * ```
     */
    list<T extends ListVariantsOptions = Record<string, unknown>>(options?: Subset<T, ListVariantsOptions>): Promise<ListResponse<GetFindResult<VariantModel, T["expand"]>, Entity.Variant>>;
    /**
     * Получить все модификации.
     *
     * @param options - Опции для получения всех модификаций {@linkcode AllVariantsOptions}
     * @returns Объект с массивом модификаций
     *
     * @example С expand
     * ```ts
     * const { rows } = await moysklad.variant.all({
     *   expand: ["product"],
     * });
     * ```
     */
    all<T extends AllVariantsOptions = Record<string, unknown>>(options?: Subset<T, AllVariantsOptions>): Promise<BatchGetResult<GetFindResult<VariantModel, T["expand"]>, Entity.Variant>>;
    /**
     * Получить первую модификацию.
     *
     * @param options - Опции для получения первой модификации {@linkcode FirstVariantOptions}
     * @returns Объект с первой модификацией
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.variant.first({
     *   expand: ["product"],
     * });
     * ```
     */
    first<T extends FirstVariantOptions = Record<string, unknown>>(options?: Subset<T, FirstVariantOptions>): Promise<ListResponse<GetFindResult<VariantModel, T["expand"]>, Entity.Variant>>;
    /**
     * Получить модификацию по id.
     *
     * @param id - id модификации
     * @param options - Опции для получения модификации {@linkcode GetVariantOptions}
     * @returns Объект модификации
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-modifikaciq-poluchit-modifikaciu
     *
     * @example
     * ```ts
     * const variant = await moysklad.variant.get("5427bc76-b95f-11eb-0a80-04bb000cd583");
     * ```
     */
    get<T extends GetVariantOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetVariantOptions>): Promise<GetFindResult<VariantModel, T["expand"]>>;
    /**
     * Получить общее количество модификаций.
     *
     * @returns Общее количество модификаций
     */
    size(): Promise<number>;
    /**
     * Удалить модификацию по id.
     * @param id - id модификации
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-modifikaciq-udalit-modifikaciu
     */
    delete(id: string): Promise<void>;
    /**
     * Изменить модификацию.
     *
     * @param id - id модификации
     * @param data - данные для изменения модификации
     * @param options - Опции для изменения модификации {@linkcode UpdateVariantOptions}
     * @returns Объект с обновленной модификацией {@linkcode VariantModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-modifikaciq-izmenit-modifikaciu
     */
    update<T extends UpdateVariantOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<VariantModel>, options?: Subset<T, UpdateVariantOptions>): Promise<GetFindResult<VariantModel, T["expand"]>>;
    /**
     * Создать модификацию.
     *
     * @param data - данные для создания модификации
     * @param options - Опции для создания модификации {@linkcode CreateVariantOptions}
     * @returns Объект с созданной модификацией {@linkcode VariantModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-modifikaciq-sozdat-modifikaciu
     */
    create<T extends CreateVariantOptions = Record<string, unknown>>(data: GetModelCreatableFields<VariantModel>, options?: Subset<T, CreateVariantOptions>): Promise<GetFindResult<VariantModel, T["expand"]>>;
    /**
     * Массово удалить модификации.
     *
     * @param ids - массив id модификаций
     * @returns Массив с результатами удаления модификаций
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-modifikaciq-massowoe-udalenie-modifikacij
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
    /**
     * Массово создать и обновить модификации.
     *
     * @param data - массив из объектов для создания и обновления модификаций
     * @param options - Опции для создания и обновления модификаций {@linkcode CreateVariantOptions}
     * @returns Массив с созданными и обновленными модификациями {@linkcode VariantModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-modifikaciq-massowoe-sozdanie-i-obnowlenie-modifikacij
     */
    upsert<T extends CreateVariantOptions = Record<string, unknown>>(data: (GetModelCreatableFields<VariantModel> | (GetModelUpdatableFields<VariantModel> & UpdateMeta<Entity.Variant>))[], options?: Subset<T, CreateVariantOptions>): Promise<GetFindResult<VariantModel, T["expand"]>[]>;
    /**
     * Поместить модификацию в корзину.
     *
     * @param id - id модификации
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-modifikaciq-pomestit-modifikaciu-w-korzinu
     */
    trash(id: string): Promise<void>;
}

export declare interface VariantModel extends Model {
    object: Variant;
    expandable: {
        product: ProductModel;
    };
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        archived: BooleanFilter;
        barcodes: StringFilter;
        code: StringFilter;
        description: StringFilter;
        externalCode: StringFilter;
        name: StringFilter;
        updated: DateTimeFilter;
        productid: IdFilter;
    };
    orderableFields: "id" | "accountId" | "archived" | "barcodes" | "code" | "description" | "externalCode" | "name" | "updated";
    requiredCreateFields: "characteristics" | "product";
}

/**
 * Условия бонусных баллов
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-bonusnaq-programma-bonusnye-programmy
 */
export declare enum WelcomeBonusMode {
    /** Приветственные баллы начисляются участиникам после регистрации в бонусной программе. */
    Registration = "REGISTRATION",
    /** Приветственные баллы начисляются участиникам бонусной программы после совершения первой покупки. */
    FirstPurchase = "FIRST_PURCHASE"
}

/**
 * Определяет какую информацию нужно заполнить: цены (`evaluate_price`), ндс (`evaluate_vat`), скидки (`evaluate_discount`) или себестоимость (`evaluate_cost`).
 */
export declare type WizardAction = "evaluate_price" | "evaluate_discount" | "evaluate_vat" | "evaluate_cost";

/**
 * Автозаполнение
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-awtozapolnenie
 */
export declare type WizardEndpoint = {
    [E in keyof typeof EntitiesActions]: (options: WizardOptions<(typeof EntitiesActions)[E]>) => Promise<WizardResult<(typeof EntitiesActions)[E]>>;
};

export declare type WizardOptions<A extends WizardAction = WizardAction> = A extends "evaluate_price" ? SetRequired<Partial<BaseOptions<A>>, "action" | "agent"> : A extends "evaluate_discount" ? SetRequired<Partial<BaseOptions<A>>, "action" | "agent"> : A extends "evaluate_vat" ? SetRequired<Partial<BaseOptions<A>>, "action" | "organization"> : SetRequired<Partial<BaseOptions<A>>, "action" | "store">;

export declare type WizardResult<A extends WizardAction> = A extends "evaluate_cost" ? {
    positions: {
        assortment: Meta<AssortmentEntity>;
        cost: number;
    }[];
} : never;

export { }
