{"version":3,"sources":["../src/http/errors.ts","../src/http/httpClient.ts","../src/client/DidoxConfig.ts","../src/modules/auth/auth.validators.ts","../src/modules/auth/auth.api.ts","../src/modules/account/account.validators.ts","../src/modules/account/account.api.ts","../src/modules/profile/profile.validators.ts","../src/modules/profile/productClasses.api.ts","../src/modules/profile/vat.api.ts","../src/modules/profile/warehouses.api.ts","../src/modules/profile/users.api.ts","../src/modules/profile/profile.api.ts","../src/modules/utilities/utilities.validators.ts","../src/modules/utilities/utilities.api.ts","../src/modules/documents/documents.validators.ts","../src/utils/normalizer.ts","../src/modules/documents/builders/base/BaseDocumentBuilder.ts","../src/modules/documents/builders/invoice.ts","../src/modules/documents/builders/invoicePharm.ts","../src/modules/documents/builders/hybridInvoice.ts","../src/modules/documents/builders/ttn.ts","../src/modules/documents/builders/act.ts","../src/modules/documents/builders/contract.ts","../src/modules/documents/builders/empowerment.ts","../src/modules/documents/builders/arbitrary.ts","../src/modules/documents/builders/verificationAct.ts","../src/modules/documents/builders/acceptanceTransfer.ts","../src/modules/documents/builders/founders-protocol.ts","../src/modules/documents/builders/letter-nk.ts","../src/modules/documents/builders/multi-party.ts","../src/modules/documents/builders/index.ts","../src/modules/documents/DocumentsClient.ts","../src/client/DidoxClient.ts","../src/modules/documents/documents.enums.ts"],"sourcesContent":["/**\n * Base class for all Didox SDK errors\n */\nexport abstract class DidoxError extends Error {\n  public readonly name: string;\n  public readonly timestamp: Date;\n\n  constructor(message: string, name: string) {\n    super(message);\n    this.name = name;\n    this.timestamp = new Date();\n    \n    // Maintain proper stack trace for where our error was thrown\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, this.constructor);\n    }\n  }\n}\n\n/**\n * Validation error thrown when input parameters are invalid\n */\nexport class DidoxValidationError extends DidoxError {\n  public readonly field: string | undefined;\n\n  constructor(message: string, field?: string) {\n    super(message, 'DidoxValidationError');\n    this.field = field;\n  }\n}\n\n/**\n * Authentication error thrown when auth operations fail\n */\nexport class DidoxAuthError extends DidoxError {\n  public readonly statusCode: number | undefined;\n\n  constructor(message: string, statusCode?: number) {\n    super(message, 'DidoxAuthError');\n    this.statusCode = statusCode;\n  }\n}\n\n/**\n * API error thrown when Didox API returns an error response\n */\nexport class DidoxApiError extends DidoxError {\n  public readonly statusCode: number;\n  public readonly response?: unknown;\n\n  constructor(message: string, statusCode: number, response?: unknown) {\n    super(message, 'DidoxApiError');\n    this.statusCode = statusCode;\n    this.response = response;\n  }\n}\n\n/**\n * Network error thrown when HTTP requests fail (timeout, connection issues, etc.)\n */\nexport class DidoxNetworkError extends DidoxError {\n  public readonly cause: Error | undefined;\n\n  constructor(message: string, cause?: Error) {\n    super(message, 'DidoxNetworkError');\n    this.cause = cause;\n  }\n}","import { DidoxApiError, DidoxNetworkError } from './errors.js';\n\n/**\n * HTTP response interface\n */\nexport interface HttpResponse<T = unknown> {\n  data: T;\n  status: number;\n  headers: Record<string, string>;\n}\n\n/**\n * HTTP request options\n */\nexport interface HttpRequestOptions {\n  method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n  headers?: Record<string, string>;\n  body?: unknown;\n  timeout?: number;\n}\n\n/**\n * HTTP client configuration\n */\nexport interface HttpClientConfig {\n  baseUrl: string;\n  timeout: number;\n  defaultHeaders: Record<string, string>;\n}\n\n/**\n * Internal HTTP client for Didox API\n * Uses native fetch API for minimal dependencies\n */\nexport class HttpClient {\n  private config: HttpClientConfig;\n  private accessToken: string | undefined;\n  private partnerToken: string | undefined;\n\n  constructor(config: HttpClientConfig) {\n    this.config = config;\n  }\n\n  /**\n   * Set the partner token for Partner-Authorization header\n   */\n  public setPartnerToken(token: string): void {\n    this.partnerToken = token;\n  }\n\n  /**\n   * Set the access token for authenticated requests\n   */\n  public setAccessToken(token: string): void {\n    this.accessToken = token;\n  }\n\n  /**\n   * Clear the access token\n   */\n  public clearAccessToken(): void {\n    this.accessToken = undefined;\n  }\n\n  /**\n   * Make an HTTP request\n   */\n  public async request<T = unknown>(\n    endpoint: string,\n    options: HttpRequestOptions = {}\n  ): Promise<HttpResponse<T>> {\n    const {\n      method = 'GET',\n      headers = {},\n      body,\n      timeout = this.config.timeout\n    } = options;\n\n    const url = `${this.config.baseUrl}${endpoint}`;\n    \n    const requestHeaders: Record<string, string> = {\n      ...this.config.defaultHeaders,\n      ...headers\n    };\n\n    // Add access token if available\n    if (this.accessToken) {\n      requestHeaders['user-key'] = this.accessToken;\n    }\n\n    // Add partner token if available\n    if (this.partnerToken) {\n      requestHeaders['Partner-Authorization'] = this.partnerToken;\n    }\n\n    // Add Content-Type for requests with body\n    if (body && !requestHeaders['Content-Type']) {\n      requestHeaders['Content-Type'] = 'application/json';\n    }\n\n    const controller = new AbortController();\n    const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n    try {\n      const fetchOptions: RequestInit = {\n        method,\n        headers: requestHeaders,\n        signal: controller.signal\n      };\n\n      if (body) {\n        fetchOptions.body = JSON.stringify(body);\n      }\n\n      const response = await fetch(url, fetchOptions);\n\n      clearTimeout(timeoutId);\n\n      const responseHeaders: Record<string, string> = {};\n      response.headers.forEach((value, key) => {\n        responseHeaders[key] = value;\n      });\n\n      let responseData: T;\n      \n      // Try to parse JSON response\n      try {\n        const text = await response.text();\n        responseData = text ? JSON.parse(text) : null;\n      } catch {\n        throw new DidoxApiError(\n          'Invalid JSON response from Didox API',\n          response.status\n        );\n      }\n\n      // Handle error responses\n      if (!response.ok) {\n        throw new DidoxApiError(\n          `HTTP ${response.status}: ${response.statusText}`,\n          response.status,\n          responseData\n        );\n      }\n\n      return {\n        data: responseData,\n        status: response.status,\n        headers: responseHeaders\n      };\n\n    } catch (error) {\n      clearTimeout(timeoutId);\n\n      if (error instanceof DidoxApiError) {\n        throw error;\n      }\n\n      // Handle AbortError (timeout)\n      if (error instanceof Error && error.name === 'AbortError') {\n        throw new DidoxNetworkError(\n          `Request timeout after ${timeout}ms`,\n          error\n        );\n      }\n\n      // Handle other network errors\n      throw new DidoxNetworkError(\n        'Network request failed',\n        error as Error\n      );\n    }\n  }\n\n  /**\n   * GET request\n   */\n  public get<T = unknown>(\n    endpoint: string,\n    options?: Omit<HttpRequestOptions, 'method' | 'body'>\n  ): Promise<HttpResponse<T>> {\n    return this.request<T>(endpoint, { ...options, method: 'GET' });\n  }\n\n  /**\n   * POST request\n   */\n  public post<T = unknown>(\n    endpoint: string,\n    body?: unknown,\n    options?: Omit<HttpRequestOptions, 'method' | 'body'>\n  ): Promise<HttpResponse<T>> {\n    return this.request<T>(endpoint, { ...options, method: 'POST', body });\n  }\n\n  /**\n   * PUT request\n   */\n  public put<T = unknown>(\n    endpoint: string,\n    body?: unknown,\n    options?: Omit<HttpRequestOptions, 'method' | 'body'>\n  ): Promise<HttpResponse<T>> {\n    return this.request<T>(endpoint, { ...options, method: 'PUT', body });\n  }\n\n  /**\n   * DELETE request\n   */\n  public delete<T = unknown>(\n    endpoint: string,\n    options?: Omit<HttpRequestOptions, 'method' | 'body'>\n  ): Promise<HttpResponse<T>> {\n    return this.request<T>(endpoint, { ...options, method: 'DELETE' });\n  }\n}","/**\n * Didox SDK configuration interface\n */\nexport interface DidoxConfig {\n  /**\n   * Partner token provided by Didox for API access\n   * Contact Didox representative to obtain this token\n   */\n  partnerToken: string;\n\n  /**\n   * Environment to use for API calls\n   * - development: https://stage.goodsign.biz/\n   * - production: https://api-partners.didox.uz/\n   */\n  environment: 'development' | 'production';\n\n  /**\n   * Request timeout in milliseconds\n   * @default 10000\n   */\n  timeout?: number;\n}\n\n/**\n * Internal configuration with resolved values\n */\nexport interface ResolvedDidoxConfig {\n  partnerToken: string;\n  baseUrl: string;\n  timeout: number;\n}\n\n/**\n * Resolve and validate Didox configuration\n */\nexport function resolveConfig(config: DidoxConfig): ResolvedDidoxConfig {\n  const baseUrl = config.environment === 'production'\n    ? 'https://api-partners.didox.uz'\n    : 'https://stage.goodsign.biz';\n\n  return {\n    partnerToken: config.partnerToken,\n    baseUrl,\n    timeout: config.timeout ?? 10000\n  };\n}","import { DidoxValidationError } from '../../http/errors.js';\nimport type { DidoxLocale } from './auth.types.js';\n\n/**\n * Validate Tax Identification Number\n * Must be exactly 9 or 14 digits\n */\nexport function validateTaxId(taxId: string): void {\n  if (!taxId || typeof taxId !== 'string') {\n    throw new DidoxValidationError(\n      'taxId is required and must be a string',\n      'taxId'\n    );\n  }\n\n  if (!/^\\d{9}(\\d{5})?$/.test(taxId)) {\n    throw new DidoxValidationError(\n      'taxId must be exactly 9 or 14 digits',\n      'taxId'\n    );\n  }\n}\n\n/**\n * Validate password\n * Must be at least 8 characters\n */\nexport function validatePassword(password: string): void {\n  if (!password || typeof password !== 'string') {\n    throw new DidoxValidationError(\n      'password is required and must be a string',\n      'password'\n    );\n  }\n\n  if (password.length < 8) {\n    throw new DidoxValidationError(\n      'password must be at least 8 characters long',\n      'password'\n    );\n  }\n}\n\n/**\n * Validate locale\n * Must be 'ru' or 'uz'\n */\nexport function validateLocale(locale: string): asserts locale is DidoxLocale {\n  if (!['ru', 'uz'].includes(locale)) {\n    throw new DidoxValidationError(\n      'locale must be either \"ru\" or \"uz\"',\n      'locale'\n    );\n  }\n}\n\n/**\n * Validate user token\n * Must be a non-empty string\n */\nexport function validateUserToken(userToken: string): void {\n  if (!userToken || typeof userToken !== 'string') {\n    throw new DidoxValidationError(\n      'userToken is required and must be a non-empty string',\n      'userToken'\n    );\n  }\n}","import { HttpClient } from '../../http/httpClient.js';\nimport { DidoxAuthError, DidoxApiError } from '../../http/errors.js';\nimport {\n  validateTaxId,\n  validatePassword,\n  validateLocale,\n  validateUserToken\n} from './auth.validators.js';\nimport type {\n  LegalEntityLoginRequest,\n  LegalEntityLoginResponse,\n  CompanyLoginRequest,\n  CompanyLoginResponse\n} from './auth.types.js';\n\n/**\n * Authentication API implementation\n */\nexport class AuthApi {\n  constructor(private readonly httpClient: HttpClient) {}\n\n  /**\n   * Login as a legal entity\n   * \n   * Authenticates a legal entity using Tax ID and password.\n   * Returns an access token valid for 360 minutes.\n   * \n   * @param request - Login request parameters\n   * @returns Promise resolving to login response with token and related companies\n   * \n   * @throws {DidoxValidationError} When input validation fails\n   * @throws {DidoxAuthError} When authentication fails (422 status)\n   * @throws {DidoxApiError} When API returns other error responses\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const result = await didox.auth.loginLegalEntity({\n   *     taxId: '123456789',\n   *     password: 'securePassword123',\n   *     locale: 'ru'\n   *   });\n   *   \n   *   console.log('Access token:', result.token);\n   *   console.log('Related companies:', result.related_companies);\n   * } catch (error) {\n   *   if (error instanceof DidoxAuthError) {\n   *     console.error('Authentication failed:', error.message);\n   *   }\n   * }\n   * ```\n   */\n  public async loginLegalEntity(\n    request: LegalEntityLoginRequest\n  ): Promise<LegalEntityLoginResponse> {\n    // Validate input parameters\n    validateTaxId(request.taxId);\n    validatePassword(request.password);\n    \n    const locale = request.locale ?? 'ru';\n    validateLocale(locale);\n\n    const endpoint = `/v1/auth/${request.taxId}/password/${locale}`;\n    const body = {\n      password: request.password\n    };\n\n    try {\n      const response = await this.httpClient.post<LegalEntityLoginResponse>(\n        endpoint,\n        body\n      );\n\n      // Automatically set the access token for future requests\n      this.httpClient.setAccessToken(response.data.token);\n\n      return response.data;\n    } catch (error) {\n      if (error instanceof DidoxApiError && error.statusCode === 422) {\n        throw new DidoxAuthError(\n          'Authentication failed: ' + error.message,\n          error.statusCode\n        );\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Login to a company as an individual\n   * \n   * Allows an individual user to access a company's context using their personal token.\n   * The user must have permissions to access the specified company.\n   * \n   * @param request - Company login request parameters\n   * @returns Promise resolving to company login response with token and permissions\n   * \n   * @throws {DidoxValidationError} When input validation fails\n   * @throws {DidoxAuthError} When authentication fails (422 status)\n   * @throws {DidoxApiError} When API returns other error responses\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const result = await didox.auth.loginCompanyAsIndividual({\n   *     companyTaxId: '987654321',\n   *     userToken: 'user-access-token-uuid',\n   *     locale: 'uz'\n   *   });\n   *   \n   *   console.log('Company access token:', result.token);\n   *   console.log('User permissions:', result.permissions);\n   * } catch (error) {\n   *   if (error instanceof DidoxAuthError) {\n   *     console.error('Company access denied:', error.message);\n   *   }\n   * }\n   * ```\n   */\n  public async loginCompanyAsIndividual(\n    request: CompanyLoginRequest\n  ): Promise<CompanyLoginResponse> {\n    // Validate input parameters\n    validateTaxId(request.companyTaxId);\n    validateUserToken(request.userToken);\n    \n    const locale = request.locale ?? 'ru';\n    validateLocale(locale);\n\n    const endpoint = `/v1/auth/company/${request.companyTaxId}/login/${locale}`;\n    const headers = {\n      'user-key': request.userToken\n    };\n\n    try {\n      const response = await this.httpClient.post<CompanyLoginResponse>(\n        endpoint,\n        undefined, // No body for this request\n        { headers }\n      );\n\n      // Automatically set the access token for future requests\n      this.httpClient.setAccessToken(response.data.token);\n\n      return response.data;\n    } catch (error) {\n      if (error instanceof DidoxApiError && error.statusCode === 422) {\n        throw new DidoxAuthError(\n          'Company login failed: ' + error.message,\n          error.statusCode\n        );\n      }\n      throw error;\n    }\n  }\n}","import { DidoxValidationError } from '../../http/errors.js';\n\n/**\n * Validate mobile phone number\n * Must be in format 998XXXXXXXXX (exactly 12 digits starting with 998)\n */\nexport function validateMobile(mobile: string): void {\n  if (!mobile || typeof mobile !== 'string') {\n    throw new DidoxValidationError(\n      'mobile is required and must be a string',\n      'mobile'\n    );\n  }\n\n  if (!/^998\\d{9}$/.test(mobile)) {\n    throw new DidoxValidationError(\n      'mobile must be in format 998XXXXXXXXX (12 digits starting with 998)',\n      'mobile'\n    );\n  }\n}\n\n/**\n * Validate email address\n * Must be a valid email format\n */\nexport function validateEmail(email: string): void {\n  if (!email || typeof email !== 'string') {\n    throw new DidoxValidationError(\n      'email is required and must be a string',\n      'email'\n    );\n  }\n\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  if (!emailRegex.test(email)) {\n    throw new DidoxValidationError(\n      'email must be a valid email address',\n      'email'\n    );\n  }\n}\n\n/**\n * Validate password (optional)\n * If provided, must be at least 8 characters\n */\nexport function validatePassword(password?: string): void {\n  if (password !== undefined) {\n    if (typeof password !== 'string') {\n      throw new DidoxValidationError(\n        'password must be a string',\n        'password'\n      );\n    }\n\n    if (password.length < 8) {\n      throw new DidoxValidationError(\n        'password must be at least 8 characters long',\n        'password'\n      );\n    }\n  }\n}\n\n/**\n * Validate notifications setting\n * Must be exactly 0 or 1\n */\nexport function validateNotifications(notifications: unknown): asserts notifications is 0 | 1 {\n  if (notifications !== 0 && notifications !== 1) {\n    throw new DidoxValidationError(\n      'notifications must be either 0 (disabled) or 1 (enabled)',\n      'notifications'\n    );\n  }\n}","import { HttpClient } from '../../http/httpClient.js';\nimport { DidoxAuthError, DidoxApiError } from '../../http/errors.js';\nimport {\n  validateMobile,\n  validateEmail,\n  validatePassword,\n  validateNotifications\n} from './account.validators.js';\nimport type {\n  AccountProfile,\n  UpdateProfileRequest,\n  UpdateProfileResponse\n} from './account.types.js';\n\n/**\n * Account API implementation\n */\nexport class AccountApi {\n  constructor(private readonly httpClient: HttpClient) {}\n\n  /**\n   * Get current account profile\n   * \n   * Retrieves the profile information for the currently authenticated user.\n   * Requires valid access token obtained via Auth module.\n   * \n   * @returns Promise resolving to account profile information\n   * \n   * @throws {DidoxAuthError} When authentication fails (401/403 status)\n   * @throws {DidoxApiError} When API returns other error responses\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const profile = await didox.account.getProfile();\n   *   \n   *   console.log('Mobile:', profile.mobile);\n   *   console.log('Email:', profile.email);\n   *   console.log('Notifications:', profile.notifications ? 'Enabled' : 'Disabled');\n   *   console.log('Messengers:', profile.messengers);\n   * } catch (error) {\n   *   if (error instanceof DidoxAuthError) {\n   *     console.error('Authentication required:', error.message);\n   *   }\n   * }\n   * ```\n   */\n  public async getProfile(): Promise<AccountProfile> {\n    const endpoint = '/v1/account';\n\n    try {\n      const response = await this.httpClient.get<AccountProfile>(endpoint);\n      return response.data;\n    } catch (error) {\n      if (error instanceof DidoxApiError && (error.statusCode === 401 || error.statusCode === 403)) {\n        throw new DidoxAuthError(\n          'Authentication failed: ' + error.message,\n          error.statusCode\n        );\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Update current account profile\n   * \n   * Updates the profile information for the currently authenticated user.\n   * All fields are required except password. Password is optional but if provided\n   * must meet minimum requirements.\n   * \n   * @param request - Profile update request parameters\n   * @returns Promise resolving to updated profile information\n   * \n   * @throws {DidoxValidationError} When input validation fails\n   * @throws {DidoxAuthError} When authentication fails (401/403 status)\n   * @throws {DidoxApiError} When API returns other error responses\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const updatedProfile = await didox.account.updateProfile({\n   *     mobile: '998901234567',\n   *     email: 'user@example.com',\n   *     password: 'newSecurePassword123', // optional\n   *     notifications: 1 // enable notifications\n   *   });\n   *   \n   *   console.log('Profile updated:', updatedProfile);\n   * } catch (error) {\n   *   if (error instanceof DidoxValidationError) {\n   *     console.error('Validation failed:', error.message, 'Field:', error.field);\n   *   }\n   * }\n   * ```\n   */\n  public async updateProfile(\n    request: UpdateProfileRequest\n  ): Promise<UpdateProfileResponse> {\n    // Validate input parameters\n    validateMobile(request.mobile);\n    validateEmail(request.email);\n    validatePassword(request.password);\n    validateNotifications(request.notifications);\n\n    const endpoint = '/v1/profile/update';\n    const body = {\n      mobile: request.mobile,\n      email: request.email,\n      notifications: request.notifications,\n      ...(request.password && { password: request.password })\n    };\n\n    try {\n      const response = await this.httpClient.post<UpdateProfileResponse>(\n        endpoint,\n        body\n      );\n\n      return response.data;\n    } catch (error) {\n      if (error instanceof DidoxApiError && (error.statusCode === 401 || error.statusCode === 403)) {\n        throw new DidoxAuthError(\n          'Authentication failed: ' + error.message,\n          error.statusCode\n        );\n      }\n      throw error;\n    }\n  }\n}","import { DidoxValidationError } from '../../http/errors.js';\n\n/**\n * Validate notifications setting\n * Must be exactly 0 or 1\n */\nexport function validateNotifications(notifications?: unknown): asserts notifications is 0 | 1 | undefined {\n  if (notifications !== undefined && notifications !== 0 && notifications !== 1) {\n    throw new DidoxValidationError(\n      'notifications must be either 0 (disabled) or 1 (enabled)',\n      'notifications'\n    );\n  }\n}\n\n/**\n * Validate region ID\n * Must be a number\n */\nexport function validateRegionId(regionId?: unknown): asserts regionId is number | undefined {\n  if (regionId !== undefined) {\n    if (typeof regionId !== 'number') {\n      throw new DidoxValidationError(\n        'regionId must be a number',\n        'regionId'\n      );\n    }\n  }\n}\n\n/**\n * Validate TIN (Tax Identification Number)\n * Must be exactly 9 or 14 digits\n */\nexport function validateTin(tin?: string, fieldName: string = 'tin'): void {\n  if (tin !== undefined) {\n    if (typeof tin !== 'string' || !/^\\d{9}(\\d{5})?$/.test(tin)) {\n      throw new DidoxValidationError(\n        `${fieldName} must be exactly 9 or 14 digits`,\n        fieldName\n      );\n    }\n  }\n}\n\n/**\n * Validate PINFL (Personal Identification Number)\n * Must be exactly 14 digits when provided\n */\nexport function validatePinfl(pinfl?: string | null, fieldName: string = 'pinfl'): void {\n  if (pinfl !== undefined && pinfl !== null) {\n    if (typeof pinfl !== 'string' || !/^\\d{14}$/.test(pinfl)) {\n      throw new DidoxValidationError(\n        `${fieldName} must be exactly 14 digits`,\n        fieldName\n      );\n    }\n  }\n}\n\n/**\n * Validate offer signed flag\n * Must be exactly 0 or 1\n */\nexport function validateOfferSigned(offerSigned?: unknown): asserts offerSigned is 0 | 1 | undefined {\n  if (offerSigned !== undefined && offerSigned !== 0 && offerSigned !== 1) {\n    throw new DidoxValidationError(\n      'offerSigned must be either 0 (not signed) or 1 (signed)',\n      'offerSigned'\n    );\n  }\n}\n\n/**\n * Validate excise flag\n * Must be a boolean\n */\nexport function validateExcise(excise?: unknown): asserts excise is boolean | undefined {\n  if (excise !== undefined && typeof excise !== 'boolean') {\n    throw new DidoxValidationError(\n      'excise must be a boolean',\n      'excise'\n    );\n  }\n}\n\n/**\n * Validate VAT value\n * Must be a number\n */\nexport function validateVat(vat?: unknown): asserts vat is number | undefined {\n  if (vat !== undefined && typeof vat !== 'number') {\n    throw new DidoxValidationError(\n      'vat must be a number',\n      'vat'\n    );\n  }\n}\n\n/**\n * Validate VAT rate\n * Must be a number or null\n */\nexport function validateVatRate(vatRate?: unknown): asserts vatRate is number | null | undefined {\n  if (vatRate !== undefined && vatRate !== null && typeof vatRate !== 'number') {\n    throw new DidoxValidationError(\n      'vatRate must be a number or null',\n      'vatRate'\n    );\n  }\n}","import type { HttpClient } from '../../http/httpClient.js';\nimport type {\n  ProductClassCodesResponse,\n  ProductClassSearchResponse,\n  ProductClassSearchParams,\n  AddProductClassRequest,\n  AddProductClassResponse,\n  RemoveProductClassResponse,\n  ProductClassesCodeCheckResponse\n} from './productClasses.types.js';\nimport { DidoxValidationError } from '../../http/errors.js';\n\n/**\n * Product Classes (ИКПУ) API module\n */\nexport class ProductClassesApi {\n  constructor(private httpClient: HttpClient) {}\n\n  /**\n   * Get attached product class codes for current profile\n   * @returns Promise<ProductClassCodesResponse>\n   * @example\n   * ```typescript\n   * const result = await didox.profile.getProductClassCodes();\n   * console.log('Attached codes:', result.data.length);\n   * ```\n   */\n  async getProductClassCodes(): Promise<ProductClassCodesResponse> {\n    const response = await this.httpClient.get<ProductClassCodesResponse>('/v1/profile/productClassCodes');\n    return response.data;\n  }\n\n  /**\n   * Search available product class codes\n   * @param params Search parameters\n   * @returns Promise<ProductClassSearchResponse>\n   * @example\n   * ```typescript\n   * const result = await didox.profile.searchProductClasses({\n   *   search: 'фото',\n   *   lang: 'ru',\n   *   page: 1\n   * });\n   * console.log('Found classes:', result.data.length);\n   * ```\n   */\n  async searchProductClasses(params: ProductClassSearchParams = {}): Promise<ProductClassSearchResponse> {\n    // Validate language\n    if (params.lang && !['ru', 'uz'].includes(params.lang)) {\n      throw new DidoxValidationError('Language must be \"ru\" or \"uz\"');\n    }\n\n    // Validate page number\n    if (params.page !== undefined && (params.page < 1 || !Number.isInteger(params.page))) {\n      throw new DidoxValidationError('Page must be a positive integer');\n    }\n\n    const searchParams = new URLSearchParams();\n    \n    if (params.page) searchParams.set('page', params.page.toString());\n    if (params.search) searchParams.set('search', params.search);\n    if (params.lang) searchParams.set('lang', params.lang);\n\n    const url = `/v1/profile/productClassCodes${searchParams.toString() ? '?' + searchParams.toString() : ''}`;\n    \n    const response = await this.httpClient.get<ProductClassSearchResponse>(url);\n    return response.data;\n  }\n\n  /**\n   * Add product class code to current profile\n   * @param classCode Class code (digits only)\n   * @returns Promise<AddProductClassResponse>\n   * @example\n   * ```typescript\n   * await didox.profile.addProductClass('08418001001013043');\n   * console.log('Product class added successfully');\n   * ```\n   */\n  async addProductClass(classCode: string): Promise<AddProductClassResponse> {\n    // Validate class code format\n    if (!classCode || typeof classCode !== 'string') {\n      throw new DidoxValidationError('Class code is required and must be a string');\n    }\n\n    if (!/^\\d+$/.test(classCode)) {\n      throw new DidoxValidationError('Class code must contain only digits');\n    }\n\n    const body: AddProductClassRequest = { classCode };\n\n    const response = await this.httpClient.post<AddProductClassResponse>('/v1/profile/productClasses', body);\n    return response.data;\n  }\n\n  /**\n   * Remove product class code from current profile\n   * @param classCode Class code to remove\n   * @returns Promise<RemoveProductClassResponse>\n   * @example\n   * ```typescript\n   * await didox.profile.removeProductClass('08418001001013043');\n   * console.log('Product class removed successfully');\n   * ```\n   */\n  async removeProductClass(classCode: string): Promise<RemoveProductClassResponse> {\n    // Validate class code format\n    if (!classCode || typeof classCode !== 'string') {\n      throw new DidoxValidationError('Class code is required and must be a string');\n    }\n\n    if (!/^\\d+$/.test(classCode)) {\n      throw new DidoxValidationError('Class code must contain only digits');\n    }\n\n    const response = await this.httpClient.delete<RemoveProductClassResponse>(`/v1/profile/productClasses/${classCode}`);\n    return response.data;\n  }\n\n  /**\n   * Check product class code packages for specific TIN and code\n   * @param taxId TIN of the company\n   * @param code ИКПУ code\n   * @param lang Language (ru or uz)\n   * @returns Promise<ProductClassesCodeCheckResponse[]>\n   * @example\n   * ```typescript\n   * const packages = await didox.profile.checkProductClassCode('123456789', '11703002001000000', 'ru');\n   * console.log('Available packages:', packages);\n   * ```\n   */\n  async checkProductClassCode(\n    taxId: string,\n    code: string,\n    lang: 'ru' | 'uz'\n  ): Promise<ProductClassesCodeCheckResponse[]> {\n    // Validate TIN\n    if (!taxId || !/^\\d{9}(\\d{5})?$/.test(taxId)) {\n      throw new DidoxValidationError('TIN must be exactly 9 or 14 digits');\n    }\n\n    // Validate code\n    if (!code || typeof code !== 'string') {\n      throw new DidoxValidationError('Code is required and must be a string');\n    }\n\n    // Validate language\n    if (!['ru', 'uz'].includes(lang)) {\n      throw new DidoxValidationError('Language must be \"ru\" or \"uz\"');\n    }\n\n    const response = await this.httpClient.get<ProductClassesCodeCheckResponse[]>(\n      `/v1/profile/${taxId}/productClasses/check/${code}/${lang}`\n    );\n    return response.data;\n  }\n}","import type { HttpClient } from '../../http/httpClient.js';\nimport type {\n  VatRegStatusResponse,\n  TaxpayerTypeResponse,\n  SupportedLanguage\n} from './vat.types.js';\nimport { DidoxValidationError } from '../../http/errors.js';\n\n/**\n * VAT and taxpayer information API module\n */\nexport class VatApi {\n  constructor(private httpClient: HttpClient) {}\n\n  /**\n   * Get VAT registration status by TIN or PINFL\n   * @param taxIdOrPinfl TIN (9 digits) or PINFL (14 digits)\n   * @param documentDate Optional date in YYYY-MM-DD format\n   * @returns Promise<VatRegStatusResponse>\n   * @example\n   * ```typescript\n   * const status = await didox.profile.getVatRegStatus('123456789');\n   * console.log('VAT status:', status.vatRegStatus);\n   * \n   * // With specific date\n   * const statusOnDate = await didox.profile.getVatRegStatus('123456789', '2021-12-22');\n   * ```\n   */\n  async getVatRegStatus(\n    taxIdOrPinfl: string,\n    documentDate?: string\n  ): Promise<VatRegStatusResponse> {\n    // Validate TIN or PINFL\n    if (!taxIdOrPinfl || typeof taxIdOrPinfl !== 'string') {\n      throw new DidoxValidationError('TIN or PINFL is required and must be a string');\n    }\n\n    // Check if it's TIN (9 digits) or PINFL (14 digits)\n    if (!/^(\\d{9}|\\d{14})$/.test(taxIdOrPinfl)) {\n      throw new DidoxValidationError('TIN must be exactly 9 or 14 digits or PINFL must be exactly 14 digits');\n    }\n\n    // Validate document date format if provided\n    if (documentDate && !/^\\d{4}-\\d{2}-\\d{2}$/.test(documentDate)) {\n      throw new DidoxValidationError('Document date must be in YYYY-MM-DD format');\n    }\n\n    let url = `/v1/profile/vatRegStatus/${taxIdOrPinfl}`;\n    \n    if (documentDate) {\n      url += `?document_date=${documentDate}`;\n    }\n\n    const response = await this.httpClient.get<VatRegStatusResponse>(url);\n    return response.data;\n  }\n\n  /**\n   * Get taxpayer type by TIN\n   * @param tin TIN (9 digits)\n   * @param lang Language (ru or uz)\n   * @param date Optional date in DD.MM.YYYY format\n   * @returns Promise<TaxpayerTypeResponse>\n   * @example\n   * ```typescript\n   * const type = await didox.profile.getTaxpayerType('123456789', 'ru');\n   * console.log('Taxpayer type:', type.name);\n   * \n   * // With specific date\n   * const typeOnDate = await didox.profile.getTaxpayerType('123456789', 'ru', '17.01.2022');\n   * ```\n   */\n  async getTaxpayerType(\n    tin: string,\n    lang: SupportedLanguage,\n    date?: string\n  ): Promise<TaxpayerTypeResponse> {\n    // Validate TIN\n    if (!tin || !/^\\d{9}(\\d{5})?$/.test(tin)) {\n      throw new DidoxValidationError('TIN must be exactly 9 or 14 digits');\n    }\n\n    // Validate language\n    if (!['ru', 'uz'].includes(lang)) {\n      throw new DidoxValidationError('Language must be \"ru\" or \"uz\"');\n    }\n\n    // Validate date format if provided\n    if (date && !/^\\d{2}\\.\\d{2}\\.\\d{4}$/.test(date)) {\n      throw new DidoxValidationError('Date must be in DD.MM.YYYY format');\n    }\n\n    let url = `/v1/profile/taxpayerType/${tin}/${lang}`;\n    \n    if (date) {\n      url += `?date=${encodeURIComponent(date)}`;\n    }\n\n    const response = await this.httpClient.get<TaxpayerTypeResponse>(url);\n    return response.data;\n  }\n}","import type { HttpClient } from '../../http/httpClient.js';\nimport type { WarehousesResponse } from './warehouses.types.js';\nimport { DidoxValidationError } from '../../http/errors.js';\n\n/**\n * Warehouses API module\n */\nexport class WarehousesApi {\n  constructor(private httpClient: HttpClient) {}\n\n  /**\n   * Get warehouses by TIN or PINFL\n   * @param taxIdOrPinfl TIN (9 digits) or PINFL (14 digits)\n   * @returns Promise<WarehousesResponse>\n   * @example\n   * ```typescript\n   * const warehouses = await didox.profile.getWarehouses('123456789');\n   * console.log('Warehouses found:', warehouses.length);\n   * \n   * warehouses.forEach(wh => {\n   *   console.log(`Warehouse #${wh.warehouseNumber}: ${wh.warehouseName}`);\n   *   console.log(`Address: ${wh.warehouseAddress}`);\n   * });\n   * ```\n   */\n  async getWarehouses(taxIdOrPinfl: string): Promise<WarehousesResponse> {\n    // Validate TIN or PINFL\n    if (!taxIdOrPinfl || typeof taxIdOrPinfl !== 'string') {\n      throw new DidoxValidationError('TIN or PINFL is required and must be a string');\n    }\n\n    // Check if it's TIN (9 digits) or PINFL (14 digits)\n    if (!/^(\\d{9}|\\d{14})$/.test(taxIdOrPinfl)) {\n      throw new DidoxValidationError('TIN must be exactly 9 or 14 digits or PINFL must be exactly 14 digits');\n    }\n\n    const response = await this.httpClient.get<WarehousesResponse>(`/v1/profile/warehouses/${taxIdOrPinfl}`);\n    return response.data;\n  }\n}","import type { HttpClient } from '../../http/httpClient.js';\nimport type {\n  UpdateCompanyUsersPermissionsRequest,\n  UpdateCompanyUsersPermissionsResponse\n} from './users.types.js';\nimport { DidoxValidationError } from '../../http/errors.js';\n\n/**\n * Company users and permissions API module\n */\nexport class UsersApi {\n  constructor(private httpClient: HttpClient) {}\n\n  /**\n   * Update company users permissions\n   * @param permissions Permissions data with signed tokens\n   * @returns Promise<UpdateCompanyUsersPermissionsResponse>\n   * @example\n   * ```typescript\n   * await didox.profile.updateCompanyUsersPermissions({\n   *   gnkpermissions: 'base64SignedToken1',\n   *   internalpermissions: 'base64SignedToken2',\n   *   is_director: 1\n   * });\n   * console.log('Permissions updated successfully');\n   * ```\n   * \n   * @note This API requires externally signed tokens. The SDK does not generate signatures.\n   * You must prepare and sign the role JSONs externally before calling this method.\n   */\n  async updateCompanyUsersPermissions(\n    permissions: UpdateCompanyUsersPermissionsRequest\n  ): Promise<UpdateCompanyUsersPermissionsResponse> {\n    // Validate required fields\n    if (!permissions.gnkpermissions || typeof permissions.gnkpermissions !== 'string') {\n      throw new DidoxValidationError('gnkpermissions is required and must be a string');\n    }\n\n    if (!permissions.internalpermissions || typeof permissions.internalpermissions !== 'string') {\n      throw new DidoxValidationError('internalpermissions is required and must be a string');\n    }\n\n    // Validate is_director flag\n    if (permissions.is_director !== 0 && permissions.is_director !== 1) {\n      throw new DidoxValidationError('is_director must be either 0 or 1');\n    }\n\n    const response = await this.httpClient.put<UpdateCompanyUsersPermissionsResponse>(\n      '/v1/profile/company/users',\n      permissions\n    );\n    return response.data;\n  }\n}","import { HttpClient } from '../../http/httpClient.js';\nimport { DidoxAuthError, DidoxApiError } from '../../http/errors.js';\nimport {\n  validateNotifications,\n  validateRegionId,\n  validateTin,\n  validatePinfl,\n  validateOfferSigned,\n  validateExcise,\n  validateVat,\n  validateVatRate\n} from './profile.validators.js';\nimport type {\n  CompanyProfile,\n  ProfileUpdateRequest,\n  ProfileUpdateResponse,\n  ProfileOperators\n} from './profile.types.js';\nimport { ProductClassesApi } from './productClasses.api.js';\nimport { VatApi } from './vat.api.js';\nimport { WarehousesApi } from './warehouses.api.js';\nimport { UsersApi } from './users.api.js';\n\n/**\n * Profile API implementation\n */\nexport class ProfileApi {\n  public readonly productClasses: ProductClassesApi;\n  public readonly vat: VatApi;\n  public readonly warehouses: WarehousesApi;\n  public readonly users: UsersApi;\n\n  constructor(private readonly httpClient: HttpClient) {\n    this.productClasses = new ProductClassesApi(httpClient);\n    this.vat = new VatApi(httpClient);\n    this.warehouses = new WarehousesApi(httpClient);\n    this.users = new UsersApi(httpClient);\n  }\n\n  /**\n   * Get current company profile\n   * \n   * Retrieves detailed profile information for the currently authenticated company.\n   * Returns comprehensive company data including financial and contact information.\n   * \n   * @returns Promise resolving to company profile information\n   * \n   * @throws {DidoxAuthError} When authentication fails (401 status)\n   * @throws {DidoxApiError} When API returns other error responses\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const profile = await didox.profile.getProfile();\n   *   \n   *   console.log('Company name:', profile.fullName);\n   *   console.log('TIN:', profile.tin);\n   *   console.log('Balance:', profile.balance);\n   *   console.log('Director:', profile.director);\n   *   console.log('Messengers:', profile.messengers);\n   * } catch (error) {\n   *   if (error instanceof DidoxAuthError) {\n   *     console.error('Authentication required:', error.message);\n   *   }\n   * }\n   * ```\n   */\n  public async getProfile(): Promise<CompanyProfile> {\n    const endpoint = '/v1/profile';\n\n    try {\n      const response = await this.httpClient.get<CompanyProfile>(endpoint);\n      return response.data;\n    } catch (error) {\n      if (error instanceof DidoxApiError && error.statusCode === 401) {\n        throw new DidoxAuthError(\n          'Unauthorized: Invalid user key',\n          error.statusCode\n        );\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Update current company profile\n   * \n   * Updates the profile information for the currently authenticated company.\n   * All fields are optional. Only provided fields will be updated.\n   * \n   * @param request - Profile update request parameters\n   * @returns Promise resolving to updated profile information\n   * \n   * @throws {DidoxValidationError} When input validation fails\n   * @throws {DidoxApiError} When profile update fails (422 status)\n   * @throws {DidoxAuthError} When authentication fails\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const updatedProfile = await didox.profile.updateProfile({\n   *     phone: '998901234567',\n   *     email: 'company@example.com',\n   *     notifications: 1,\n   *     regionId: 26,\n   *     directorTin: '123456789'\n   *   });\n   *   \n   *   console.log('Profile updated:', updatedProfile);\n   * } catch (error) {\n   *   if (error instanceof DidoxValidationError) {\n   *     console.error('Validation failed:', error.message, 'Field:', error.field);\n   *   } else if (error instanceof DidoxApiError && error.statusCode === 422) {\n   *     console.error('Update failed:', error.message);\n   *   }\n   * }\n   * ```\n   */\n  public async updateProfile(\n    request: ProfileUpdateRequest\n  ): Promise<ProfileUpdateResponse> {\n    // Validate input parameters\n    validateNotifications(request.notifications);\n    validateRegionId(request.regionId);\n    validateTin(request.tin, 'tin');\n    validateTin(request.companyTaxId, 'companyTaxId');\n    validateTin(request.directorTin, 'directorTin');\n    validatePinfl(request.pinfl, 'pinfl');\n    validatePinfl(request.directorPinfl, 'directorPinfl');\n    validatePinfl(request.itemReleasedPinfl, 'itemReleasedPinfl');\n    validateOfferSigned(request.offerSigned);\n    validateExcise(request.excise);\n    validateVat(request.vat);\n    validateVatRate(request.vatRate);\n\n    const endpoint = '/v1/profile/update';\n\n    try {\n      const response = await this.httpClient.post<ProfileUpdateResponse>(\n        endpoint,\n        request\n      );\n\n      return response.data;\n    } catch (error) {\n      if (error instanceof DidoxApiError && error.statusCode === 422) {\n        throw new DidoxApiError(\n          'User not updated',\n          error.statusCode,\n          error.response\n        );\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Get profile operators\n   * \n   * Retrieves the list of operators associated with the current profile.\n   * Returns a mapping of operator IDs to their corresponding platform names.\n   * \n   * @returns Promise resolving to operators mapping\n   * \n   * @throws {DidoxAuthError} When authentication fails\n   * @throws {DidoxApiError} When API returns error responses\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const operators = await didox.profile.getOperators();\n   *   \n   *   Object.entries(operators).forEach(([id, name]) => {\n   *     console.log(`Operator ${id}: ${name}`);\n   *   });\n   *   \n   *   // Example output:\n   *   // Operator 202530465: soliqservis.uz\n   *   // Operator 302563857: Faktura.uz\n   *   // Operator 302936161: Didox.uz\n   * } catch (error) {\n   *   console.error('Failed to get operators:', error.message);\n   * }\n   * ```\n   */\n  public async getOperators(): Promise<ProfileOperators> {\n    const endpoint = '/v1/profile/operators';\n\n    try {\n      const response = await this.httpClient.get<ProfileOperators>(endpoint);\n      return response.data;\n    } catch (error) {\n      if (error instanceof DidoxApiError && error.statusCode === 401) {\n        throw new DidoxAuthError(\n          'Unauthorized: Invalid user key',\n          error.statusCode\n        );\n      }\n      throw error;\n    }\n  }\n\n  // Product Classes convenience methods\n  /**\n   * Get attached product class codes for current profile\n   * @returns Promise<ProductClassCodesResponse>\n   */\n  async getProductClassCodes() {\n    return this.productClasses.getProductClassCodes();\n  }\n\n  /**\n   * Search available product class codes\n   * @param params Search parameters\n   */\n  async searchProductClasses(params: Parameters<ProductClassesApi['searchProductClasses']>[0] = {}) {\n    return this.productClasses.searchProductClasses(params);\n  }\n\n  /**\n   * Add product class code to current profile\n   * @param classCode Class code (digits only)\n   */\n  async addProductClass(classCode: string) {\n    return this.productClasses.addProductClass(classCode);\n  }\n\n  /**\n   * Remove product class code from current profile\n   * @param classCode Class code to remove\n   */\n  async removeProductClass(classCode: string) {\n    return this.productClasses.removeProductClass(classCode);\n  }\n\n  // VAT convenience methods\n  /**\n   * Get VAT registration status by TIN or PINFL\n   * @param taxIdOrPinfl TIN (9 digits) or PINFL (14 digits)\n   * @param documentDate Optional date in YYYY-MM-DD format\n   */\n  async getVatRegStatus(taxIdOrPinfl: string, documentDate?: string) {\n    return this.vat.getVatRegStatus(taxIdOrPinfl, documentDate);\n  }\n\n  /**\n   * Get taxpayer type by TIN\n   * @param tin TIN (9 digits)\n   * @param lang Language (ru or uz)\n   * @param date Optional date in DD.MM.YYYY format\n   */\n  async getTaxpayerType(tin: string, lang: 'ru' | 'uz', date?: string) {\n    return this.vat.getTaxpayerType(tin, lang, date);\n  }\n\n  // Warehouses convenience methods\n  /**\n   * Get warehouses by TIN or PINFL\n   * @param taxIdOrPinfl TIN (9 digits) or PINFL (14 digits)\n   */\n  async getWarehouses(taxIdOrPinfl: string) {\n    return this.warehouses.getWarehouses(taxIdOrPinfl);\n  }\n\n  // Users convenience methods\n  /**\n   * Update company users permissions\n   * @param permissions Permissions data with signed tokens\n   */\n  async updateCompanyUsersPermissions(\n    permissions: Parameters<UsersApi['updateCompanyUsersPermissions']>[0]\n  ) {\n    return this.users.updateCompanyUsersPermissions(permissions);\n  }\n}","import { DidoxValidationError } from '../../http/errors.js';\n\n/**\n * Validate Tax Identification Number for utilities operations\n * Must be exactly 9 or 14 digits\n */\nexport function validateUtilitiesTin(tin: string): void {\n  if (!tin || typeof tin !== 'string') {\n    throw new DidoxValidationError(\n      'tin is required and must be a string',\n      'tin'\n    );\n  }\n\n  if (!/^\\d{9}(\\d{5})?$/.test(tin)) {\n    throw new DidoxValidationError(\n      'tin must be exactly 9 or 14 digits',\n      'tin'\n    );\n  }\n}","import { HttpClient } from '../../http/httpClient.js';\nimport { DidoxAuthError, DidoxApiError, DidoxValidationError } from '../../http/errors.js';\nimport { validateUtilitiesTin } from './utilities.validators.js';\nimport type { CompanyBranch, GetBranchesByTinRequest, LegalEntityInfo } from './utilities.types.js';\n\n/**\n * Utilities API implementation\n */\nexport class UtilitiesApi {\n  constructor(private readonly httpClient: HttpClient) {}\n\n  /**\n   * Get branches by TIN\n   * \n   * Retrieves a list of company branches associated with the specified Tax Identification Number.\n   * Returns detailed information about each branch including location, management, and banking details.\n   * \n   * @param request - Request containing the TIN to search for\n   * @returns Promise resolving to array of company branches\n   * \n   * @throws {DidoxValidationError} When TIN validation fails\n   * @throws {DidoxAuthError} When authentication fails\n   * @throws {DidoxApiError} When API returns error responses\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const branches = await didox.utilities.getBranchesByTin({\n   *     tin: '123456789'\n   *   });\n   *   \n   *   branches.forEach(branch => {\n   *     console.log(`Branch: ${branch.branchName}`);\n   *     console.log(`Location: ${branch.address}`);\n   *     console.log(`Director: ${branch.directorName}`);\n   *     console.log(`Status: ${branch.isDeleted ? 'Deleted' : 'Active'}`);\n   *   });\n   * } catch (error) {\n   *   if (error instanceof DidoxValidationError) {\n   *     console.error('Invalid TIN:', error.message);\n   *   }\n   * }\n   * ```\n   */\n  public async getBranchesByTin(\n    request: GetBranchesByTinRequest\n  ): Promise<CompanyBranch[]> {\n    // Validate input parameters\n    validateUtilitiesTin(request.tin);\n\n    const endpoint = `/v1/profile/branches?tin=${encodeURIComponent(request.tin)}`;\n\n    try {\n      const response = await this.httpClient.get<CompanyBranch[]>(endpoint);\n      return response.data;\n    } catch (error) {\n      if (error instanceof DidoxApiError && error.statusCode === 401) {\n        throw new DidoxAuthError(\n          'Unauthorized: Invalid user key',\n          error.statusCode\n        );\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Get legal entity information by TIN\n   * \n   * Retrieves detailed legal entity (company) information by Tax Identification Number.\n   * Returns comprehensive company data including legal form, director info, banking details,\n   * address, and various organizational flags.\n   * \n   * @param taxId - Tax Identification Number (exactly 9 or 14 digits)\n   * @returns Promise resolving to legal entity information\n   * \n   * @throws {DidoxValidationError} When TIN validation fails\n   * @throws {DidoxAuthError} When authentication fails (401 status)\n   * @throws {DidoxApiError} When API returns other error responses\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const entityInfo = await didox.utilities.getLegalEntityInfoByTin('306915557');\n   *   \n   *   console.log('Organization:', entityInfo.name);\n   *   console.log('Short name:', entityInfo.shortName);\n   *   console.log('Director:', entityInfo.director);\n   *   console.log('Legal form:', entityInfo.na1Name);\n   *   console.log('Address:', entityInfo.address);\n   *   console.log('VAT status:', entityInfo.VATRegStatus);\n   *   console.log('OKED:', entityInfo.oked);\n   * } catch (error) {\n   *   if (error instanceof DidoxValidationError) {\n   *     console.error('Invalid TIN format:', error.message);\n   *   } else if (error instanceof DidoxAuthError) {\n   *     console.error('Authentication required:', error.message);\n   *   }\n   * }\n   * ```\n   */\n  public async getLegalEntityInfoByTin(taxId: string): Promise<LegalEntityInfo> {\n    // Validate TIN format\n    validateUtilitiesTin(taxId);\n\n    const endpoint = `/v1/utils/info/${taxId}`;\n\n    try {\n      const response = await this.httpClient.get<LegalEntityInfo>(endpoint);\n      return response.data;\n    } catch (error) {\n      if (error instanceof DidoxApiError && error.statusCode === 401) {\n        throw new DidoxAuthError(\n          'Unauthorized: Invalid user key',\n          error.statusCode\n        );\n      }\n      throw error;\n    }\n  }\n}","import { DidoxValidationError } from '../../http/errors.js';\nimport type { ListDocumentsParams } from './documents.types.js';\n\n/**\n * Date format regex (YYYY-MM-DD)\n */\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/**\n * Validates document ID format\n * @param id Document ID to validate\n * @throws {DidoxValidationError} When ID is invalid\n */\nexport function validateDocumentId(id: string): void {\n  if (!id || typeof id !== 'string') {\n    throw new DidoxValidationError('Document ID is required and must be a string');\n  }\n\n  if (id.trim().length === 0) {\n    throw new DidoxValidationError('Document ID cannot be empty');\n  }\n}\n\n/**\n * Validates date format (YYYY-MM-DD)\n * @param date Date string to validate\n * @param fieldName Field name for error message\n * @throws {DidoxValidationError} When date format is invalid\n */\nexport function validateDateFormat(date: string, fieldName: string): void {\n  if (!DATE_REGEX.test(date)) {\n    throw new DidoxValidationError(\n      `${fieldName} must be in YYYY-MM-DD format`\n    );\n  }\n\n  // Additional date validation\n  const parsedDate = new Date(date);\n  const [year, month, day] = date.split('-').map(Number);\n  \n  if (\n    parsedDate.getFullYear() !== year ||\n    parsedDate.getMonth() + 1 !== month ||\n    parsedDate.getDate() !== day\n  ) {\n    throw new DidoxValidationError(\n      `${fieldName} contains an invalid date: ${date}`\n    );\n  }\n}\n\n/**\n * Validates page number\n * @param page Page number to validate\n * @throws {DidoxValidationError} When page is invalid\n */\nexport function validatePage(page: number): void {\n  if (!Number.isInteger(page) || page < 1) {\n    throw new DidoxValidationError(\n      'Page must be a positive integer starting from 1'\n    );\n  }\n}\n\n/**\n * Validates limit parameter\n * @param limit Limit value to validate\n * @throws {DidoxValidationError} When limit is invalid\n */\nexport function validateLimit(limit: number): void {\n  if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n    throw new DidoxValidationError(\n      'Limit must be an integer between 1 and 100'\n    );\n  }\n}\n\n/**\n * Validates owner type\n * @param owner Owner type to validate\n * @throws {DidoxValidationError} When owner type is invalid\n */\nexport function validateOwnerType(owner: number): void {\n  if (owner !== 0 && owner !== 1) {\n    throw new DidoxValidationError(\n      'Owner must be 0 (incoming) or 1 (outgoing)'\n    );\n  }\n}\n\n/**\n * Validates status parameter\n * @param status Status value or array to validate\n * @throws {DidoxValidationError} When status is invalid\n */\nexport function validateStatus(status: number | number[]): void {\n  const validateSingleStatus = (val: number) => {\n    if (!Number.isInteger(val) || val < 0) {\n      throw new DidoxValidationError(\n        'Status must be a non-negative integer'\n      );\n    }\n  };\n\n  if (Array.isArray(status)) {\n    if (status.length === 0) {\n      throw new DidoxValidationError(\n        'Status array cannot be empty'\n      );\n    }\n    status.forEach(validateSingleStatus);\n  } else {\n    validateSingleStatus(status);\n  }\n}\n\n/**\n * Validates output format\n * @param output Output format to validate\n * @throws {DidoxValidationError} When output format is invalid\n */\nexport function validateOutputFormat(output: string): void {\n  if (output !== 'raw' && output !== 'normalized') {\n    throw new DidoxValidationError(\n      'Output format must be \"raw\" or \"normalized\"'\n    );\n  }\n}\n\n/**\n * Validates binary flag (0 or 1)\n * @param value Flag value to validate\n * @param fieldName Field name for error message\n * @throws {DidoxValidationError} When flag is invalid\n */\nexport function validateBinaryFlag(value: number, fieldName: string): void {\n  if (value !== 0 && value !== 1) {\n    throw new DidoxValidationError(\n      `${fieldName} must be 0 or 1`\n    );\n  }\n}\n\n/**\n * Validates document type code\n * @param doctype Document type code to validate\n * @throws {DidoxValidationError} When document type is invalid\n */\nexport function validateDocumentType(doctype: string): void {\n  if (!doctype || typeof doctype !== 'string') {\n    throw new DidoxValidationError(\n      'Document type is required and must be a string'\n    );\n  }\n\n  if (!/^\\d{3}$/.test(doctype)) {\n    throw new DidoxValidationError(\n      'Document type must be a 3-digit code'\n    );\n  }\n}\n\n/**\n * Validates all parameters for listing documents\n * @param params Parameters to validate\n * @throws {DidoxValidationError} When any parameter is invalid\n */\nexport function validateListDocumentsParams(params: ListDocumentsParams): void {\n  // Required parameters\n  validateOwnerType(params.owner);\n  validatePage(params.page);\n  validateLimit(params.limit);\n\n  // Optional parameters\n  if (params.status !== undefined) {\n    validateStatus(params.status);\n  }\n\n  if (params.doctype !== undefined) {\n    validateDocumentType(params.doctype);\n  }\n\n  if (params.output !== undefined) {\n    validateOutputFormat(params.output);\n  }\n\n  // Date parameters\n  const dateFields = [\n    'dateFromCreated',\n    'dateToCreated', \n    'dateFromUpdated',\n    'dateToUpdated',\n    'signDateFrom',\n    'signDateTo',\n    'docDateFromCreated',\n    'docDateToCreated',\n    'contractDate'\n  ] as const;\n\n  for (const field of dateFields) {\n    const value = params[field];\n    if (value !== undefined) {\n      validateDateFormat(value, field);\n    }\n  }\n\n  // Binary flags\n  const binaryFields = [\n    'hasCommittent',\n    'hasLgota',\n    'hasMarks',\n    'oneside'\n  ] as const;\n\n  for (const field of binaryFields) {\n    const value = params[field];\n    if (value !== undefined) {\n      validateBinaryFlag(value, field);\n    }\n  }\n\n  // String parameters validation\n  if (params.partner !== undefined && typeof params.partner !== 'string') {\n    throw new DidoxValidationError('Partner must be a string');\n  }\n\n  if (params.contractName !== undefined && typeof params.contractName !== 'string') {\n    throw new DidoxValidationError('Contract name must be a string');\n  }\n}\n\n/**\n * Validates parameters for createDraft method\n * \n * Performs minimal validation required for document draft creation.\n * Does not validate document structure or business rules.\n * \n * @param docType - Document type code\n * @param payload - Document payload\n * @throws {DidoxValidationError} When parameters are invalid\n */\nexport function validateCreateDraftParams(docType: unknown, payload: unknown): void {\n  // Validate docType\n  if (!docType || typeof docType !== 'string') {\n    throw new DidoxValidationError('Document type is required and must be a string');\n  }\n\n  if (docType.trim().length === 0) {\n    throw new DidoxValidationError('Document type cannot be empty');\n  }\n\n  // Validate payload\n  if (!payload) {\n    throw new DidoxValidationError('Payload is required');\n  }\n\n  if (typeof payload !== 'object') {\n    throw new DidoxValidationError('Payload must be an object');\n  }\n\n  if (payload === null) {\n    throw new DidoxValidationError('Payload cannot be null');\n  }\n}","import type { DocumentType, DocumentStatus } from '../modules/documents/documents.enums.js';\nimport type { \n  DocumentsListResponse, \n  NormalizedDocumentsListResponse, \n  PaginationMeta \n} from '../modules/documents/documents.types.js';\n\n/**\n * Data normalization utilities for documents\n * \n * Provides functions to normalize and transform document data received from the API\n * into consistent, usable formats for the client application.\n */\n\n/**\n * Normalize document status code to readable format\n * \n * Converts numeric status codes to human-readable status descriptions\n * \n * @param status - Numeric status code\n * @returns Normalized status object with code and description\n * \n * @example\n * ```typescript\n * const normalized = normalizeDocumentStatus(1);\n * // Returns: { code: 1, name: 'DRAFT', description: 'Document in draft state' }\n * ```\n */\nexport function normalizeDocumentStatus(status: DocumentStatus): {\n  code: DocumentStatus;\n  name: string;\n  description: string;\n} {\n  // TODO: Implement status normalization mapping\n  // Should map status codes to human-readable names and descriptions\n  throw new Error('Method not implemented yet');\n}\n\n/**\n * Normalize document type code to readable format\n * \n * Converts numeric type codes to human-readable type descriptions\n * \n * @param type - Numeric document type code\n * @returns Normalized type object with code and description\n * \n * @example\n * ```typescript\n * const normalized = normalizeDocumentType(1);\n * // Returns: { code: 1, name: 'FACTURA', description: 'Invoice document' }\n * ```\n */\nexport function normalizeDocumentType(type: DocumentType): {\n  code: DocumentType;\n  name: string;\n  description: string;\n} {\n  // TODO: Implement type normalization mapping\n  // Should map type codes to human-readable names and descriptions\n  throw new Error('Method not implemented yet');\n}\n\n/**\n * Normalize date format from API response\n * \n * Converts API date strings to consistent ISO format or Date objects\n * \n * @param dateString - Date string from API\n * @returns Normalized Date object or ISO string\n * \n * @example\n * ```typescript\n * const normalized = normalizeDateFormat('2024-01-15T10:30:00');\n * // Returns: Date object or normalized ISO string\n * ```\n */\nexport function normalizeDateFormat(dateString: string): Date | string {\n  // TODO: Implement date normalization\n  // Should handle various date formats from API and convert to consistent format\n  throw new Error('Method not implemented yet');\n}\n\n/**\n * Normalize document metadata\n * \n * Transforms raw document metadata from API into a consistent, typed format\n * \n * @param rawMetadata - Raw metadata object from API\n * @returns Normalized metadata with consistent field names and types\n * \n * @example\n * ```typescript\n * const normalized = normalizeDocumentMetadata(apiResponse);\n * // Returns: { id, type, status, createdAt, updatedAt, ... }\n * ```\n */\nexport function normalizeDocumentMetadata(rawMetadata: unknown): unknown {\n  // TODO: Implement metadata normalization\n  // Should transform API response fields to consistent naming and typing\n  throw new Error('Method not implemented yet');\n}\n\n/**\n * Normalize pagination metadata\n * \n * Converts API pagination info into a consistent format\n * \n * @param rawPagination - Raw pagination data from API\n * @returns Normalized pagination with standard field names\n * \n * @example\n * ```typescript\n * const normalized = normalizePaginationMeta(apiPagination);\n * // Returns: { currentPage, totalPages, totalItems, itemsPerPage }\n * ```\n */\nexport function normalizePaginationMeta(rawPagination: unknown): {\n  currentPage: number;\n  totalPages: number;\n  totalItems: number;\n  itemsPerPage: number;\n} {\n  // TODO: Implement pagination normalization\n  // Should standardize pagination field names and ensure proper typing\n  throw new Error('Method not implemented yet');\n}\n\n/**\n * Normalize error response from API\n * \n * Transforms API error responses into consistent error format\n * \n * @param errorResponse - Raw error response from API\n * @returns Normalized error with consistent structure\n * \n * @example\n * ```typescript\n * const normalized = normalizeApiError(apiError);\n * // Returns: { code, message, details, field? }\n * ```\n */\nexport function normalizeApiError(errorResponse: unknown): {\n  code: string;\n  message: string;\n  details?: string;\n  field?: string;\n} {\n  // TODO: Implement error normalization\n  // Should extract error details and provide consistent error structure\n  throw new Error('Method not implemented yet');\n}\n\n/**\n * Normalize documents list response\n * \n * Transforms raw documents list response from API into normalized format with standardized pagination\n * \n * @param response - Raw documents list response from API\n * @returns Normalized documents list response\n * \n * @example\n * ```typescript\n * const normalized = normalizeDocumentsList(apiResponse);\n * // Returns: { data: [...], meta: { currentPage, totalPages, ... } }\n * ```\n */\nexport function normalizeDocumentsList(response: DocumentsListResponse): NormalizedDocumentsListResponse {\n  const meta = response.meta;\n  \n  // Create standardized pagination metadata\n  const normalizedMeta: PaginationMeta = {\n    currentPage: meta?.page || 1,\n    totalPages: meta?.totalPages || 1,\n    totalItems: meta?.total || 0,\n    itemsPerPage: meta?.limit || 20,\n    hasNext: (meta?.page || 1) < (meta?.totalPages || 1),\n    hasPrevious: (meta?.page || 1) > 1\n  };\n\n  return {\n    data: response.data,\n    meta: normalizedMeta\n  };\n}","/**\n * Base Document Builder Infrastructure\n * \n * Provides the foundational architecture for all document builders in the Didox SDK.\n * This class serves as the universal base that all specific document builders extend from.\n */\n\n/**\n * Abstract base class for all document builders\n * \n * Provides common functionality for building document payloads in a fluent,\n * chainable API pattern. All document builders inherit from this class to ensure\n * consistent behavior and IDE support across the SDK.\n * \n * @template TPayload - The final document payload type that this builder produces\n * \n * @example\n * ```typescript\n * // Example usage pattern (actual builders will extend this)\n * const payload = builder\n *   .someMethod(value)\n *   .anotherMethod(data)\n *   .raw({ customField: 'value' })  // Escape hatch for advanced cases\n *   .build();  // Returns TPayload\n * ```\n */\nexport abstract class BaseDocumentBuilder<TPayload> {\n  /**\n   * Internal payload state\n   * \n   * Contains the document data being built. Subclasses should manipulate\n   * this object through their specific methods to construct valid documents.\n   * \n   * @protected\n   */\n  protected payload: Partial<TPayload>;\n\n  /**\n   * Initialize builder with optional initial data\n   * \n   * @param initial - Optional initial payload data to seed the builder\n   * \n   * @example\n   * ```typescript\n   * // Start with empty payload\n   * const builder = new ConcreteBuilder();\n   * \n   * // Start with some initial data\n   * const builder = new ConcreteBuilder({\n   *   existingField: 'value',\n   *   anotherField: 123\n   * });\n   * ```\n   */\n  constructor(initial?: Partial<TPayload>) {\n    this.payload = initial ? { ...initial } : {};\n  }\n\n  /**\n   * Raw data merge (escape hatch)\n   * \n   * Allows merging arbitrary JSON data directly into the payload.\n   * This is useful for edge cases, advanced scenarios, or when working\n   * with undocumented API fields that aren't covered by typed methods.\n   * \n   * @param data - Raw data to merge into the current payload\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * // Merge raw data for advanced use cases\n   * const payload = builder\n   *   .standardMethod(value)\n   *   .raw({\n   *     customField: 'special value',\n   *     undocumentedFlag: true,\n   *     nestedObject: {\n   *       property: 'data'\n   *     }\n   *   })\n   *   .build();\n   * \n   * // Override specific fields if needed\n   * const payload = builder\n   *   .setAmount(1000)\n   *   .raw({ amount: 2000 })  // Override the amount\n   *   .build();\n   * ```\n   */\n  raw(data: Partial<TPayload>): this {\n    // Deep merge the raw data into current payload\n    Object.assign(this.payload, data);\n    return this;\n  }\n\n  /**\n   * Build final document payload\n   * \n   * Returns the constructed document payload. This method should be called\n   * after all desired builder methods have been chained to get the final\n   * document structure ready for API submission.\n   * \n   * @returns The complete document payload of type TPayload\n   * \n   * @example\n   * ```typescript\n   * // Build the final payload\n   * const documentPayload = builder\n   *   .setCompany(companyInfo)\n   *   .addItem(item1)\n   *   .addItem(item2)\n   *   .build();\n   * \n   * // Use with createDraft\n   * await client.documents.createDraft('002', documentPayload);\n   * ```\n   */\n  build(): TPayload {\n    // Return a copy to prevent external modification of internal state\n    return { ...this.payload } as TPayload;\n  }\n}\n\n/**\n * Document Builder Factory Type\n * \n * Defines the standard interface for all document builder factories.\n * Each builder factory should conform to this signature to ensure\n * consistency across the SDK.\n * \n * @template T - The payload type that the builder produces\n * \n * @example\n * ```typescript\n * // Example factory implementation\n * const invoiceBuilder: DocumentBuilderFactory<InvoicePayload> = \n *   (initial?) => new InvoiceBuilder(initial);\n * \n * // Usage\n * const builder = invoiceBuilder({ existingData: 'value' });\n * const payload = builder.someMethod().build();\n * ```\n */\nexport type DocumentBuilderFactory<T> = (initial?: Partial<T>) => BaseDocumentBuilder<T>;","import { BaseDocumentBuilder, DocumentBuilderFactory } from './base/BaseDocumentBuilder.js';\n\n/**\n * DX-friendly Invoice Draft interface\n * \n * Developer-friendly structure for building invoices.\n * This gets transformed to Didox API JSON format in build().\n */\nexport interface InvoiceDraft {\n  /** Invoice document information */\n  factura: {\n    no: string;\n    date: string;\n  };\n\n  /** Optional contract reference */\n  contract?: {\n    no: string;\n    date: string;\n  };\n\n  /** Seller organization details */\n  seller: {\n    tin: string;\n    name: string;\n    vatRegCode: string;\n    account: string;\n    bankId: string;\n    address: string;\n  };\n\n  /** Buyer organization details */\n  buyer: {\n    tin: string;\n    name: string;\n    vatRegCode: string;\n    account: string;\n    bankId: string;\n    address: string;\n  };\n\n  /** List of products/services */\n  products: InvoiceProductDraft[];\n\n  /** Optional invoice flags */\n  flags?: {\n    hasVat?: boolean;\n    hasExcise?: boolean;\n    hasLgota?: boolean;\n    hasCommittent?: boolean;\n  };\n}\n\n/**\n * DX-friendly Product Draft interface\n * \n * Simple structure for adding products to invoices.\n */\nexport interface InvoiceProductDraft {\n  /** Product name */\n  name: string;\n  /** Product catalog code */\n  catalogCode: string;\n  /** Optional catalog name */\n  catalogName?: string;\n  /** Package code */\n  packageCode: string;\n  /** Package name */\n  packageName: string;\n  /** Quantity */\n  quantity: number;\n  /** Unit price */\n  price: number;\n  /** VAT rate (optional) */\n  vatRate?: number;\n  /** Origin code */\n  origin: number;\n}\n\n/**\n * API Invoice Payload interface\n * \n * Exact structure expected by Didox API for invoice documents (docType: '002').\n */\nexport interface ApiInvoicePayload {\n  Version: number;\n  FacturaType: number;\n  FacturaDoc: {\n    FacturaNo: string;\n    FacturaDate: string;\n  };\n  ContractDoc?: {\n    ContractNo: string;\n    ContractDate: string;\n  };\n  SellerTin: string;\n  Seller: {\n    Name: string;\n    VatRegCode: string;\n    Account: string;\n    BankId: string;\n    Address: string;\n  };\n  BuyerTin: string;\n  Buyer: {\n    Name: string;\n    VatRegCode: string;\n    Account: string;\n    BankId: string;\n    Address: string;\n  };\n  ProductList: {\n    Tin: string;\n    HasVat: boolean;\n    HasExcise: boolean;\n    HasLgota: boolean;\n    HasCommittent: boolean;\n    Products: {\n      OrdNo: number;\n      Name: string;\n      CatalogCode: string;\n      PackageCode: string;\n      PackageName: string;\n      Count: number;\n      Summa: number;\n      DeliverySum: number;\n      VatRate: number;\n      VatSum: number;\n      DeliverySumWithVat: number;\n      WithoutVat: boolean;\n      Origin: number;\n    }[];\n  };\n}\n\n/**\n * Invoice Document Builder (Production)\n * \n * DX-friendly builder for creating invoice documents (docType: '002').\n * Provides fluent, chainable API that transforms to exact Didox API JSON format.\n * \n * @example\n * ```typescript\n * const payload = builders.invoice()\n *   .factura('INV-001', '2025-02-07')\n *   .contract('CNT-1', '2025-01-01')\n *   .seller({ tin: '123456789', name: 'ООО Компания', ... })\n *   .buyer({ tin: '987654321', name: 'ООО Клиент', ... })\n *   .addProduct({ name: 'Товар', quantity: 10, price: 100, ... })\n *   .flags({ hasVat: true })\n *   .build(); // Returns API JSON\n * \n * // Use with createDraft\n * await client.documents.createDraft('002', payload);\n * ```\n */\nclass InvoiceBuilder extends BaseDocumentBuilder<InvoiceDraft> {\n  /**\n   * Set invoice document information\n   * \n   * @param no - Invoice number\n   * @param date - Invoice date (YYYY-MM-DD format)\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.factura('INV-2025-001', '2025-02-07')\n   * ```\n   */\n  factura(no: string, date: string): this {\n    if (!this.payload.factura) {\n      this.payload.factura = { no: '', date: '' };\n    }\n    this.payload.factura.no = no;\n    this.payload.factura.date = date;\n    return this;\n  }\n\n  /**\n   * Set contract reference (optional)\n   * \n   * @param no - Contract number\n   * @param date - Contract date (YYYY-MM-DD format)\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.contract('CNT-2025-001', '2025-01-15')\n   * ```\n   */\n  contract(no: string, date: string): this {\n    this.payload.contract = { no, date };\n    return this;\n  }\n\n  /**\n   * Set seller organization details\n   * \n   * @param data - Seller organization information\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.seller({\n   *   tin: '123456789',\n   *   name: 'ООО «Продавец»',\n   *   vatRegCode: 'VAT123',\n   *   account: '20208000000000001',\n   *   bankId: '00014',\n   *   address: 'г.Ташкент, ул.Примерная, д.1'\n   * })\n   * ```\n   */\n  seller(data: InvoiceDraft['seller']): this {\n    this.payload.seller = data;\n    return this;\n  }\n\n  /**\n   * Set buyer organization details\n   * \n   * @param data - Buyer organization information\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.buyer({\n   *   tin: '987654321',\n   *   name: 'ООО «Покупатель»',\n   *   vatRegCode: 'VAT456',\n   *   account: '20208000000000002',\n   *   bankId: '00014',\n   *   address: 'г.Ташкент, ул.Другая, д.2'\n   * })\n   * ```\n   */\n  buyer(data: InvoiceDraft['buyer']): this {\n    this.payload.buyer = data;\n    return this;\n  }\n\n  /**\n   * Add a single product to the invoice\n   * \n   * @param product - Product information\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.addProduct({\n   *   name: 'Товар №1',\n   *   catalogCode: 'PROD001',\n   *   packageCode: 'PCK001',\n   *   packageName: 'штука',\n   *   quantity: 10,\n   *   price: 15000,\n   *   vatRate: 12,\n   *   origin: 1\n   * })\n   * ```\n   */\n  addProduct(product: InvoiceProductDraft): this {\n    if (!this.payload.products) {\n      this.payload.products = [];\n    }\n    this.payload.products.push(product);\n    return this;\n  }\n\n  /**\n   * Add multiple products to the invoice\n   * \n   * @param products - Array of products\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.addProducts([\n   *   { name: 'Товар №1', quantity: 5, price: 10000, ... },\n   *   { name: 'Товар №2', quantity: 3, price: 20000, ... }\n   * ])\n   * ```\n   */\n  addProducts(products: InvoiceProductDraft[]): this {\n    if (!this.payload.products) {\n      this.payload.products = [];\n    }\n    this.payload.products.push(...products);\n    return this;\n  }\n\n  /**\n   * Set invoice flags (optional)\n   * \n   * @param flags - Invoice processing flags\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.flags({\n   *   hasVat: true,\n   *   hasExcise: false,\n   *   hasLgota: false,\n   *   hasCommittent: false\n   * })\n   * ```\n   */\n  flags(flags: NonNullable<InvoiceDraft['flags']>): this {\n    this.payload.flags = flags;\n    return this;\n  }\n\n  /**\n   * Build and transform to API payload\n   * \n   * Overrides BaseDocumentBuilder.build() to return API format instead of DX format.\n   * Validates required fields and transforms DX structure to Didox API JSON format.\n   * \n   * @returns API-compatible invoice payload ready for createDraft()\n   * @throws Error if required fields are missing\n   * \n   * @example\n   * ```typescript\n   * const apiPayload = builder.build();\n   * await client.documents.createDraft('002', apiPayload);\n   * ```\n   */\n  build(): any {\n    // Validate required fields\n    if (!this.payload.factura) {\n      throw new Error('Invoice factura information is required');\n    }\n    if (!this.payload.seller) {\n      throw new Error('Seller information is required');\n    }\n    if (!this.payload.buyer) {\n      throw new Error('Buyer information is required');\n    }\n    if (!this.payload.products || this.payload.products.length === 0) {\n      throw new Error('At least one product is required');\n    }\n\n    const flags = this.payload.flags || {};\n\n    // Transform DX structure to API structure\n    const apiPayload: ApiInvoicePayload = {\n      Version: 1,\n      FacturaType: 0,\n      FacturaDoc: {\n        FacturaNo: this.payload.factura.no,\n        FacturaDate: this.payload.factura.date,\n      },\n      SellerTin: this.payload.seller.tin,\n      Seller: {\n        Name: this.payload.seller.name,\n        VatRegCode: this.payload.seller.vatRegCode,\n        Account: this.payload.seller.account,\n        BankId: this.payload.seller.bankId,\n        Address: this.payload.seller.address,\n      },\n      BuyerTin: this.payload.buyer.tin,\n      Buyer: {\n        Name: this.payload.buyer.name,\n        VatRegCode: this.payload.buyer.vatRegCode,\n        Account: this.payload.buyer.account,\n        BankId: this.payload.buyer.bankId,\n        Address: this.payload.buyer.address,\n      },\n      ProductList: {\n        Tin: this.payload.seller.tin,\n        HasVat: flags.hasVat ?? false,\n        HasExcise: flags.hasExcise ?? false,\n        HasLgota: flags.hasLgota ?? false,\n        HasCommittent: flags.hasCommittent ?? false,\n        Products: this.payload.products.map((product, index) => {\n          const deliverySum = product.quantity * product.price;\n          const vatRate = product.vatRate ?? 0;\n          const vatSum = flags.hasVat && vatRate > 0 ? (deliverySum * vatRate) / 100 : 0;\n          const deliverySumWithVat = deliverySum + vatSum;\n\n          return {\n            OrdNo: index + 1,\n            Name: product.name,\n            CatalogCode: product.catalogCode,\n            PackageCode: product.packageCode,\n            PackageName: product.packageName,\n            Count: product.quantity,\n            Summa: deliverySumWithVat,\n            DeliverySum: deliverySum,\n            VatRate: vatRate,\n            VatSum: vatSum,\n            DeliverySumWithVat: deliverySumWithVat,\n            WithoutVat: !flags.hasVat,\n            Origin: product.origin,\n          };\n        }),\n      },\n    };\n\n    // Add optional contract\n    if (this.payload.contract) {\n      apiPayload.ContractDoc = {\n        ContractNo: this.payload.contract.no,\n        ContractDate: this.payload.contract.date,\n      };\n    }\n\n    return apiPayload;\n  }\n\n  /**\n   * Get DX-friendly draft payload (for debugging/testing)\n   * \n   * @returns DX-friendly invoice draft\n   */\n  getDraft(): InvoiceDraft {\n    return this.payload as InvoiceDraft;\n  }\n}\n\n/**\n * Creates a new invoice document builder\n * \n * @returns Invoice builder instance ready for chaining\n * \n * @example\n * ```typescript\n * const invoice = builders.invoice()\n *   .factura('INV-001', '2025-02-07')\n *   .seller({ tin: '123456789', ... })\n *   .buyer({ tin: '987654321', ... })\n *   .addProduct({ name: 'Product', quantity: 1, price: 1000, ... })\n *   .build();\n * \n * await client.documents.createDraft('002', invoice);\n * ```\n */\nexport const invoice: DocumentBuilderFactory<InvoiceDraft> = () => new InvoiceBuilder();\n\n// Export types separately to avoid conflicts\nexport type { InvoiceDraft as InvoiceDraftType };\nexport type { InvoiceProductDraft as InvoiceProductDraftType };\nexport type { ApiInvoicePayload as ApiInvoicePayloadType };","import { BaseDocumentBuilder, DocumentBuilderFactory } from './base/BaseDocumentBuilder.js';\n\n/**\n * Pharmacy Invoice Document Builder (Stub)\n * \n * Builder for creating pharmacy invoice documents.\n * This is a placeholder implementation that will be expanded in future stages.\n */\nclass InvoicePharmBuilder extends BaseDocumentBuilder<any> {\n  // TODO: Add pharmacy-specific invoice methods\n}\n\n/**\n * Creates a new pharmacy invoice document builder\n * \n * @param initial - Optional initial pharmacy invoice data\n * @returns Pharmacy invoice builder instance\n */\nexport const invoicePharm: DocumentBuilderFactory<any> = (initial?) => \n  new InvoicePharmBuilder(initial);","import { BaseDocumentBuilder, DocumentBuilderFactory } from './base/BaseDocumentBuilder.js';\n\n/**\n * Hybrid Invoice Document Builder (Stub)\n * \n * Builder for creating hybrid invoice documents.\n * This is a placeholder implementation that will be expanded in future stages.\n */\nclass HybridInvoiceBuilder extends BaseDocumentBuilder<any> {\n  // TODO: Add hybrid invoice methods\n}\n\n/**\n * Creates a new hybrid invoice document builder\n * \n * @param initial - Optional initial hybrid invoice data\n * @returns Hybrid invoice builder instance\n */\nexport const hybridInvoice: DocumentBuilderFactory<any> = (initial?) => \n  new HybridInvoiceBuilder(initial);","import { BaseDocumentBuilder, DocumentBuilderFactory } from './base/BaseDocumentBuilder.js';\n\n/**\n * DX-friendly TTN Draft interface\n * \n * Developer-friendly structure for building transport waybill documents.\n * This gets transformed to Didox API JSON format in build().\n */\nexport interface TtnDraft {\n  /** Waybill document information */\n  waybill: {\n    no: string;\n    date: string;\n    localType?: 0 | 1 | 4;\n    deliveryType: number;\n  };\n\n  /** Optional contract reference */\n  contract?: {\n    no: string;\n    date: string;\n  };\n\n  /** Consignor (sender) organization details */\n  consignor: Party;\n\n  /** Consignee (receiver) organization details */\n  consignee: Party;\n\n  /** Carrier organization details */\n  carrier: Party;\n\n  /** Optional freight forwarder */\n  freightForwarder?: Party;\n\n  /** Optional client organization */\n  client?: Party;\n\n  /** Optional payer organization */\n  payer?: Party;\n\n  /** Transport information */\n  transport: {\n    type: 1 | 2; // 1 - автомобильный, 2 - железнодорожный\n    truck: {\n      regNo: string;\n      model: string;\n    };\n    trailer?: {\n      regNo: string;\n      model: string;\n    };\n    driver: {\n      pinfl: string;\n      fullName: string;\n    };\n  };\n\n  /** Product groups with loading/unloading points */\n  productGroups: ProductGroupDraft[];\n\n  /** Total delivery calculation */\n  totals: {\n    distanceKm: number;\n    pricePerKm: number;\n  };\n\n  /** Responsible person */\n  responsiblePerson: {\n    pinfl: string;\n    fullName: string;\n  };\n\n  /** Optional TTN flags */\n  flags?: {\n    hasCommittent?: boolean;\n    singleSidedType?: number;\n  };\n}\n\n/**\n * DX-friendly Party interface\n * \n * Organization details used across TTN document.\n */\nexport interface Party {\n  /** Tax identification number */\n  tin: string;\n  /** Organization name */\n  name: string;\n  /** Optional branch code */\n  branchCode?: string;\n  /** Optional branch name */\n  branchName?: string;\n}\n\n/**\n * DX-friendly Product Group Draft interface\n * \n * Group of products/goods with same loading/unloading points.\n */\nexport interface ProductGroupDraft {\n  /** Loading point information */\n  loadingPoint: {\n    address: string;\n    tin: string;\n    name: string;\n  };\n\n  /** Loading trustee (person responsible for loading) */\n  loadingTrustee?: {\n    pinfl: string;\n    fullName: string;\n  };\n\n  /** Unloading point information */\n  unloadingPoint: {\n    address: string;\n    tin: string;\n    name: string;\n  };\n\n  /** Unloading trustee (person responsible for unloading) */\n  unloadingTrustee?: {\n    pinfl: string;\n    fullName: string;\n  };\n\n  /** Empowerment document information */\n  empowerment?: {\n    no: string;\n    date: string;\n    series?: string;\n  };\n\n  /** Products/goods in this group */\n  products: TtnProductDraft[];\n}\n\n/**\n * DX-friendly TTN Product Draft interface\n * \n * Simple structure for adding products/goods to TTN.\n */\nexport interface TtnProductDraft {\n  /** Product/good name */\n  name: string;\n  /** Product catalog code */\n  catalogCode: string;\n  /** Product catalog name */\n  catalogName: string;\n  /** Package code */\n  packageCode: string;\n  /** Package name */\n  packageName: string;\n  /** Count/quantity */\n  count: number;\n  /** Unit price per kg/unit */\n  price: number;\n  /** VAT rate (optional) */\n  vatRate?: number;\n}\n\n/**\n * API TTN Payload interface\n * \n * Exact structure expected by Didox API for TTN documents (docType: '041').\n */\nexport interface ApiTtnPayload {\n  WaybillLocalType: number;\n  DeliveryType: number;\n  WaybillDoc: {\n    WaybillNo: string;\n    WaybillDate: string;\n  };\n  ContractDoc?: {\n    ContractNo: string;\n    ContractDate: string;\n  };\n  Consignor: {\n    ConsignorTin: string;\n    ConsignorName: string;\n    ConsignorBranchCode: string;\n    ConsignorBranchName: string;\n  };\n  Consignee: {\n    ConsigneeTin: string;\n    ConsigneeName: string;\n    ConsigneeBranchCode: string;\n    ConsigneeBranchName: string;\n  };\n  Carrier: {\n    CarrierTin: string;\n    CarrierName: string;\n    CarrierBranchCode: string;\n    CarrierBranchName: string;\n  };\n  FreightForwarder?: {\n    FreightForwarderTin: string;\n    FreightForwarderName: string;\n    FreightForwarderBranchCode: string;\n    FreightForwarderBranchName: string;\n  };\n  Client?: {\n    ClientTin: string;\n    ClientName: string;\n    ClientBranchCode: string;\n    ClientBranchName: string;\n  };\n  Payer?: {\n    PayerTin: string;\n    PayerName: string;\n    PayerBranchCode: string;\n    PayerBranchName: string;\n  };\n  TransportType: number;\n  Roadway: {\n    Truck: {\n      RegNo: string;\n      Model: string;\n    };\n    Trailer?: {\n      RegNo: string;\n      Model: string;\n    };\n    Driver: {\n      Pinfl: string;\n      FullName: string;\n    };\n    ProductGroups: {\n      OrdNo: number;\n      LoadingPoint: {\n        Address: string;\n        Tin: string;\n        Name: string;\n      };\n      LoadingTrustee?: {\n        Pinfl: string;\n        FullName: string;\n      };\n      UnloadingPoint: {\n        Address: string;\n        Tin: string;\n        Name: string;\n      };\n      UnloadingTrustee?: {\n        Pinfl: string;\n        FullName: string;\n      };\n      Empowerment?: {\n        EmpowermentNo: string;\n        EmpowermentDate: string;\n        EmpowermentSeries?: string;\n      };\n      ProductList: {\n        OrdNo: number;\n        CatalogCode: string;\n        CatalogName: string;\n        Name: string;\n        PackageCode: string;\n        PackageName: string;\n        Count: string;\n        Amount: string;\n        DeliverySum: string;\n      }[];\n    }[];\n  };\n  ResponsiblePerson: {\n    Pinfl: string;\n    FullName: string;\n  };\n  TotalDistance: string;\n  DeliveryCost: string;\n  TotalDeliveryCost: string;\n  HasCommittent?: boolean;\n  SingleSidedType?: number;\n  isValid: boolean;\n}\n\n/**\n * TTN Product Group Builder\n * \n * Nested builder for constructing product groups with loading/unloading points.\n * Used internally by TTNBuilder.addProductGroup().\n */\nexport class TtnProductGroupBuilder {\n  private groupData: Partial<ProductGroupDraft> = {};\n\n  /**\n   * Set loading point information\n   * \n   * @param point - Loading point details\n   * @returns This product group builder for chaining\n   * \n   * @example\n   * ```typescript\n   * group.loadingPoint({\n   *   address: 'г. Ташкент, ул. Амира Темура, 1',\n   *   tin: '123456789',\n   *   name: 'ООО Склад'\n   * })\n   * ```\n   */\n  loadingPoint(point: { address: string; tin: string; name: string }): this {\n    this.groupData.loadingPoint = point;\n    return this;\n  }\n\n  /**\n   * Set loading trustee (responsible person for loading)\n   * \n   * @param trustee - Loading trustee details\n   * @returns This product group builder for chaining\n   * \n   * @example\n   * ```typescript\n   * group.loadingTrustee({\n   *   pinfl: '30601851234567',\n   *   fullName: 'Иванов Иван Иванович'\n   * })\n   * ```\n   */\n  loadingTrustee(trustee: { pinfl: string; fullName: string }): this {\n    this.groupData.loadingTrustee = trustee;\n    return this;\n  }\n\n  /**\n   * Set unloading point information\n   * \n   * @param point - Unloading point details\n   * @returns This product group builder for chaining\n   * \n   * @example\n   * ```typescript\n   * group.unloadingPoint({\n   *   address: 'г. Самарканд, ул. Регистан, 5',\n   *   tin: '987654321',\n   *   name: 'ООО Получатель'\n   * })\n   * ```\n   */\n  unloadingPoint(point: { address: string; tin: string; name: string }): this {\n    this.groupData.unloadingPoint = point;\n    return this;\n  }\n\n  /**\n   * Set unloading trustee (responsible person for unloading)\n   * \n   * @param trustee - Unloading trustee details\n   * @returns This product group builder for chaining\n   * \n   * @example\n   * ```typescript\n   * group.unloadingTrustee({\n   *   pinfl: '31501851234567',\n   *   fullName: 'Петров Петр Петрович'\n   * })\n   * ```\n   */\n  unloadingTrustee(trustee: { pinfl: string; fullName: string }): this {\n    this.groupData.unloadingTrustee = trustee;\n    return this;\n  }\n\n  /**\n   * Set empowerment document information\n   * \n   * @param empowerment - Empowerment document details\n   * @returns This product group builder for chaining\n   * \n   * @example\n   * ```typescript\n   * group.empowerment({\n   *   no: 'DOV-001',\n   *   date: '2025-01-20',\n   *   series: 'AAA'\n   * })\n   * ```\n   */\n  empowerment(empowerment: { no: string; date: string; series?: string }): this {\n    this.groupData.empowerment = empowerment;\n    return this;\n  }\n\n  /**\n   * Add a product/good to this group\n   * \n   * @param product - Product details\n   * @returns This product group builder for chaining\n   * \n   * @example\n   * ```typescript\n   * group.addProduct({\n   *   name: 'Пшеница',\n   *   catalogCode: 'WHEAT001',\n   *   catalogName: 'Зерновые',\n   *   packageCode: 'TON',\n   *   packageName: 'тонна',\n   *   count: 25,\n   *   price: 2500000 // цена за тонну\n   * })\n   * ```\n   */\n  addProduct(product: TtnProductDraft): this {\n    if (!this.groupData.products) {\n      this.groupData.products = [];\n    }\n    this.groupData.products.push(product);\n    return this;\n  }\n\n  /**\n   * Add multiple products/goods to this group\n   * \n   * @param products - Array of product details\n   * @returns This product group builder for chaining\n   * \n   * @example\n   * ```typescript\n   * group.addProducts([\n   *   { name: 'Пшеница', catalogCode: 'WHEAT001', count: 25, price: 2500000, ... },\n   *   { name: 'Ячмень', catalogCode: 'BARLEY001', count: 15, price: 2200000, ... }\n   * ])\n   * ```\n   */\n  addProducts(products: TtnProductDraft[]): this {\n    if (!this.groupData.products) {\n      this.groupData.products = [];\n    }\n    this.groupData.products.push(...products);\n    return this;\n  }\n\n  /**\n   * Build the final product group data\n   * \n   * @returns Complete product group draft\n   * @internal Used by TTNBuilder\n   */\n  build(): ProductGroupDraft {\n    if (!this.groupData.loadingPoint) {\n      throw new Error('Loading point is required for product group');\n    }\n    if (!this.groupData.unloadingPoint) {\n      throw new Error('Unloading point is required for product group');\n    }\n    if (!this.groupData.products || this.groupData.products.length === 0) {\n      throw new Error('At least one product is required for product group');\n    }\n\n    return this.groupData as ProductGroupDraft;\n  }\n}\n\n/**\n * Transport Waybill (TTN) Document Builder (Production)\n * \n * DX-friendly builder for creating transport waybill documents (docType: '041').\n * Provides fluent, chainable API that transforms to exact Didox API JSON format.\n * \n * @example\n * ```typescript\n * const payload = builders.ttn()\n *   .waybill('TTN-001', '2025-02-07', { deliveryType: 2 })\n *   .contract('CNT-1', '2025-01-01')\n *   .consignor({ tin: '123456789', name: 'ООО Отправитель' })\n *   .consignee({ tin: '987654321', name: 'ООО Получатель' })\n *   .carrier({ tin: '555444333', name: 'ООО Перевозчик' })\n *   .transport({\n *     truck: { regNo: '01 386 EJA', model: 'KAMAZ-5320' },\n *     driver: { pinfl: '30601851234567', fullName: 'Иванов И.И.' }\n *   })\n *   .addProductGroup(group => \n *     group\n *       .loadingPoint({ address: 'Склад №1', tin: '123456789', name: 'ООО Склад' })\n *       .unloadingPoint({ address: 'Магазин №5', tin: '987654321', name: 'ООО Магазин' })\n *       .addProduct({ name: 'Товар', catalogCode: 'GOOD001', count: 100, price: 50000, ... })\n *   )\n *   .totals({ distanceKm: 120, pricePerKm: 10000 })\n *   .responsiblePerson({ pinfl: '30601851234567', fullName: 'Иванов И.И.' })\n *   .build();\n * \n * // Use with createDraft\n * await client.documents.createDraft('041', payload);\n * ```\n */\nclass TtnBuilder extends BaseDocumentBuilder<ApiTtnPayload> {\n  private dxPayload: Partial<TtnDraft> = {};\n\n  /**\n   * Raw data merge (escape hatch)\n   * \n   * Allows merging arbitrary JSON data directly into the API payload.\n   * This overrides the base implementation to work with TTN's dual payload system.\n   * \n   * @param data - Raw data to merge into the current payload\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * const payload = builder\n   *   .waybill('TTN-001', '2025-02-07', { deliveryType: 2 })\n   *   .consignor({ tin: '123456789', name: 'Test' })\n   *   .raw({\n   *     CustomField: 'special value',\n   *     AdvancedSettings: { priority: 'high' }\n   *   })\n   *   .build();\n   * ```\n   */\n  raw(data: Partial<ApiTtnPayload>): this {\n    // Merge raw data into the base payload (for API-level overrides)\n    Object.assign(this.payload, data);\n    return this;\n  }\n  /**\n   * Set waybill document information\n   * \n   * @param no - Waybill number\n   * @param date - Waybill date (YYYY-MM-DD format)\n   * @param options - Additional waybill options\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.waybill('TTN-001', '2025-02-07', { \n   *   localType: 0, \n   *   deliveryType: 2 \n   * })\n   * ```\n   */\n  waybill(no: string, date: string, options: { localType?: 0 | 1 | 4; deliveryType: number }): this {\n    this.dxPayload.waybill = {\n      no,\n      date,\n      deliveryType: options.deliveryType,\n      ...(options.localType !== undefined && { localType: options.localType })\n    };\n    return this;\n  }\n\n  /**\n   * Set contract document information (optional)\n   * \n   * @param no - Contract number\n   * @param date - Contract date (YYYY-MM-DD format)\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.contract('CNT-2025-001', '2025-01-15')\n   * ```\n   */\n  contract(no: string, date: string): this {\n    this.dxPayload.contract = { no, date };\n    return this;\n  }\n\n  /**\n   * Set consignor (sender) organization details\n   * \n   * @param consignor - Consignor organization information\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.consignor({\n   *   tin: '123456789',\n   *   name: 'ООО «Отправитель»',\n   *   branchCode: 'MAIN',\n   *   branchName: 'Головной офис'\n   * })\n   * ```\n   */\n  consignor(consignor: Party): this {\n    this.dxPayload.consignor = consignor;\n    return this;\n  }\n\n  /**\n   * Set consignee (receiver) organization details\n   * \n   * @param consignee - Consignee organization information\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.consignee({\n   *   tin: '987654321',\n   *   name: 'ООО «Получатель»',\n   *   branchCode: 'STORE5',\n   *   branchName: 'Магазин №5'\n   * })\n   * ```\n   */\n  consignee(consignee: Party): this {\n    this.dxPayload.consignee = consignee;\n    return this;\n  }\n\n  /**\n   * Set carrier organization details\n   * \n   * @param carrier - Carrier organization information\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.carrier({\n   *   tin: '555444333',\n   *   name: 'ООО «Транспорт»',\n   *   branchCode: 'AUTO1',\n   *   branchName: 'Автопарк №1'\n   * })\n   * ```\n   */\n  carrier(carrier: Party): this {\n    this.dxPayload.carrier = carrier;\n    return this;\n  }\n\n  /**\n   * Set freight forwarder organization details (optional)\n   * \n   * @param freightForwarder - Freight forwarder organization information\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.freightForwarder({\n   *   tin: '111222333',\n   *   name: 'ООО «Экспедитор»'\n   * })\n   * ```\n   */\n  freightForwarder(freightForwarder: Party): this {\n    this.dxPayload.freightForwarder = freightForwarder;\n    return this;\n  }\n\n  /**\n   * Set client organization details (optional)\n   * \n   * @param client - Client organization information\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.client({\n   *   tin: '999888777',\n   *   name: 'ООО «Клиент»'\n   * })\n   * ```\n   */\n  client(client: Party): this {\n    this.dxPayload.client = client;\n    return this;\n  }\n\n  /**\n   * Set payer organization details (optional)\n   * \n   * @param payer - Payer organization information\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.payer({\n   *   tin: '777666555',\n   *   name: 'ООО «Плательщик»'\n   * })\n   * ```\n   */\n  payer(payer: Party): this {\n    this.dxPayload.payer = payer;\n    return this;\n  }\n\n  /**\n   * Set transport information\n   * \n   * @param transport - Transport details including truck, trailer, and driver\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.transport({\n   *   type: 1, // автомобильный\n   *   truck: { \n   *     regNo: '01 386 EJA', \n   *     model: 'KAMAZ-5320' \n   *   },\n   *   trailer: { \n   *     regNo: '01 387 EJB', \n   *     model: 'Прицеп-1' \n   *   },\n   *   driver: { \n   *     pinfl: '30601851234567', \n   *     fullName: 'Иванов Иван Иванович' \n   *   }\n   * })\n   * ```\n   */\n  transport(transport: TtnDraft['transport']): this {\n    this.dxPayload.transport = transport;\n    return this;\n  }\n\n  /**\n   * Add a product group with nested builder\n   * \n   * @param builderFn - Function that configures the product group builder\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.addProductGroup(group => \n   *   group\n   *     .loadingPoint({\n   *       address: 'г. Ташкент, ул. Амира Темура, 1',\n   *       tin: '123456789',\n   *       name: 'ООО Склад'\n   *     })\n   *     .unloadingPoint({\n   *       address: 'г. Самарканд, ул. Регистан, 5',\n   *       tin: '987654321',\n   *       name: 'ООО Магазин'\n   *     })\n   *     .addProduct({\n   *       name: 'Пшеница',\n   *       catalogCode: 'WHEAT001',\n   *       catalogName: 'Зерновые',\n   *       packageCode: 'TON',\n   *       packageName: 'тонна',\n   *       count: 25,\n   *       price: 2500000\n   *     })\n   *     .addProduct({\n   *       name: 'Ячмень',\n   *       catalogCode: 'BARLEY001',\n   *       catalogName: 'Зерновые',\n   *       packageCode: 'TON',\n   *       packageName: 'тонна',\n   *       count: 15,\n   *       price: 2200000\n   *     })\n   * )\n   * ```\n   */\n  addProductGroup(builderFn: (builder: TtnProductGroupBuilder) => TtnProductGroupBuilder): this {\n    const groupBuilder = new TtnProductGroupBuilder();\n    const configuredBuilder = builderFn(groupBuilder);\n    const productGroup = configuredBuilder.build();\n\n    if (!this.dxPayload.productGroups) {\n      this.dxPayload.productGroups = [];\n    }\n    this.dxPayload.productGroups.push(productGroup);\n\n    return this;\n  }\n\n  /**\n   * Set total distance and delivery cost calculation\n   * \n   * @param totals - Distance and price per km information\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.totals({ \n   *   distanceKm: 120, \n   *   pricePerKm: 10000 // цена за км в сумах\n   * })\n   * ```\n   */\n  totals(totals: { distanceKm: number; pricePerKm: number }): this {\n    this.dxPayload.totals = totals;\n    return this;\n  }\n\n  /**\n   * Set responsible person information\n   * \n   * @param person - Responsible person details\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.responsiblePerson({\n   *   pinfl: '30601851234567',\n   *   fullName: 'Иванов Иван Иванович'\n   * })\n   * ```\n   */\n  responsiblePerson(person: { pinfl: string; fullName: string }): this {\n    this.dxPayload.responsiblePerson = person;\n    return this;\n  }\n\n  /**\n   * Set additional TTN flags (optional)\n   * \n   * @param flags - Optional TTN configuration flags\n   * @returns This builder instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * builder.flags({ \n   *   hasCommittent: true, \n   *   singleSidedType: 1 \n   * })\n   * ```\n   */\n  flags(flags: { hasCommittent?: boolean; singleSidedType?: number }): this {\n    this.dxPayload.flags = flags;\n    return this;\n  }\n\n  /**\n   * Build final TTN document payload\n   * \n   * Transforms the DX-friendly payload into the exact Didox API JSON format.\n   * Performs automatic calculations for delivery costs and product numbering.\n   * \n   * @returns Complete TTN payload ready for Didox API\n   * \n   * @example\n   * ```typescript\n   * const apiPayload = builder.build();\n   * await client.documents.createDraft('041', apiPayload);\n   * ```\n   */\n  build(): ApiTtnPayload {\n    const draft = this.dxPayload as TtnDraft;\n\n    // Validation\n    if (!draft.waybill) throw new Error('Waybill information is required');\n    if (!draft.consignor) throw new Error('Consignor is required');\n    if (!draft.consignee) throw new Error('Consignee is required'); \n    if (!draft.carrier) throw new Error('Carrier is required');\n    if (!draft.transport) throw new Error('Transport information is required');\n    if (!draft.productGroups || draft.productGroups.length === 0) {\n      throw new Error('At least one product group is required');\n    }\n    if (!draft.totals) throw new Error('Totals information is required');\n    if (!draft.responsiblePerson) throw new Error('Responsible person is required');\n\n    // Calculate totals\n    const totalDeliveryCost = draft.totals.distanceKm * draft.totals.pricePerKm;\n\n    // Transform to API format\n    const apiPayload: ApiTtnPayload = {\n      WaybillLocalType: draft.waybill.localType ?? 0,\n      DeliveryType: draft.waybill.deliveryType,\n\n      WaybillDoc: {\n        WaybillNo: draft.waybill.no,\n        WaybillDate: draft.waybill.date\n      },\n\n      ...(draft.contract && {\n        ContractDoc: {\n          ContractNo: draft.contract.no,\n          ContractDate: draft.contract.date\n        }\n      }),\n\n      Consignor: {\n        ConsignorTin: draft.consignor.tin,\n        ConsignorName: draft.consignor.name,\n        ConsignorBranchCode: draft.consignor.branchCode ?? '',\n        ConsignorBranchName: draft.consignor.branchName ?? ''\n      },\n\n      Consignee: {\n        ConsigneeTin: draft.consignee.tin,\n        ConsigneeName: draft.consignee.name,\n        ConsigneeBranchCode: draft.consignee.branchCode ?? '',\n        ConsigneeBranchName: draft.consignee.branchName ?? ''\n      },\n\n      Carrier: {\n        CarrierTin: draft.carrier.tin,\n        CarrierName: draft.carrier.name,\n        CarrierBranchCode: draft.carrier.branchCode ?? '',\n        CarrierBranchName: draft.carrier.branchName ?? ''\n      },\n\n      ...(draft.freightForwarder && {\n        FreightForwarder: {\n          FreightForwarderTin: draft.freightForwarder.tin,\n          FreightForwarderName: draft.freightForwarder.name,\n          FreightForwarderBranchCode: draft.freightForwarder.branchCode ?? '',\n          FreightForwarderBranchName: draft.freightForwarder.branchName ?? ''\n        }\n      }),\n\n      ...(draft.client && {\n        Client: {\n          ClientTin: draft.client.tin,\n          ClientName: draft.client.name,\n          ClientBranchCode: draft.client.branchCode ?? '',\n          ClientBranchName: draft.client.branchName ?? ''\n        }\n      }),\n\n      ...(draft.payer && {\n        Payer: {\n          PayerTin: draft.payer.tin,\n          PayerName: draft.payer.name,\n          PayerBranchCode: draft.payer.branchCode ?? '',\n          PayerBranchName: draft.payer.branchName ?? ''\n        }\n      }),\n\n      TransportType: draft.transport.type,\n\n      Roadway: {\n        Truck: {\n          RegNo: draft.transport.truck.regNo,\n          Model: draft.transport.truck.model\n        },\n\n        ...(draft.transport.trailer && {\n          Trailer: {\n            RegNo: draft.transport.trailer.regNo,\n            Model: draft.transport.trailer.model\n          }\n        }),\n\n        Driver: {\n          Pinfl: draft.transport.driver.pinfl,\n          FullName: draft.transport.driver.fullName\n        },\n\n        ProductGroups: draft.productGroups.map((group, groupIndex) => ({\n          OrdNo: groupIndex + 1,\n\n          LoadingPoint: {\n            Address: group.loadingPoint.address,\n            Tin: group.loadingPoint.tin,\n            Name: group.loadingPoint.name\n          },\n\n          ...(group.loadingTrustee && {\n            LoadingTrustee: {\n              Pinfl: group.loadingTrustee.pinfl,\n              FullName: group.loadingTrustee.fullName\n            }\n          }),\n\n          UnloadingPoint: {\n            Address: group.unloadingPoint.address,\n            Tin: group.unloadingPoint.tin,\n            Name: group.unloadingPoint.name\n          },\n\n          ...(group.unloadingTrustee && {\n            UnloadingTrustee: {\n              Pinfl: group.unloadingTrustee.pinfl,\n              FullName: group.unloadingTrustee.fullName\n            }\n          }),\n\n          ...(group.empowerment && {\n            Empowerment: {\n              EmpowermentNo: group.empowerment.no,\n              EmpowermentDate: group.empowerment.date,\n              ...(group.empowerment.series && {\n                EmpowermentSeries: group.empowerment.series\n              })\n            }\n          }),\n\n          ProductList: group.products.map((product, productIndex) => {\n            const amount = product.count * product.price;\n            const deliverySum = Math.round((amount / 100) * draft.totals.pricePerKm);\n\n            return {\n              OrdNo: productIndex + 1,\n              CatalogCode: product.catalogCode,\n              CatalogName: product.catalogName,\n              Name: product.name,\n              PackageCode: product.packageCode,\n              PackageName: product.packageName,\n              Count: product.count.toString(),\n              Amount: amount.toString(),\n              DeliverySum: deliverySum.toString()\n            };\n          })\n        }))\n      },\n\n      ResponsiblePerson: {\n        Pinfl: draft.responsiblePerson.pinfl,\n        FullName: draft.responsiblePerson.fullName\n      },\n\n      TotalDistance: draft.totals.distanceKm.toFixed(2),\n      DeliveryCost: draft.totals.pricePerKm.toString(),\n      TotalDeliveryCost: totalDeliveryCost.toFixed(2),\n\n      ...(draft.flags?.hasCommittent !== undefined && {\n        HasCommittent: draft.flags.hasCommittent\n      }),\n\n      ...(draft.flags?.singleSidedType !== undefined && {\n        SingleSidedType: draft.flags.singleSidedType\n      }),\n\n      isValid: true\n    };\n\n    // Merge any raw overrides from base payload\n    return { ...apiPayload, ...this.payload };\n  }\n}\n\n/**\n * Creates a new transport waybill document builder\n * \n * @param initial - Optional initial TTN data\n * @returns TTN builder instance\n * \n * @example\n * ```typescript\n * const payload = client.documents.builders.ttn()\n *   .waybill('TTN-001', '2025-02-07', { deliveryType: 2 })\n *   .consignor({ tin: '123456789', name: 'ООО Отправитель' })\n *   .consignee({ tin: '987654321', name: 'ООО Получатель' })\n *   .carrier({ tin: '555444333', name: 'ООО Перевозчик' })\n *   .transport({\n *     type: 1,\n *     truck: { regNo: '01 386 EJA', model: 'KAMAZ' },\n *     driver: { pinfl: '30601851234567', fullName: 'Иванов И.И.' }\n *   })\n *   .addProductGroup(group => \n *     group\n *       .loadingPoint({...})\n *       .unloadingPoint({...})\n *       .addProduct({...})\n *   )\n *   .totals({ distanceKm: 120, pricePerKm: 10000 })\n *   .responsiblePerson({ pinfl: '...', fullName: '...' })\n *   .build();\n * ```\n */\nexport const ttn: DocumentBuilderFactory<ApiTtnPayload> = (initial?) => \n  new TtnBuilder(initial);","import { BaseDocumentBuilder, DocumentBuilderFactory } from './base/BaseDocumentBuilder.js';\n\n/**\n * DX-friendly Act Draft interface\n * \n * Developer-friendly structure for building act documents.\n * This gets transformed to Didox API JSON format in build().\n */\nexport interface ActDraft {\n  /** Act document information */\n  act: {\n    no: string;\n    date: string;\n    text?: string;\n  };\n\n  /** Optional contract reference */\n  contract?: {\n    no: string;\n    date: string;\n  };\n\n  /** Seller (performer) organization details */\n  seller: {\n    tin: string;\n    name: string;\n    branchCode?: string;\n    branchName?: string;\n  };\n\n  /** Buyer (customer) organization details */\n  buyer: {\n    tin: string;\n    name: string;\n    branchCode?: string;\n    branchName?: string;\n  };\n\n  /** List of products/services/works */\n  products: ActProductDraft[];\n\n  /** Optional act flags */\n  flags?: {\n    hasVat?: boolean;\n    hasExcise?: boolean;\n  };\n}\n\n/**\n * DX-friendly Product Draft interface\n * \n * Simple structure for adding products/services to acts.\n */\nexport interface ActProductDraft {\n  /** Product/service name */\n  name: string;\n  /** Product catalog code */\n  catalogCode: string;\n  /** Product catalog name */\n  catalogName: string;\n  /** Package code */\n  packageCode: string;\n  /** Package name */\n  packageName: string;\n  /** Count/quantity */\n  count: number;\n  /** Unit price */\n  price: number;\n  /** VAT rate (optional) */\n  vatRate?: number;\n  /** Without VAT flag (optional) */\n  withoutVat?: boolean;\n  /** Benefit name (optional) */\n  lgotaName?: string;\n  /** Benefit type (optional) */\n  lgotaType?: 1 | 2;\n}\n\n/**\n * API Act Payload interface\n * \n * Exact structure expected by Didox API for act documents (docType: '005').\n */\nexport interface ApiActPayload {\n  ActDoc: {\n    ActNo: string;\n    ActDate: string;\n    ActText?: string;\n  };\n  ContractDoc?: {\n    ContractNo: string;\n    ContractDate: string;\n  };\n  SellerTin: string;\n  ProductList: {\n    Tin: string;\n    HasExcise: boolean;\n    HasVat: boolean;\n    Products: {\n      OrdNo: number;\n      CatalogCode: string;\n      CatalogName: string;\n      Name: string;\n      MeasureId: null;\n      PackageCode: string;\n      PackageName: string;\n      Count: string;\n      Summa: string;\n      TotalSumWithoutVat: string;\n      VatRate: string;\n      VatSum: string;\n      TotalSum: string;\n      WithoutVat: boolean;\n      LgotaName: string | null;\n      LgotaType: number | null;\n    }[];\n  };\n  SellerName: string;\n  SellerBranchCode: string;\n  SellerBranchName: string;\n  BuyerTin: string;\n  BuyerName: string;\n  BuyerBranchCode: string;\n  BuyerBranchName: string;\n}\n\n/**\n * Act Document Builder (Production)\n * \n * DX-friendly builder for creating act documents (docType: '005').\n * Provides fluent, chainable API that transforms to exact Didox API JSON format.\n * \n * @example\n * ```typescript\n * const payload = builders.act()\n *   .act('ACT-001', '2025-02-07', 'Акт выполненных работ')\n *   .contract('CNT-1', '2025-01-01')\n *   .seller({ tin: '123456789', name: 'ООО Исполнитель' })\n *   .buyer({ tin: '987654321', name: 'ООО Заказчик' })\n *   .addProduct({ name: 'Услуга', catalogCode: 'SRV001', count: 1, price: 100000, ... })\n *   .flags({ hasVat: true })\n *   .build();\n * \n * // Use with createDraft\n * await client.documents.createDraft('005', payload);\n * ```\n */\nclass ActBuilder extends BaseDocumentBuilder<ActDraft> {\n  /**\n   * Set act document information\n   * \n   * @param no - Act number\n   * @param date - Act date (YYYY-MM-DD format)\n   * @param text - Optional act text description\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.act('ACT-2025-001', '2025-02-07', 'Акт выполненных работ по договору')\n   * ```\n   */\n  act(no: string, date: string, text?: string): this {\n    if (!this.payload.act) {\n      this.payload.act = { no: '', date: '' };\n    }\n    this.payload.act.no = no;\n    this.payload.act.date = date;\n    if (text !== undefined) {\n      this.payload.act.text = text;\n    }\n    return this;\n  }\n\n  /**\n   * Set contract reference (optional)\n   * \n   * @param no - Contract number\n   * @param date - Contract date (YYYY-MM-DD format)\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.contract('CNT-2025-001', '2025-01-15')\n   * ```\n   */\n  contract(no: string, date: string): this {\n    this.payload.contract = { no, date };\n    return this;\n  }\n\n  /**\n   * Set seller (performer) organization details\n   * \n   * @param data - Seller organization information\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.seller({\n   *   tin: '123456789',\n   *   name: 'ООО «Исполнитель работ»',\n   *   branchCode: 'BR001',\n   *   branchName: 'Главный офис'\n   * })\n   * ```\n   */\n  seller(data: ActDraft['seller']): this {\n    this.payload.seller = data;\n    return this;\n  }\n\n  /**\n   * Set buyer (customer) organization details\n   * \n   * @param data - Buyer organization information\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.buyer({\n   *   tin: '987654321',\n   *   name: 'ООО «Заказчик услуг»',\n   *   branchCode: 'BR002',\n   *   branchName: 'Филиал'\n   * })\n   * ```\n   */\n  buyer(data: ActDraft['buyer']): this {\n    this.payload.buyer = data;\n    return this;\n  }\n\n  /**\n   * Add a single product/service to the act\n   * \n   * @param product - Product/service information\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.addProduct({\n   *   name: 'Консультационные услуги',\n   *   catalogCode: '08471001001000000',\n   *   catalogName: 'Консультация',\n   *   packageCode: '1501886',\n   *   packageName: 'шт.',\n   *   count: 10,\n   *   price: 50000,\n   *   vatRate: 12\n   * })\n   * ```\n   */\n  addProduct(product: ActProductDraft): this {\n    if (!this.payload.products) {\n      this.payload.products = [];\n    }\n    this.payload.products.push(product);\n    return this;\n  }\n\n  /**\n   * Add multiple products/services to the act\n   * \n   * @param products - Array of products/services\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.addProducts([\n   *   { name: 'Услуга №1', count: 5, price: 10000, ... },\n   *   { name: 'Услуга №2', count: 3, price: 20000, ... }\n   * ])\n   * ```\n   */\n  addProducts(products: ActProductDraft[]): this {\n    if (!this.payload.products) {\n      this.payload.products = [];\n    }\n    this.payload.products.push(...products);\n    return this;\n  }\n\n  /**\n   * Set act flags (optional)\n   * \n   * @param flags - Act processing flags\n   * @returns Builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.flags({\n   *   hasVat: true,\n   *   hasExcise: false\n   * })\n   * ```\n   */\n  flags(flags: NonNullable<ActDraft['flags']>): this {\n    this.payload.flags = flags;\n    return this;\n  }\n\n  /**\n   * Build and transform to API payload\n   * \n   * Overrides BaseDocumentBuilder.build() to return API format instead of DX format.\n   * Validates required fields and transforms DX structure to Didox API JSON format.\n   * \n   * @returns API-compatible act payload ready for createDraft()\n   * @throws Error if required fields are missing\n   * \n   * @example\n   * ```typescript\n   * const apiPayload = builder.build();\n   * await client.documents.createDraft('005', apiPayload);\n   * ```\n   */\n  build(): any {\n    // Validate required fields\n    if (!this.payload.act) {\n      throw new Error('Act document information is required');\n    }\n    if (!this.payload.seller) {\n      throw new Error('Seller information is required');\n    }\n    if (!this.payload.buyer) {\n      throw new Error('Buyer information is required');\n    }\n    if (!this.payload.products || this.payload.products.length === 0) {\n      throw new Error('At least one product/service is required');\n    }\n\n    const flags = this.payload.flags || {};\n\n    // Transform DX structure to API structure\n    const apiPayload: ApiActPayload = {\n      ActDoc: {\n        ActNo: this.payload.act.no,\n        ActDate: this.payload.act.date,\n        ...(this.payload.act.text && { ActText: this.payload.act.text }),\n      },\n      SellerTin: this.payload.seller.tin,\n      ProductList: {\n        Tin: this.payload.seller.tin,\n        HasVat: flags.hasVat ?? false,\n        HasExcise: flags.hasExcise ?? false,\n        Products: this.payload.products.map((product, index) => {\n          const totalSumWithoutVat = product.count * product.price;\n          const vatRate = product.vatRate ?? 0;\n          const vatSum = flags.hasVat && vatRate > 0 ? (totalSumWithoutVat * vatRate) / 100 : 0;\n          const totalSum = totalSumWithoutVat + vatSum;\n\n          return {\n            OrdNo: index + 1,\n            CatalogCode: product.catalogCode,\n            CatalogName: product.catalogName,\n            Name: product.name,\n            MeasureId: null,\n            PackageCode: product.packageCode,\n            PackageName: product.packageName,\n            Count: product.count.toString(),\n            Summa: totalSum.toString(),\n            TotalSumWithoutVat: totalSumWithoutVat.toFixed(2),\n            VatRate: vatRate.toString(),\n            VatSum: vatSum.toFixed(2),\n            TotalSum: totalSum.toFixed(2),\n            WithoutVat: product.withoutVat ?? !flags.hasVat,\n            LgotaName: product.lgotaName ?? null,\n            LgotaType: product.lgotaType ?? null,\n          };\n        }),\n      },\n      SellerName: this.payload.seller.name,\n      SellerBranchCode: this.payload.seller.branchCode ?? '',\n      SellerBranchName: this.payload.seller.branchName ?? '',\n      BuyerTin: this.payload.buyer.tin,\n      BuyerName: this.payload.buyer.name,\n      BuyerBranchCode: this.payload.buyer.branchCode ?? '',\n      BuyerBranchName: this.payload.buyer.branchName ?? '',\n    };\n\n    // Add optional contract\n    if (this.payload.contract) {\n      apiPayload.ContractDoc = {\n        ContractNo: this.payload.contract.no,\n        ContractDate: this.payload.contract.date,\n      };\n    }\n\n    return apiPayload;\n  }\n\n  /**\n   * Get DX-friendly draft payload (for debugging/testing)\n   * \n   * @returns DX-friendly act draft\n   */\n  getDraft(): ActDraft {\n    return this.payload as ActDraft;\n  }\n}\n\n/**\n * Creates a new act document builder\n * \n * @returns Act builder instance ready for chaining\n * \n * @example\n * ```typescript\n * const act = builders.act()\n *   .act('ACT-001', '2025-02-07', 'Акт выполненных работ')\n *   .seller({ tin: '123456789', name: 'ООО Исполнитель' })\n *   .buyer({ tin: '987654321', name: 'ООО Заказчик' })\n *   .addProduct({ name: 'Услуга', count: 1, price: 100000, ... })\n *   .build();\n * \n * await client.documents.createDraft('005', act);\n * ```\n */\nexport const act: DocumentBuilderFactory<ActDraft> = () => new ActBuilder();\n\n// Export types separately to avoid conflicts\nexport type { ActDraft as ActDraftType };\nexport type { ActProductDraft as ActProductDraftType };\nexport type { ApiActPayload as ApiActPayloadType };","import { BaseDocumentBuilder, DocumentBuilderFactory } from './base/BaseDocumentBuilder.js';\n\n/**\n * Contract Document Builder (Stub)\n * \n * Builder for creating contract documents.\n * This is a placeholder implementation that will be expanded in future stages.\n */\nclass ContractBuilder extends BaseDocumentBuilder<any> {\n  // TODO: Add contract-specific methods\n}\n\n/**\n * Creates a new contract document builder\n * \n * @param initial - Optional initial contract data\n * @returns Contract builder instance\n */\nexport const contract: DocumentBuilderFactory<any> = (initial?) => \n  new ContractBuilder(initial);","/**\n * Empowerment Builder (Stage 3.2.9)\n * \n * Builder for creating empowerment documents (doctype 006 - Доверенность).\n * Provides DX-friendly fluent API with transformation to API-compliant payload.\n * \n * Key features:\n * - Three-party structure: Seller, Buyer, Agent\n * - NO prices, VAT, or sums (pure product list with quantities)\n * - Auto-increment OrdNo for products\n * - Optional contract reference\n * - Agent with passport information\n * \n * @module empowerment\n */\n\nimport { BaseDocumentBuilder } from './base/BaseDocumentBuilder.js';\nimport { DidoxValidationError } from '../../../http/errors.js';\n\n/**\n * DX-friendly interface for agent passport information\n */\nexport interface AgentPassportDraft {\n  /**\n   * Passport number (optional)\n   */\n  number?: string;\n  /**\n   * Passport issued by (optional)\n   */\n  issuedBy?: string;\n  /**\n   * Passport issue date in YYYY-MM-DD format (optional)\n   */\n  issueDate?: string;\n}\n\n/**\n * DX-friendly interface for agent information\n */\nexport interface AgentDraft {\n  /**\n   * Full name (ФИО)\n   */\n  fio: string;\n  /**\n   * PINFL (14-digit personal identification number)\n   */\n  pinfl: string;\n  /**\n   * Job title (optional)\n   */\n  jobTitle?: string;\n  /**\n   * Passport information (optional)\n   */\n  passport?: AgentPassportDraft;\n}\n\n/**\n * DX-friendly interface for seller/buyer company information\n */\nexport interface CompanyDraft {\n  /**\n   * TIN (ИНН)\n   */\n  tin: string;\n  /**\n   * Company name\n   */\n  name: string;\n  /**\n   * Bank account number\n   */\n  account: string;\n  /**\n   * Bank ID (MFO)\n   */\n  bankId: string;\n  /**\n   * Company address\n   */\n  address: string;\n  /**\n   * Director name (optional)\n   */\n  director?: string;\n  /**\n   * Accountant name (optional)\n   */\n  accountant?: string;\n  /**\n   * Branch code (optional)\n   */\n  branchCode?: string;\n  /**\n   * Branch name (optional)\n   */\n  branchName?: string;\n}\n\n/**\n * DX-friendly interface for product in empowerment\n */\nexport interface EmpowermentProductDraft {\n  /**\n   * Product name\n   */\n  name: string;\n  /**\n   * Catalog code (ИКПУ)\n   */\n  catalogCode: string;\n  /**\n   * Catalog name (optional, from ИКПУ classifier)\n   */\n  catalogName?: string;\n  /**\n   * Measure unit ID (e.g., \"1\" for pieces)\n   */\n  measureId: string;\n  /**\n   * Quantity\n   */\n  count: number;\n}\n\n/**\n * Complete DX-friendly draft structure for Empowerment\n */\nexport interface EmpowermentDraft {\n  /**\n   * Empowerment document information\n   */\n  empowerment: {\n    no: string;\n    issueDate: string;\n    expireDate: string;\n  };\n  /**\n   * Contract reference (optional)\n   */\n  contract?: {\n    no: string;\n    date: string;\n  };\n  /**\n   * Agent information (person receiving empowerment)\n   */\n  agent: AgentDraft;\n  /**\n   * Seller company information\n   */\n  seller: CompanyDraft;\n  /**\n   * Buyer company information\n   */\n  buyer: CompanyDraft;\n  /**\n   * List of products covered by empowerment\n   */\n  products: EmpowermentProductDraft[];\n}\n\n/**\n * API-compliant interface for empowerment payload\n * \n * This is the exact structure expected by Didox API for doctype 006.\n */\nexport interface ApiEmpowermentPayload {\n  EmpowermentDoc: {\n    EmpowermentNo: string;\n    EmpowermentDateOfIssue: string;\n    EmpowermentDateOfExpire: string;\n  };\n  ContractDoc: {\n    ContractNo: string;\n    ContractDate: string;\n  };\n  Agent: {\n    JobTitle: string | null;\n    Fio: string;\n    Passport: {\n      Number: string | null;\n      IssuedBy: string | null;\n      DateOfIssue: string | null;\n    };\n    AgentTin: string;\n  };\n  SellerTin: string;\n  Seller: {\n    Name: string;\n    Address: string;\n    BankAccount: string;\n    BankId: string;\n    Director: string;\n    Accountant: string;\n    BranchCode: string;\n    BranchName: string;\n  };\n  BuyerTin: string;\n  Buyer: {\n    Name: string;\n    Address: string;\n    BankAccount: string;\n    BankId: string;\n    Director: string;\n    Accountant: string;\n    BranchCode: string;\n    BranchName: string;\n  };\n  ProductList: {\n    Tin: string;\n    HasExcise: boolean;\n    HasVat: boolean;\n    Products: Array<{\n      OrdNo: number;\n      CatalogCode: string;\n      CatalogName: string;\n      Name: string;\n      MeasureId: string;\n      Count: string;\n    }>;\n  };\n}\n\n/**\n * Builder for creating Empowerment documents (doctype 006)\n *\n * The EmpowermentBuilder provides a DX-friendly fluent API for building\n * empowerment (power of attorney) documents. It supports three-party structure\n * (seller, buyer, agent) with product lists, but without any pricing or VAT information.\n *\n * Features:\n * - Fluent API for intuitive document building\n * - Three-party structure: Seller, Buyer, Agent\n * - Product list with auto-incrementing OrdNo\n * - No prices, VAT, or sum calculations\n * - Optional contract reference\n * - Agent passport information support\n * - DX-friendly draft format with API transformation\n * - Raw escape hatch for custom fields\n * - TypeScript type safety with exactOptionalPropertyTypes\n *\n * @extends BaseDocumentBuilder<ApiEmpowermentPayload>\n *\n * @example\n * ```typescript\n * // Basic empowerment\n * const empowerment = builders.empowerment()\n *   .empowerment('EMP-001', '2025-02-07', '2025-02-14')\n *   .agent({\n *     fio: 'MAMATQULOV SANJAR XAMZALI O\\'G\\'LI',\n *     pinfl: '50106026830029'\n *   })\n *   .seller({\n *     tin: '302936161',\n *     name: '\"VENKON GROUP\" MCHJ',\n *     account: '20208000400308125001',\n *     bankId: '00974',\n *     address: 'г. Ташкент, ул. Навои, 1'\n *   })\n *   .buyer({\n *     tin: '310529901',\n *     name: '\"DIDOX TECH\" MCHJ',\n *     account: '20208000905656222001',\n *     bankId: '00401',\n *     address: 'г. Ташкент, ул. Амира Темура, 15'\n *   })\n *   .addProduct({\n *     name: 'Ноутбук',\n *     catalogCode: '08471001001000000',\n *     measureId: '1',\n *     count: 10\n *   })\n *   .build();\n *\n * // With contract and passport details\n * const detailedEmpowerment = builders.empowerment()\n *   .empowerment('EMP-002', '2025-02-10', '2025-03-10')\n *   .contract('CNT-1', '2025-01-01')\n *   .agent({\n *     fio: 'ИВАНОВ ИВАН ИВАНОВИЧ',\n *     pinfl: '12345678901234',\n *     jobTitle: 'Менеджер по продажам',\n *     passport: {\n *       number: 'AC1234567',\n *       issuedBy: 'ОВД Мирзо-Улугбекского района',\n *       issueDate: '2020-05-15'\n *     }\n *   })\n *   .seller({\n *     tin: '123456789',\n *     name: 'ООО \"Поставщик\"',\n *     account: '20208000400000000001',\n *     bankId: '00401',\n *     address: 'Адрес поставщика',\n *     director: 'Директор Иванов И.И.',\n *     accountant: 'Бухгалтер Петрова П.П.',\n *     branchCode: 'BRANCH01',\n *     branchName: 'Центральный филиал'\n *   })\n *   .buyer({\n *     tin: '987654321',\n *     name: 'ООО \"Покупатель\"',\n *     account: '20208000400000000002',\n *     bankId: '00974',\n *     address: 'Адрес покупателя'\n *   })\n *   .addProducts([\n *     {\n *       name: 'Компьютер настольный',\n *       catalogCode: '08471001002000000',\n *       catalogName: 'Компьютеры персональные',\n *       measureId: '1',\n *       count: 5\n *     },\n *     {\n *       name: 'Монитор 24\"',\n *       catalogCode: '08471002001000000',\n *       measureId: '1',\n *       count: 5\n *     }\n *   ])\n *   .build();\n * ```\n */\nexport class EmpowermentBuilder extends BaseDocumentBuilder<ApiEmpowermentPayload> {\n  private draft: Partial<EmpowermentDraft> = {\n    products: []\n  };\n\n  /**\n   * Set empowerment document information (number and dates)\n   *\n   * @param no - Empowerment number\n   * @param issueDate - Issue date in YYYY-MM-DD format\n   * @param expireDate - Expiration date in YYYY-MM-DD format\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.empowerment('EMP-2025-001', '2025-02-07', '2025-02-14')\n   * ```\n   */\n  empowerment(no: string, issueDate: string, expireDate: string): this {\n    this.draft.empowerment = { no, issueDate, expireDate };\n    return this;\n  }\n\n  /**\n   * Set contract reference (optional)\n   *\n   * @param no - Contract number\n   * @param date - Contract date in YYYY-MM-DD format\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.contract('CNT-2025-089', '2025-01-15')\n   * ```\n   */\n  contract(no: string, date: string): this {\n    this.draft.contract = { no, date };\n    return this;\n  }\n\n  /**\n   * Set agent information (person receiving empowerment)\n   *\n   * @param agentInfo - Complete agent details\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * // Basic agent\n   * builder.agent({\n   *   fio: 'MAMATQULOV SANJAR XAMZALI O\\'G\\'LI',\n   *   pinfl: '50106026830029'\n   * })\n   *\n   * // Agent with full details\n   * builder.agent({\n   *   fio: 'ИВАНОВ ИВАН ИВАНОВИЧ',\n   *   pinfl: '12345678901234',\n   *   jobTitle: 'Менеджер по продажам',\n   *   passport: {\n   *     number: 'AC1234567',\n   *     issuedBy: 'ОВД Мирзо-Улугбекского района',\n   *     issueDate: '2020-05-15'\n   *   }\n   * })\n   * ```\n   */\n  agent(agentInfo: AgentDraft): this {\n    this.draft.agent = agentInfo;\n    return this;\n  }\n\n  /**\n   * Set seller company information\n   *\n   * @param sellerInfo - Complete seller details\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.seller({\n   *   tin: '302936161',\n   *   name: '\"VENKON GROUP\" MCHJ',\n   *   account: '20208000400308125001',\n   *   bankId: '00974',\n   *   address: 'г. Ташкент, ул. Навои, 1',\n   *   director: 'Директор Иванов И.И.',\n   *   accountant: 'Гл. бухгалтер Петрова П.П.',\n   *   branchCode: 'TSH01',\n   *   branchName: 'Ташкентский филиал'\n   * })\n   * ```\n   */\n  seller(sellerInfo: CompanyDraft): this {\n    this.draft.seller = sellerInfo;\n    return this;\n  }\n\n  /**\n   * Set buyer company information\n   *\n   * @param buyerInfo - Complete buyer details\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.buyer({\n   *   tin: '310529901',\n   *   name: '\"DIDOX TECH\" MCHJ',\n   *   account: '20208000905656222001',\n   *   bankId: '00401',\n   *   address: 'г. Ташкент, ул. Амира Темура, 15'\n   * })\n   * ```\n   */\n  buyer(buyerInfo: CompanyDraft): this {\n    this.draft.buyer = buyerInfo;\n    return this;\n  }\n\n  /**\n   * Add a single product to the empowerment\n   *\n   * Products are assigned auto-incrementing OrdNo starting from 1.\n   * Count is converted to string in the final API payload.\n   *\n   * @param product - Product details\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.addProduct({\n   *   name: 'Ноутбук Dell Latitude',\n   *   catalogCode: '08471001001000000',\n   *   catalogName: 'Компьютеры портативные',\n   *   measureId: '1',\n   *   count: 10\n   * })\n   * ```\n   */\n  addProduct(product: EmpowermentProductDraft): this {\n    if (!this.draft.products) {\n      this.draft.products = [];\n    }\n    this.draft.products.push(product);\n    return this;\n  }\n\n  /**\n   * Add multiple products to the empowerment\n   *\n   * Products are assigned auto-incrementing OrdNo in the order they are added.\n   *\n   * @param products - Array of product details\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.addProducts([\n   *   {\n   *     name: 'Компьютер настольный',\n   *     catalogCode: '08471001002000000',\n   *     catalogName: 'Компьютеры персональные',\n   *     measureId: '1',\n   *     count: 5\n   *   },\n   *   {\n   *     name: 'Монитор 24\"',\n   *     catalogCode: '08471002001000000',\n   *     measureId: '1',\n   *     count: 5\n   *   }\n   * ])\n   * ```\n   */\n  addProducts(products: EmpowermentProductDraft[]): this {\n    if (!this.draft.products) {\n      this.draft.products = [];\n    }\n    this.draft.products.push(...products);\n    return this;\n  }\n\n  /**\n   * Raw data merge (escape hatch)\n   *\n   * Allows merging arbitrary JSON data directly into the API payload.\n   * Useful for edge cases, advanced scenarios, or undocumented API fields.\n   * The data is deep-merged with the generated payload.\n   *\n   * @param data - Raw data to merge into the payload\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.raw({\n   *   CustomField: 'Custom Value',\n   *   EmpowermentDoc: {\n   *     AdditionalInfo: 'Some additional information'\n   *   }\n   * })\n   * ```\n   */\n  raw(data: Partial<ApiEmpowermentPayload & Record<string, any>>): this {\n    return super.raw(data);\n  }\n\n  /**\n   * Build the final API-compliant payload\n   *\n   * Transforms the DX-friendly draft into the API format expected by Didox.\n   * Performs validation and applies field transformations:\n   *\n   * - empowerment → EmpowermentDoc {EmpowermentNo, EmpowermentDateOfIssue, EmpowermentDateOfExpire}\n   * - contract → ContractDoc {ContractNo, ContractDate} (empty strings if not provided)\n   * - agent → Agent with JobTitle (null default), Passport fields (null defaults)\n   * - seller/buyer → Seller/Buyer with BranchCode/BranchName defaults (\"\")\n   * - products → ProductList with auto-increment OrdNo, count as string\n   * - HasExcise: false, HasVat: false (always)\n   *\n   * @returns Complete API payload ready for Didox submission\n   * @throws {DidoxValidationError} When required fields are missing or products list is empty\n   *\n   * @example\n   * ```typescript\n   * const payload = builder\n   *   .empowerment('EMP-001', '2025-02-07', '2025-02-14')\n   *   .agent({ fio: 'Agent Name', pinfl: '12345678901234' })\n   *   .seller({ tin: '123456789', name: 'Seller', account: '...', bankId: '...', address: '...' })\n   *   .buyer({ tin: '987654321', name: 'Buyer', account: '...', bankId: '...', address: '...' })\n   *   .addProduct({ name: 'Product', catalogCode: '...', measureId: '1', count: 10 })\n   *   .build();\n   *\n   * await client.documents.createDraft('006', payload);\n   * ```\n   */\n  build(): ApiEmpowermentPayload & Record<string, any> {\n    // Validation\n    if (!this.draft.empowerment) {\n      throw new DidoxValidationError('Empowerment information is required');\n    }\n\n    if (!this.draft.agent) {\n      throw new DidoxValidationError('Agent information is required');\n    }\n\n    if (!this.draft.seller) {\n      throw new DidoxValidationError('Seller information is required');\n    }\n\n    if (!this.draft.buyer) {\n      throw new DidoxValidationError('Buyer information is required');\n    }\n\n    if (!this.draft.products || this.draft.products.length === 0) {\n      throw new DidoxValidationError('At least one product is required');\n    }\n\n    // Transform contract (empty strings if not provided)\n    const contractDoc = this.draft.contract\n      ? {\n          ContractNo: this.draft.contract.no,\n          ContractDate: this.draft.contract.date\n        }\n      : {\n          ContractNo: '',\n          ContractDate: ''\n        };\n\n    // Transform agent passport (null defaults)\n    const agentPassport = {\n      Number: this.draft.agent.passport?.number || null,\n      IssuedBy: this.draft.agent.passport?.issuedBy || null,\n      DateOfIssue: this.draft.agent.passport?.issueDate || null\n    };\n\n    // Transform seller\n    const seller = {\n      Name: this.draft.seller.name,\n      Address: this.draft.seller.address,\n      BankAccount: this.draft.seller.account,\n      BankId: this.draft.seller.bankId,\n      Director: this.draft.seller.director || '',\n      Accountant: this.draft.seller.accountant || '',\n      BranchCode: this.draft.seller.branchCode || '',\n      BranchName: this.draft.seller.branchName || ''\n    };\n\n    // Transform buyer\n    const buyer = {\n      Name: this.draft.buyer.name,\n      Address: this.draft.buyer.address,\n      BankAccount: this.draft.buyer.account,\n      BankId: this.draft.buyer.bankId,\n      Director: this.draft.buyer.director || '',\n      Accountant: this.draft.buyer.accountant || '',\n      BranchCode: this.draft.buyer.branchCode || '',\n      BranchName: this.draft.buyer.branchName || ''\n    };\n\n    // Transform products with auto-increment OrdNo\n    const products = this.draft.products.map((product, index) => ({\n      OrdNo: index + 1,\n      CatalogCode: product.catalogCode,\n      CatalogName: product.catalogName || '',\n      Name: product.name,\n      MeasureId: product.measureId,\n      Count: String(product.count) // Convert to string\n    }));\n\n    // Build API payload\n    const apiPayload: ApiEmpowermentPayload = {\n      EmpowermentDoc: {\n        EmpowermentNo: this.draft.empowerment.no,\n        EmpowermentDateOfIssue: this.draft.empowerment.issueDate,\n        EmpowermentDateOfExpire: this.draft.empowerment.expireDate\n      },\n      ContractDoc: contractDoc,\n      Agent: {\n        JobTitle: this.draft.agent.jobTitle || null,\n        Fio: this.draft.agent.fio,\n        Passport: agentPassport,\n        AgentTin: this.draft.agent.pinfl\n      },\n      SellerTin: this.draft.seller.tin,\n      Seller: seller,\n      BuyerTin: this.draft.buyer.tin,\n      Buyer: buyer,\n      ProductList: {\n        Tin: this.draft.seller.tin, // ProductList.Tin = SellerTin\n        HasExcise: false,\n        HasVat: false,\n        Products: products\n      }\n    };\n\n    // Deep merge: first apply apiPayload, then merge with any raw() data\n    const basePayload = super.build(); // Get any raw() data applied earlier\n    return this.deepMerge(apiPayload, basePayload) as ApiEmpowermentPayload & Record<string, any>;\n  }\n\n  /**\n   * Deep merge helper for combining API payload with raw data\n   * \n   * @private\n   */\n  private deepMerge(target: any, source: any): any {\n    const result = { ...target };\n    \n    for (const key in source) {\n      if (source[key] instanceof Object && key in target && target[key] instanceof Object) {\n        result[key] = this.deepMerge(target[key], source[key]);\n      } else {\n        result[key] = source[key];\n      }\n    }\n    \n    return result;\n  }\n}\n\n/**\n * Factory function for creating a new EmpowermentBuilder instance\n *\n * @returns A new EmpowermentBuilder instance ready for method chaining\n *\n * @example\n * ```typescript\n * const empowerment = empowerment()\n *   .empowerment('EMP-001', '2025-02-07', '2025-02-14')\n *   .agent({ fio: 'Agent Name', pinfl: '12345678901234' })\n *   .seller({ tin: '123456789', name: 'Seller', ... })\n *   .buyer({ tin: '987654321', name: 'Buyer', ... })\n *   .addProduct({ name: 'Product', catalogCode: '...', measureId: '1', count: 10 })\n *   .build();\n * ```\n */\nexport function empowerment(): EmpowermentBuilder {\n  return new EmpowermentBuilder();\n}\n","import { BaseDocumentBuilder, DocumentBuilderFactory } from './base/BaseDocumentBuilder.js';\nimport { DidoxValidationError } from '../../../http/errors.js';\n\n/**\n * DX-friendly ArbitraryDocument Draft interface\n * \n * Developer-friendly structure for building arbitrary documents.\n * This gets transformed to Didox API JSON format in build().\n */\nexport interface ArbitraryDocumentDraft {\n  /** Document information */\n  document: {\n    /** Document number */\n    no: string;\n    /** Document date (YYYY-MM-DD format) */\n    date: string;\n    /** Optional document name/title */\n    name?: string;\n  };\n\n  /** Subtype of arbitrary document */\n  subtype: number;\n\n  /** Optional contract reference */\n  contract?: {\n    /** Contract number */\n    no: string;\n    /** Contract date (YYYY-MM-DD format) */\n    date: string;\n  };\n\n  /** Seller (document issuer) organization details */\n  seller: {\n    /** Tax Identification Number (exactly 9 or 14 digits) */\n    tin: string;\n    /** Company name */\n    name: string;\n    /** Company address */\n    address: string;\n    /** Optional branch code */\n    branchCode?: string;\n    /** Optional branch name */\n    branchName?: string;\n  };\n\n  /** Buyer (document recipient) organization details */\n  buyer: {\n    /** Tax Identification Number (exactly 9 or 14 digits) */\n    tin: string;\n    /** Company name */\n    name: string;\n    /** Company address */\n    address: string;\n    /** Optional branch code */\n    branchCode?: string;\n    /** Optional branch name */\n    branchName?: string;\n  };\n\n  /** PDF document in base64 format */\n  pdfBase64: string;\n}\n\n/**\n * API payload for Arbitrary Document (doctype 000)\n * \n * This interface represents the exact JSON structure required by the Didox API\n * for arbitrary documents. The builder's build() method transforms the DX-friendly\n * ArbitraryDocumentDraft into this format.\n */\nexport interface ApiArbitraryDocumentPayload {\n  /** Document data structure */\n  data: {\n    /** Document information */\n    Document: {\n      /** Document number */\n      DocumentNo: string;\n      /** Document date in YYYY-MM-DD format */\n      DocumentDate: string;\n      /** Document name/title */\n      DocumentName?: string;\n    };\n\n    /** Document subtype */\n    Subtype: number;\n\n    /** Optional contract information */\n    ContractDoc?: {\n      /** Contract number */\n      ContractNo: string;\n      /** Contract date in YYYY-MM-DD format */\n      ContractDate: string;\n    };\n\n    /** Seller TIN */\n    SellerTin: string;\n\n    /** Seller information */\n    Seller: {\n      /** Company name */\n      Name: string;\n      /** Branch code (empty string if not provided) */\n      BranchCode: string;\n      /** Branch name (empty string if not provided) */\n      BranchName: string;\n      /** Company address */\n      Address: string;\n    };\n\n    /** Buyer TIN */\n    BuyerTin: string;\n\n    /** Buyer information */\n    Buyer: {\n      /** Company name */\n      Name: string;\n      /** Branch code (empty string if not provided) */\n      BranchCode: string;\n      /** Branch name (empty string if not provided) */\n      BranchName: string;\n      /** Company address */\n      Address: string;\n    };\n  };\n\n  /** PDF document in base64 data URL format */\n  document: string;\n}\n\n/**\n * DX-friendly builder for Arbitrary Documents (doctype 000)\n * \n * Provides a fluent API for creating arbitrary PDF documents in Didox.\n * These are arbitrary PDF documents (≤ 10 MB) for internal EDO use\n * that don't sync with roaming or other operators.\n * \n * @example\n * ```typescript\n * const doc = builders.arbitrary()\n *   .document('DOC-001', '2025-02-07', 'Коммерческое письмо')\n *   .subtype(6) // \"Другое\"\n *   .contract('CNT-1', '2025-01-01') // optional\n *   .seller({\n *     tin: '310529901',\n *     name: '\"DIDOX TECH\" MCHJ',\n *     address: 'г. Ташкент, ...'\n *   })\n *   .buyer({\n *     tin: '302936161',\n *     name: '\"VENKON GROUP\" MCHJ',\n *     address: 'г. Ташкент, ...'\n *   })\n *   .pdf(base64PdfString)\n *   .build();\n * ```\n */\nexport class ArbitraryDocumentBuilder extends BaseDocumentBuilder<ApiArbitraryDocumentPayload> {\n  /**\n   * Internal DX-friendly payload for development\n   * \n   * @private\n   */\n  private dxPayload: Partial<ArbitraryDocumentDraft> = {};\n\n  /**\n   * Set document information\n   * \n   * @param no - Document number (required)\n   * @param date - Document date in YYYY-MM-DD format (required)\n   * @param name - Optional document name/title\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.document('DOC-001', '2025-02-07', 'Коммерческое письмо');\n   * ```\n   */\n  public document(no: string, date: string, name?: string): this {\n    this.dxPayload.document = { \n      no, \n      date, \n      ...(name !== undefined && { name })\n    };\n    return this;\n  }\n\n  /**\n   * Set document subtype\n   * \n   * @param value - Document subtype number\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.subtype(6); // \"Другое\"\n   * ```\n   */\n  public subtype(value: number): this {\n    this.dxPayload.subtype = value;\n    return this;\n  }\n\n  /**\n   * Set optional contract information\n   * \n   * @param no - Contract number\n   * @param date - Contract date in YYYY-MM-DD format\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.contract('CNT-001', '2025-01-01');\n   * ```\n   */\n  public contract(no: string, date: string): this {\n    this.dxPayload.contract = { no, date };\n    return this;\n  }\n\n  /**\n   * Set seller (document issuer) organization information\n   * \n   * @param data - Seller organization data\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.seller({\n   *   tin: '310529901',\n   *   name: '\"DIDOX TECH\" MCHJ',\n   *   address: 'г. Ташкент, ул. Амира Темура, 15',\n   *   branchCode: 'MAIN', // optional\n   *   branchName: 'Головной офис' // optional\n   * });\n   * ```\n   */\n  public seller(data: ArbitraryDocumentDraft['seller']): this {\n    this.dxPayload.seller = data;\n    return this;\n  }\n\n  /**\n   * Set buyer (document recipient) organization information\n   * \n   * @param data - Buyer organization data\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.buyer({\n   *   tin: '302936161',\n   *   name: '\"VENKON GROUP\" MCHJ',\n   *   address: 'г. Ташкент, Мирзо-Улугбекский район, ул. Университетская, 4'\n   * });\n   * ```\n   */\n  public buyer(data: ArbitraryDocumentDraft['buyer']): this {\n    this.dxPayload.buyer = data;\n    return this;\n  }\n\n  /**\n   * Set PDF document content\n   * \n   * @param base64 - PDF document encoded as base64 string\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * const pdfBuffer = fs.readFileSync('document.pdf');\n   * const base64String = pdfBuffer.toString('base64');\n   * builder.pdf(base64String);\n   * ```\n   */\n  public pdf(base64: string): this {\n    this.dxPayload.pdfBase64 = base64;\n    return this;\n  }\n\n  /**\n   * Build the final API payload\n   * \n   * Transforms the DX-friendly draft into the exact JSON structure\n   * required by the Didox API for arbitrary documents (doctype 000).\n   * \n   * @returns Complete API payload ready for createDraft()\n   * @throws {DidoxValidationError} When required fields are missing\n   * \n   * @example\n   * ```typescript\n   * const doc = builder\n   *   .document('DOC-001', '2025-02-07')\n   *   .subtype(6)\n   *   .seller({ tin: '310529901', name: 'Company', address: 'Address' })\n   *   .buyer({ tin: '302936161', name: 'Buyer', address: 'Address' })\n   *   .pdf(base64String)\n   *   .build();\n   * \n   * // Use with createDraft API\n   * const result = await didox.documents.createDraft('000', doc);\n   * ```\n   */\n  public build(): ApiArbitraryDocumentPayload {\n    // Validate required fields\n    this.validateRequiredFields();\n\n    const payload: ApiArbitraryDocumentPayload = {\n      data: {\n        Document: {\n          DocumentNo: this.dxPayload.document!.no,\n          DocumentDate: this.dxPayload.document!.date,\n        },\n        Subtype: this.dxPayload.subtype!,\n        SellerTin: this.dxPayload.seller!.tin,\n        Seller: {\n          Name: this.dxPayload.seller!.name,\n          BranchCode: this.dxPayload.seller!.branchCode || '',\n          BranchName: this.dxPayload.seller!.branchName || '',\n          Address: this.dxPayload.seller!.address,\n        },\n        BuyerTin: this.dxPayload.buyer!.tin,\n        Buyer: {\n          Name: this.dxPayload.buyer!.name,\n          BranchCode: this.dxPayload.buyer!.branchCode || '',\n          BranchName: this.dxPayload.buyer!.branchName || '',\n          Address: this.dxPayload.buyer!.address,\n        },\n      },\n      document: `data:application/pdf;base64,${this.dxPayload.pdfBase64}`,\n    };\n\n    // Add optional document name\n    if (this.dxPayload.document!.name) {\n      payload.data.Document.DocumentName = this.dxPayload.document!.name;\n    }\n\n    // Add optional contract information\n    if (this.dxPayload.contract) {\n      payload.data.ContractDoc = {\n        ContractNo: this.dxPayload.contract.no,\n        ContractDate: this.dxPayload.contract.date,\n      };\n    }\n\n    // Merge any raw data (escape hatch)\n    return this.mergeRawData(payload);\n  }\n\n  /**\n   * Validate required fields\n   * \n   * @private\n   * @throws {DidoxValidationError} When validation fails\n   */\n  private validateRequiredFields(): void {\n    if (!this.dxPayload.document?.no) {\n      throw new DidoxValidationError('Document number is required', 'document.no');\n    }\n\n    if (!this.dxPayload.document?.date) {\n      throw new DidoxValidationError('Document date is required', 'document.date');\n    }\n\n    if (this.dxPayload.subtype === undefined) {\n      throw new DidoxValidationError('Subtype is required', 'subtype');\n    }\n\n    if (!this.dxPayload.seller?.tin) {\n      throw new DidoxValidationError('Seller TIN is required', 'seller.tin');\n    }\n\n    if (!this.dxPayload.buyer?.tin) {\n      throw new DidoxValidationError('Buyer TIN is required', 'buyer.tin');\n    }\n\n    if (!this.dxPayload.pdfBase64) {\n      throw new DidoxValidationError('PDF base64 data is required', 'pdfBase64');\n    }\n  }\n\n  /**\n   * Merge raw data with the built payload (escape hatch)\n   * \n   * @private\n   * @param payload - The built payload\n   * @returns Payload with raw data merged\n   */\n  private mergeRawData(payload: ApiArbitraryDocumentPayload): ApiArbitraryDocumentPayload {\n    if (Object.keys(this.payload).length > 0) {\n      // Deep merge raw data into payload\n      return {\n        ...payload,\n        ...this.payload,\n        data: {\n          ...payload.data,\n          ...(this.payload as any).data,\n        },\n      };\n    }\n    return payload;\n  }\n}\n\n/**\n * Creates a new arbitrary document builder\n * \n * @param initial - Optional initial arbitrary document data\n * @returns Arbitrary document builder instance\n * \n * @example\n * ```typescript\n * // Start with empty builder\n * const doc = builders.arbitrary()\n *   .document('DOC-001', '2025-02-07')\n *   .subtype(6)\n *   .seller({ tin: '123456789', name: 'Company', address: 'Address' })\n *   .buyer({ tin: '987654321', name: 'Buyer', address: 'Address' })\n *   .pdf(base64String)\n *   .build();\n * \n * // Start with initial data\n * const doc = builders.arbitrary({\n *   data: {\n *     Document: {\n *       DocumentNo: 'EXISTING-DOC',\n *       DocumentDate: '2025-02-07'\n *     },\n *     Subtype: 1\n *   }\n * })\n *   .seller({ tin: '123456789', name: 'Company', address: 'Address' })\n *   .build();\n * ```\n */\nexport const arbitrary: DocumentBuilderFactory<ApiArbitraryDocumentPayload> = (initial?) => \n  new ArbitraryDocumentBuilder(initial);","import { BaseDocumentBuilder, DocumentBuilderFactory } from './base/BaseDocumentBuilder.js';\n\n/**\n * Verification Act Document Builder (Stub)\n * \n * Builder for creating verification act documents.\n * This is a placeholder implementation that will be expanded in future stages.\n */\nclass VerificationActBuilder extends BaseDocumentBuilder<any> {\n  // TODO: Add verification act methods\n}\n\n/**\n * Creates a new verification act document builder\n * \n * @param initial - Optional initial verification act data\n * @returns Verification act builder instance\n */\nexport const verificationAct: DocumentBuilderFactory<any> = (initial?) => \n  new VerificationActBuilder(initial);","import { BaseDocumentBuilder, DocumentBuilderFactory } from './base/BaseDocumentBuilder.js';\n\n/**\n * Acceptance Transfer Document Builder (Stub)\n * \n * Builder for creating acceptance transfer documents.\n * This is a placeholder implementation that will be expanded in future stages.\n */\nclass AcceptanceTransferBuilder extends BaseDocumentBuilder<any> {\n  // TODO: Add acceptance transfer methods\n}\n\n/**\n * Creates a new acceptance transfer document builder\n * \n * @param initial - Optional initial acceptance transfer data\n * @returns Acceptance transfer builder instance\n */\nexport const acceptanceTransfer: DocumentBuilderFactory<any> = (initial?) => \n  new AcceptanceTransferBuilder(initial);","/**\n * @fileoverview FoundersProtocolBuilder for doctype 075 — Протокол собрания учредителей\n *\n * Provides a DX-friendly fluent API for building founders' meeting protocol documents.\n * Supports complex multi-participant scenarios with agenda items and comprehensive\n * company information management.\n *\n * @example Basic usage\n * ```typescript\n * const protocol = builders.foundersProtocol()\n *   .document('Протокол №1', '001', 'Ташкент', '2025-02-07')\n *   .company({\n *     tin: '123456789',\n *     name: '\"DIDOX TECH\" MCHJ',\n *     fizTin: '12345678901234',\n *     fio: 'Иванов Иван Иванович',\n *     address: 'г. Ташкент, ул. Амира Темура, 15'\n *   })\n *   .addParticipant({\n *     tin: '987654321',\n *     name: 'Петров Петр Петрович', \n *     share: 51,\n *     chairman: true\n *   })\n *   .addParticipant({\n *     tin: '111222333',\n *     name: 'Сидоров Сидор Сидорович',\n *     share: 49,\n *     secretary: true\n *   })\n *   .addPart('О создании общества', 'Принято единогласно создать ООО')\n *   .addPart('Об избрании руководства', 'Избран директор и секретарь')\n *   .build();\n * ```\n *\n * @example With company details\n * ```typescript\n * const detailedProtocol = builders.foundersProtocol()\n *   .document('Протокол собрания учредителей', 'PROT-2025-001', 'Ташкент', '2025-02-07')\n *   .company({\n *     tin: '310529901',\n *     name: '\"VENKON GROUP\" MCHJ',\n *     fizTin: '12345678901234',\n *     fio: 'Директор Иванов И.И.',\n *     bankId: 'NBU01',\n *     oked: 62010,\n *     account: '20208000400000000001',\n *     address: 'г. Ташкент, ул. Университетская, 4',\n *     workPhone: '+998711234567',\n *     mobile: '+998901234567'\n *   })\n *   .addParticipants([\n *     {\n *       tin: '123456789',\n *       name: 'Учредитель 1',\n *       companyTin: '987654321',\n *       companyName: 'Компания-учредитель',\n *       share: '60%',\n *       citizenship: 'UZ',\n *       chairman: true\n *     },\n *     {\n *       tin: '987654321',\n *       name: 'Учредитель 2', \n *       share: '40%',\n *       secretary: true\n *     }\n *   ])\n *   .addParts([\n *     { title: 'Вопрос 1', body: 'Принятие устава' },\n *     { title: 'Вопрос 2', body: 'Выбор руководства' },\n *     { title: 'Вопрос 3', body: 'Определение уставного капитала' }\n *   ])\n *   .raw({\n *     meetingType: 'FOUNDATION',\n *     duration: '2_HOURS'\n *   })\n *   .build();\n * ```\n *\n * @since 3.2.7\n */\n\nimport { BaseDocumentBuilder } from './base/BaseDocumentBuilder.js';\nimport { DidoxValidationError } from '../../../http/errors.js';\n\n/**\n * DX-friendly interface for founders protocol document draft\n */\nexport interface FoundersProtocolDraft {\n  /**\n   * Document metadata\n   */\n  document: {\n    /** Document name/title */\n    name: string;\n    /** Document number */\n    no: string;\n    /** Meeting place */\n    place: string;\n    /** Document date (YYYY-MM-DD format) */\n    date: string;\n  };\n\n  /**\n   * Company information for the protocol\n   */\n  company: {\n    /** Company TIN */\n    tin: string;\n    /** Company name */\n    name: string;\n    /** Physical person TIN (for individual) */\n    fizTin: string;\n    /** Full name of the representative */\n    fio: string;\n    /** Bank ID (optional) */\n    bankId?: string;\n    /** OKED classification code (optional) */\n    oked?: number;\n    /** Bank account number (optional) */\n    account?: string;\n    /** Company address */\n    address: string;\n    /** Work phone (optional) */\n    workPhone?: string;\n    /** Mobile phone (optional) */\n    mobile?: string;\n  };\n\n  /**\n   * Protocol participants/founders\n   */\n  participants: ProtocolParticipantDraft[];\n\n  /**\n   * Protocol agenda items/parts\n   */\n  parts: ProtocolPartDraft[];\n}\n\n/**\n * DX-friendly interface for protocol participant\n */\nexport interface ProtocolParticipantDraft {\n  /** Participant TIN */\n  tin: string;\n  /** Participant name */\n  name: string;\n  /** Company TIN if participant represents a company (optional) */\n  companyTin?: string;\n  /** Company name if participant represents a company (optional) */\n  companyName?: string;\n  /** Share percentage or amount */\n  share: number | string;\n  /** Citizenship (optional) */\n  citizenship?: string;\n  /** Whether this participant is chairman (optional) */\n  chairman?: boolean;\n  /** Whether this participant is secretary (optional) */\n  secretary?: boolean;\n}\n\n/**\n * DX-friendly interface for protocol agenda part\n */\nexport interface ProtocolPartDraft {\n  /** Part title */\n  title: string;\n  /** Part body/content */\n  body: string;\n}\n\n/**\n * API-compliant interface for founders protocol payload\n */\nexport interface ApiFoundersProtocolPayload {\n  documentdoc: {\n    documentname: string;\n    documentno: string;\n    documentplace: string;\n    documentdate: string;\n  };\n  company: {\n    tin: string;\n    name: string;\n    fiztin: string;\n    fio: string;\n    bankid: string;\n    oked: number;\n    account: string;\n    address: string;\n    workphone: string;\n    mobile: string;\n  };\n  participants: Array<{\n    tin: string;\n    name: string;\n    companyTaxId: string;\n    companyname: string;\n    share: string;\n    citizenship: string;\n    ischairman: boolean;\n    issecretary: boolean;\n  }>;\n  parts: Array<{\n    ordno: number;\n    title: string;\n    body: string;\n  }>;\n}\n\n/**\n * Builder for creating Founders Protocol documents (doctype 075)\n *\n * The FoundersProtocolBuilder provides a DX-friendly fluent API for building\n * founders' meeting protocol documents. It supports complex scenarios with\n * multiple participants, detailed company information, and structured agenda items.\n *\n * Features:\n * - Fluent API for intuitive document building\n * - Multi-participant support with roles (chairman, secretary)\n * - Comprehensive company information handling\n * - Structured agenda items with automatic ordering\n * - DX-friendly draft format with API transformation\n * - Raw escape hatch for custom fields\n * - TypeScript type safety with exactOptionalPropertyTypes\n *\n * @extends BaseDocumentBuilder<ApiFoundersProtocolPayload>\n *\n * @example\n * ```typescript\n * const protocol = builders.foundersProtocol()\n *   .document('Протокол №1', '001', 'Ташкент', '2025-02-07')\n *   .company({\n *     tin: '123456789',\n *     name: '\"DIDOX TECH\" MCHJ',\n *     fizTin: '12345678901234',\n *     fio: 'Иванов Иван Иванович',\n *     address: 'г. Ташкент, ул. Амира Темура, 15'\n *   })\n *   .addParticipant({\n *     tin: '987654321',\n *     name: 'Петров Петр Петрович',\n *     share: 51,\n *     chairman: true\n *   })\n *   .addPart('Вопрос 1', 'Принято решение')\n *   .build();\n * ```\n */\nexport class FoundersProtocolBuilder extends BaseDocumentBuilder<ApiFoundersProtocolPayload> {\n  private draft: Partial<FoundersProtocolDraft> = {\n    participants: [],\n    parts: []\n  };\n\n  /**\n   * Set document metadata for the founders protocol\n   *\n   * @param name - Document name/title\n   * @param no - Document number\n   * @param place - Meeting place\n   * @param date - Document date in YYYY-MM-DD format\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.document('Протокол собрания учредителей', 'PROT-001', 'Ташкент', '2025-02-07')\n   * ```\n   */\n  document(name: string, no: string, place: string, date: string): this {\n    this.draft.document = { name, no, place, date };\n    return this;\n  }\n\n  /**\n   * Set company information for the protocol\n   *\n   * @param companyInfo - Company details\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.company({\n   *   tin: '310529901',\n   *   name: '\"DIDOX TECH\" MCHJ',\n   *   fizTin: '12345678901234',\n   *   fio: 'Директор Иванов И.И.',\n   *   address: 'г. Ташкент, ул. Амира Темура, 15',\n   *   bankId: 'NBU01',\n   *   oked: 62010\n   * })\n   * ```\n   */\n  company(companyInfo: FoundersProtocolDraft['company']): this {\n    this.draft.company = companyInfo;\n    return this;\n  }\n\n  /**\n   * Add a single participant to the protocol\n   *\n   * @param participant - Participant information\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.addParticipant({\n   *   tin: '123456789',\n   *   name: 'Иванов Иван Иванович',\n   *   share: 51,\n   *   chairman: true,\n   *   citizenship: 'UZ'\n   * })\n   * ```\n   */\n  addParticipant(participant: ProtocolParticipantDraft): this {\n    if (!this.draft.participants) {\n      this.draft.participants = [];\n    }\n    this.draft.participants.push(participant);\n    return this;\n  }\n\n  /**\n   * Add multiple participants to the protocol at once\n   *\n   * @param participants - Array of participants to add\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.addParticipants([\n   *   {\n   *     tin: '123456789',\n   *     name: 'Учредитель 1',\n   *     share: '60%',\n   *     chairman: true\n   *   },\n   *   {\n   *     tin: '987654321',\n   *     name: 'Учредитель 2',\n   *     share: '40%',\n   *     secretary: true\n   *   }\n   * ])\n   * ```\n   */\n  addParticipants(participants: ProtocolParticipantDraft[]): this {\n    if (!this.draft.participants) {\n      this.draft.participants = [];\n    }\n    this.draft.participants.push(...participants);\n    return this;\n  }\n\n  /**\n   * Add a single agenda item/part to the protocol\n   *\n   * @param title - Part title\n   * @param body - Part content/body\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.addPart('О создании общества', 'Принято единогласно создать ООО с уставным капиталом...')\n   * ```\n   */\n  addPart(title: string, body: string): this {\n    if (!this.draft.parts) {\n      this.draft.parts = [];\n    }\n    this.draft.parts.push({ title, body });\n    return this;\n  }\n\n  /**\n   * Add multiple agenda items/parts to the protocol at once\n   *\n   * @param parts - Array of parts to add\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.addParts([\n   *   { title: 'Вопрос 1', body: 'Принятие устава' },\n   *   { title: 'Вопрос 2', body: 'Выбор руководства' },\n   *   { title: 'Вопрос 3', body: 'Определение капитала' }\n   * ])\n   * ```\n   */\n  addParts(parts: ProtocolPartDraft[]): this {\n    if (!this.draft.parts) {\n      this.draft.parts = [];\n    }\n    this.draft.parts.push(...parts);\n    return this;\n  }\n\n  /**\n   * Override with raw API payload data (escape hatch)\n   *\n   * Allows direct modification of the final API payload for advanced scenarios\n   * or custom fields not covered by the standard API. The data is deep-merged\n   * with the generated payload, allowing fine-grained control.\n   *\n   * @param data - Raw data to merge into the payload\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.raw({\n   *   meetingType: 'FOUNDATION',\n   *   duration: '2_HOURS',\n   *   customField: 'custom value',\n   *   company: {\n   *     oked: 62020  // Override specific company field\n   *   }\n   * })\n   * ```\n   */\n  raw(data: Partial<ApiFoundersProtocolPayload & Record<string, any>>): this {\n    return super.raw(data);\n  }\n\n  /**\n   * Build the final API-compliant payload\n   *\n   * Transforms the DX-friendly draft into the API format expected by Didox.\n   * Performs validation and applies field transformations:\n   *\n   * - chairman → ischairman\n   * - secretary → issecretary\n   * - share → string conversion\n   * - ordno → auto-increment from 1\n   * - Optional fields → empty strings if missing\n   * - oked → number type\n   * - Removes undefined values\n   *\n   * @returns Complete API payload ready for Didox submission\n   * @throws {DidoxValidationError} When required fields are missing\n   *\n   * @example\n   * ```typescript\n   * const payload = builder\n   *   .document('Протокол №1', '001', 'Ташкент', '2025-02-07')\n   *   .company({ ... })\n   *   .addParticipant({ ... })\n   *   .addPart('Вопрос 1', 'Содержание')\n   *   .build();\n   *\n   * // Returns API-compliant structure ready for createDraft()\n   * ```\n   */\n  build(): ApiFoundersProtocolPayload & Record<string, any> {\n    // Validation\n    if (!this.draft.document) {\n      throw new DidoxValidationError('Document information is required');\n    }\n\n    if (!this.draft.company) {\n      throw new DidoxValidationError('Company information is required');\n    }\n\n    if (!this.draft.participants || this.draft.participants.length === 0) {\n      throw new DidoxValidationError('At least one participant is required');\n    }\n\n    if (!this.draft.parts || this.draft.parts.length === 0) {\n      throw new DidoxValidationError('At least one agenda part is required');\n    }\n\n    // Build API payload and assign to parent's payload\n    const apiPayload: ApiFoundersProtocolPayload = {\n      documentdoc: {\n        documentname: this.draft.document.name,\n        documentno: this.draft.document.no,\n        documentplace: this.draft.document.place,\n        documentdate: this.draft.document.date\n      },\n      company: {\n        tin: this.draft.company.tin,\n        name: this.draft.company.name,\n        fiztin: this.draft.company.fizTin,\n        fio: this.draft.company.fio,\n        bankid: this.draft.company.bankId || '',\n        oked: this.draft.company.oked || 0,\n        account: this.draft.company.account || '',\n        address: this.draft.company.address,\n        workphone: this.draft.company.workPhone || '',\n        mobile: this.draft.company.mobile || ''\n      },\n      participants: this.draft.participants.map(participant => ({\n        tin: participant.tin,\n        name: participant.name,\n        companyTaxId: participant.companyTin || '',\n        companyname: participant.companyName || '',\n        share: String(participant.share),\n        citizenship: participant.citizenship || '',\n        ischairman: participant.chairman || false,\n        issecretary: participant.secretary || false\n      })),\n      parts: this.draft.parts.map((part, index) => ({\n        ordno: index + 1,\n        title: part.title,\n        body: part.body\n      }))\n    };\n\n    // Assign to parent payload for raw() support\n    Object.assign(this.payload, apiPayload);\n    \n    // Return with raw data applied\n    return super.build() as ApiFoundersProtocolPayload & Record<string, any>;\n  }\n}\n\n/**\n * Factory function for creating a new FoundersProtocolBuilder instance\n *\n * @returns A new FoundersProtocolBuilder instance ready for method chaining\n *\n * @example\n * ```typescript\n * const protocol = foundersProtocol()\n *   .document('Протокол №1', '001', 'Ташкент', '2025-02-07')\n *   .company({ ... })\n *   .addParticipant({ ... })\n *   .addPart('Вопрос', 'Содержание')\n *   .build();\n * ```\n */\nexport function foundersProtocol(): FoundersProtocolBuilder {\n  return new FoundersProtocolBuilder();\n}","/**\n * Letter NK Builder (Stage 3.2.8)\n * \n * Builder for creating letters to tax committee (doctype 013 - Письмо НК).\n * Provides DX-friendly fluent API with transformation to API-compliant payload.\n * \n * @module letter-nk\n */\n\nimport { BaseDocumentBuilder } from './base/BaseDocumentBuilder.js';\nimport { DidoxValidationError } from '../../../http/errors.js';\n\n/**\n * DX-friendly interface for letter head information (optional)\n */\nexport interface LetterHeadDraft {\n  /**\n   * Branch code (optional)\n   */\n  branchCode?: string;\n  /**\n   * Branch name (optional)\n   */\n  branchName?: string;\n  /**\n   * Email address (optional)\n   */\n  email?: string;\n  /**\n   * Website URL (optional, null in API if not provided)\n   */\n  website?: string;\n  /**\n   * Logo as base64-encoded string (optional)\n   */\n  logoBase64?: string;\n  /**\n   * Phone numbers array (optional)\n   */\n  phones?: string[];\n}\n\n/**\n * DX-friendly interface for sender information\n */\nexport interface LetterSenderDraft {\n  /**\n   * Company or person name\n   */\n  name: string;\n  /**\n   * TIN (БИН/ИИН)\n   */\n  tin: string;\n  /**\n   * Optional head information (branch, email, website, logo, phones)\n   */\n  head?: LetterHeadDraft;\n}\n\n/**\n * DX-friendly interface for recipient information\n */\nexport interface LetterRecipientDraft {\n  /**\n   * Company or person name\n   */\n  name: string;\n  /**\n   * TIN (БИН/ИИН)\n   */\n  tin: string;\n  /**\n   * Optional head information (branch, email, website, logo, phones)\n   */\n  head?: LetterHeadDraft;\n}\n\n/**\n * DX-friendly interface for attachment\n */\nexport interface LetterAttachmentDraft {\n  /**\n   * Filename with extension\n   */\n  filename: string;\n  /**\n   * MIME type (e.g., \"application/pdf\")\n   */\n  mimeType: string;\n  /**\n   * File size in bytes\n   */\n  size: number;\n  /**\n   * Base64-encoded file content\n   */\n  base64: string;\n  /**\n   * Optional description of the attachment\n   */\n  description?: string;\n}\n\n/**\n * Complete DX-friendly draft structure for Letter NK\n */\nexport interface LetterNKDraft {\n  /**\n   * Letter information (number and date)\n   */\n  letter: {\n    number: string;\n    date: string;\n  };\n  /**\n   * Sender information\n   */\n  sender: LetterSenderDraft;\n  /**\n   * Recipient information\n   */\n  recipient: LetterRecipientDraft;\n  /**\n   * HTML content of the letter\n   */\n  html: string;\n  /**\n   * Letter attachments (optional)\n   */\n  attachments?: LetterAttachmentDraft[];\n}\n\n/**\n * API-compliant interface for letter NK payload\n * \n * This is the exact structure expected by Didox API for doctype 013.\n * Field transformations:\n * - letter → Letter {Number, Date}\n * - sender/recipient → Sender/Recipient {Name, Tin, Head}\n * - head optional fields → empty strings or null (Website)\n * - html → Html\n * - attachments → Attachments with ContentBase64\n */\nexport interface ApiLetterNKPayload {\n  Letter: {\n    Number: string;\n    Date: string;\n  };\n  Sender: {\n    Name: string;\n    Tin: string;\n    Head: {\n      BranchCode: string;\n      BranchName: string;\n      Email: string;\n      Website: string | null;\n      LogoBase64: string;\n      Phones: string[];\n    };\n  };\n  Recipient: {\n    Name: string;\n    Tin: string;\n    Head: {\n      BranchCode: string;\n      BranchName: string;\n      Email: string;\n      Website: string | null;\n      LogoBase64: string;\n      Phones: string[];\n    };\n  };\n  Html: string;\n  Attachments: Array<{\n    Filename: string;\n    MimeType: string;\n    Size: number;\n    ContentBase64: string;\n    Description: string;\n  }>;\n}\n\n/**\n * Builder for creating Letter NK documents (doctype 013)\n *\n * The LetterNKBuilder provides a DX-friendly fluent API for building\n * letters to tax committee documents. It supports comprehensive sender/recipient\n * information, HTML content, and file attachments.\n *\n * Features:\n * - Fluent API for intuitive document building\n * - Comprehensive sender and recipient information with optional head fields\n * - HTML content support without sanitization\n * - File attachment management with base64 encoding\n * - DX-friendly draft format with API transformation\n * - Raw escape hatch for custom fields\n * - TypeScript type safety with exactOptionalPropertyTypes\n *\n * @extends BaseDocumentBuilder<ApiLetterNKPayload>\n *\n * @example\n * ```typescript\n * // Basic letter\n * const letter = builders.letterNK()\n *   .letter({\n *     number: 'ИСХ-145/2024',\n *     date: '2024-12-15'\n *   })\n *   .sender({\n *     name: 'ТОО \"ТехноСнаб Казахстан\"',\n *     tin: '123456789012'\n *   })\n *   .recipient({\n *     name: 'Департамент Налогового Комитета МФ РК по г. Алматы',\n *     tin: '999888777666'\n *   })\n *   .html('<p>Уважаемые господа, прошу разъяснить вопрос...</p>')\n *   .build();\n *\n * // Detailed sender with head information\n * const detailedLetter = builders.letterNK()\n *   .letter({ number: 'ИСХ-146/2024', date: '2024-12-16' })\n *   .sender({\n *     name: 'ТОО \"Производство+\"',\n *     tin: '111222333444',\n *     head: {\n *       branchCode: 'ALM01',\n *       branchName: 'Алматинский филиал',\n *       email: 'info@production.kz',\n *       website: 'https://production.kz',\n *       logoBase64: 'iVBORw0KGgoAAAANSUhEUgAAAAUA...',\n *       phones: ['+7 727 123 45 67', '+7 701 234 56 78']\n *     }\n *   })\n *   .recipient({\n *     name: 'НК РК',\n *     tin: '999888777666'\n *   })\n *   .html('<p>Detailed content</p>')\n *   .addAttachment({\n *     filename: 'balance.pdf',\n *     mimeType: 'application/pdf',\n *     size: 102400,\n *     base64: 'JVBERi0xLjQK...',\n *     description: 'Бухгалтерский баланс за 2024 год'\n *   })\n *   .build();\n * ```\n */\nexport class LetterNKBuilder extends BaseDocumentBuilder<ApiLetterNKPayload> {\n  private draft: Partial<LetterNKDraft> = {};\n\n  /**\n   * Set letter information (number and date)\n   *\n   * @param letterInfo - Letter metadata\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.letter({\n   *   number: 'ИСХ-145/2024',\n   *   date: '2024-12-15'\n   * })\n   * ```\n   */\n  letter(letterInfo: { number: string; date: string }): this {\n    this.draft.letter = letterInfo;\n    return this;\n  }\n\n  /**\n   * Set sender information\n   *\n   * @param senderInfo - Complete sender details\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.sender({\n   *   name: 'ТОО \"ТехноСнаб Казахстан\"',\n   *   tin: '123456789012',\n   *   head: {\n   *     branchCode: 'ALM01',\n   *     branchName: 'Головной офис',\n   *     email: 'office@technosnab.kz',\n   *     website: 'https://technosnab.kz',\n   *     logoBase64: 'iVBORw0KGgoAAAANSUhEUgAAAAUA...',\n   *     phones: ['+7 727 350 12 34', '+7 701 234 56 78']\n   *   }\n   * })\n   * ```\n   */\n  sender(senderInfo: LetterSenderDraft): this {\n    this.draft.sender = senderInfo;\n    return this;\n  }\n\n  /**\n   * Set recipient information\n   *\n   * @param recipientInfo - Complete recipient details\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.recipient({\n   *   name: 'Департамент Налогового Комитета МФ РК по г. Алматы',\n   *   tin: '999888777666',\n   *   head: {\n   *     email: 'almaty@kgd.gov.kz',\n   *     website: 'https://kgd.gov.kz',\n   *     phones: ['+7 7172 58 09 09']\n   *   }\n   * })\n   * ```\n   */\n  recipient(recipientInfo: LetterRecipientDraft): this {\n    this.draft.recipient = recipientInfo;\n    return this;\n  }\n\n  /**\n   * Set HTML content of the letter\n   *\n   * NO sanitization or validation is performed on the HTML content.\n   * The content is passed as-is to the API.\n   *\n   * @param htmlContent - HTML content of the letter\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.html(`\n   *   <div>\n   *     <h2>Запрос разъяснения по применению НДС</h2>\n   *     <p>Уважаемые господа,</p>\n   *     <p>Просим дать письменное разъяснение...</p>\n   *   </div>\n   * `)\n   * ```\n   */\n  html(htmlContent: string): this {\n    this.draft.html = htmlContent;\n    return this;\n  }\n\n  /**\n   * Add a single attachment to the letter\n   *\n   * @param attachment - Attachment details\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.addAttachment({\n   *   filename: 'balance.pdf',\n   *   mimeType: 'application/pdf',\n   *   size: 102400,\n   *   base64: 'JVBERi0xLjQK...',\n   *   description: 'Бухгалтерский баланс за 2024 год'\n   * })\n   * ```\n   */\n  addAttachment(attachment: LetterAttachmentDraft): this {\n    if (!this.draft.attachments) {\n      this.draft.attachments = [];\n    }\n    this.draft.attachments.push(attachment);\n    return this;\n  }\n\n  /**\n   * Add multiple attachments to the letter\n   *\n   * @param attachments - Array of attachment details\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.addAttachments([\n   *   {\n   *     filename: 'contract.pdf',\n   *     mimeType: 'application/pdf',\n   *     size: 245760,\n   *     base64: 'JVBERi0xLjQK...',\n   *     description: 'Контракт № 2024-089'\n   *   },\n   *   {\n   *     filename: 'specification.pdf',\n   *     mimeType: 'application/pdf',\n   *     size: 102400,\n   *     base64: 'JVBERi0xLjQK...',\n   *     description: 'Спецификация к контракту'\n   *   }\n   * ])\n   * ```\n   */\n  addAttachments(attachments: LetterAttachmentDraft[]): this {\n    if (!this.draft.attachments) {\n      this.draft.attachments = [];\n    }\n    this.draft.attachments.push(...attachments);\n    return this;\n  }\n\n  /**\n   * Raw data merge (escape hatch)\n   *\n   * Allows merging arbitrary JSON data directly into the API payload.\n   * Useful for edge cases, advanced scenarios, or undocumented API fields.\n   * The data is deep-merged with the generated payload.\n   *\n   * @param data - Raw data to merge into the payload\n   * @returns The builder instance for method chaining\n   *\n   * @example\n   * ```typescript\n   * builder.raw({\n   *   CustomField: 'Custom Value',\n   *   Letter: {\n   *     Priority: 'urgent',\n   *     Category: 'tax-inquiry'\n   *   }\n   * })\n   * ```\n   */\n  raw(data: Partial<ApiLetterNKPayload & Record<string, any>>): this {\n    return super.raw(data);\n  }\n\n  /**\n   * Build the final API-compliant payload\n   *\n   * Transforms the DX-friendly draft into the API format expected by Didox.\n   * Performs validation and applies field transformations:\n   *\n   * - letter → Letter {Number, Date}\n   * - sender/recipient → Sender/Recipient {Name, Tin, Head}\n   * - head optional fields → empty strings (except Website → null)\n   * - html → Html\n   * - attachments → Attachments with ContentBase64, Description (empty string default)\n   *\n   * @returns Complete API payload ready for Didox submission\n   * @throws {DidoxValidationError} When required fields are missing\n   *\n   * @example\n   * ```typescript\n   * const payload = builder\n   *   .letter({ number: 'ИСХ-001', date: '2024-12-15' })\n   *   .sender({ name: 'Company', tin: '123456789012' })\n   *   .recipient({ name: 'НК РК', tin: '999888777666' })\n   *   .html('<p>Content</p>')\n   *   .build();\n   *\n   * await client.documents.createDraft('013', payload);\n   * ```\n   */\n  build(): ApiLetterNKPayload & Record<string, any> {\n    // Validation\n    if (!this.draft.letter) {\n      throw new DidoxValidationError('Letter information is required');\n    }\n\n    if (!this.draft.sender) {\n      throw new DidoxValidationError('Sender information is required');\n    }\n\n    if (!this.draft.recipient) {\n      throw new DidoxValidationError('Recipient information is required');\n    }\n\n    if (!this.draft.html) {\n      throw new DidoxValidationError('HTML content is required');\n    }\n\n    // Transform sender head\n    const senderHead = this.draft.sender.head || {};\n    const transformedSenderHead = {\n      BranchCode: senderHead.branchCode || '',\n      BranchName: senderHead.branchName || '',\n      Email: senderHead.email || '',\n      Website: senderHead.website !== undefined ? senderHead.website : null,\n      LogoBase64: senderHead.logoBase64 || '',\n      Phones: senderHead.phones || []\n    };\n\n    // Transform recipient head\n    const recipientHead = this.draft.recipient.head || {};\n    const transformedRecipientHead = {\n      BranchCode: recipientHead.branchCode || '',\n      BranchName: recipientHead.branchName || '',\n      Email: recipientHead.email || '',\n      Website: recipientHead.website !== undefined ? recipientHead.website : null,\n      LogoBase64: recipientHead.logoBase64 || '',\n      Phones: recipientHead.phones || []\n    };\n\n    // Build API payload\n    const apiPayload: ApiLetterNKPayload = {\n      Letter: {\n        Number: this.draft.letter.number,\n        Date: this.draft.letter.date\n      },\n      Sender: {\n        Name: this.draft.sender.name,\n        Tin: this.draft.sender.tin,\n        Head: transformedSenderHead\n      },\n      Recipient: {\n        Name: this.draft.recipient.name,\n        Tin: this.draft.recipient.tin,\n        Head: transformedRecipientHead\n      },\n      Html: this.draft.html,\n      Attachments: (this.draft.attachments || []).map(attachment => ({\n        Filename: attachment.filename,\n        MimeType: attachment.mimeType,\n        Size: attachment.size,\n        ContentBase64: attachment.base64,\n        Description: attachment.description || ''\n      }))\n    };\n\n    // Deep merge: first apply apiPayload, then merge with any raw() data\n    const basePayload = super.build(); // Get any raw() data applied earlier\n    return this.deepMerge(apiPayload, basePayload) as ApiLetterNKPayload & Record<string, any>;\n  }\n\n  /**\n   * Deep merge helper for combining API payload with raw data\n   * \n   * @private\n   */\n  private deepMerge(target: any, source: any): any {\n    const result = { ...target };\n    \n    for (const key in source) {\n      if (source[key] instanceof Object && key in target && target[key] instanceof Object) {\n        result[key] = this.deepMerge(target[key], source[key]);\n      } else {\n        result[key] = source[key];\n      }\n    }\n    \n    return result;\n  }\n}\n\n/**\n * Factory function for creating a new LetterNKBuilder instance\n *\n * @returns A new LetterNKBuilder instance ready for method chaining\n *\n * @example\n * ```typescript\n * const letter = letterNK()\n *   .letter({ number: 'ИСХ-001', date: '2024-12-15' })\n *   .sender({ name: 'Company', tin: '123456789012' })\n *   .recipient({ name: 'НК РК', tin: '999888777666' })\n *   .html('<p>Content</p>')\n *   .build();\n * ```\n */\nexport function letterNK(): LetterNKBuilder {\n  return new LetterNKBuilder();\n}\n","import { BaseDocumentBuilder, DocumentBuilderFactory } from './base/BaseDocumentBuilder.js';\nimport { DidoxValidationError } from '../../../http/errors.js';\n\n/**\n * DX-friendly MultiPartyDocument Draft interface\n * \n * Developer-friendly structure for building multi-party arbitrary documents.\n * This gets transformed to Didox API JSON format in build().\n */\nexport interface MultiPartyDocumentDraft {\n  /** Document information */\n  document: {\n    /** Document number */\n    no: string;\n    /** Document date (YYYY-MM-DD format) */\n    date: string;\n    /** Optional document name/title */\n    name?: string;\n  };\n\n  /** Optional contract reference */\n  contract?: {\n    /** Contract number */\n    no: string;\n    /** Contract date (YYYY-MM-DD format) */\n    date: string;\n  };\n\n  /** Document owner organization details */\n  owner: {\n    /** Tax Identification Number (exactly 9 or 14 digits) */\n    tin: string;\n    /** Company name */\n    name: string;\n    /** Company address */\n    address: string;\n    /** Optional branch code */\n    branchCode?: string;\n    /** Optional branch name */\n    branchName?: string;\n  };\n\n  /** Array of client organizations (minimum 1 required) */\n  clients: Array<{\n    /** Tax Identification Number (exactly 9 or 14 digits) */\n    tin: string;\n    /** Company name */\n    name: string;\n    /** Company address */\n    address: string;\n  }>;\n\n  /** PDF document in base64 format */\n  pdfBase64: string;\n}\n\n/**\n * API payload for Multi-Party Arbitrary Document (doctype 010)\n * \n * This interface represents the exact JSON structure required by the Didox API\n * for multi-party arbitrary documents. The builder's build() method transforms \n * the DX-friendly MultiPartyDocumentDraft into this format.\n */\nexport interface ApiMultiPartyDocumentPayload {\n  /** Document data structure */\n  data: {\n    /** Document information */\n    Document: {\n      /** Document number */\n      DocumentNo: string;\n      /** Document date in YYYY-MM-DD format */\n      DocumentDate: string;\n      /** Document name/title */\n      DocumentName?: string;\n    };\n\n    /** Optional contract information */\n    ContractDoc?: {\n      /** Contract number */\n      ContractNo: string;\n      /** Contract date in YYYY-MM-DD format */\n      ContractDate: string;\n    };\n\n    /** Owner organization information */\n    Owner: {\n      /** Owner TIN */\n      Tin: string;\n      /** Company name */\n      Name: string;\n      /** Branch code (empty string if not provided) */\n      BranchCode: string;\n      /** Branch name (empty string if not provided) */\n      BranchName: string;\n      /** Company address */\n      Address: string;\n    };\n\n    /** Array of client organizations */\n    Clients: Array<{\n      /** Client TIN */\n      Tin: string;\n      /** Company name */\n      Name: string;\n      /** Company address */\n      Address: string;\n    }>;\n  };\n\n  /** PDF document in base64 data URL format */\n  document: string;\n}\n\n/**\n * DX-friendly builder for Multi-Party Arbitrary Documents (doctype 010)\n * \n * Provides a fluent API for creating multi-party arbitrary PDF documents in Didox.\n * These are internal EDO documents supporting 1 owner + N clients that don't sync\n * with roaming or other operators.\n * \n * @example\n * ```typescript\n * const doc = builders.multiParty()\n *   .document('MULTI-001', '2025-02-07', 'Многостороннее соглашение')\n *   .contract('CONTRACT-001', '2025-01-15')\n *   .owner({\n *     tin: '310529901',\n *     name: '\"DIDOX TECH\" MCHJ',\n *     address: 'г. Ташкент, ул. Амира Темура, 15'\n *   })\n *   .addClient({\n *     tin: '302936161',\n *     name: '\"VENKON GROUP\" MCHJ',\n *     address: 'г. Ташкент, ул. Университетская, 4'\n *   })\n *   .addClient({\n *     tin: '123456789',\n *     name: '\"PARTNER CORP\" MCHJ',\n *     address: 'г. Самарканд, ул. Регистан, 1'\n *   })\n *   .pdf(base64PdfString)\n *   .build();\n * ```\n */\nexport class MultiPartyDocumentBuilder extends BaseDocumentBuilder<ApiMultiPartyDocumentPayload> {\n  /**\n   * Internal DX-friendly payload for development\n   * \n   * @private\n   */\n  private dxPayload: Partial<MultiPartyDocumentDraft> = {};\n\n  /**\n   * Set document information\n   * \n   * @param no - Document number (required)\n   * @param date - Document date in YYYY-MM-DD format (required)\n   * @param name - Optional document name/title\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.document('MULTI-001', '2025-02-07', 'Многостороннее соглашение');\n   * ```\n   */\n  public document(no: string, date: string, name?: string): this {\n    this.dxPayload.document = { \n      no, \n      date, \n      ...(name !== undefined && { name })\n    };\n    return this;\n  }\n\n  /**\n   * Set optional contract information\n   * \n   * @param no - Contract number\n   * @param date - Contract date in YYYY-MM-DD format\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.contract('CONTRACT-2025-001', '2025-01-15');\n   * ```\n   */\n  public contract(no: string, date: string): this {\n    this.dxPayload.contract = { no, date };\n    return this;\n  }\n\n  /**\n   * Set owner (main party) organization information\n   * \n   * @param data - Owner organization data\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.owner({\n   *   tin: '310529901',\n   *   name: '\"DIDOX TECH\" MCHJ',\n   *   address: 'г. Ташкент, ул. Амира Темура, 15',\n   *   branchCode: 'HQ', // optional\n   *   branchName: 'Головной офис' // optional\n   * });\n   * ```\n   */\n  public owner(data: MultiPartyDocumentDraft['owner']): this {\n    this.dxPayload.owner = data;\n    return this;\n  }\n\n  /**\n   * Add a single client organization\n   * \n   * @param data - Client organization data\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder\n   *   .addClient({\n   *     tin: '302936161',\n   *     name: '\"VENKON GROUP\" MCHJ',\n   *     address: 'г. Ташкент, ул. Университетская, 4'\n   *   })\n   *   .addClient({\n   *     tin: '123456789',\n   *     name: '\"PARTNER CORP\" MCHJ',\n   *     address: 'г. Самарканд, ул. Регистан, 1'\n   *   });\n   * ```\n   */\n  public addClient(data: MultiPartyDocumentDraft['clients'][0]): this {\n    if (!this.dxPayload.clients) {\n      this.dxPayload.clients = [];\n    }\n    this.dxPayload.clients.push(data);\n    return this;\n  }\n\n  /**\n   * Add multiple client organizations at once\n   * \n   * @param clients - Array of client organization data\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * builder.addClients([\n   *   {\n   *     tin: '302936161',\n   *     name: '\"VENKON GROUP\" MCHJ',\n   *     address: 'г. Ташкент, ул. Университетская, 4'\n   *   },\n   *   {\n   *     tin: '123456789',\n   *     name: '\"PARTNER CORP\" MCHJ',\n   *     address: 'г. Самарканд, ул. Регистан, 1'\n   *   }\n   * ]);\n   * ```\n   */\n  public addClients(clients: MultiPartyDocumentDraft['clients']): this {\n    if (!this.dxPayload.clients) {\n      this.dxPayload.clients = [];\n    }\n    this.dxPayload.clients.push(...clients);\n    return this;\n  }\n\n  /**\n   * Set PDF document content\n   * \n   * @param base64 - PDF document encoded as base64 string\n   * @returns This builder instance for chaining\n   * \n   * @example\n   * ```typescript\n   * const pdfBuffer = fs.readFileSync('multi-party-agreement.pdf');\n   * const base64String = pdfBuffer.toString('base64');\n   * builder.pdf(base64String);\n   * ```\n   */\n  public pdf(base64: string): this {\n    this.dxPayload.pdfBase64 = base64;\n    return this;\n  }\n\n  /**\n   * Build the final API payload\n   * \n   * Transforms the DX-friendly draft into the exact JSON structure\n   * required by the Didox API for multi-party arbitrary documents (doctype 010).\n   * \n   * @returns Complete API payload ready for createDraft()\n   * @throws {DidoxValidationError} When required fields are missing or invalid\n   * \n   * @example\n   * ```typescript\n   * const doc = builder\n   *   .document('MULTI-001', '2025-02-07')\n   *   .owner({ tin: '310529901', name: 'Owner Company', address: 'Address' })\n   *   .addClient({ tin: '302936161', name: 'Client Company', address: 'Address' })\n   *   .pdf(base64String)\n   *   .build();\n   * \n   * // Use with createDraft API\n   * const result = await didox.documents.createDraft('010', doc);\n   * ```\n   */\n  public build(): ApiMultiPartyDocumentPayload {\n    // Validate required fields\n    this.validateRequiredFields();\n\n    const payload: ApiMultiPartyDocumentPayload = {\n      data: {\n        Document: {\n          DocumentNo: this.dxPayload.document!.no,\n          DocumentDate: this.dxPayload.document!.date,\n        },\n        Owner: {\n          Tin: this.dxPayload.owner!.tin,\n          Name: this.dxPayload.owner!.name,\n          BranchCode: this.dxPayload.owner!.branchCode || '',\n          BranchName: this.dxPayload.owner!.branchName || '',\n          Address: this.dxPayload.owner!.address,\n        },\n        Clients: this.dxPayload.clients!.map(client => ({\n          Tin: client.tin,\n          Name: client.name,\n          Address: client.address,\n        })),\n      },\n      document: `data:application/pdf;base64,${this.dxPayload.pdfBase64}`,\n    };\n\n    // Add optional document name\n    if (this.dxPayload.document!.name) {\n      payload.data.Document.DocumentName = this.dxPayload.document!.name;\n    }\n\n    // Add optional contract information\n    if (this.dxPayload.contract) {\n      payload.data.ContractDoc = {\n        ContractNo: this.dxPayload.contract.no,\n        ContractDate: this.dxPayload.contract.date,\n      };\n    }\n\n    // Merge any raw data (escape hatch)\n    return this.mergeRawData(payload);\n  }\n\n  /**\n   * Validate required fields\n   * \n   * @private\n   * @throws {DidoxValidationError} When validation fails\n   */\n  private validateRequiredFields(): void {\n    if (!this.dxPayload.document?.no) {\n      throw new DidoxValidationError('Document number is required', 'document.no');\n    }\n\n    if (!this.dxPayload.document?.date) {\n      throw new DidoxValidationError('Document date is required', 'document.date');\n    }\n\n    if (!this.dxPayload.owner?.tin) {\n      throw new DidoxValidationError('Owner TIN is required', 'owner.tin');\n    }\n\n    if (!this.dxPayload.owner?.name) {\n      throw new DidoxValidationError('Owner name is required', 'owner.name');\n    }\n\n    if (!this.dxPayload.owner?.address) {\n      throw new DidoxValidationError('Owner address is required', 'owner.address');\n    }\n\n    if (!this.dxPayload.clients || this.dxPayload.clients.length === 0) {\n      throw new DidoxValidationError('At least one client is required', 'clients');\n    }\n\n    // Validate each client\n    this.dxPayload.clients.forEach((client, index) => {\n      if (!client.tin) {\n        throw new DidoxValidationError(`Client ${index + 1} TIN is required`, `clients[${index}].tin`);\n      }\n      if (!client.name) {\n        throw new DidoxValidationError(`Client ${index + 1} name is required`, `clients[${index}].name`);\n      }\n      if (!client.address) {\n        throw new DidoxValidationError(`Client ${index + 1} address is required`, `clients[${index}].address`);\n      }\n    });\n\n    if (!this.dxPayload.pdfBase64) {\n      throw new DidoxValidationError('PDF base64 data is required', 'pdfBase64');\n    }\n  }\n\n  /**\n   * Merge raw data with the built payload (escape hatch)\n   * \n   * @private\n   * @param payload - The built payload\n   * @returns Payload with raw data merged\n   */\n  private mergeRawData(payload: ApiMultiPartyDocumentPayload): ApiMultiPartyDocumentPayload {\n    if (Object.keys(this.payload).length > 0) {\n      // Deep merge raw data into payload\n      return {\n        ...payload,\n        ...this.payload,\n        data: {\n          ...payload.data,\n          ...(this.payload as any).data,\n        },\n      };\n    }\n    return payload;\n  }\n}\n\n/**\n * Creates a new multi-party arbitrary document builder\n * \n * @param initial - Optional initial multi-party document data\n * @returns Multi-party document builder instance\n * \n * @example\n * ```typescript\n * // Start with empty builder\n * const doc = builders.multiParty()\n *   .document('MULTI-001', '2025-02-07')\n *   .owner({ tin: '123456789', name: 'Owner', address: 'Address' })\n *   .addClient({ tin: '987654321', name: 'Client', address: 'Address' })\n *   .pdf(base64String)\n *   .build();\n * \n * // Start with initial data\n * const doc = builders.multiParty({\n *   data: {\n *     Document: {\n *       DocumentNo: 'EXISTING-DOC',\n *       DocumentDate: '2025-02-07'\n *     },\n *     Owner: {\n *       Tin: '123456789',\n *       Name: 'Existing Owner',\n *       BranchCode: '',\n *       BranchName: '',\n *       Address: 'Existing Address'\n *     },\n *     Clients: []\n *   }\n * })\n *   .addClient({ tin: '987654321', name: 'Client', address: 'Address' })\n *   .build();\n * ```\n */\nexport const multiParty: DocumentBuilderFactory<ApiMultiPartyDocumentPayload> = (initial?) => \n  new MultiPartyDocumentBuilder(initial);","/**\n * Document Builders Infrastructure\n * \n * Provides fluent, chainable builders for all Didox document types.\n * Each builder offers a type-safe, IDE-friendly way to construct document payloads.\n */\n\n// Import all builder factories\nimport { invoice } from './invoice.js';\nimport { invoicePharm } from './invoicePharm.js';\nimport { hybridInvoice } from './hybridInvoice.js';\nimport { ttn } from './ttn.js';\nimport { act } from './act.js';\nimport { contract } from './contract.js';\nimport { empowerment } from './empowerment.js';\nimport { arbitrary } from './arbitrary.js';\nimport { verificationAct } from './verificationAct.js';\nimport { acceptanceTransfer } from './acceptanceTransfer.js';\nimport { foundersProtocol } from './founders-protocol.js';\nimport { letterNK } from './letter-nk.js';\nimport { multiParty } from './multi-party.js';\n\n// Export base classes and types for extensibility\nexport { BaseDocumentBuilder } from './base/BaseDocumentBuilder.js';\nexport type { DocumentBuilderFactory } from './base/BaseDocumentBuilder.js';\n\n// Export builder-specific types\nexport type {\n  InvoiceDraft,\n  InvoiceProductDraft,\n  ApiInvoicePayload\n} from './invoice.js';\n\nexport type {\n  ActDraft,\n  ActProductDraft,\n  ApiActPayload\n} from './act.js';\n\nexport type {\n  TtnDraft,\n  ProductGroupDraft,\n  TtnProductDraft,\n  ApiTtnPayload,\n  Party\n} from './ttn.js';\n\nexport type {\n  ArbitraryDocumentDraft,\n  ApiArbitraryDocumentPayload\n} from './arbitrary.js';\n\nexport type {\n  MultiPartyDocumentDraft,\n  ApiMultiPartyDocumentPayload\n} from './multi-party.js';\n\nexport type {\n  FoundersProtocolDraft,\n  ProtocolParticipantDraft,\n  ProtocolPartDraft,\n  ApiFoundersProtocolPayload\n} from './founders-protocol.js';\n\nexport type {\n  LetterNKDraft,\n  LetterSenderDraft,\n  LetterRecipientDraft,\n  LetterAttachmentDraft,\n  LetterHeadDraft,\n  ApiLetterNKPayload\n} from './letter-nk.js';\n\nexport type {\n  EmpowermentDraft,\n  AgentDraft,\n  AgentPassportDraft,\n  CompanyDraft,\n  EmpowermentProductDraft,\n  ApiEmpowermentPayload\n} from './empowerment.js';\n\n/**\n * Document Builders Collection\n * \n * Centralized access to all document builders. Each builder provides a fluent API\n * for constructing documents with proper typing and IDE support.\n * \n * @example\n * ```typescript\n * // Create an invoice document\n * const invoicePayload = builders.invoice()\n *   .raw({ FacturaType: 0 })\n *   .build();\n * \n * await client.documents.createDraft('002', invoicePayload);\n * \n * // Create a transport waybill\n * const ttnPayload = builders.ttn()\n *   .raw({ transportInfo: { vehicleNumber: '01A123BC' } })\n *   .build();\n * \n * await client.documents.createDraft('041', ttnPayload);\n * ```\n */\nexport const builders = {\n  /**\n   * Invoice document builder (docType: '002')\n   * For creating standard invoices\n   */\n  invoice,\n\n  /**\n   * Pharmacy invoice document builder\n   * For creating pharmacy-specific invoices\n   */\n  invoicePharm,\n\n  /**\n   * Hybrid invoice document builder\n   * For creating hybrid invoices\n   */\n  hybridInvoice,\n\n  /**\n   * Transport waybill (TTN) document builder (docType: '041')\n   * For creating transport waybills\n   */\n  ttn,\n\n  /**\n   * Act document builder (docType: '075')\n   * For creating act of work completed documents\n   */\n  act,\n\n  /**\n   * Contract document builder\n   * For creating contract documents\n   */\n  contract,\n\n  /**\n   * Empowerment document builder (doctype: '006')\n   * For creating empowerment (power of attorney) documents.\n   * Three-party structure: Seller, Buyer, Agent. No prices or VAT.\n   */\n  empowerment,\n\n  /**\n   * Arbitrary document builder (doctype: '000')\n   * For creating arbitrary PDF documents for internal EDO use.\n   * These documents don't sync with roaming or other operators.\n   */\n  arbitrary,\n\n  /**\n   * Verification act document builder\n   * For creating verification act documents\n   */\n  verificationAct,\n\n  /**\n   * Acceptance transfer document builder\n   * For creating acceptance transfer documents\n   */\n  acceptanceTransfer,\n\n  /**\n   * Founders protocol document builder (doctype: '075')\n   * For creating founders' meeting protocol documents\n   */\n  foundersProtocol,\n\n  /**\n   * Letter NK document builder (doctype: '013')\n   * For creating letters to tax committee (Письмо НК)\n   */\n  letterNK,\n\n  /**\n   * Multi-party arbitrary document builder (doctype: '010')\n   * For creating multi-party arbitrary PDF documents with 1 owner + N clients.\n   * These documents are for internal EDO use and don't sync with roaming.\n   */\n  multiParty\n} as const;","import type { HttpClient } from '../../http/httpClient.js';\nimport type {\n  ListDocumentsParams,\n  DocumentMetadata,\n  DocumentStatistics,\n  DocumentPrivileges,\n  DocumentResponse,\n  DocumentCreatePayload,\n  DocumentsListResponse,\n  NormalizedDocumentsListResponse,\n  DocumentsStatisticsResponse,\n  RawDocumentResponse,\n  RawDocumentPrivilegesResponse\n} from './documents.types.js';\nimport type { DocumentType } from './documents.enums.js';\nimport {\n  validateListDocumentsParams,\n  validateDocumentId,\n  validateCreateDraftParams\n} from './documents.validators.js';\nimport { normalizeDocumentsList } from '../../utils/normalizer.js';\nimport { builders } from './builders/index.js';\n\n/**\n * Documents API client for Didox platform\n * \n * Provides methods for managing electronic documents including invoices,\n * waybills, acts, and other document types supported by the Didox EDO platform.\n */\nexport class DocumentsClient {\n  /**\n   * Document builders for fluent document creation\n   * \n   * Provides chainable, type-safe builders for all supported document types.\n   * Each builder offers IDE-friendly methods for constructing valid document payloads.\n   * \n   * @example\n   * ```typescript\n   * // Create invoice using builder\n   * const payload = client.documents.builders.invoice()\n   *   .raw({ FacturaType: 0 })\n   *   .build();\n   * \n   * await client.documents.createDraft('002', payload);\n   * \n   * // Create TTN using builder\n   * const ttnPayload = client.documents.builders.ttn()\n   *   .raw({ transportInfo: { vehicleNumber: '01A123BC' } })\n   *   .build();\n   * \n   * await client.documents.createDraft('041', ttnPayload);\n   * ```\n   */\n  public readonly builders = builders;\n\n  constructor(private readonly httpClient: HttpClient) {}\n\n  /**\n   * Get paginated list of documents\n   * \n   * Retrieves a filtered and paginated list of documents based on specified criteria.\n   * Supports filtering by status, type, dates, partner, and other parameters.\n   * \n   * @param params - Filtering and pagination parameters\n   * @returns Promise resolving to paginated document list\n   * \n   * @throws {DidoxValidationError} When parameters are invalid\n   * @throws {DidoxAuthError} When authentication fails (401 status)\n   * @throws {DidoxApiError} When API returns other error responses  \n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const documents = await client.documents.list({\n   *     owner: 1, // outgoing documents\n   *     page: 1,\n   *     limit: 20,\n   *     status: [1, 2], // sent or signed\n   *     dateFromCreated: '2024-01-01',\n   *     dateToCreated: '2024-01-31'\n   *   });\n   *   \n   *   console.log('Found documents:', documents.data.length);\n   *   console.log('Total pages:', documents.meta.totalPages);\n   * } catch (error) {\n   *   if (error instanceof DidoxValidationError) {\n   *     console.error('Invalid parameters:', error.message);\n   *   }\n   * }\n   * ```\n   */\n  async list(params: ListDocumentsParams): Promise<DocumentsListResponse | NormalizedDocumentsListResponse> {\n    // Validate parameters\n    validateListDocumentsParams(params);\n    \n    // Build URL with query parameters\n    const url = this.buildUrlWithParams('/v2/documents', params);\n    \n    // Make HTTP request\n    const response = await this.httpClient.get<DocumentsListResponse>(url);\n    \n    // Handle output format\n    if (params.output === 'normalized') {\n      return normalizeDocumentsList(response.data);\n    }\n    \n    return response.data;\n  }\n\n  /**\n   * Get document statistics\n   * \n   * Retrieves statistical information about documents matching the specified criteria.\n   * Returns counts by status, type, and other aggregations.\n   * \n   * @param params - Filtering parameters (same as list method)\n   * @returns Promise resolving to document statistics\n   * \n   * @throws {DidoxValidationError} When parameters are invalid\n   * @throws {DidoxAuthError} When authentication fails (401 status)\n   * @throws {DidoxApiError} When API returns other error responses\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const stats = await client.documents.statistics({\n   *     owner: 1,\n   *     page: 1,\n   *     limit: 1, // Minimal page for stats\n   *     dateFromCreated: '2024-01-01'\n   *   });\n   *   \n   *   console.log('Total documents:', stats.total);\n   *   console.log('By status:', stats.byStatus);\n   *   console.log('By type:', stats.byType);\n   * } catch (error) {\n   *   console.error('Failed to get statistics:', error.message);\n   * }\n   * ```\n   */\n  async statistics(params: ListDocumentsParams): Promise<DocumentsStatisticsResponse> {\n    // Validate parameters\n    validateListDocumentsParams(params);\n    \n    // Build URL with query parameters (excluding output parameter)\n    const { output, ...filteredParams } = params;\n    const url = this.buildUrlWithParams('/v2/documents/statistics/all', filteredParams);\n    \n    // Make HTTP request\n    const response = await this.httpClient.get<DocumentsStatisticsResponse>(url);\n    \n    return response.data;\n  }\n\n  /**\n   * Get document by ID\n   * \n   * Retrieves detailed information about a specific document by its unique identifier.\n   * Returns raw Didox API response without any normalization or transformation.\n   * \n   * @param id - Document unique identifier\n   * @returns Promise resolving to raw document response from Didox API\n   * \n   * @throws {DidoxValidationError} When document ID is invalid\n   * @throws {DidoxAuthError} When authentication fails (401 status)\n   * @throws {DidoxApiError} When API returns other error responses (e.g., 404 if document not found)\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const document = await client.documents.getById('11F092E3428D10C68F7B1E0008000075');\n   *   \n   *   // Raw Didox API response structure\n   *   console.log('Document data:', document);\n   *   // Note: Structure depends on document type and Didox API version\n   * } catch (error) {\n   *   if (error instanceof DidoxApiError && error.statusCode === 404) {\n   *     console.error('Document not found');\n   *   }\n   * }\n   * ```\n   */\n  async getById(id: string): Promise<RawDocumentResponse> {\n    // Validate document ID\n    validateDocumentId(id);\n    \n    // Make HTTP request to get document by ID\n    const response = await this.httpClient.get<RawDocumentResponse>(`/v1/documents/${id}`);\n    \n    // Return raw response data without any transformation\n    return response.data;\n  }\n\n  /**\n   * Get document privileges\n   * \n   * Retrieves user privileges for a specific document, indicating what actions\n   * the current user can perform. Returns raw Didox API response without normalization.\n   * \n   * @param id - Document unique identifier\n   * @returns Promise resolving to raw document privileges response from Didox API\n   * \n   * @throws {DidoxValidationError} When document ID is invalid\n   * @throws {DidoxAuthError} When authentication fails (401 status)\n   * @throws {DidoxApiError} When API returns other error responses\n   * @throws {DidoxNetworkError} When network request fails\n   * \n   * @example\n   * ```typescript\n   * try {\n   *   const privileges = await client.documents.getPrivileges('11F092E3428D10C68F7B1E0008000075');\n   *   \n   *   // Raw Didox API response - structure may vary\n   *   console.log('Privileges data:', privileges);\n   *   \n   *   // Example of potential structure (actual may differ):\n   *   // {\n   *   //   canView: true,\n   *   //   canEdit: false,\n   *   //   canSign: true,\n   *   //   canCancel: false,\n   *   //   canDelete: false,\n   *   //   canDownload: true\n   *   // }\n   * } catch (error) {\n   *   console.error('Failed to get privileges:', error.message);\n   * }\n   * ```\n   */\n  async getPrivileges(id: string): Promise<RawDocumentPrivilegesResponse> {\n    // Validate document ID\n    validateDocumentId(id);\n    \n    // Make HTTP request to get document privileges\n    const response = await this.httpClient.get<RawDocumentPrivilegesResponse>(`/v1/documents/${id}/privileges`);\n    \n    // Return raw response data without any transformation\n    return response.data;\n  }\n\n  /**\n   * Create document draft\n   * \n   * Creates a draft document in Didox system using the specified document type and payload.\n   * This is a universal method that accepts any document structure without validation.\n   * \n   * @param docType - Didox document type code (e.g. '002', '041', '075')\n   * @param payload - Raw document JSON body according to Didox API specification\n   * @param options - Additional options for request handling\n   * @param options.output - Response mode: 'wrapped' (default) handles errors, 'raw' returns as-is\n   * @returns Promise resolving to raw Didox API response\n   * \n   * @throws {DidoxValidationError} When docType or payload is invalid\n   * @throws {DidoxApiError} When API returns error responses (unless output = 'raw')\n   * @throws {DidoxAuthError} When authentication fails (unless output = 'raw')\n   * @throws {DidoxNetworkError} When network request fails (unless output = 'raw')\n   * \n   * @example\n   * ```typescript\n   * // Create invoice draft\n   * const invoice = await client.documents.createDraft('002', {\n   *   // Invoice payload structure according to Didox API\n   *   sellerInfo: { tin: '123456789', name: 'Company LLC' },\n   *   buyerInfo: { tin: '987654321', name: 'Client Corp' },\n   *   items: [{ name: 'Product', price: 1000, quantity: 1 }]\n   * });\n   * \n   * // Create transport waybill with raw output\n   * const ttn = await client.documents.createDraft('041', ttnPayload, {\n   *   output: 'raw'\n   * });\n   * \n   * // Create act of work completed\n   * const act = await client.documents.createDraft('075', actPayload);\n   * ```\n   */\n  async createDraft(\n    docType: string,\n    payload: unknown,\n    options?: { output?: 'wrapped' | 'raw' }\n  ): Promise<any> {\n    // Validate parameters\n    validateCreateDraftParams(docType, payload);\n    \n    const endpoint = `/v1/documents/${docType}/create`;\n    \n    try {\n      // Make HTTP POST request\n      const response = await this.httpClient.post<any>(endpoint, payload);\n      \n      // Return raw response data\n      return response.data;\n      \n    } catch (error) {\n      // Handle output mode\n      if (options?.output === 'raw') {\n        // In raw mode, rethrow the original error without wrapping\n        throw error;\n      }\n      \n      // In wrapped mode (default), errors are handled by HttpClient error classes\n      throw error;\n    }\n  }\n\n  /**\n   * Build URL with query parameters for API requests\n   * \n   * Transforms the ListDocumentsParams into a URL with query parameters.\n   * Handles arrays by converting them to comma-separated strings.\n   * Only includes parameters that have defined values.\n   * \n   * @private\n   * @param endpoint - Base endpoint URL\n   * @param params - Document filtering parameters\n   * @returns Complete URL with query parameters\n   */\n  private buildUrlWithParams(endpoint: string, params: Partial<ListDocumentsParams>): string {\n    const queryParams = new URLSearchParams();\n\n    // Map parameter names to API query parameter names\n    const paramMapping = {\n      owner: 'owner',\n      page: 'page',\n      limit: 'limit',\n      status: 'status',\n      dateFromCreated: 'dateFromCreated',\n      dateToCreated: 'dateToCreated',\n      dateFromModified: 'dateFromUpdated',\n      dateToModified: 'dateToUpdated',\n      dateFromSent: 'signDateFrom',\n      dateToSent: 'signDateTo',\n      type: 'doctype',\n      partner: 'partner',\n      number: 'name',\n      docDateFromCreated: 'docDateFromCreated',\n      docDateToCreated: 'docDateToCreated',\n      contractName: 'contractName',\n      contractDate: 'contractDate',\n      hasCommittent: 'hasCommittent',\n      hasLgota: 'hasLgota',\n      hasMarks: 'hasMarks',\n      oneside: 'oneside'\n    };\n\n    // Process each parameter\n    for (const [key, value] of Object.entries(params)) {\n      if (value === undefined || value === null) {\n        continue;\n      }\n\n      // Skip output parameter as it's handled separately\n      if (key === 'output') {\n        continue;\n      }\n\n      const apiParamName = paramMapping[key as keyof typeof paramMapping] || key;\n\n      if (Array.isArray(value)) {\n        // Convert array to comma-separated string\n        queryParams.append(apiParamName, value.join(','));\n      } else {\n        queryParams.append(apiParamName, String(value));\n      }\n    }\n\n    const queryString = queryParams.toString();\n    return queryString ? `${endpoint}?${queryString}` : endpoint;\n  }\n}","import { HttpClient } from '../http/httpClient.js';\nimport { DidoxValidationError } from '../http/errors.js';\nimport { DidoxConfig, ResolvedDidoxConfig, resolveConfig } from './DidoxConfig.js';\nimport { AuthApi } from '../modules/auth/auth.api.js';\nimport { AccountApi } from '../modules/account/account.api.js';\nimport { ProfileApi } from '../modules/profile/profile.api.js';\nimport { UtilitiesApi } from '../modules/utilities/utilities.api.js';\nimport { DocumentsClient } from '../modules/documents/DocumentsClient.js';\n\n/**\n * Main Didox SDK client\n * \n * @example\n * ```typescript\n * const didox = new DidoxClient({\n *   partnerToken: 'your-partner-token',\n *   environment: 'development'\n * });\n * \n * // Login as legal entity\n * const result = await didox.auth.loginLegalEntity({\n *   taxId: '123456789',\n *   password: 'your-password'\n * });\n * ```\n */\nexport class DidoxClient {\n  private readonly config: ResolvedDidoxConfig;\n  private readonly httpClient: HttpClient;\n\n  /**\n   * Authentication API\n   */\n  public readonly auth: AuthApi;\n\n  /**\n   * Account / Profile API\n   */\n  public readonly account: AccountApi;\n\n  /**\n   * Company Profile API\n   */\n  public readonly profile: ProfileApi;\n\n  /**\n   * Utilities API\n   */\n  public readonly utilities: UtilitiesApi;\n\n  /**\n   * Documents API\n   */\n  public readonly documents: DocumentsClient;\n\n  constructor(config: DidoxConfig) {\n    // Validate configuration\n    this.validateConfig(config);\n    \n    // Resolve configuration\n    this.config = resolveConfig(config);\n\n    // Create HTTP client\n    this.httpClient = new HttpClient({\n      baseUrl: this.config.baseUrl,\n      timeout: this.config.timeout,\n      defaultHeaders: {\n        'Authorization': `Bearer ${this.config.partnerToken}`,\n        'Content-Type': 'application/json',\n        'Accept': 'application/json'\n      }\n    });\n\n    // Set partner token for Partner-Authorization header\n    this.httpClient.setPartnerToken(this.config.partnerToken);\n\n    // Initialize API modules\n    this.auth = new AuthApi(this.httpClient);\n    this.account = new AccountApi(this.httpClient);\n    this.profile = new ProfileApi(this.httpClient);\n    this.utilities = new UtilitiesApi(this.httpClient);\n    this.documents = new DocumentsClient(this.httpClient);\n  }\n\n  /**\n   * Get the current configuration\n   */\n  public getConfig(): Readonly<ResolvedDidoxConfig> {\n    return { ...this.config };\n  }\n\n  /**\n   * Set access token for authenticated requests\n   * This is called automatically after successful login\n   */\n  public setAccessToken(token: string): void {\n    this.httpClient.setAccessToken(token);\n  }\n\n  /**\n   * Clear access token\n   */\n  public clearAccessToken(): void {\n    this.httpClient.clearAccessToken();\n  }\n\n  /**\n   * Validate the configuration\n   */\n  private validateConfig(config: DidoxConfig): void {\n    if (!config.partnerToken || typeof config.partnerToken !== 'string') {\n      throw new DidoxValidationError(\n        'partnerToken is required and must be a non-empty string',\n        'partnerToken'\n      );\n    }\n\n    if (!config.environment || !['development', 'production'].includes(config.environment)) {\n      throw new DidoxValidationError(\n        'environment must be either \"development\" or \"production\"',\n        'environment'\n      );\n    }\n\n    if (config.timeout !== undefined) {\n      if (typeof config.timeout !== 'number' || config.timeout <= 0) {\n        throw new DidoxValidationError(\n          'timeout must be a positive number',\n          'timeout'\n        );\n      }\n    }\n  }\n}","/**\n * Document types enum for Didox platform\n */\nexport enum DocumentType {\n  /** Electronic invoice (ЭСФ) */\n  FACTURA = '002',\n  \n  /** Pharmaceutical invoice (ЭСФ для фармацевтики) */\n  FACTURA_PHARM = '008',\n  \n  /** Hybrid invoice (Гибридная ЭСФ) */\n  HYBRID_FACTURA = '023',\n  \n  /** Waybill (ТТН) */\n  WAYBILL = '041',\n  \n  /** Act (Акт) */\n  ACT = '005',\n  \n  /** Power of attorney (Доверенность) */\n  EMPOWERMENT = '006',\n  \n  /** Contract NK (Договор НК) */\n  CONTRACT_NK = '007',\n  \n  /** Free form document (Произвольный документ) */\n  FREE_FORM = '000',\n  \n  /** Verification act (Акт сверки) */\n  VERIFICATION_ACT = '052',\n  \n  /** Acceptance transfer act (Акт приема-передачи) */\n  ACCEPTANCE_TRANSFER = '054',\n  \n  /** Multi-party free form (Многосторонний произвольный) */\n  MULTI_FREE_FORM = '010',\n  \n  /** Founders protocol (Протокол учредителей) */\n  FOUNDERS_PROTOCOL = '075',\n  \n  /** Tax letter (Налоговое письмо) */\n  TAX_LETTER = '013'\n}\n\n/**\n * Document status enum\n */\nexport enum DocumentStatus {\n  /** Draft state */\n  DRAFT = 0,\n  \n  /** Sent for signing */\n  SENT = 1,\n  \n  /** Signed by all parties */\n  SIGNED = 2,\n  \n  /** Rejected by counterparty */\n  REJECTED = 3,\n  \n  /** Cancelled by sender */\n  CANCELLED = 4,\n  \n  /** Error state */\n  ERROR = 5,\n  \n  /** Partially signed */\n  PARTIALLY_SIGNED = 6,\n  \n  /** Waiting for signature */\n  WAITING_SIGNATURE = 7,\n  \n  /** Processing */\n  PROCESSING = 8,\n  \n  /** Expired */\n  EXPIRED = 9\n}\n\n/**\n * Document owner type enum\n */\nexport enum OwnerType {\n  /** Incoming document */\n  INCOMING = 0,\n  \n  /** Outgoing document */\n  OUTGOING = 1\n}\n\n/**\n * Document output format enum\n */\nexport enum DocumentOutputFormat {\n  /** Raw API response */\n  RAW = 'raw',\n  \n  /** Normalized response */\n  NORMALIZED = 'normalized'\n}"],"mappings":"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","names":["validatePassword","validatePassword","validateNotifications","validateNotifications","empowerment","DocumentType","DocumentStatus","OwnerType"]}