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;
    /** Корреспондентский счет */
    correspondentAccount?: 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 AllFactureOutsOptions = Omit<ListFactureOutsOptions, "pagination">;

export declare type AllInventoryOptions = Omit<ListInventoryOptions, "pagination">;

export declare type AllInvoiceOutsOptions = Omit<ListInvoiceOutsOptions, "pagination">;

export declare type AllOrganizationsOptions = Omit<ListOrganizationsOptions, "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 AllProductFoldersOptions = Omit<ListProductFoldersOptions, "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 AllRegionsOptions = Omit<ListRegionsOptions, "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;
};

/**
 * Archived filter that supports boolean values, boolean filter operators,
 * and an array of both [true, false] to include both archived and non-archived items.
 */
export declare type ArchivedFilter = BooleanFilter | [boolean, boolean];

/**
 * Ассортимент
 *
 * @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(options?: AllAssortmentOptions): Promise<ListMeta<AssortmentEntity>>;
}

export declare type AssortmentEntity = Entity.Product | Entity.Service | Entity.Bundle | Entity.Variant | Entity.Consignment;

/**
 * Тип сущности для фильтрации ассортимента
 */
export declare enum AssortmentEntityType {
    /** Товар */
    Product = "product",
    /** Услуга */
    Service = "service",
    /** Комплект */
    Bundle = "bundle",
    /** Модификация */
    Variant = "variant",
    /** Серия */
    Consignment = "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"
}

/**
 * Объединенный тип для всех возможных diff
 */
export declare type AuditDiff = RegistrationAuditDiff | PublicationAuditDiff | EmailAuditDiff | DeleteAuditDiff | UpdateAuditDiff;

/**
 * Событие аудита
 *
 * События аудита содержат подробную информацию о произошедших изменениях, например, изменение значения поля.
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/audit/#audit-audit-sobytiq
 */
export declare type AuditEvent = (BaseAuditEvent & {
    readonly eventType: AuditEventType.Registration;
    readonly diff?: RegistrationAuditDiff;
}) | (BaseAuditEvent & {
    readonly eventType: AuditEventType.OpenPublication | AuditEventType.ClosePublication;
    readonly diff?: PublicationAuditDiff;
}) | (BaseAuditEvent & {
    readonly eventType: AuditEventType.SendEmailFromEntity;
    readonly diff?: EmailAuditDiff;
}) | (BaseAuditEvent & {
    readonly eventType: AuditEventType.Delete;
    readonly diff?: DeleteAuditDiff;
}) | (BaseAuditEvent & {
    readonly eventType: AuditEventType.Update | AuditEventType.PutToArchive | AuditEventType.RestoreFromArchive | AuditEventType.PutToRecycleBin | AuditEventType.RestoreFromRecycleBin;
    readonly diff?: UpdateAuditDiff;
}) | (BaseAuditEvent & {
    readonly eventType: AuditEventType.BulkOperation | AuditEventType.Create | AuditEventType.Print | AuditEventType.ReplaceToken;
    readonly diff?: AuditDiff;
});

/**
 * Тип изменения
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/audit/#audit-audit-sobytiq-atributy-suschnosti
 */
export declare enum AuditEventSource {
    /** Регистрация аккаунта */
    Registration = "registration",
    /** Автоматическая очистка корзины */
    ClearRecycleBin = "clearrecyclebin",
    /** Объединение */
    Combine = "combine",
    /** Массовое создание */
    BulkCreate = "bulkcreate",
    /** Синхронизация с ИМ */
    Connectors = "connectors",
    /** Копирование */
    Copy = "copy",
    /** Отправка сообщения */
    EmailSend = "emailsend",
    /** Синхронизация с Эвотор */
    Evotor = "evotor",
    /** Экспорт */
    Export = "export",
    /** Экспорт в 1С Клиент ЭДО */
    ExportEdiClient1c = "exportediclient1c",
    /** Импорт */
    Import = "import",
    /** Импорт в 1С Клиент ЭДО */
    ImportEdiClient1c = "importediclient1c",
    /** JSON API (remap-1.0, remap-1.1, remap-1.2) */
    JsonApi = "jsonapi",
    /** Вход или выход из МоегоСклада */
    LoginLogout = "loginlogout",
    /** Phone API */
    Phone = "phone-1.0",
    /** POS API */
    PosApi = "posapi",
    /** REST API */
    RestApi = "restapi",
    /** Точка продаж */
    Retail = "retail",
    /** Работа со сценариями */
    Scriptor = "scriptor"
}

/**
 * Действие события аудита
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/audit/#audit-audit-sobytiq-tipy-sobytij
 */
export declare enum AuditEventType {
    /** Регистрация */
    Registration = "registration",
    /** Массовая операция */
    BulkOperation = "bulkoperation",
    /** Удаление публикации */
    ClosePublication = "closepublication",
    /** Создание сущностей */
    Create = "create",
    /** Удаление сущностей */
    Delete = "delete",
    /** Создание публикации */
    OpenPublication = "openpublication",
    /** Печать документа */
    Print = "print",
    /** Помещение в архив */
    PutToArchive = "puttoarchive",
    /** Помещение в корзину */
    PutToRecycleBin = "puttorecyclebin",
    /** Смена токена для Точки продаж */
    ReplaceToken = "replacetoken",
    /** Извлечение из архива */
    RestoreFromArchive = "restorefromarchive",
    /** Извлечение из корзины */
    RestoreFromRecycleBin = "restorefromrecyclebin",
    /** Отправка письма */
    SendEmailFromEntity = "sendemailfromentity",
    /** Изменение сущностей */
    Update = "update"
}

/**
 * Тип сущностей для настроек
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/audit/#audit-audit-sobytiq-atributy-suschnosti
 */
export declare enum AuditObjectType {
    /** Настройки сущностей */
    EntitySettings = "ENTITY_SETTINGS",
    /** Настройки состояний */
    StateSettings = "STATE_SETTINGS",
    /** Настройки шаблонов */
    TemplateSettings = "TEMPLATE_SETTINGS"
}

/**
 * Опции для авторизации
 *
 * @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 BaseAuditEvent {
    /** Дополнительная информация о Событии */
    readonly additionalInfo?: string;
    /** Метаданные контекста */
    readonly audit: Meta<Entity.AuditEvent>;
    /**
     * Метаданные сущности.
     *
     * Не будет выводиться только для товаров, услуг, модификаций, комплектов удаленных до 20.08.2017
     */
    readonly entity?: Meta<Entity>;
    /** Название сущности */
    readonly entityType: Entity;
    /** Время создания события */
    readonly moment: DateTime;
    /** Имя сущности */
    readonly name: string;
    /** Количество измененных объектов */
    readonly objectCount?: number;
    /**
     * Тип сущностей, с которыми связанно данное изменение.
     *
     * Поле присутствует только для `entityType` = `entitysettings` или `statesettings` или `templatesettings`
     *
     * {@linkcode AuditObjectType}
     */
    readonly objectType?: AuditObjectType;
    /**
     * Тип изменения
     *
     * {@linkcode AuditEventSource}
     */
    readonly source: AuditEventSource;
    /**
     * Был ли доступ произведен поддержкой от имени пользователя.
     *
     * Флаг отсутствует, если значение false
     */
    readonly supportAccess?: boolean;
    /** Логин Сотрудника */
    readonly uid: 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<Entity.Country>;
        house?: string;
        postalCode?: string;
        region?: Meta<Entity.Region>;
        street?: string;
    };
    legalAddress?: string;
    legalAddressFull?: {
        addInfo?: string;
        apartment?: string;
        city?: string;
        comment?: string;
        country?: Meta<Entity.Country>;
        house?: string;
        postalCode?: string;
        region?: Meta<Entity.Region>;
        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?: Meta<Entity.State>;
    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;
    }[];
}

/**
 * Юрлицо
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-jurlica
 */
declare interface BaseOrganization extends Idable, Meta<Entity.Organization> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные счетов юрлица */
    accounts: ListMeta<Entity.Account>;
    /** Фактический адрес Юрлица */
    actualAddress?: string;
    /**
     * Фактический адрес Юрлица с детализацией по отдельным полям
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-jurlica-attributy-wlozhennyh-suschnostej-adres
     */
    actualAddressFull?: {
        /** Другое */
        addInfo?: string;
        /** Квартира */
        apartment?: string;
        /** Город */
        city?: string;
        /** Комментарий */
        comment?: string;
        /** Метаданные страны */
        country?: Meta<Entity.Country>;
        /** Дом */
        house?: string;
        /** Почтовый индекс */
        postalCode?: string;
        /** Метаданные региона */
        region?: Meta<Entity.Region>;
        /** Улица */
        street?: string;
    };
    /**
     * Налоговая ставка для авансов для плательщиков НДС.
     *
     * Можно использовать значение только из существующих ставок НДС.
     */
    advancePaymentVat?: number;
    /** Юридический адрес Юрлица */
    legalAddress?: string;
    /**
     * Юридический адрес Юрлица с детализацией по отдельным полям
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-jurlica-attributy-wlozhennyh-suschnostej-adres
     */
    legalAddressFull?: {
        /** Другое */
        addInfo?: string;
        /** Квартира */
        apartment?: string;
        /** Город */
        city?: string;
        /** Комментарий */
        comment?: string;
        /** Метаданные страны */
        country?: Meta<Entity.Country>;
        /** Дом */
        house?: string;
        /** Почтовый индекс */
        postalCode?: string;
        /** Метаданные региона */
        region?: Meta<Entity.Region>;
        /** Улица */
        street?: string;
    };
    /** Номер городского телефона */
    phone?: string;
    /** Адрес электронной почты */
    email?: string;
    /** Добавлено ли Юрлицо в архив */
    archived: boolean;
    /** Массив метаданных дополнительных полей юрлица */
    attributes?: Attribute[];
    /** Бонусные баллы по активной бонусной программе */
    readonly bonusPoints?: number;
    /** Метаданные активной бонусной программы */
    bonusProgram?: Meta<Entity.BonusProgram>;
    /** Главный бухгалтер */
    chiefAccountant?: string;
    /**
     * Подпись главного бухгалтера
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-jurlica-attributy-wlozhennyh-suschnostej-podpisi-i-pechat
     */
    chiefAccountSign?: unknown;
    /** Код Юрлица */
    code?: string;
    /**
     * Тип Юрлица
     *
     * {@linkcode OrganizationCompanyType}
     */
    companyType: OrganizationCompanyType;
    /** Дата создания */
    created: DateTime;
    /** Комментарий к Юрлицу */
    description?: string;
    /** Руководитель */
    director?: string;
    /** Должность руководителя */
    directorPosition?: string;
    /**
     * Подпись руководителя
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-jurlica-attributy-wlozhennyh-suschnostej-podpisi-i-pechat
     */
    directorSign?: unknown;
    /** Внешний код Юрлица */
    externalCode: string;
    /** Номер факса */
    fax?: string;
    /** Идентификатор в ФСРАР */
    fsrarId?: string;
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Включен ли ЕГАИС для данного юрлица */
    isEgaisEnable?: boolean;
    /** Наименование Юрлица */
    name: string;
    /** Владелец (Сотрудник) */
    owner?: Meta<Entity.Employee>;
    /** Является ли данное юрлицо плательщиком НДС */
    payerVat?: boolean;
    /** Общий доступ */
    shared: boolean;
    /**
     * Печать
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-jurlica-attributy-wlozhennyh-suschnostej-podpisi-i-pechat
     */
    stamp?: unknown;
    /** ID синхронизации. После заполнения недоступно для изменения. */
    syncId?: string;
    /** Дата договора с ЦРПТ */
    trackingContractDate?: DateTime;
    /** Номер договора с ЦРПТ */
    trackingContractNumber?: string;
    /** Момент последнего обновления Юрлица */
    readonly updated: DateTime;
    /** IP-адрес УТМ */
    utmUrl?: string;
}

/**
 * Опции для 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 AllBonusTransactionsOptions}
     * @returns Количество бонусных операций
     *
     * @example
     * ```ts
     * const count = await moysklad.bonusTransaction.size();
     * ```
     */
    size(options?: AllBonusTransactionsOptions): Promise<ListMeta<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: ArchivedFilter;
        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(options?: AllCounterpartiesOptions): Promise<ListMeta<Entity.Counterparty>>;
    /**
     * Создать или обновить контрагента.
     *
     * @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;
        state: StateModel;
    };
    filters: {
        accountId: IdFilter;
        actualAddress: StringFilter;
        archived: ArchivedFilter;
        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;
        state: IdFilter;
        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 CreateProductFolderOptions {
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productFolder.create({...}, {
     *   expand: {
     *     owner: {
     *       group: true
     *     },
     *     productFolder: 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<ProductFolderModel>;
}

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(options?: AllCustomerOrdersOptions): Promise<ListMeta<Entity.CustomerOrder>>;
    /**
     * Удалить заказ покупателя по 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"]>[]>;
    /**
     * Получить метаданные заказов покупателей.
     *
     * @returns Метаданные заказов покупателей {@linkcode CustomerOrderMetadata}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-metadannye-zakazow-pokupatelej
     *
     * @example
     * ```ts
     * const metadata = await moysklad.customerOrder.metadata();
     * console.log(metadata.states); // массив статусов
     * ```
     */
    metadata(): Promise<CustomerOrderMetadata>;
}

/**
 * Метаданные заказов покупателей.
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-zakaz-pokupatelq-metadannye-zakazow-pokupatelej
 */
export declare interface CustomerOrderMetadata {
    /** Метаданные */
    meta: {
        href: string;
        mediaType: MediaType;
    };
    /** Дополнительные поля */
    attributes: {
        meta: ListMetadata<Entity.AttributeMetadata>;
    };
    /** Массив статусов заказов покупателей */
    states: State[];
    /** Создавать новые заказы покупателей с меткой "Общий" */
    createShared: boolean;
}

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;
        store: StoreModel;
        project: ProjectModel;
        state: StateModel;
    };
    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[];

/**
 * Diff для событий удаления сущностей
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/audit/#audit-audit-sobytiq-format-polq-diff-sobytiq-udaleniq-suschnostej
 */
export declare type DeleteAuditDiff = Record<string, {
    /** Значение атрибута до удаления */
    oldValue: unknown;
}>;

export declare interface Demand extends Idable, Meta<Entity.Demand> {
    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;
    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(options?: AllDemandsOptions): Promise<ListMeta<Entity.Demand>>;
    /**
     * Удалить отгрузку.
     *
     * @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;
        store: StoreModel;
        project: ProjectModel;
        state: StateModel;
    };
    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;
    expandable: {
        assortment: AssortmentModel;
    };
}

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;
}

/**
 * Diff для событий отправки писем
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/audit/#audit-audit-sobytiq-format-polq-diff-sobytiq-otprawki-pisem
 */
export declare interface EmailAuditDiff {
    /** Почта отправителя письма */
    senderEmail: string;
    /** Почта получателя письма */
    targetEmail: string;
    /** Тема письма */
    subjectEmail: string;
    /** Текст письма */
    text: string;
}

export declare interface Employee extends Idable, Meta<Entity.Employee> {
    readonly accountId: string;
    archived: boolean;
    /** Дополнительные поля */
    attributes?: Attribute[];
    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?: Attribute[];
    /** Отметка о проведении */
    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(options?: AllEntersOptions): Promise<ListMeta<Entity.Enter>>;
    /**
     * Удалить оприходование.
     *
     * @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;
        state: StateModel;
    };
    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",
    AuditEvent = "auditevent",
    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",
    PurchaseReturn = "purchasereturn",
    CommissionReportIn = "commissionreportin",
    RetailShift = "retailshift",
    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",
    TurnoverAll = "turnover",
    TurnoverByStore = "turnoverbystore",
    TurnoverByOperation = "turnoverbyoperation",
    StockByStore = "stockbystore"
}

export declare interface EntrepreneurCounterparty extends BaseCounterparty {
    companyType: CounterpartyCompanyType.Entrepreneur;
    certificateDate?: DateTime;
    certificateNumber?: string;
    inn?: 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;
    /** Имя для Юрлица типа `[Индивидуальный предприниматель, Физическое лицо]` */
    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;

/**
 * Извлекает идентификатор сущности из meta.href.
 *
 * Meta.href в API МойСклад имеет формат:
 * `https://api.moysklad.ru/api/remap/1.2/entity/{type}/{id}` или
 * `https://api.moysklad.ru/api/remap/1.2/entity/{type}/{id}?expand=...`
 *
 * @param href - URL из поля meta.href сущности
 * @returns Идентификатор сущности (UUID) или undefined, если href не передан
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/#mojsklad-json-api-obschie-swedeniq-metadannye
 *
 * @example
 * ```ts
 * const href = "https://api.moysklad.ru/api/remap/1.2/entity/product/7944ef04-f831-11e5-7a69-971500188b19";
 * const id = extractIdFromMetaHref(href);
 * // id === "7944ef04-f831-11e5-7a69-971500188b19"
 * ```
 *
 * @example С query параметрами
 * ```ts
 * const href = "https://api.moysklad.ru/api/remap/1.2/entity/product/7944ef04-f831-11e5-7a69-971500188b19?expand=owner";
 * const id = extractIdFromMetaHref(href);
 * // id === "7944ef04-f831-11e5-7a69-971500188b19"
 * ```
 */
export declare function extractIdFromMetaHref<T extends string | undefined>(href: T): undefined extends T ? string | undefined : string;

/**
 * Счет-фактура выданный
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-faktura-wydannyj
 */
export declare interface FactureOut extends Idable, Meta<Entity.FactureOut> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Метаданные контрагента */
    agent: Meta<Entity.Counterparty>;
    /** Отметка о проведении */
    applicable: boolean;
    /** Коллекция метаданных доп. полей */
    attributes?: Attribute[];
    /** Код выданного Счета-фактуры */
    code?: string;
    /** Метаданные договора */
    contract?: Meta<Entity.Contract>;
    /** Дата создания */
    readonly created: DateTime;
    /** Момент последнего удаления выданного Счета-фактуры */
    readonly deleted?: DateTime;
    /** Комментарий выданного Счета-фактуры */
    description?: string;
    /** Внешний код выданного Счета-фактуры */
    externalCode: string;
    /** Метаданные массива Файлов (Максимальное количество файлов - 100) */
    files: unknown[];
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Дата документа */
    moment: DateTime;
    /** Наименование выданного Счета-фактуры */
    name: string;
    /** Метаданные юрлица */
    organization: Meta<Entity.Organization>;
    /** Владелец (Сотрудник) */
    owner?: Meta<Entity.Employee>;
    /** Напечатан ли документ */
    readonly printed: boolean;
    /** Опубликован ли документ */
    readonly published: boolean;
    /** Валюта */
    rate: DocumentRate;
    /** Общий доступ */
    shared: boolean;
    /** Метаданные статуса выданного Счета-фактуры */
    state?: Meta<Entity.State>;
    /** Идентификатор государственного контракта, договора (соглашения) */
    stateContractId?: string;
    /** Сумма выданного Счета-фактуры в копейках */
    readonly sum: number;
    /** ID синхронизации. После заполнения недоступен для изменения */
    syncId?: string;
    /** Момент последнего обновления выданного Счета-фактуры */
    readonly updated: DateTime;
    /** Массив ссылок на связанные отгрузки */
    demands?: Meta<Entity.Demand>[];
    /** Массив ссылок на связанные входящие платежи */
    payments?: Meta<Entity.PaymentIn>[];
    /** Массив ссылок на связанные возвраты поставщикам */
    /** Метаданные грузополучателя (контрагент или юрлицо) */
    consignee?: Meta<Entity.Counterparty> | Meta<Entity.Organization>;
    /** Название платежного документа */
    paymentNumber?: string;
    /** Дата платежного документа */
    paymentDate?: DateTime;
}

/**
 * Счета-фактуры выданные
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-faktura-wydannyj
 */
export declare interface FactureOutEndpoint {
    /**
     * Получить список счетов-фактур выданных.
     *
     * @param options - Опции для получения списка
     * @returns Объект с списком счетов-фактур выданных
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-faktura-wydannyj-poluchit-wydannye-scheta-faktury
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.factureOut.list();
     * ```
     */
    list<T extends ListFactureOutsOptions = Record<string, unknown>>(options?: Subset<T, ListFactureOutsOptions>): Promise<ListResponse<GetFindResult<FactureOutModel, T["expand"], T["fields"]>, Entity.FactureOut>>;
    /**
     * Получить все счета-фактуры выданные с учетом пагинации.
     *
     * @param options - Опции для получения списка
     * @returns Массив счетов-фактур выданных
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-faktura-wydannyj-poluchit-wydannye-scheta-faktury
     *
     * @example
     * ```ts
     * const factureOuts = await moysklad.factureOut.all();
     * ```
     */
    all<T extends AllFactureOutsOptions = Record<string, unknown>>(options?: Subset<T, AllFactureOutsOptions>): Promise<BatchGetResult<GetFindResult<FactureOutModel, T["expand"], T["fields"]>, Entity.FactureOut>>;
    /**
     * Получить счет-фактуру выданный по ID.
     *
     * @param id - ID счета-фактуры выданного
     * @param options - Опции для получения счета-фактуры выданного
     * @returns Счет-фактура выданный
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-faktura-wydannyj-poluchit-schet-fakturu-wydannyj
     *
     * @example
     * ```ts
     * const factureOut = await moysklad.factureOut.get("99d41b01-aa8a-11e6-8af5-581e0000007e");
     * ```
     */
    get<T extends GetFactureOutOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetFactureOutOptions>): Promise<GetFindResult<FactureOutModel, T["expand"], T["fields"]>>;
    /**
     * Получить первый счет-фактуру выданный из списка.
     *
     * @param options - Опции для получения списка
     * @returns Объект с списком счетов-фактур выданных (с одним элементом)
     *
     * @example
     * ```ts
     * const { rows: [factureOut] } = await moysklad.factureOut.first();
     * ```
     */
    first<T extends FirstFactureOutOptions = Record<string, unknown>>(options?: Subset<T, FirstFactureOutOptions>): Promise<ListResponse<GetFindResult<FactureOutModel, T["expand"], T["fields"]>, Entity.FactureOut>>;
    /**
     * Получить количество счетов-фактур выданных.
     *
     * @returns Количество счетов-фактур выданных
     *
     * @example
     * ```ts
     * const count = await moysklad.factureOut.size();
     * ```
     */
    size(options?: AllFactureOutsOptions): Promise<ListMeta<Entity.FactureOut>>;
    /**
     * Удалить счет-фактуру выданный.
     *
     * @param id - ID счета-фактуры выданного
     * @returns Promise, который разрешается, когда счет-фактура выданный удален
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-faktura-wydannyj-udalit-schet-fakturu-wydannyj
     *
     * @example
     * ```ts
     * await moysklad.factureOut.delete("99d41b01-aa8a-11e6-8af5-581e0000007e");
     * ```
     */
    delete(id: string): Promise<void>;
    /**
     * Удалить несколько счетов-фактур выданных.
     *
     * @param ids - Массив ID счетов-фактур выданных
     * @returns Результат удаления
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-faktura-wydannyj-massowoe-udalenie-schetow-faktur-wydannyh
     *
     * @example
     * ```ts
     * await moysklad.factureOut.batchDelete(["99d41b01-aa8a-11e6-8af5-581e0000007e", "99d41b01-aa8a-11e6-8af5-581e0000007f"]);
     * ```
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
    /**
     * Переместить счет-фактуру выданный в корзину.
     *
     * @param id - ID счета-фактуры выданного
     * @returns Promise, который разрешается, когда счет-фактура выданный перемещен в корзину
     *
     * @example
     * ```ts
     * await moysklad.factureOut.trash("99d41b01-aa8a-11e6-8af5-581e0000007e");
     * ```
     */
    trash(id: string): Promise<void>;
    /**
     * Создать или обновить счет-фактуру выданный.
     *
     * @param data - Данные для создания или обновления счета-фактуры выданного
     * @param options - Опции для создания или обновления счета-фактуры выданного
     * @returns Созданный или обновленный счет-фактура выданный
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-faktura-wydannyj-sozdat-schet-fakturu
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-faktura-wydannyj-izmenit-schet-fakturu-wydannyj
     *
     * @example
     * ```ts
     * const factureOut = await moysklad.factureOut.upsert({
     *   demands: [
     *     {
     *       meta: {
     *         href: "https://api.moysklad.ru/api/remap/1.2/entity/demand/a95dbc95-24e0-11e7-1542-821d00000001",
     *         type: "demand",
     *         mediaType: "application/json"
     *       }
     *     }
     *   ]
     * });
     * ```
     */
    upsert<TData extends ModelCreateOrUpdateData<FactureOutModel>, TOptions extends UpsertFactureOutsOptions = Record<string, unknown>>(data: TData, options?: Subset<TOptions, UpsertFactureOutsOptions>): Promise<MatchArrayType<TData, GetFindResult<FactureOutModel, TOptions["expand"]>>>;
    /**
     * Получить шаблон счета-фактуры выданного на основе отгрузки, возврата поставщику или входящего платежа.
     *
     * @param data - Данные для создания шаблона
     * @returns Шаблон счета-фактуры выданного
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-schet-faktura-wydannyj-shablon-scheta-faktury-wydannogo
     *
     * @example
     * ```ts
     * const template = await moysklad.factureOut.template({
     *   demands: [
     *     {
     *       meta: {
     *         href: "https://api.moysklad.ru/api/remap/1.2/entity/demand/fb3e5ec6-66cc-11e7-6adb-ede5000000be",
     *         type: "demand",
     *         mediaType: "application/json"
     *       }
     *     }
     *   ]
     * });
     * ```
     */
    template(data: FactureOutTemplateData): Promise<GetFindResult<FactureOutModel, undefined>>;
}

/**
 * Модель счета-фактуры выданного
 */
export declare interface FactureOutModel extends Model {
    object: FactureOut;
    expandable: {
        agent: CounterpartyModel;
        group: GroupModel;
        organization: OrganizationModel;
        owner: EmployeeModel;
        state: StateModel;
    };
    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;
        published: BooleanFilter;
        shared: BooleanFilter;
        state: IdFilter;
        sum: NumberFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
        isDeleted: BooleanFilter;
    };
    orderableFields: "id" | "syncId" | "updated" | "name" | "description" | "externalCode" | "moment" | "applicable" | "sum" | "created";
    requiredCreateFields: "organization";
}

/**
 * Данные для создания шаблона счета-фактуры выданного
 */
export declare interface FactureOutTemplateData {
    /** Массив ссылок на связанные отгрузки */
    demands?: UpdateMeta<Entity.Demand>[];
    /** Массив ссылок на связанные входящие платежи */
    payments?: UpdateMeta<Entity.PaymentIn>[];
}

export declare interface FileAttribute extends BaseAttribute {
    type: AttributeType.File;
    value: string;
}

export declare type Filter = IdFilter | BooleanFilter | ArchivedFilter | 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 FirstFactureOutOptions = Omit<ListFactureOutsOptions, "pagination">;

export declare type FirstInventoryOptions = Omit<ListInventoryOptions, "pagination">;

export declare type FirstInvoiceOutOptions = Omit<ListInvoiceOutsOptions, "pagination">;

export declare type FirstOrganizationOptions = Omit<ListOrganizationsOptions, "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 FirstProductFolderOptions = Omit<ListProductFoldersOptions, "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 FirstRegionOptions = Omit<ListRegionsOptions, "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 GetAuditByEntityOptions {
    filter?: {
        moment?: Partial<GreaterOrEqualsFilter<DateTime> & LessOrEqualsFilter<DateTime>>;
        /**
         * В качестве значения должен быть передан href сущности сотрудника. В отфильтрованную выборку попадут все сущности аудита, автором изменений которых является данный пользователь.
         */
        employee?: IdFilter;
        /**
         * В качестве значения должен быть передан тип События, по которому должны быть отфильтрованы сущности аудита.
         */
        eventType?: AuditEventType;
        /**
         * В качестве значения должен быть передан тип действия, по которому должны быть отфильтрованы сущности аудита.
         * Список возможных значений параметра:
         */
        source?: AuditEventSource;
    };
    pagination?: PaginationOptions;
}

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>;
}

/**
 * Опции для получения счета-фактуры выданного
 */
export declare interface GetFactureOutOptions {
    expand?: ExpandOptions<FactureOutModel>;
    fields?: PositionFields;
}

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 ? // ✅ Expand is defined ..
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> ? // ✅ Expand list field.
    ListMeta<O> & {
        rows: IncludeFields<M["expandable"][K]["object"], M["expandable"][K], F>[];
    } : NonNullable<M["object"][K]> extends unknown[] ? M["expandable"][K]["object"][] : M["expandable"][K]["object"] : never : never : never;
}> & IncludeFields<Omit<M["object"], ConditionalKeys<E, true | object>>, M, F> : 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 ? // make it nullable
    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] ? // make it nullable
    M["object"][Key] | null : M["object"][Key];
};

export declare interface GetOrganizationOptions {
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const organization = await moysklad.organization.get("123", {
     *   expand: {
     *     owner: true,
     *     group: 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<OrganizationModel>;
}

/**
 * Опции для получения входящего платежа
 */
export declare interface GetPaymentInOptions {
    /** Опции раскрытия связанных сущностей */
    expand?: ExpandOptions<PaymentInModel>;
}

export declare interface GetPaymentOutOptions {
    expand?: ExpandOptions<PaymentOutModel>;
}

export declare interface GetProcessingPlanOptions {
    expand?: ExpandOptions<ProcessingPlanModel>;
}

export declare interface GetProductFolderOptions {
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productFolder.get("123", {
     *   expand: {
     *     owner: {
     *       group: true
     *     },
     *     productFolder: 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<ProductFolderModel>;
}

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>;
}

/**
 * Опции для получения региона по ID
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-region-region
 */
export declare interface GetRegionOptions {
    /** Параметры раскрытия вложенных сущностей */
    expand?: ExpandOptions<RegionModel>;
}

/**
 * Опции для получения Возврата покупателя
 */
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;
    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;
    /** Имя для Юрлица типа `[Индивидуальный предприниматель, Физическое лицо]` */
    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 AllInventoryOptions}
     * @returns Количество инвентаризаций
     *
     * @example
     * ```ts
     * const count = await moysklad.inventory.size();
     * ```
     */
    size(options?: AllInventoryOptions): Promise<ListMeta<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;
        store: StoreModel;
    };
    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?: Attribute[];
    /** Код Счета покупателю */
    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(options?: AllInvoiceOutsOptions): Promise<ListMeta<Entity.InvoiceOut>>;
    /**
     * Удалить счет покупателю.
     *
     * @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;
        state: StateModel;
    };
    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;
    legalTitle?: string;
    ogrn?: string;
    okpo?: string;
}

/** Юрлицо с типом "Юридическое лицо" */
export declare interface LegalOrganization extends BaseOrganization {
    companyType: OrganizationCompanyType.Legal;
    /** Полное наименование юрлица */
    legalTitle?: 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?: {
        /** Фильтрация по коду вида алкогольной продукции */
        "alcoholic.type"?: NumberFilter;
        /** Фильтрация по признаку архивности товаров */
        archived?: ArchivedFilter;
        /** Фильтрация по артикулам товаров и комплектов */
        article?: StringFilter;
        /** Фильтрация по штрихкодам сущностей */
        barcode?: EqualityFilter<string> | string | string[];
        /** Фильтрация по кодам сущностей */
        code?: StringFilter;
        /** Фильтрация по описаниям сущностей */
        description?: StringFilter;
        /** Фильтрация по внешним кодам сущностей */
        externalCode?: StringFilter;
        /** Фильтрация по владельцу-отделу */
        group?: EqualityFilter<string> | string | string[];
        /** Фильтрация по идентификаторам сущностей */
        id?: IdFilter;
        /** Фильтрация по использованию серийных номеров */
        isSerialTrackable?: BooleanFilter;
        /** Фильтрация по наименованиям сущностей */
        name?: StringFilter;
        /** Фильтрация по владельцу-сотруднику */
        owner?: EqualityFilter<string> | string | string[];
        /** Фильтрация по наименованию групп товаров */
        pathname?: StringFilter;
        /** Фильтрация по группам товаров */
        productFolder?: EqualityFilter<string> | string | string[];
        /** Фильтрация по значению доступно */
        quantityMode?: QuantityMode;
        /** Префиксный поиск по строковым полям */
        search?: EqualityFilter<string> | string;
        /** Фильтрация по признаку общего доступа */
        shared?: BooleanFilter;
        /** Фильтрация по значению остатка */
        stockMode?: StockMode;
        /** Момент времени, на который нужно вывести остатки */
        stockMoment?: DateTimeFilter;
        /** Фильтрация по складам */
        stockStore?: EqualityFilter<string> | string | string[];
        /** Фильтрация по поставщикам */
        supplier?: EqualityFilter<string> | string | string[];
        /** Фильтрация по типу сущности */
        type?: EqualityFilter<AssortmentEntityType> | AssortmentEntityType | AssortmentEntityType[];
        /** Фильтрация по времени последнего обновления */
        updated?: DateTimeFilter;
        /** Фильтрация по автору последнего обновления */
        updatedBy?: EqualityFilter<string> | string | string[];
        /** Фильтрация по признаку весового товара */
        weighed?: BooleanFilter;
        /** Параметр учета вложенных подгрупп */
        withSubFolders?: boolean;
    };
    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 ListFactureOutsOptions {
    pagination?: PaginationOptions;
    fields?: PositionFields;
    expand?: ExpandOptions<FactureOutModel>;
    order?: OrderOptions<FactureOutModel>;
    search?: string;
    filter?: FilterOptions<FactureOutModel>;
}

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 ListOrganizationsOptions {
    /**
     * Опции пагинации
     *
     * {@linkcode PaginationOptions}
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.organization.list({
     *   pagination: { limit: 10, offset: 0 },
     * })
     * ```
     */
    pagination?: PaginationOptions;
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.organization.list({
     *   expand: {
     *     owner: true,
     *     group: 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<OrganizationModel>;
    /**
     * Опции сортировки
     *
     * @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.organization.list({
     *   order: { field: "name", direction: "asc" },
     * })
     * ```
     *
     * @example Несколько полей
     * ```ts
     * const { rows } = await moysklad.organization.list({
     *   order: [
     *     { field: "name", direction: "asc" },
     *     { field: "created", direction: "desc" },
     *   ],
     * })
     * ```
     */
    order?: OrderOptions<OrganizationModel>;
    /**
     * Контекстный поиск
     *
     * Поиск среди объектов юрлиц осуществляется по полям: `name`, `code`, `legalTitle`, `email`, `phone`.
     *
     * @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.organization.list({
     *   filter: {
     *     name: {
     *       sw: "ООО",
     *     }
     *   }
     * });
     * ```
     */
    filter?: FilterOptions<OrganizationModel>;
}

/**
 * Опции для получения списка входящих платежей
 */
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 ListProductFoldersOptions {
    /**
     * Опции пагинации
     *
     * {@linkcode PaginationOptions}
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productFolder.list({
     *  pagination: { limit: 10, offset: 0 },
     * })
     * ```
     */
    pagination?: PaginationOptions;
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productFolder.list({
     *   expand: {
     *     owner: {
     *       group: true
     *     },
     *     productFolder: 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<ProductFolderModel>;
    /**
     * Опции сортировки
     *
     * @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.productFolder.list({
     *   order: { field: "name", direction: "asc" },
     * })
     * ```
     *
     * @example Несколько полей
     * ```ts
     * const { rows } = await moysklad.productFolder.list({
     *   order: [
     *     { field: "name", direction: "asc" },
     *     { field: "updated", direction: "desc" },
     *   ],
     * })
     * ```
     */
    order?: OrderOptions<ProductFolderModel>;
    /**
     * Контекстный поиск
     *
     * @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.productFolder.list({
     *   filter: {
     *     name: {
     *       sw: "test",
     *     }
     *   }
     * });
     * ```
     */
    filter?: FilterOptions<ProductFolderModel>;
}

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>;
}

/**
 * Опции для получения списка регионов
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-region-poluchit-regiony
 */
export declare interface ListRegionsOptions {
    /** Параметры пагинации */
    pagination?: PaginationOptions;
    /** Параметры раскрытия вложенных сущностей */
    expand?: ExpandOptions<RegionModel>;
    /** Параметры сортировки */
    order?: OrderOptions<RegionModel>;
    /** Строка поиска */
    search?: string;
    /** Параметры фильтрации */
    filter?: FilterOptions<RegionModel>;
}

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 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-jurlico
     */
    organization: OrganizationEndpoint;
    /**
     * Пользовательские справочники
     *
     * @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-schet-faktura-wydannyj
     */
    factureOut: FactureOutEndpoint;
    /**
     * Приёмки
     *
     * @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-gruppa-towarow
     */
    productFolder: ProductFolderEndpoint;
    /**
     * Техкарты
     *
     * @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/dictionaries/#suschnosti-region
     */
    region: RegionEndpoint;
    /**
     * Производственные этапы
     *
     * @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;

/**
 * Юрлицо
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-jurlica
 */
export declare type Organization = LegalOrganization | EntrepreneurOrganization | IndividualOrganization;

/**
 * Тип юрлица
 *
 * В зависимости от значения данного поля набор выводимых реквизитов юрлица может меняться.
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-jurlica-tip-jurlica
 */
export declare enum OrganizationCompanyType {
    /** Юридическое лицо */
    Legal = "legal",
    /** Индивидуальный предприниматель */
    Entrepreneur = "entrepreneur",
    /** Физическое лицо */
    Individual = "individual"
}

/**
 * Юрлица
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico
 */
export declare interface OrganizationEndpoint {
    /**
     * Получить список юрлиц.
     *
     * @param options - Опции для получения списка {@linkcode ListOrganizationsOptions}
     * @returns Объект с списком юрлиц
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-poluchit-spisok-jurlits
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.organization.list();
     * ```
     */
    list<T extends ListOrganizationsOptions = Record<string, unknown>>(options?: Subset<T, ListOrganizationsOptions>): Promise<ListResponse<GetFindResult<OrganizationModel, T["expand"]>, Entity.Organization>>;
    /**
     * Получить все юрлица.
     *
     * @param options - Опции для получения всех юрлиц {@linkcode AllOrganizationsOptions}
     * @returns Объект с массивом юрлиц
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-poluchit-spisok-jurlits
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.organization.all();
     * ```
     */
    all<T extends AllOrganizationsOptions = Record<string, unknown>>(options?: Subset<T, AllOrganizationsOptions>): Promise<BatchGetResult<GetFindResult<OrganizationModel, T["expand"]>, Entity.Organization>>;
    /**
     * Получить юрлицо по id.
     *
     * @param id - id юрлица
     * @param options - Опции для получения юрлица {@linkcode GetOrganizationOptions}
     * @returns Объект с юрлицом {@linkcode OrganizationModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-poluchit-jurlico
     *
     * @example
     * ```ts
     * const organization = await moysklad.organization.get("5427bc76-b95f-11eb-0a80-04bb000cd583");
     * ```
     */
    get<T extends GetOrganizationOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetOrganizationOptions>): Promise<GetFindResult<OrganizationModel, T["expand"]>>;
    /**
     * Изменить юрлицо.
     *
     * @param id - id юрлица
     * @param data - данные для изменения юрлица
     * @param options - Опции для изменения юрлица {@linkcode UpdateOrganizationOptions}
     * @returns Объект с обновленным юрлицом {@linkcode OrganizationModel}
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-izmenit-jurlico
     *
     * @example
     * ```ts
     * await moysklad.organization.update("5427bc76-b95f-11eb-0a80-04bb000cd583", {
     *   name: "ООО Ромашка",
     * });
     * ```
     */
    update<T extends UpdateOrganizationOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<OrganizationModel>, options?: Subset<T, UpdateOrganizationOptions>): Promise<GetFindResult<OrganizationModel, T["expand"]>>;
    /**
     * Получить первое юрлицо из списка.
     *
     * @param options - Опции для получения первого юрлица {@linkcode FirstOrganizationOptions}
     * @returns Объект с первым юрлицом
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-poluchit-spisok-jurlits
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.organization.first();
     * const firstOrganization = rows[0];
     * ```
     */
    first<T extends FirstOrganizationOptions = Record<string, unknown>>(options?: Subset<T, FirstOrganizationOptions>): Promise<ListResponse<GetFindResult<OrganizationModel, T["expand"]>, Entity.Organization>>;
    /**
     * Получить количество юрлиц.
     *
     * @returns Количество юрлиц
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-poluchit-spisok-jurlits
     *
     * @example
     * ```ts
     * const count = await moysklad.organization.size();
     * ```
     */
    size(options?: AllOrganizationsOptions): Promise<ListMeta<Entity.Organization>>;
    /**
     * Удалить юрлицо по id.
     *
     * @param id - id юрлица
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-udalit-jurlico
     */
    delete(id: string): Promise<void>;
    /**
     * Массово удалить юрлица.
     *
     * @param ids - массив id юрлиц
     * @returns Массив с результатами удаления юрлиц
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-massowoe-udalenie-jurlits
     */
    batchDelete(ids: string[]): Promise<BatchDeleteResult[]>;
    /**
     * Создать или обновить юрлицо.
     *
     * @param data - Данные для создания или обновления юрлица
     * @param options - Опции для создания или обновления юрлица {@linkcode UpsertOrganizationOptions}
     * @returns Созданное или обновленное юрлицо (или массив юрлиц)
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-sozdat-jurlico
     *
     * @example
     * ```ts
     * const organization = await moysklad.organization.upsert({
     *   name: "ООО Ромашка",
     * });
     * ```
     */
    upsert<TData extends ModelCreateOrUpdateData<OrganizationModel>, TOptions extends UpsertOrganizationOptions = Record<string, unknown>>(data: TData, options?: Subset<TOptions, UpsertOrganizationOptions>): Promise<MatchArrayType<TData, GetFindResult<OrganizationModel, TOptions["expand"]>>>;
    /**
     * Получить список счетов юрлица.
     *
     * @param id - id юрлица
     * @param options - Опции для получения списка счетов
     * @returns Объект с списком счетов юрлица
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-poluchit-scheta-jurlica
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.organization.listAccounts("5427bc76-b95f-11eb-0a80-04bb000cd583");
     * ```
     */
    listAccounts(id: string, options?: ListOrganizationsOptions): Promise<ListResponse<AccountModel["object"], Entity.Account>>;
    /**
     * Изменить счета юрлица.
     *
     * @param id - id юрлица
     * @param data - массив счетов для обновления
     * @returns Объект с обновленными счетами юрлица
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-jurlico-izmenit-scheta-jurlica
     *
     * @example
     * ```ts
     * await moysklad.organization.updateAccounts("5427bc76-b95f-11eb-0a80-04bb000cd583", [
     *   { accountNumber: "40702810001234567890", isDefault: true },
     * ]);
     * ```
     */
    updateAccounts(id: string, data: GetModelCreatableFields<AccountModel>[]): Promise<ListResponse<AccountModel["object"], Entity.Account>>;
}

export declare interface OrganizationModel extends Model {
    /** Основная сущность юрлица {@linkcode Organization} */
    object: Organization;
    expandable: {
        accounts: AccountModel;
        bonusProgram: BonusProgramModel;
        group: GroupModel;
        owner: EmployeeModel;
    };
    filters: {
        accountId: IdFilter;
        actualAddress: StringFilter;
        archived: ArchivedFilter;
        code: StringFilter;
        companyType: EnumFilter<OrganizationCompanyType>;
        created: DateTimeFilter;
        description: StringFilter;
        email: StringFilter;
        externalCode: StringFilter;
        fax: StringFilter;
        group: IdFilter;
        id: IdFilter;
        inn: StringFilter;
        kpp: StringFilter;
        legalAddress: StringFilter;
        legalTitle: StringFilter;
        name: StringFilter;
        owner: IdFilter;
        phone: StringFilter;
        shared: BooleanFilter;
        syncId: IdFilter;
        updated: DateTimeFilter;
    };
    orderableFields: "id" | "name" | "code" | "externalCode" | "archived" | "created" | "updated" | "description" | "email" | "phone" | "fax";
    requiredCreateFields: "name";
}

/**
 * Опции пагинации
 */
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;

/**
 * Входящий платеж
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/documents/#dokumenty-vhodqschij-platezh
 */
export declare interface PaymentIn extends Idable, Meta<Entity.PaymentIn> {
    /** ID учетной записи */
    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;
    /** Комментарий Входящего платежа */
    description?: string;
    /** Внешний код Входящего платежа */
    externalCode: string;
    /** Ссылка на Счет-фактуру выданный, с которым связан этот платеж */
    factureOut?: Meta<Entity.FactureOut>;
    /** Метаданные массива Файлов (Максимальное количество файлов - 100) */
    files?: unknown[];
    /** Отдел сотрудника */
    group: Meta<Entity.Group>;
    /** Входящая дата */
    incomingDate?: DateTime;
    /** Входящий номер */
    incomingNumber?: number;
    /** Дата документа */
    moment: DateTime;
    /** Наименование Входящего платежа */
    name: string;
    /** Массив ссылок на связанные операции */
    operations?: Array<{
        meta: Meta<Entity.CustomerOrder | Entity.PurchaseReturn | Entity.Demand | Entity.InvoiceOut | Entity.CommissionReportIn | Entity.RetailShift>;
        linkedSum?: number;
    }>;
    /** Метаданные юрлица */
    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;
    /** Метаданные канала продаж */
    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-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(options?: AllPaymentInsOptions): Promise<ListMeta<Entity.PaymentIn>>;
    /**
     * Удалить входящий платеж
     *
     * @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;
        state: StateModel;
        project: ProjectModel;
    };
    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?: Attribute[];
    /** Код Исходящего платежа */
    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(options?: AllPaymentOutsOptions): Promise<ListMeta<Entity.PaymentOut>>;
    /**
     * Удалить исходящий платеж.
     *
     * @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;
        state: StateModel;
        project: ProjectModel;
    };
    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(options?: AllProcessingPlansOptions): Promise<ListMeta<Entity.ProcessingPlan>>;
    /**
     * Создать техкарту.
     *
     * @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
 */
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;
}

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
 */
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;
}

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(options?: AllProductsOptions): Promise<ListMeta<Entity.Product>>;
    /**
     * Удалить товар.
     *
     * @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 AuditEvent}
     *
     * @param id - ID товара
     * @param options - Опции для получения событий аудита
     * @returns Список событий аудита
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/audit/#audit-audit-poluchit-sobytiq-po-suschnosti
     */
    audit(id: string, options?: GetAuditByEntityOptions): Promise<ListResponse<AuditEvent, Entity.AuditEvent>>;
}

/**
 * Группа товаров
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-gruppa-towarow
 */
export declare interface ProductFolder extends Idable, Meta<Entity.ProductFolder> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Добавлена ли Группа товаров в архив */
    readonly archived: boolean;
    /** Код Группы товаров */
    code?: string;
    /** Описание Группы товаров */
    description?: string;
    /** Реальный НДС % */
    readonly effectiveVat?: number;
    /** Дополнительный признак для определения разграничения реального НДС = 0 или "без НДС". (effectiveVat = 0, effectiveVatEnabled = false) -> "без НДС", (effectiveVat = 0, effectiveVatEnabled = true) -> 0%. */
    readonly effectiveVatEnabled?: boolean;
    /** Внешний код Группы товаров */
    externalCode: string;
    /** Метаданные отдела сотрудника */
    group: Meta<Entity.Group>;
    /** Наименование Группы товаров */
    name: string;
    /** Метаданные владельца (Сотрудника) */
    owner?: Meta<Entity.Employee>;
    /** Наименование Группы товаров, в которую входит данная Группа товаров */
    readonly pathName: string;
    /** Ссылка на Группу товаров, в которую входит данная Группа товаров, в формате Метаданных */
    productFolder?: Meta<Entity.ProductFolder>;
    /** Общий доступ */
    shared: boolean;
    /** Код системы налогообложения */
    taxSystem?: TaxSystem;
    /** Момент последнего обновления сущности */
    readonly updated: DateTime;
    /** Используется ли ставка НДС родительской группы. Если true для единицы ассортимента будет применена ставка, установленная для родительской группы. */
    useParentVat: boolean;
    /** НДС % */
    vat?: number;
    /** Включен ли НДС для группы. С помощью этого флага для группы можно выставлять НДС = 0 или НДС = "без НДС". (vat = 0, vatEnabled = false) -> vat = "без НДС", (vat = 0, vatEnabled = true) -> vat = 0%. */
    vatEnabled?: boolean;
}

/**
 * Группы товаров
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-gruppa-towarow
 */
export declare interface ProductFolderEndpoint {
    /**
     * Получить список групп товаров.
     *
     * @param options - Опции для получения списка {@linkcode ListProductFoldersOptions}
     * @returns Объект с списком групп товаров
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-gruppa-towarow-poluchit-gruppy-towarow
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productFolder.list();
     * ```
     */
    list<T extends ListProductFoldersOptions = Record<string, unknown>>(options?: Subset<T, ListProductFoldersOptions>): Promise<ListResponse<GetFindResult<ProductFolderModel, T["expand"]>, Entity.ProductFolder>>;
    /**
     * Получить все группы товаров
     *
     * @param options - Опции для получения списка {@linkcode ListProductFoldersOptions}
     * @returns Массив групп товаров
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productFolder.all();
     * ```
     */
    all<T extends ListProductFoldersOptions = Record<string, unknown>>(options?: Subset<T, ListProductFoldersOptions>): Promise<BatchGetResult<GetFindResult<ProductFolderModel, T["expand"]>, Entity.ProductFolder>>;
    /**
     * Получить первую группу товаров, соответствующую фильтру
     *
     * @param options - Опции для поиска {@linkcode FirstProductFolderOptions}
     * @returns Группа товаров
     *
     * @example
     * ```ts
     * const { rows: [folder] } = await moysklad.productFolder.first({ filter: { name: { eq: "Овощи" } } });
     * ```
     */
    first<T extends FirstProductFolderOptions = Record<string, unknown>>(options?: Subset<T, FirstProductFolderOptions>): Promise<GetFindResult<ProductFolderModel, T["expand"]>>;
    /**
     * Получить группу товаров по ID
     *
     * @param id - ID группы товаров
     * @param options - Опции для получения {@linkcode GetProductFolderOptions}
     * @returns Группа товаров
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-gruppa-towarow-poluchit-gruppu-towarow
     *
     * @example
     * ```ts
     * const folder = await moysklad.productFolder.get("a7404397-83a7-11ed-0a80-0e9700500d7e");
     * ```
     */
    get<T extends GetProductFolderOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetProductFolderOptions>): Promise<GetFindResult<ProductFolderModel, T["expand"]>>;
    /**
     * Создать новую группу товаров
     *
     * @param data - Данные для создания группы товаров
     * @param options - Опции для создания {@linkcode CreateProductFolderOptions}
     * @returns Созданная группа товаров
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-gruppa-towarow-sozdat-nowuu-gruppu-towarow
     *
     * @example
     * ```ts
     * const folder = await moysklad.productFolder.create({
     *   name: "Овощи",
     *   code: "vegetables",
     *   vat: 20
     * });
     * ```
     */
    create<T extends CreateProductFolderOptions = Record<string, unknown>>(data: GetModelCreatableFields<ProductFolderModel>, options?: Subset<T, CreateProductFolderOptions>): Promise<GetFindResult<ProductFolderModel, T["expand"]>>;
    /**
     * Обновить группу товаров
     *
     * @param id - ID группы товаров
     * @param data - Данные для обновления
     * @param options - Опции для обновления {@linkcode UpdateProductFolderOptions}
     * @returns Обновленная группа товаров
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-gruppa-towarow-izmenit-gruppu-towarow
     *
     * @example
     * ```ts
     * const folder = await moysklad.productFolder.update(
     *   "a7404397-83a7-11ed-0a80-0e9700500d7e",
     *   { name: "Фрукты" }
     * );
     * ```
     */
    update<T extends UpdateProductFolderOptions = Record<string, unknown>>(id: string, data: GetModelUpdatableFields<ProductFolderModel>, options?: Subset<T, UpdateProductFolderOptions>): Promise<GetFindResult<ProductFolderModel, T["expand"]>>;
    /**
     * Создать или обновить группу товаров
     *
     * @param data - Данные для создания или обновления
     * @param options - Опции для операции {@linkcode UpsertProductFolderOptions}
     * @returns Созданная или обновленная группа товаров (или массив групп)
     *
     * @example
     * ```ts
     * const folder = await moysklad.productFolder.upsert({
     *   meta: {
     *     href: "https://api.moysklad.ru/api/remap/1.2/entity/productfolder/a7404397-83a7-11ed-0a80-0e9700500d7e",
     *     type: Entity.ProductFolder,
     *     mediaType: MediaType.Json,
     *   },
     *   name: "Фрукты"
     * });
     * ```
     *
     * @example
     * ```ts
     * const folders = await moysklad.productFolder.upsert([
     *   // Создание
     *   {
     *     name: "Овощи"
     *   },
     *   // Обновление
     *   {
     *     meta: {
     *       href: "https://api.moysklad.ru/api/remap/1.2/entity/productfolder/b8515408-94b8-12fe-1b91-1f8811600e8f",
     *       type: Entity.ProductFolder,
     *       mediaType: MediaType.Json,
     *     },
     *     name: "Фрукты"
     *   }
     * ]);
     * ```
     */
    upsert<TData extends ModelCreateOrUpdateData<ProductFolderModel>, TOptions extends UpsertProductFolderOptions = Record<string, unknown>>(data: TData, options?: Subset<TOptions, UpsertProductFolderOptions>): Promise<MatchArrayType<TData, GetFindResult<ProductFolderModel, TOptions["expand"]>>>;
    /**
     * Удалить группу товаров
     *
     * @param id - ID группы товаров
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-gruppa-towarow-udalit-gruppu-towarow
     *
     * @example
     * ```ts
     * await moysklad.productFolder.delete("a7404397-83a7-11ed-0a80-0e9700500d7e");
     * ```
     */
    delete(id: string): Promise<void>;
    /**
     * Удалить несколько групп товаров
     *
     * @param ids - Массив ID групп товаров
     *
     * @example
     * ```ts
     * await moysklad.productFolder.batchDelete([
     *   "a7404397-83a7-11ed-0a80-0e9700500d7e",
     *   "b8515408-94b8-12fe-1b91-1f8811600e8f"
     * ]);
     * ```
     */
    batchDelete(ids: string[]): Promise<void>;
}

export declare interface ProductFolderModel extends Model {
    /** Основная сущность группы товаров {@linkcode ProductFolder} */
    object: ProductFolder;
    expandable: {
        owner: EmployeeModel;
        group: GroupModel;
        productFolder: ProductFolderModel;
    };
    orderableFields: "id" | "code" | "externalCode" | "name" | "updated" | "archived" | "pathName";
    requiredCreateFields: "name";
    filters: {
        accountId: IdFilter;
        archived: ArchivedFilter;
        code: StringFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        id: IdFilter;
        name: StringFilter;
        owner: IdFilter;
        pathName: StringFilter;
        shared: BooleanFilter;
        updated: DateTimeFilter;
        updatedBy: IdFilter;
    };
}

/**
 * Позиция производственного задания
 *
 * {@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(options?: AllProductionStageCompletionOptions): Promise<ListMeta<Entity.ProductionStageCompletionMaterial>>;
    };
    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(options?: AllProductionStageCompletionOptions): Promise<ListMeta<Entity.ProductionStageCompletionResult>>;
    };
}

/**
 * Выполнение этапа производства
 *
 * @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(options?: AllProductionStageCompletionOptions): Promise<ListMeta<Entity.ProductionStageCompletion>>;
    /**
     * Удалить выполнение этапа производства по 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;
        materialStore: StoreModel;
    };
    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` недоступен `expand` вложенных полей.
     */
    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;
    /** Массив ссылок на связанные заказы покупателей в формате Метаданных */
    customerOrders?: Meta<Entity.CustomerOrder>[];
}

/**
 * Производственные задания
 *
 * @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(options?: AllProductionTasksOptions): Promise<ListMeta<Entity.ProductionTask>>;
    /**
     * Удалить производственное задание по 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;
        materialsStore: StoreModel;
        productsStore: StoreModel;
        state: StateModel;
    };
    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: ArchivedFilter;
        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"
}

/**
 * Проект
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-proekt
 */
export declare interface Project extends Idable, Meta<Entity.Project> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Добавлен ли проект в архив */
    archived: boolean;
    /** Коллекция дополнительных полей */
    attributes?: Attribute[];
    /** Код проекта */
    code?: string;
    /** Описание проекта */
    description?: string;
    /** Внешний код проекта */
    externalCode: string;
    /** Метаданные отдела сотрудника */
    group: Meta<Entity.Group>;
    /** Наименование проекта */
    name: string;
    /** Метаданные владельца (Сотрудника) */
    owner?: Meta<Entity.Employee>;
    /** Общий доступ */
    shared: boolean;
    /** Момент последнего обновления проекта */
    readonly updated: DateTime;
}

export declare interface ProjectAttribute extends BaseAttribute {
    type: AttributeType.Project;
    value: Meta<Entity.Project> & {
        name: string;
    };
}

/**
 * Модель проекта
 *
 * {@linkcode Project}
 */
export declare interface ProjectModel extends Model {
    object: Project;
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        archived: BooleanFilter;
        code: StringFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        name: StringFilter;
        owner: IdFilter;
        shared: BooleanFilter;
        updated: DateTimeFilter;
    };
}

/**
 * Diff для событий публикации документов
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/audit/#audit-audit-sobytiq-format-polq-diff-sobytiq-publikacii-dokumentow
 */
export declare interface PublicationAuditDiff {
    /** Название шаблона */
    templateName: string;
    /** Ссылка на публикацию */
    publicationHref: 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?: 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.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(options?: AllPurchaseOrdersOptions): Promise<ListMeta<Entity.PurchaseOrder>>;
    /**
     * Удалить заказ поставщику по 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;
    };
}

/**
 * Режим фильтрации по доступности
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-assortiment-atributy-dostupnye-dlq-fil-tracii-dostupnye-znacheniq-dlq-quantitymode
 */
export declare enum QuantityMode {
    /** Любое значение остатка */
    All = "all",
    /** Положительный остаток */
    PositiveOnly = "positiveOnly",
    /** Отрицательный остаток */
    NegativeOnly = "negativeOnly",
    /** Нулевой остаток */
    Empty = "empty",
    /** Ненулевой остаток */
    NonEmpty = "nonEmpty",
    /** Остаток ниже неснижаемого остатка */
    UnderMinimum = "underMinimum"
}

/**
 * Регион
 *
 * Справочник регионов России для использования в адресах.
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-region
 */
export declare interface Region extends Idable, Meta<Entity.Region> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Код Региона */
    code?: string;
    /** Внешний код Региона */
    externalCode: string;
    /** Наименование Региона */
    name: string;
    /** Момент последнего обновления сущности */
    readonly updated: DateTime;
    /** Версия сущности */
    readonly version: number;
}

/**
 * Регионы
 *
 * Справочник регионов России. Данный справочник предназначен только для чтения.
 * Средствами JSON API можно запрашивать список регионов России и сведения по отдельным регионам.
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-region
 */
export declare interface RegionEndpoint {
    /**
     * Получить список регионов.
     *
     * Результат: Объект JSON, включающий в себя поля: meta, context, rows.
     * Возвращает список всех регионов России с пагинацией.
     *
     * @param options - Опции для получения списка {@linkcode ListRegionsOptions}
     * @returns Объект с списком регионов
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-region-poluchit-regiony
     *
     * @example
     * ```ts
     * // Получить первые 25 регионов
     * const { rows } = await moysklad.region.list();
     *
     * // Получить регионы с фильтрацией по названию
     * const { rows } = await moysklad.region.list({
     *   filter: {
     *     name: { contains: "Москва" }
     *   }
     * });
     *
     * // Получить регионы с сортировкой по коду
     * const { rows } = await moysklad.region.list({
     *   order: { by: "code", direction: "asc" }
     * });
     * ```
     */
    list<T extends ListRegionsOptions = Record<string, unknown>>(options?: Subset<T, ListRegionsOptions>): Promise<ListResponse<GetFindResult<RegionModel, T["expand"]>, Entity.Region>>;
    /**
     * Получить все регионы.
     *
     * Получает полный список всех регионов России без пагинации.
     * Использует последовательные запросы для получения всех данных.
     *
     * @param options - Опции для получения списка {@linkcode AllRegionsOptions}
     * @returns Массив всех регионов
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-region-poluchit-regiony
     *
     * @example
     * ```ts
     * // Получить все регионы России
     * const allRegions = await moysklad.region.all();
     * console.log(`Всего регионов: ${allRegions.length}`);
     *
     * // Получить все регионы с фильтрацией
     * const moscowRegions = await moysklad.region.all({
     *   filter: {
     *     name: { contains: "Москва" }
     *   }
     * });
     * ```
     */
    all<T extends AllRegionsOptions = Record<string, unknown>>(options?: Subset<T, AllRegionsOptions>): Promise<BatchGetResult<GetFindResult<RegionModel, T["expand"]>, Entity.Region>>;
    /**
     * Получить первый регион из списка.
     *
     * Возвращает первый регион из отфильтрованного и отсортированного списка.
     * Удобно для поиска конкретного региона.
     *
     * @param options - Опции для получения списка {@linkcode FirstRegionOptions}
     * @returns Объект с первым регионом (с ограничением в 1 элемент)
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-region-poluchit-regiony
     *
     * @example
     * ```ts
     * // Найти первый регион по названию
     * const { rows } = await moysklad.region.first({
     *   filter: {
     *     name: { contains: "Москва" }
     *   }
     * });
     * const moscowRegion = rows[0];
     *
     * // Получить регион с наименьшим кодом
     * const { rows } = await moysklad.region.first({
     *   order: { by: "code", direction: "asc" }
     * });
     * ```
     */
    first<T extends FirstRegionOptions = Record<string, unknown>>(options?: Subset<T, FirstRegionOptions>): Promise<ListResponse<GetFindResult<RegionModel, T["expand"]>, Entity.Region>>;
    /**
     * Получить регион по ID.
     *
     * Возвращает отдельный регион по его уникальному идентификатору.
     *
     * @param id - ID региона в формате UUID
     * @param options - Опции для получения региона {@linkcode GetRegionOptions}
     * @returns Регион
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-region-region
     *
     * @example
     * ```ts
     * // Получить регион по ID
     * const region = await moysklad.region.get("00000000-0000-0000-0000-000000000077");
     * console.log(`Регион: ${region.name}, код: ${region.code}`);
     * ```
     */
    get<T extends GetRegionOptions = Record<string, unknown>>(id: string, options?: Subset<T, GetRegionOptions>): Promise<GetFindResult<RegionModel, T["expand"]>>;
    /**
     * Получить размер списка регионов.
     *
     * Возвращает количество регионов в системе с учетом примененных фильтров.
     * Полезно для подсчета общего количества регионов или для реализации пагинации.
     *
     * @param options - Опции для фильтрации {@linkcode AllRegionsOptions}
     * @returns Метаданные с информацией о количестве регионов
     *
     * @example
     * ```ts
     * // Получить общее количество регионов
     * const { size } = await moysklad.region.size();
     * console.log(`Всего регионов в России: ${size}`);
     *
     * // Получить количество регионов с определенным названием
     * const { size } = await moysklad.region.size({
     *   filter: {
     *     name: { contains: "область" }
     *   }
     * });
     * console.log(`Количество областей: ${size}`);
     * ```
     */
    size(options?: AllRegionsOptions): Promise<ListMeta<Entity.Region>>;
}

/**
 * Модель для работы с регионами
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-region
 */
export declare interface RegionModel extends Model {
    object: Region;
    expandable: EmptyObject;
    filters: {
        /** ID в формате UUID */
        id: IdFilter;
        /** ID учетной записи */
        accountId: IdFilter;
        /** Код Региона */
        code: StringFilter;
        /** Внешний код Региона */
        externalCode: StringFilter;
        /** Наименование Региона */
        name: StringFilter;
        /** Момент последнего обновления сущности */
        updated: DateTimeFilter;
    };
    orderableFields: "id" | "code" | "externalCode" | "name" | "updated" | "version";
    requiredCreateFields: never;
}

/**
 * Diff для события регистрации
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/audit/#audit-audit-sobytiq-format-polq-diff-sobytie-registracii
 */
export declare interface RegistrationAuditDiff {
    /** Название аккаунта */
    account: string;
    /** Конфигурация аккаунта (страна) */
    country: string;
}

export declare interface ReportEndpoint {
    stock: ReportStockEndpoint;
    profit: ReportProfitEndpoint;
    money: ReportMoneyEndpoint;
    turnover: ReportTurnoverEndpoint;
}

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>>;
    /**
     * Получить отчёт Остатки по складам.
     *
     * Эндпоинт предназначен для получения остатков по складам для товаров.
     *
     * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-ostatki-ostatki-po-skladam
     *
     * @param options Параметры запроса
     * @returns Отчёт Остатки по складам
     */
    byStore(options?: StockByStoreOptions): Promise<ListResponse<StockByStore, Entity.StockByStore>>;
}

export declare interface ReportTurnoverEndpoint {
    /** Обороты по товарам */
    all: (options?: TurnoverReportListOptions) => Promise<ListResponse<TurnoverReport, Entity.TurnoverAll>>;
    /** Обороты по товару с детализацией по складам */
    byStore: (options?: TurnoverByStoreReportListOptions) => Promise<ListResponse<TurnoverByStoreReport, Entity.TurnoverByStore>>;
    /** Обороты по товару с детализацией по документам */
    byOperation: (options: TurnoverByOperationReportListOptions) => Promise<ListResponse<TurnoverByOperationReport, Entity.TurnoverByOperation>>;
}

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?: Attribute[];
    /** Код Возврата Покупателя */
    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(options?: AllSalesReturnsOptions): Promise<ListMeta<Entity.SalesReturn>>;
    /**
     * Удалить возврат покупателя.
     *
     * @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;
        store: StoreModel;
        project: ProjectModel;
        state: StateModel;
    };
    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: ArchivedFilter;
        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/dictionaries/#suschnosti-statusy-dokumentow
 */
export declare interface State extends Idable, Meta<Entity.State> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Название статуса */
    name: string;
    /** Цвет статуса */
    color: number;
    /** Тип статуса */
    stateType: "Regular" | "Successful" | "Unsuccessful";
    /** Тип сущности */
    entityType: string;
}

/**
 * Модель статуса
 *
 * {@linkcode State}
 */
export declare interface StateModel extends Model {
    object: State;
}

/**
 * Атрибуты объекта отчёта
 *
 * @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: ArchivedFilter;
        /** параметр для фильтрации по нескольким сериям. Значение параметра - ссылка на серию, которая должна быть включена в выборку или исключена из нее. Можно передать несколько значений. Данный параметр фильтрации можно комбинировать с параметрами `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;
}

/**
 * Атрибуты объекта отчёта Остатки по складам
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-ostatki-ostatki-po-skladam-atributy-ob-ekta-otcheta
 */
export declare interface StockByStore extends Meta<AssortmentEntity> {
    /** Остатки по складам */
    readonly stockByStore: Array<{
        /** Метаданные склада, по которому выводится Остаток */
        readonly meta: Meta<Entity.Store>;
        /** Наименование склада */
        readonly name: string;
        /** Остаток */
        readonly stock: number;
        /** Ожидание */
        readonly inTransit: number;
        /** Резерв */
        readonly reserve: number;
    }>;
}

export declare interface StockByStoreOptions {
    pagination?: PaginationOptions;
    filter?: {
        /** ссылка на серию, по которой нужно произвести фильтрацию */
        consignment?: IdFilter;
        /** момент времени, на который нужно вывести остатки */
        moment?: DateTimeFilter;
        /** ссылка на товар, по которому нужно произвести фильтрацию */
        product?: IdFilter;
        /** ссылка на группу товаров, по которой нужно произвести фильтрацию */
        productFolder?: IdFilter;
        /** специальный параметр текстового поиска */
        search?: StringFilter;
        /** параметр для фильтрации по признаку весового товара */
        soldByWeight?: BooleanFilter;
        /** параметр для фильтрации по значению остатка */
        stockMode?: EnumFilter<"all" | "positiveOnly" | "negativeOnly" | "empty" | "nonEmpty" | "underMinimum">;
        /** ссылка на склад, для которого нужно построить отчет */
        store?: IdFilter;
        /** параметр для фильтрации по поставщику */
        supplier?: IdFilter;
        /** ссылка на модификация, по которой нужно произвести фильтрацию */
        variant?: IdFilter;
    };
    order?: OrderOption<"pathName" | "name" | "code" | "productCode" | "stockOnAllStores">;
    /**
     * Тип, по которому нужно сгруппировать выдачу.
     *
     * По умолчанию параметр groupBy имеет значение variant. Если вы хотите увидеть объекты типа consignment, или только объекты типа product, необходимо выставить соответствующее значение параметра.
     *
     * @default "variant"
     */
    groupBy?: "product" | "variant" | "consignment";
}

/**
 * Режим фильтрации по остаткам
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-assortiment-atributy-dostupnye-dlq-fil-tracii-dostupnye-znacheniq-dlq-stockmode
 */
export declare enum StockMode {
    /** Любое значение остатка */
    All = "all",
    /** Положительный остаток */
    PositiveOnly = "positiveOnly",
    /** Отрицательный остаток */
    NegativeOnly = "negativeOnly",
    /** Нулевой остаток */
    Empty = "empty",
    /** Ненулевой остаток */
    NonEmpty = "nonEmpty",
    /** Остаток ниже неснижаемого остатка */
    UnderMinimum = "underMinimum"
}

/**
 * Склад
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-sklad
 */
export declare interface Store extends Idable, Meta<Entity.Store> {
    /** ID учетной записи */
    readonly accountId: string;
    /** Адрес склада */
    address?: string;
    /** Адрес склада с детализацией по отдельным полям */
    addressFull?: {
        /** Другое */
        addInfo?: string;
        /** Квартира */
        apartment?: string;
        /** Город */
        city?: string;
        /** Комментарий */
        comment?: string;
        /** Метаданные страны */
        country?: Meta<Entity.Country>;
        /** Дом */
        house?: string;
        /** Почтовый индекс */
        postalCode?: string;
        /** Метаданные региона */
        region?: Meta<Entity.Region>;
        /** Улица */
        street?: string;
    };
    /** Добавлен ли склад в архив */
    archived: boolean;
    /** Массив метаданных дополнительных полей склада */
    attributes?: Attribute[];
    /** Код склада */
    code?: string;
    /** Комментарий к складу */
    description?: string;
    /** Внешний код склада */
    externalCode: string;
    /** Метаданные отдела сотрудника */
    group: Meta<Entity.Group>;
    /** Наименование склада */
    name: string;
    /** Метаданные владельца (Сотрудника) */
    owner?: Meta<Entity.Employee>;
    /** Метаданные родительского склада (Группы) */
    parent?: Meta<Entity.Store>;
    /** Группа склада */
    pathName: string;
    /** Общий доступ */
    shared: boolean;
    /** Момент последнего обновления склада */
    readonly updated: DateTime;
}

export declare interface StoreAttribute extends BaseAttribute {
    type: AttributeType.Store;
    value: Meta<Entity.Store> & {
        name: string;
    };
}

/**
 * Модель склада
 *
 * {@linkcode Store}
 */
export declare interface StoreModel extends Model {
    object: Store;
    filters: {
        id: IdFilter;
        accountId: IdFilter;
        address: StringFilter;
        archived: BooleanFilter;
        code: StringFilter;
        description: StringFilter;
        externalCode: StringFilter;
        group: IdFilter;
        name: StringFilter;
        owner: IdFilter;
        parent: IdFilter;
        pathName: StringFilter;
        shared: BooleanFilter;
        updated: DateTimeFilter;
    };
}

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(options?: AllSuppliesOptions): Promise<ListMeta<Entity.Supply>>;
    /**
     * Удалить приёмку
     *
     * @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"
}

/**
 * Краткое представление Товара или Модификации в отчете
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-oboroty-oboroty-po-towaram-struktura-ob-ekta-assortment
 */
export declare interface TurnoverAssortment {
    /** Метаданные Товара или Модификации */
    meta: Metadata<AssortmentEntity>;
    /** Наименование Товара или Модификации */
    name: string;
    /** Код Товара */
    code?: string;
    /** Артикул Товара */
    article?: string;
    /** Изображение Товара или Модификации */
    image?: unknown;
    /** Группа Товара или Модификации */
    productFolder?: {
        meta: Metadata<Entity.ProductFolder>;
        name: string;
    };
    /** Единица измерения */
    uom?: {
        meta: Metadata<Entity.Uom>;
        name: string;
    };
}

/**
 * Обороты по товару с детализацией по документам
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-oboroty-oboroty-po-towaru-s-detalizaciej-po-dokumentam
 */
export declare interface TurnoverByOperationReport {
    /** Краткое представление Товара или Модификации в отчете */
    assortment: TurnoverAssortment;
    /** Склад */
    store: {
        meta: Metadata<Entity.Store>;
        name: string;
    };
    /** Документ, связанный с Товаром */
    operation: {
        meta: Metadata<Entity>;
        name: string;
        description?: string;
        moment: DateTime;
        agent?: {
            meta: Metadata<Entity.Counterparty>;
            name: string;
        };
    };
    /** Количество товара в документе */
    quantity: number;
    /** Себестоимость товара в копейках в документе */
    cost: number;
    /** Сумма себестоимостей в копейках */
    sum: number;
}

export declare interface TurnoverByOperationReportListOptions {
    filter?: FilterOptions<TurnoverReportModel>;
    /**
     * Начало периода отчета
     */
    momentFrom: DateTime;
    /**
     * Конец периода отчета
     */
    momentTo: DateTime;
}

/**
 * Детализация оборотов по складам
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-oboroty-oboroty-po-towaru-s-detalizaciej-po-skladam-struktura-ob-ekta-detalizaciq-oborotow-po-skladam
 */
export declare interface TurnoverByStoreReport {
    /** Краткое представление Товара или Модификации в отчете */
    assortment: TurnoverAssortment;
    /** Детализация оборотов по складам */
    stockByStore: Array<{
        /** Склад */
        store: {
            meta: Metadata<Entity.Store>;
            name: string;
        };
        /** Показатели на начало периода */
        onPeriodStart: TurnoverMetrics;
        /** Показатели на конец периода */
        onPeriodEnd: TurnoverMetrics;
        /** Показатели прихода в течение периода отчета */
        income: TurnoverMetrics;
        /** Показатели расхода в течение периода отчета */
        outcome: TurnoverMetrics;
    }>;
}

export declare interface TurnoverByStoreReportListOptions {
    filter?: FilterOptions<TurnoverReportModel>;
    /**
     * При отсутствии параметров `momentFrom` и `momentTo` отображаются отчеты за последний месяц.
     *
     * При отсутствии параметра `momentFrom` и указании параметра `momentTo` отображаются отчеты с начала текущего года по `momentTo`.
     *
     * При отсутствии параметра `momentTo` и указании параметра `momentFrom` отображаются отчеты с `momentFrom` по текущий день.
     */
    momentFrom?: DateTime;
    /**
     * При отсутствии параметров `momentFrom` и `momentTo` отображаются отчеты за последний месяц.
     *
     * При отсутствии параметра `momentFrom` и указании параметра `momentTo` отображаются отчеты с начала текущего года по `momentTo`.
     *
     * При отсутствии параметра `momentTo` и указании параметра `momentFrom` отображаются отчеты с `momentFrom` по текущий день.
     */
    momentTo?: DateTime;
}

/**
 * Показатели оборотов (начало/конец периода, приход/расход)
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-oboroty-oboroty-po-towaram-struktura-ob-ekta-pokazateli-onperiodstart-onperiodend-income-outcome
 */
export declare interface TurnoverMetrics {
    /** Сумма себестоимости в копейках */
    sum: number;
    /** Количество единиц товара */
    quantity: number;
}

/**
 * Обороты по товарам
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/reports/#otchety-otchet-oboroty-oboroty-po-towaram
 */
export declare interface TurnoverReport {
    /** Краткое представление Товара или Модификации в отчете */
    assortment: TurnoverAssortment;
    /** Показатели на начало периода */
    onPeriodStart: TurnoverMetrics;
    /** Показатели на конец периода */
    onPeriodEnd: TurnoverMetrics;
    /** Показатели прихода в течение периода отчета */
    income: TurnoverMetrics;
    /** Показатели расхода в течение периода отчета */
    outcome: TurnoverMetrics;
}

export declare interface TurnoverReportListOptions {
    pagination?: PaginationOptions;
    filter?: FilterOptions<TurnoverReportModel>;
    /**
     * При отсутствии параметров `momentFrom` и `momentTo` отображаются отчеты за последний месяц.
     *
     * При отсутствии параметра `momentFrom` и указании параметра `momentTo` отображаются отчеты с начала текущего года по `momentTo`.
     *
     * При отсутствии параметра `momentTo` и указании параметра `momentFrom` отображаются отчеты с `momentFrom` по текущий день.
     */
    momentFrom?: DateTime;
    /**
     * При отсутствии параметров `momentFrom` и `momentTo` отображаются отчеты за последний месяц.
     *
     * При отсутствии параметра `momentFrom` и указании параметра `momentTo` отображаются отчеты с начала текущего года по `momentTo`.
     *
     * При отсутствии параметра `momentTo` и указании параметра `momentFrom` отображаются отчеты с `momentFrom` по текущий день.
     */
    momentTo?: DateTime;
    /**
     * Тип, по которому нужно сгруппировать выдачу.
     * По умолчанию параметр groupBy имеет значение product.
     */
    groupBy?: "product" | "variant";
}

export declare interface TurnoverReportModel extends Model {
    object: TurnoverReport;
    filters: {
        /** ссылка на контрагента, по которому нужно произвести фильтрацию */
        agent: IdFilter;
        /** строка с названием группы контрагентов, по которой нужно произвести фильтрацию */
        agentTag: IdFilter;
        /** ссылка на договор, по которому нужно произвести фильтрацию */
        contract: IdFilter;
        /** ссылка на юрлицо, по которому нужно произвести фильтрацию */
        organization: IdFilter;
        /** ссылка на товар, по которому нужно произвести фильтрацию */
        product: IdFilter;
        /** ссылка на проект, по которому нужно произвести фильтрацию */
        project: IdFilter;
        /** ссылка на точку продаж, по которой нужно произвести фильтрацию */
        retailStore: IdFilter;
        /** ссылка на склад, по которому нужно произвести фильтрацию */
        store: IdFilter;
        /** параметр для фильтрации по поставщику */
        supplier: IdFilter;
        /** тип документа */
        type: "supply" | "purchasereturn" | "demand" | "salesreturn" | "loss" | "enter" | "move" | "processing" | "retaildemand" | "retailsalesreturn" | "productionstagecompletion";
        /** ссылка на модификацию, по которой нужно произвести фильтрацию */
        variant: IdFilter;
        /** параметр для фильтрации "Показывать товары без движения" */
        withoutturnover: BooleanFilter;
        /** параметр для фильтрации "Показывать архивные" */
        archived: ArchivedFilter;
    };
}

/**
 * Diff для событий обновления сущностей, перемещения/восстановления из корзины, перемещение/восстановление из архива
 *
 * @see https://dev.moysklad.ru/doc/api/remap/1.2/audit/#audit-audit-sobytiq-format-polq-diff-sobytiq-obnovleniq-suschnostej-peremescheniq-wosstanowleniq-iz-korziny-peremeschenie-wosstanowlenie-iz-arhiwa
 */
export declare type UpdateAuditDiff = Record<string, {
    /** Значение атрибута до обновления */
    oldValue: unknown;
    /** Значение атрибута после обновления */
    newValue: unknown;
}>;

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 UpdateOrganizationOptions {
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const organization = await moysklad.organization.update("123", {...}, {
     *   expand: {
     *     owner: 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<OrganizationModel>;
}

/**
 * Опции для обновления входящего платежа
 */
export declare interface UpdatePaymentInOptions {
    /** Опции раскрытия связанных сущностей */
    expand?: ExpandOptions<PaymentInModel>;
}

export declare interface UpdatePaymentOutOptions {
    expand?: ExpandOptions<PaymentOutModel>;
}

export declare interface UpdateProcessingPlanOptions {
    expand?: ExpandOptions<ProcessingPlanModel>;
}

export declare interface UpdateProductFolderOptions {
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const { rows } = await moysklad.productFolder.update("123", {...}, {
     *   expand: {
     *     owner: {
     *       group: true
     *     },
     *     productFolder: 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<ProductFolderModel>;
}

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 UpsertFactureOutsOptions {
    expand?: ExpandOptions<FactureOutModel>;
}

/** Опции для создания или обновления юрлица */
export declare interface UpsertOrganizationOptions {
    /**
     * Замена ссылок объектами с помощью expand
     *
     * @example
     * ```ts
     * const organization = await moysklad.organization.upsert({...}, {
     *   expand: {
     *     owner: 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<OrganizationModel>;
}

export declare interface UpsertProductFolderOptions {
    expand?: ExpandOptions<ProductFolderModel>;
}

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(options?: AllVariantsOptions): Promise<ListMeta<Entity.Variant>>;
    /**
     * Удалить модификацию по 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: ArchivedFilter;
        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 { }
