@zentring/zinvoice 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +190 -0
- package/README.md +273 -0
- package/dist/index.cjs +3329 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2408 -0
- package/dist/index.d.ts +2408 -0
- package/dist/index.js +3274 -0
- package/dist/index.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Provider.ts","../src/errors/index.ts","../src/infrastructure/amego/AmegoConfig.ts","../src/infrastructure/amego/AmegoSigner.ts","../src/infrastructure/amego/AmegoClient.ts","../src/domain/shared/Money.ts","../src/domain/shared/Carrier.ts","../src/domain/shared/Donation.ts","../src/domain/shared/TaxType.ts","../src/domain/invoice/Invoice.ts","../src/domain/allowance/Allowance.ts","../src/infrastructure/amego/AmegoMapper.ts","../src/domain/invoice/InvoiceNumber.ts","../src/domain/invoice/InvoiceItem.ts","../src/domain/shared/TaxId.ts","../src/domain/shared/OrderId.ts","../src/domain/shared/Buyer.ts","../src/infrastructure/amego/AmegoInvoiceRepository.ts","../src/domain/shared/Pagination.ts","../src/domain/shared/LocalDate.ts","../src/infrastructure/amego/AmegoInvoiceService.ts","../src/domain/allowance/AllowanceItem.ts","../src/infrastructure/amego/AmegoAllowanceRepository.ts","../src/infrastructure/amego/AmegoAllowanceService.ts","../src/Zinvoice.ts","../src/domain/shared/CarrierCode.ts","../src/domain/invoice/InvoiceQuery.ts","../src/domain/services/TaxCalculator.ts","../src/application/InvoiceService.ts","../src/application/AllowanceService.ts"],"names":["Provider","Capability","createHash","TaxType","ZeroTaxRateReason","CustomsClearanceMark","InvoiceStatus","InvoiceType","AllowanceStatus","AllowanceType","DateType","CarrierType"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Supported e-invoice providers (加值中心)\n */\nexport enum Provider {\n /** 光貿資訊 */\n AMEGO = 'amego',\n}\n\n/**\n * Provider capabilities - features that may or may not be supported\n */\nexport enum Capability {\n /** B2C 發票開立 */\n B2C = 'b2c',\n /** B2B 發票開立 */\n B2B = 'b2b',\n /** 載具 (手機條碼、自然人憑證) */\n CARRIER = 'carrier',\n /** 捐贈 */\n DONATION = 'donation',\n /** 折讓 */\n ALLOWANCE = 'allowance',\n /** 作廢 */\n VOID = 'void',\n /** 換開發票 */\n EXCHANGE = 'exchange',\n /** 列印格式輸出 */\n PRINT = 'print',\n /** 發票查詢 */\n QUERY = 'query',\n /** 發票列表 */\n LIST = 'list',\n}\n\n/**\n * Capability definitions for each provider\n */\nexport const PROVIDER_CAPABILITIES: Record<Provider, Set<Capability>> = {\n [Provider.AMEGO]: new Set([\n Capability.B2C,\n Capability.B2B,\n Capability.CARRIER,\n Capability.DONATION,\n Capability.ALLOWANCE,\n Capability.VOID,\n Capability.EXCHANGE,\n Capability.PRINT,\n Capability.QUERY,\n Capability.LIST,\n ]),\n};\n\n/**\n * Provider display names\n */\nexport const PROVIDER_NAMES: Record<Provider, string> = {\n [Provider.AMEGO]: '光貿資訊',\n};\n","/**\n * Base error class for zinvoice\n */\nexport class ZinvoiceError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ZinvoiceError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Invalid Tax ID (統一編號) error\n */\nexport class InvalidTaxIdError extends ZinvoiceError {\n constructor(public readonly value: string) {\n super(`Invalid tax ID (統一編號): ${value}`);\n this.name = 'InvalidTaxIdError';\n }\n}\n\n/**\n * Invalid carrier code (載具條碼) error\n */\nexport class InvalidCarrierCodeError extends ZinvoiceError {\n constructor(\n public readonly value: string,\n public readonly carrierType: string\n ) {\n super(`Invalid carrier code for type ${carrierType}: ${value}`);\n this.name = 'InvalidCarrierCodeError';\n }\n}\n\n/**\n * Invalid invoice number error\n */\nexport class InvalidInvoiceNumberError extends ZinvoiceError {\n constructor(public readonly value: string) {\n super(`Invalid invoice number (發票號碼): ${value}`);\n this.name = 'InvalidInvoiceNumberError';\n }\n}\n\n/**\n * Invalid money amount error\n */\nexport class InvalidMoneyError extends ZinvoiceError {\n constructor(\n public readonly value: number,\n reason: string\n ) {\n super(`Invalid money amount: ${value} - ${reason}`);\n this.name = 'InvalidMoneyError';\n }\n}\n\n/**\n * API error from provider\n */\nexport class ProviderApiError extends ZinvoiceError {\n constructor(\n public readonly provider: string,\n public readonly code: string,\n message: string\n ) {\n super(`[${provider}] API Error (${code}): ${message}`);\n this.name = 'ProviderApiError';\n }\n}\n\n/**\n * Network error\n */\nexport class NetworkError extends ZinvoiceError {\n constructor(\n message: string,\n public readonly cause?: Error\n ) {\n super(`Network error: ${message}`);\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Validation error for domain objects\n */\nexport class ValidationError extends ZinvoiceError {\n constructor(\n public readonly field: string,\n message: string\n ) {\n super(`Validation error on ${field}: ${message}`);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Unsupported capability error\n *\n * Thrown when attempting to use a feature that the provider doesn't support.\n */\nexport class UnsupportedCapabilityError extends ZinvoiceError {\n constructor(\n public readonly capability: string,\n public readonly provider: string\n ) {\n super(`Provider \"${provider}\" does not support capability: ${capability}`);\n this.name = 'UnsupportedCapabilityError';\n }\n}\n\n/**\n * Provider not implemented error\n */\nexport class ProviderNotImplementedError extends ZinvoiceError {\n constructor(public readonly provider: string) {\n super(`Provider \"${provider}\" is not yet implemented`);\n this.name = 'ProviderNotImplementedError';\n }\n}\n","/**\n * Amego API Configuration\n */\nexport interface AmegoConfig {\n /** API Base URL */\n baseUrl: string;\n /** 賣方統一編號 */\n sellerTaxId: string;\n /** API 金鑰 */\n apiKey: string;\n /** 字軌 API 代碼 (optional, for track allocation) */\n trackApiCode?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Amego API endpoints\n *\n * 根據光貿 API 文件規格 (MIG 4.0, 2025年1月起)\n * 所有路徑都以 /json/ 開頭\n */\nexport const AMEGO_ENDPOINTS = {\n // Invoice endpoints (發票)\n INVOICE_ISSUE: '/json/f0401', // 開立發票 (自動配號)\n INVOICE_ISSUE_CUSTOM: '/json/f0401_custom', // 開立發票 (API 配號)\n INVOICE_VOID: '/json/f0501', // 作廢發票\n INVOICE_QUERY: '/json/invoice_query', // 查詢單張發票\n INVOICE_LIST: '/json/invoice_list', // 查詢發票列表\n INVOICE_STATUS: '/json/invoice_status', // 查詢發票狀態\n INVOICE_FILE: '/json/invoice_file', // 下載發票檔案 (PDF)\n INVOICE_PRINT: '/json/invoice_print', // 產出列印格式字串\n\n // Allowance endpoints (折讓)\n ALLOWANCE_ISSUE: '/json/g0401', // 開立折讓\n ALLOWANCE_VOID: '/json/g0501', // 作廢折讓\n ALLOWANCE_QUERY: '/json/allowance_query', // 查詢單張折讓\n ALLOWANCE_LIST: '/json/allowance_list', // 查詢折讓列表\n ALLOWANCE_STATUS: '/json/allowance_status', // 查詢折讓狀態\n ALLOWANCE_FILE: '/json/allowance_file', // 下載折讓檔案 (PDF)\n ALLOWANCE_PRINT: '/json/allowance_print', // 產出折讓列印格式字串\n\n // Utility endpoints (其他)\n BARCODE_CHECK: '/json/barcode', // 手機條碼查詢\n BAN_QUERY: '/json/ban_query', // 公司名稱查詢\n TRACK_ALL: '/json/track_all', // 所有字軌資料\n TRACK_GET: '/json/track_get', // 字軌取號 (API 配號專用)\n TRACK_STATUS: '/json/track_status', // 字軌狀態 (API 配號專用)\n LOTTERY_TYPE: '/json/lottery_type', // 獎項定義\n LOTTERY_STATUS: '/json/lottery_status', // 中獎發票\n} as const;\n\n/**\n * Default configuration values\n */\nexport const AMEGO_DEFAULTS = {\n TIMEOUT: 30000,\n BASE_URL: 'https://invoice-api.amego.tw',\n} as const;\n","import { createHash } from 'crypto';\n\n/**\n * Amego API Signer\n *\n * Generates MD5 signatures for Amego API requests.\n * Format: MD5(data + time + apiKey)\n *\n * 根據光貿 API 文件規格:sign = md5(data JSON string + time + APP Key)\n */\nexport class AmegoSigner {\n constructor(private readonly apiKey: string) {}\n\n /**\n * Generate signature for API request\n *\n * @param data - Request data as JSON string\n * @param timestamp - Unix timestamp in seconds\n * @returns MD5 signature in lowercase hex\n */\n sign(data: string, timestamp: number): string {\n // 格式: md5(data + time + apiKey)\n const payload = `${data}${timestamp}${this.apiKey}`;\n return createHash('md5').update(payload, 'utf8').digest('hex').toLowerCase();\n }\n\n /**\n * Generate current timestamp (Unix seconds)\n */\n static getTimestamp(): number {\n return Math.floor(Date.now() / 1000);\n }\n}\n","import { AmegoConfig, AMEGO_DEFAULTS } from './AmegoConfig.js';\nimport { AmegoSigner } from './AmegoSigner.js';\nimport { ProviderApiError, NetworkError } from '../../errors/index.js';\n\n/**\n * Amego API Response wrapper\n *\n * 光貿 API 回應格式:\n * - code: 回應代碼 (0 = 成功)\n * - msg: 回應訊息\n * - 其他欄位視 API 而定 (data, page_total, page_now, data_total 等)\n */\nexport interface AmegoResponse {\n /** 回應代碼 (0 = success) */\n code: number;\n /** 回應訊息 */\n msg: string;\n /** 其他欄位 */\n [key: string]: unknown;\n}\n\n/**\n * Amego HTTP Client\n *\n * Low-level HTTP client for Amego API communication.\n *\n * 根據光貿 API 文件規格:\n * - Content-Type: application/x-www-form-urlencoded\n * - 參數: invoice (統編), data (JSON string), time (timestamp), sign (MD5 signature)\n */\nexport class AmegoClient {\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly signer: AmegoSigner;\n private readonly sellerTaxId: string;\n\n constructor(config: AmegoConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.timeout = config.timeout ?? AMEGO_DEFAULTS.TIMEOUT;\n this.signer = new AmegoSigner(config.apiKey);\n this.sellerTaxId = config.sellerTaxId;\n }\n\n /**\n * Send POST request to Amego API\n *\n * 請求格式:application/x-www-form-urlencoded\n * 參數:\n * - invoice: 統一編號\n * - data: URL encoded JSON string\n * - time: Unix timestamp\n * - sign: MD5(data + time + apiKey)\n */\n async post<T>(endpoint: string, data: object): Promise<T> {\n const timestamp = AmegoSigner.getTimestamp();\n const jsonData = JSON.stringify(data);\n const signature = this.signer.sign(jsonData, timestamp);\n\n const url = `${this.baseUrl}${endpoint}`;\n\n // 建立 form-urlencoded body\n const formData = new URLSearchParams();\n formData.append('invoice', this.sellerTaxId);\n formData.append('data', jsonData);\n formData.append('time', timestamp.toString());\n formData.append('sign', signature);\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: formData.toString(),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new ProviderApiError(\n 'amego',\n `HTTP ${response.status}`,\n `HTTP error: ${response.status} ${response.statusText}`\n );\n }\n\n const result = (await response.json()) as AmegoResponse;\n\n // 光貿 API 回應 code=0 表示成功\n if (result.code !== 0) {\n throw new ProviderApiError(\n 'amego',\n String(result.code),\n result.msg || 'Unknown error'\n );\n }\n\n // 回傳完整的回應物件 (讓呼叫者取需要的欄位)\n // 對於一般 API,資料在 result.data\n // 對於列表 API,page_total, page_now, data_total, data 都在 root level\n return result as unknown as T;\n } catch (error) {\n if (error instanceof ProviderApiError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new NetworkError(`Request timeout after ${this.timeout}ms`);\n }\n throw new NetworkError(error.message);\n }\n\n throw new NetworkError('Unknown network error');\n }\n }\n\n /**\n * Send POST request and return raw response (for debugging)\n */\n async postRaw(endpoint: string, data: object): Promise<{\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string;\n parsed?: AmegoResponse;\n }> {\n const timestamp = AmegoSigner.getTimestamp();\n const jsonData = JSON.stringify(data);\n const signature = this.signer.sign(jsonData, timestamp);\n\n const url = `${this.baseUrl}${endpoint}`;\n\n const formData = new URLSearchParams();\n formData.append('invoice', this.sellerTaxId);\n formData.append('data', jsonData);\n formData.append('time', timestamp.toString());\n formData.append('sign', signature);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: formData.toString(),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const headers: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n const body = await response.text();\n let parsed: AmegoResponse | undefined;\n try {\n parsed = JSON.parse(body);\n } catch {\n // Not JSON\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n parsed,\n };\n }\n}\n","import { InvalidMoneyError } from '../../errors/index.js';\n\n/**\n * Money Value Object\n *\n * Handles monetary amounts with proper precision for Taiwan e-invoice.\n * Supports up to 7 decimal places as per API specification.\n */\nexport class Money {\n private constructor(private readonly amount: number) {}\n\n /**\n * Create Money from a number\n * @throws InvalidMoneyError if the amount is invalid\n */\n static create(amount: number): Money {\n if (!Number.isFinite(amount)) {\n throw new InvalidMoneyError(amount, 'Amount must be a finite number');\n }\n\n return new Money(amount);\n }\n\n /**\n * Create Money representing zero\n */\n static zero(): Money {\n return new Money(0);\n }\n\n /**\n * Create Money from cents (integer)\n */\n static fromCents(cents: number): Money {\n if (!Number.isInteger(cents)) {\n throw new InvalidMoneyError(cents, 'Cents must be an integer');\n }\n return new Money(cents / 100);\n }\n\n /**\n * Get the numeric value\n */\n toNumber(): number {\n return this.amount;\n }\n\n /**\n * Get value rounded to integer\n */\n toInteger(): number {\n return Math.round(this.amount);\n }\n\n /**\n * Get value in cents (integer)\n */\n toCents(): number {\n return Math.round(this.amount * 100);\n }\n\n /**\n * Add another Money value\n */\n add(other: Money): Money {\n return new Money(this.amount + other.amount);\n }\n\n /**\n * Subtract another Money value\n */\n subtract(other: Money): Money {\n return new Money(this.amount - other.amount);\n }\n\n /**\n * Multiply by a factor\n */\n multiply(factor: number): Money {\n return new Money(this.amount * factor);\n }\n\n /**\n * Divide by a divisor\n */\n divide(divisor: number): Money {\n if (divisor === 0) {\n throw new InvalidMoneyError(this.amount, 'Cannot divide by zero');\n }\n return new Money(this.amount / divisor);\n }\n\n /**\n * Check if this amount is zero\n */\n isZero(): boolean {\n return this.amount === 0;\n }\n\n /**\n * Check if this amount is positive\n */\n isPositive(): boolean {\n return this.amount > 0;\n }\n\n /**\n * Check if this amount is negative\n */\n isNegative(): boolean {\n return this.amount < 0;\n }\n\n /**\n * Get absolute value\n */\n abs(): Money {\n return new Money(Math.abs(this.amount));\n }\n\n /**\n * Round to specified decimal places\n */\n round(decimals: number = 0): Money {\n const factor = Math.pow(10, decimals);\n return new Money(Math.round(this.amount * factor) / factor);\n }\n\n /**\n * Format as string with specified decimal places\n */\n format(decimals: number = 2): string {\n return this.amount.toFixed(decimals);\n }\n\n /**\n * Check equality with another Money\n */\n equals(other: Money): boolean {\n return this.amount === other.amount;\n }\n\n /**\n * Compare with another Money\n * Returns: -1 if less, 0 if equal, 1 if greater\n */\n compareTo(other: Money): number {\n if (this.amount < other.amount) return -1;\n if (this.amount > other.amount) return 1;\n return 0;\n }\n\n toString(): string {\n return this.amount.toString();\n }\n}\n","import { ValidationError } from '../../errors/index.js';\n\n/**\n * Carrier type codes as defined by Taiwan MOF\n */\nexport enum CarrierType {\n /** 無載具 */\n NONE = '',\n /** 手機條碼 */\n MOBILE = '3J0002',\n /** 自然人憑證 */\n CERTIFICATE = 'CQ0001',\n /** 光貿會員載具 */\n AMEGO_MEMBER = 'amego',\n}\n\n/**\n * Carrier Value Object\n *\n * 發票載具資訊。支援手機條碼、自然人憑證等。\n */\nexport class Carrier {\n private constructor(\n private readonly _type: CarrierType,\n private readonly _id: string\n ) {}\n\n /**\n * Create a \"no carrier\" instance\n */\n static none(): Carrier {\n return new Carrier(CarrierType.NONE, '');\n }\n\n /**\n * Create a mobile barcode carrier (手機條碼)\n *\n * @param barcode The mobile barcode (format: /XXXXXXX)\n */\n static mobile(barcode: string): Carrier {\n const trimmed = barcode?.trim();\n\n if (!trimmed) {\n throw new ValidationError('carrier', 'Mobile barcode is required');\n }\n\n // 手機條碼格式: / + 7碼英數字 (大寫)\n const pattern = /^\\/[0-9A-Z.+-]{7}$/;\n if (!pattern.test(trimmed.toUpperCase())) {\n throw new ValidationError(\n 'carrier',\n 'Invalid mobile barcode format. Expected: /XXXXXXX'\n );\n }\n\n return new Carrier(CarrierType.MOBILE, trimmed.toUpperCase());\n }\n\n /**\n * Create a certificate carrier (自然人憑證)\n *\n * @param certId The certificate ID (16 characters)\n */\n static certificate(certId: string): Carrier {\n const trimmed = certId?.trim();\n\n if (!trimmed) {\n throw new ValidationError('carrier', 'Certificate ID is required');\n }\n\n // 自然人憑證格式: 16碼英數字\n if (!/^[A-Z0-9]{16}$/i.test(trimmed)) {\n throw new ValidationError(\n 'carrier',\n 'Invalid certificate ID format. Expected: 16 alphanumeric characters'\n );\n }\n\n return new Carrier(CarrierType.CERTIFICATE, trimmed.toUpperCase());\n }\n\n /**\n * Create a custom carrier\n */\n static custom(type: CarrierType, id: string): Carrier {\n if (type === CarrierType.NONE) {\n return Carrier.none();\n }\n return new Carrier(type, id?.trim() ?? '');\n }\n\n /**\n * Get the carrier type\n */\n get type(): CarrierType {\n return this._type;\n }\n\n /**\n * Get the carrier type code (for API)\n */\n get typeCode(): string {\n return this._type;\n }\n\n /**\n * Get the carrier ID\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Check if this is an empty carrier\n */\n get isEmpty(): boolean {\n return this._type === CarrierType.NONE;\n }\n\n /**\n * Check if this is a mobile barcode\n */\n get isMobile(): boolean {\n return this._type === CarrierType.MOBILE;\n }\n\n /**\n * Check if this is a certificate\n */\n get isCertificate(): boolean {\n return this._type === CarrierType.CERTIFICATE;\n }\n}\n","import { ValidationError } from '../../errors/index.js';\n\n/**\n * Donation Value Object\n *\n * 發票捐贈資訊(愛心碼)。\n * 愛心碼為 3-7 碼數字。\n */\nexport class Donation {\n private constructor(private readonly _code: string) {}\n\n /**\n * Create a \"no donation\" instance\n */\n static none(): Donation {\n return new Donation('');\n }\n\n /**\n * Create a donation with code (愛心碼)\n *\n * @param code The donation code (3-7 digits)\n */\n static code(code: string): Donation {\n const trimmed = code?.trim();\n\n if (!trimmed) {\n throw new ValidationError('donation', 'Donation code is required');\n }\n\n // 愛心碼格式: 3-7 碼數字\n if (!/^\\d{3,7}$/.test(trimmed)) {\n throw new ValidationError(\n 'donation',\n 'Invalid donation code format. Expected: 3-7 digits'\n );\n }\n\n return new Donation(trimmed);\n }\n\n /**\n * Try to create a Donation, returns none() if invalid\n */\n static tryCreate(code: string): Donation {\n try {\n return Donation.code(code);\n } catch {\n return Donation.none();\n }\n }\n\n /**\n * Get the donation code\n */\n get code(): string {\n return this._code;\n }\n\n /**\n * Check if this is an empty donation (not donating)\n */\n get isEmpty(): boolean {\n return this._code.length === 0;\n }\n\n /**\n * Check if this invoice is being donated\n */\n get isDonating(): boolean {\n return this._code.length > 0;\n }\n\n /**\n * Get the string value\n */\n toString(): string {\n return this._code;\n }\n}\n","/**\n * Tax Type (課稅別)\n *\n * Represents the tax classification for invoice items and invoices.\n */\nexport enum TaxType {\n /** 應稅 (Taxable) - 5% VAT */\n TAXABLE = 1,\n /** 零稅率 (Zero-rated) */\n ZERO_RATED = 2,\n /** 免稅 (Tax-exempt) */\n TAX_EXEMPT = 3,\n /** 應稅(特種稅率)(Special tax rate) */\n SPECIAL_TAX = 4,\n /** 混合應稅與免稅或零稅率 (Mixed) - Only for C0401 */\n MIXED = 9,\n}\n\n/**\n * Zero Tax Rate Reason (零稅率原因)\n *\n * Required when tax type is ZERO_RATED.\n */\nexport enum ZeroTaxRateReason {\n /** 第一款 外銷貨物 */\n EXPORT_GOODS = 71,\n /** 第二款 與外銷有關之勞務,或在國內提供而在國外使用之勞務 */\n EXPORT_SERVICES = 72,\n /** 第三款 依法設立之免稅商店銷售與過境或出境旅客之貨物 */\n DUTY_FREE_SHOP = 73,\n /** 第四款 銷售與保稅區營業人供營運之貨物或勞務 */\n BONDED_AREA = 74,\n /** 第五款 國際間之運輸 */\n INTERNATIONAL_TRANSPORT = 75,\n /** 第六款 國際運輸用之船舶、航空器及遠洋漁船 */\n INTERNATIONAL_VESSELS = 76,\n /** 第七款 銷售與國際運輸用之船舶、航空器及遠洋漁船所使用之貨物或修繕勞務 */\n VESSEL_SUPPLIES = 77,\n /** 第八款 保稅區營業人銷售與課稅區營業人未輸往課稅區而直接出口之貨物 */\n BONDED_DIRECT_EXPORT = 78,\n /** 第九款 保稅區營業人銷售與課稅區營業人存入自由港區事業或海關管理之保稅倉庫、物流中心以供外銷之貨物 */\n BONDED_WAREHOUSE = 79,\n}\n\n/**\n * Customs Clearance Mark (通關方式註記)\n *\n * Required when tax type is ZERO_RATED.\n */\nexport enum CustomsClearanceMark {\n /** 非經海關出口 */\n NON_CUSTOMS = 1,\n /** 經海關出口 */\n CUSTOMS = 2,\n}\n\n/**\n * Tax rate constant\n */\nexport const TAX_RATE = 0.05;\n\n/**\n * Helper functions for tax type\n */\nexport const TaxTypeHelper = {\n /**\n * Check if the tax type is taxable (includes tax amount)\n */\n isTaxable(type: TaxType): boolean {\n return type === TaxType.TAXABLE || type === TaxType.SPECIAL_TAX;\n },\n\n /**\n * Check if the tax type requires customs clearance mark\n */\n requiresCustomsClearance(type: TaxType): boolean {\n return type === TaxType.ZERO_RATED;\n },\n\n /**\n * Check if the tax type requires zero tax rate reason\n */\n requiresZeroTaxReason(type: TaxType): boolean {\n return type === TaxType.ZERO_RATED;\n },\n\n /**\n * Get display name for tax type\n */\n getDisplayName(type: TaxType): string {\n switch (type) {\n case TaxType.TAXABLE:\n return '應稅';\n case TaxType.ZERO_RATED:\n return '零稅率';\n case TaxType.TAX_EXEMPT:\n return '免稅';\n case TaxType.SPECIAL_TAX:\n return '應稅(特種稅率)';\n case TaxType.MIXED:\n return '混合稅';\n default:\n return '未知';\n }\n },\n};\n","import { InvoiceNumber } from './InvoiceNumber.js';\nimport { InvoiceItem } from './InvoiceItem.js';\nimport { Money } from '../shared/Money.js';\nimport { OrderId } from '../shared/OrderId.js';\nimport { Buyer } from '../shared/Buyer.js';\nimport { Carrier } from '../shared/Carrier.js';\nimport { Donation } from '../shared/Donation.js';\nimport {\n TaxType,\n ZeroTaxRateReason,\n CustomsClearanceMark,\n} from '../shared/TaxType.js';\nimport { ValidationError } from '../../errors/index.js';\n\n/**\n * Invoice status for upload to government\n */\nexport enum InvoiceStatus {\n /** 待處理 */\n PENDING = 1,\n /** 上傳中 */\n UPLOADING = 2,\n /** 已上傳 */\n UPLOADED = 3,\n /** 處理中 */\n PROCESSING = 31,\n /** 處理完成/待確認 */\n AWAITING_CONFIRMATION = 32,\n /** 錯誤 */\n ERROR = 91,\n /** 完成 */\n COMPLETED = 99,\n}\n\n/**\n * Invoice type based on MIG\n */\nexport enum InvoiceType {\n /** B2C 存證發票開立 */\n B2C_ISSUE = 'C0401',\n /** B2C 存證發票作廢 */\n B2C_VOID = 'C0501',\n /** B2C 存證發票註銷 */\n B2C_CANCEL = 'C0701',\n /** B2B 存證發票開立 */\n B2B_ISSUE = 'A0401',\n /** B2B 存證發票作廢 */\n B2B_VOID = 'A0501',\n}\n\n/**\n * Properties for creating an Invoice\n */\nexport interface CreateInvoiceProps {\n /** 訂單編號 */\n orderId: OrderId;\n /** 買方資訊 */\n buyer: Buyer;\n /** 商品明細 */\n items: InvoiceItem[];\n /** 載具 (optional) */\n carrier?: Carrier;\n /** 捐贈 (optional) */\n donation?: Donation;\n /** 總備註 (max 200 chars, optional) */\n remark?: string;\n /** 指定字軌代碼 (optional) */\n trackApiCode?: string;\n /** 通關方式 (required for zero-rated) */\n customsClearanceMark?: CustomsClearanceMark;\n /** 零稅率原因 (required for zero-rated) */\n zeroTaxRateReason?: ZeroTaxRateReason;\n /** 品牌名稱 (optional) */\n brandName?: string;\n /** 明細含稅或未稅 (default: true = 含稅) */\n pricesIncludeTax?: boolean;\n}\n\n/**\n * Invoice Aggregate Root\n *\n * Represents an e-invoice in Taiwan's electronic invoice system.\n */\nexport class Invoice {\n private _invoiceNumber?: InvoiceNumber;\n private _invoiceTime?: Date;\n private _randomNumber?: string;\n\n private constructor(\n private readonly _orderId: OrderId,\n private readonly _buyer: Buyer,\n private readonly _items: InvoiceItem[],\n private readonly _carrier: Carrier,\n private readonly _donation: Donation,\n private readonly _remark: string,\n private readonly _trackApiCode: string,\n private readonly _taxType: TaxType,\n private readonly _customsClearanceMark?: CustomsClearanceMark,\n private readonly _zeroTaxRateReason?: ZeroTaxRateReason,\n private readonly _brandName?: string,\n private readonly _pricesIncludeTax: boolean = true,\n private _status: InvoiceStatus = InvoiceStatus.PENDING,\n private _type: InvoiceType = InvoiceType.B2C_ISSUE\n ) {}\n\n /**\n * Create a new Invoice\n */\n static create(props: CreateInvoiceProps): Invoice {\n // Validate items\n if (!props.items || props.items.length === 0) {\n throw new ValidationError('items', 'At least one item is required');\n }\n if (props.items.length > 9999) {\n throw new ValidationError('items', 'Maximum 9999 items allowed');\n }\n\n // Validate remark\n if (props.remark && props.remark.length > 200) {\n throw new ValidationError(\n 'remark',\n 'Remark must not exceed 200 characters'\n );\n }\n\n // Determine tax type from items\n const taxType = Invoice.determineTaxType(props.items);\n\n // Validate zero-rated requirements\n if (taxType === TaxType.ZERO_RATED) {\n if (!props.customsClearanceMark) {\n throw new ValidationError(\n 'customsClearanceMark',\n 'Customs clearance mark is required for zero-rated invoices'\n );\n }\n if (!props.zeroTaxRateReason) {\n throw new ValidationError(\n 'zeroTaxRateReason',\n 'Zero tax rate reason is required for zero-rated invoices'\n );\n }\n }\n\n // Validate carrier and donation exclusivity\n const hasCarrier = props.carrier && !props.carrier.isEmpty;\n const hasDonation = props.donation && props.donation.isDonating;\n if (hasCarrier && hasDonation) {\n throw new ValidationError(\n 'carrier',\n 'Cannot have both carrier and donation on the same invoice'\n );\n }\n\n // Determine invoice type (B2B or B2C)\n const isB2B = props.buyer.isCompany;\n\n return new Invoice(\n props.orderId,\n props.buyer,\n props.items,\n props.carrier ?? Carrier.none(),\n props.donation ?? Donation.none(),\n props.remark?.trim() ?? '',\n props.trackApiCode?.trim() ?? '',\n taxType,\n props.customsClearanceMark,\n props.zeroTaxRateReason,\n props.brandName?.trim(),\n props.pricesIncludeTax ?? true,\n InvoiceStatus.PENDING,\n isB2B ? InvoiceType.B2B_ISSUE : InvoiceType.B2C_ISSUE\n );\n }\n\n /**\n * Determine overall tax type from items\n */\n private static determineTaxType(items: InvoiceItem[]): TaxType {\n const taxTypes = new Set(items.map((item) => item.taxType));\n\n if (taxTypes.size === 1) {\n return items[0]!.taxType;\n }\n\n // Mixed tax types\n return TaxType.MIXED;\n }\n\n // --- Calculated amounts ---\n\n /**\n * Calculate sales amount (應稅銷售額)\n */\n calculateSalesAmount(): Money {\n return this._items\n .filter((item) => item.taxType === TaxType.TAXABLE)\n .reduce((sum, item) => sum.add(item.amount), Money.zero())\n .round();\n }\n\n /**\n * Calculate free tax sales amount (免稅銷售額)\n */\n calculateFreeTaxSalesAmount(): Money {\n return this._items\n .filter((item) => item.taxType === TaxType.TAX_EXEMPT)\n .reduce((sum, item) => sum.add(item.amount), Money.zero())\n .round();\n }\n\n /**\n * Calculate zero tax sales amount (零稅率銷售額)\n */\n calculateZeroTaxSalesAmount(): Money {\n return this._items\n .filter((item) => item.taxType === TaxType.ZERO_RATED)\n .reduce((sum, item) => sum.add(item.amount), Money.zero())\n .round();\n }\n\n /**\n * Calculate tax amount (營業稅額)\n */\n calculateTaxAmount(): Money {\n // B2C without tax ID: tax amount is always 0\n if (this._buyer.isAnonymous) {\n return Money.zero();\n }\n\n // B2B: calculate 5% tax\n const salesAmount = this.calculateSalesAmount();\n\n if (this._pricesIncludeTax) {\n // Tax included: tax = salesAmount - round(salesAmount / 1.05)\n const beforeTax = salesAmount.divide(1.05).round();\n return salesAmount.subtract(beforeTax);\n } else {\n // Tax excluded: tax = round(salesAmount * 0.05)\n return salesAmount.multiply(0.05).round();\n }\n }\n\n /**\n * Calculate total amount (總計)\n */\n calculateTotalAmount(): Money {\n const salesAmount = this.calculateSalesAmount();\n const freeTaxAmount = this.calculateFreeTaxSalesAmount();\n const zeroTaxAmount = this.calculateZeroTaxSalesAmount();\n const taxAmount = this.calculateTaxAmount();\n\n if (this._pricesIncludeTax) {\n // Prices include tax\n return salesAmount.add(freeTaxAmount).add(zeroTaxAmount);\n } else {\n // Prices exclude tax\n return salesAmount\n .add(freeTaxAmount)\n .add(zeroTaxAmount)\n .add(taxAmount);\n }\n }\n\n // --- State mutations ---\n\n /**\n * Set invoice number after issuing\n */\n setInvoiceNumber(\n number: InvoiceNumber,\n time: Date,\n randomNumber: string\n ): void {\n this._invoiceNumber = number;\n this._invoiceTime = time;\n this._randomNumber = randomNumber;\n }\n\n /**\n * Update status\n */\n updateStatus(status: InvoiceStatus): void {\n this._status = status;\n }\n\n /**\n * Mark as voided\n */\n markAsVoided(): void {\n this._type = this.isB2B ? InvoiceType.B2B_VOID : InvoiceType.B2C_VOID;\n }\n\n // --- Getters ---\n\n get orderId(): OrderId {\n return this._orderId;\n }\n\n get invoiceNumber(): InvoiceNumber | undefined {\n return this._invoiceNumber;\n }\n\n get invoiceTime(): Date | undefined {\n return this._invoiceTime;\n }\n\n get randomNumber(): string | undefined {\n return this._randomNumber;\n }\n\n get buyer(): Buyer {\n return this._buyer;\n }\n\n get carrier(): Carrier {\n return this._carrier;\n }\n\n get donation(): Donation {\n return this._donation;\n }\n\n get remark(): string {\n return this._remark;\n }\n\n get trackApiCode(): string {\n return this._trackApiCode;\n }\n\n get items(): readonly InvoiceItem[] {\n return this._items;\n }\n\n get taxType(): TaxType {\n return this._taxType;\n }\n\n get customsClearanceMark(): CustomsClearanceMark | undefined {\n return this._customsClearanceMark;\n }\n\n get zeroTaxRateReason(): ZeroTaxRateReason | undefined {\n return this._zeroTaxRateReason;\n }\n\n get brandName(): string | undefined {\n return this._brandName;\n }\n\n get pricesIncludeTax(): boolean {\n return this._pricesIncludeTax;\n }\n\n get status(): InvoiceStatus {\n return this._status;\n }\n\n get type(): InvoiceType {\n return this._type;\n }\n\n /**\n * Check if this is a B2B invoice (has buyer tax ID)\n */\n get isB2B(): boolean {\n return this._buyer.isCompany;\n }\n\n /**\n * Check if invoice has been issued\n */\n get isIssued(): boolean {\n return this._invoiceNumber !== undefined;\n }\n\n /**\n * Check if invoice has carrier\n */\n get hasCarrier(): boolean {\n return !this._carrier.isEmpty;\n }\n\n /**\n * Check if invoice is donated\n */\n get isDonated(): boolean {\n return this._donation.isDonating;\n }\n\n // --- Backward compatibility getters (deprecated) ---\n\n /** @deprecated Use buyer.taxId instead */\n get buyerTaxId() {\n return this._buyer.taxId;\n }\n\n /** @deprecated Use buyer.name instead */\n get buyerName(): string {\n return this._buyer.name;\n }\n\n /** @deprecated Use buyer.address instead */\n get buyerAddress(): string {\n return this._buyer.address;\n }\n\n /** @deprecated Use buyer.phone instead */\n get buyerPhone(): string {\n return this._buyer.phone;\n }\n\n /** @deprecated Use buyer.email instead */\n get buyerEmail(): string {\n return this._buyer.email;\n }\n\n /** @deprecated Use donation.code instead */\n get donationCode(): string {\n return this._donation.code;\n }\n}\n","import { InvoiceNumber } from '../invoice/InvoiceNumber.js';\nimport { AllowanceItem } from './AllowanceItem.js';\nimport { TaxId } from '../shared/TaxId.js';\nimport { Money } from '../shared/Money.js';\nimport { TaxType, TAX_RATE } from '../shared/TaxType.js';\nimport { ValidationError } from '../../errors/index.js';\n\n/**\n * Allowance status\n */\nexport enum AllowanceStatus {\n /** 待處理 */\n PENDING = 1,\n /** 上傳中 */\n UPLOADING = 2,\n /** 已上傳 */\n UPLOADED = 3,\n /** 處理中 */\n PROCESSING = 31,\n /** 處理完成/待確認 */\n AWAITING_CONFIRMATION = 32,\n /** 錯誤 */\n ERROR = 91,\n /** 完成 */\n COMPLETED = 99,\n}\n\n/**\n * Allowance type based on MIG\n */\nexport enum AllowanceType {\n /** B2C 存證折讓開立 */\n B2C_ISSUE = 'C0701',\n /** B2C 存證折讓作廢 */\n B2C_VOID = 'C0801',\n /** B2B 存證折讓開立 */\n B2B_ISSUE = 'A0701',\n /** B2B 存證折讓作廢 */\n B2B_VOID = 'A0801',\n}\n\n/**\n * Properties for creating an Allowance\n */\nexport interface CreateAllowanceProps {\n /** 原發票號碼 */\n originalInvoiceNumber: InvoiceNumber;\n /** 原發票日期 */\n originalInvoiceDate: Date;\n /** 買方統一編號 */\n buyerTaxId: TaxId;\n /** 賣方統一編號 */\n sellerTaxId: TaxId;\n /** 折讓明細 */\n items: AllowanceItem[];\n /** 買方名稱 (optional) */\n buyerName?: string;\n /** 賣方名稱 (optional) */\n sellerName?: string;\n /** 明細含稅或未稅 (default: true = 含稅) */\n pricesIncludeTax?: boolean;\n}\n\n/**\n * Allowance Aggregate Root\n *\n * Represents an allowance (折讓) in Taiwan's electronic invoice system.\n * Used for partial refunds or corrections to invoices.\n */\nexport class Allowance {\n private _allowanceNumber?: string;\n private _allowanceDate?: Date;\n\n private constructor(\n private readonly _originalInvoiceNumber: InvoiceNumber,\n private readonly _originalInvoiceDate: Date,\n private readonly _buyerTaxId: TaxId,\n private readonly _sellerTaxId: TaxId,\n private readonly _buyerName: string,\n private readonly _sellerName: string,\n private readonly _items: AllowanceItem[],\n private readonly _taxType: TaxType,\n private readonly _pricesIncludeTax: boolean = true,\n private _status: AllowanceStatus = AllowanceStatus.PENDING,\n private _type: AllowanceType = AllowanceType.B2C_ISSUE\n ) {}\n\n /**\n * Create a new Allowance\n */\n static create(props: CreateAllowanceProps): Allowance {\n // Validate items\n if (!props.items || props.items.length === 0) {\n throw new ValidationError('items', 'At least one item is required');\n }\n if (props.items.length > 9999) {\n throw new ValidationError('items', 'Maximum 9999 items allowed');\n }\n\n // Determine tax type from items\n const taxType = Allowance.determineTaxType(props.items);\n\n // Determine allowance type (B2B or B2C)\n const isB2B = !props.buyerTaxId.isNone();\n\n return new Allowance(\n props.originalInvoiceNumber,\n props.originalInvoiceDate,\n props.buyerTaxId,\n props.sellerTaxId,\n props.buyerName?.trim() ?? '',\n props.sellerName?.trim() ?? '',\n props.items,\n taxType,\n props.pricesIncludeTax ?? true,\n AllowanceStatus.PENDING,\n isB2B ? AllowanceType.B2B_ISSUE : AllowanceType.B2C_ISSUE\n );\n }\n\n /**\n * Determine overall tax type from items\n */\n private static determineTaxType(items: AllowanceItem[]): TaxType {\n const taxTypes = new Set(items.map((item) => item.taxType));\n\n if (taxTypes.size === 1) {\n return items[0]!.taxType;\n }\n\n // Mixed tax types\n return TaxType.MIXED;\n }\n\n // --- Calculated amounts ---\n\n /**\n * Calculate taxable sales amount (應稅銷售額)\n */\n calculateTaxableAmount(): Money {\n return this._items\n .filter((item) => item.taxType === TaxType.TAXABLE)\n .reduce((sum, item) => sum.add(item.amount), Money.zero())\n .round();\n }\n\n /**\n * Calculate free tax sales amount (免稅銷售額)\n */\n calculateFreeTaxAmount(): Money {\n return this._items\n .filter((item) => item.taxType === TaxType.TAX_EXEMPT)\n .reduce((sum, item) => sum.add(item.amount), Money.zero())\n .round();\n }\n\n /**\n * Calculate zero tax sales amount (零稅率銷售額)\n */\n calculateZeroTaxAmount(): Money {\n return this._items\n .filter((item) => item.taxType === TaxType.ZERO_RATED)\n .reduce((sum, item) => sum.add(item.amount), Money.zero())\n .round();\n }\n\n /**\n * Calculate tax amount (營業稅額)\n */\n calculateTaxAmount(): Money {\n const taxableAmount = this.calculateTaxableAmount();\n\n if (this._pricesIncludeTax) {\n // Tax included: tax = taxableAmount - round(taxableAmount / 1.05)\n const beforeTax = taxableAmount.divide(1 + TAX_RATE).round();\n return taxableAmount.subtract(beforeTax);\n } else {\n // Tax excluded: tax = round(taxableAmount * 0.05)\n return taxableAmount.multiply(TAX_RATE).round();\n }\n }\n\n /**\n * Calculate total amount (總計)\n */\n calculateTotalAmount(): Money {\n const taxableAmount = this.calculateTaxableAmount();\n const freeTaxAmount = this.calculateFreeTaxAmount();\n const zeroTaxAmount = this.calculateZeroTaxAmount();\n const taxAmount = this.calculateTaxAmount();\n\n if (this._pricesIncludeTax) {\n // Prices include tax\n return taxableAmount.add(freeTaxAmount).add(zeroTaxAmount);\n } else {\n // Prices exclude tax\n return taxableAmount\n .add(freeTaxAmount)\n .add(zeroTaxAmount)\n .add(taxAmount);\n }\n }\n\n // --- State mutations ---\n\n /**\n * Set allowance number after issuing\n */\n setAllowanceNumber(number: string, date: Date): void {\n this._allowanceNumber = number;\n this._allowanceDate = date;\n }\n\n /**\n * Update status\n */\n updateStatus(status: AllowanceStatus): void {\n this._status = status;\n }\n\n /**\n * Mark as voided\n */\n markAsVoided(): void {\n this._type = this.isB2B ? AllowanceType.B2B_VOID : AllowanceType.B2C_VOID;\n }\n\n // --- Getters ---\n\n get originalInvoiceNumber(): InvoiceNumber {\n return this._originalInvoiceNumber;\n }\n\n get originalInvoiceDate(): Date {\n return this._originalInvoiceDate;\n }\n\n get allowanceNumber(): string | undefined {\n return this._allowanceNumber;\n }\n\n get allowanceDate(): Date | undefined {\n return this._allowanceDate;\n }\n\n get buyerTaxId(): TaxId {\n return this._buyerTaxId;\n }\n\n get sellerTaxId(): TaxId {\n return this._sellerTaxId;\n }\n\n get buyerName(): string {\n return this._buyerName;\n }\n\n get sellerName(): string {\n return this._sellerName;\n }\n\n get items(): readonly AllowanceItem[] {\n return this._items;\n }\n\n get taxType(): TaxType {\n return this._taxType;\n }\n\n get pricesIncludeTax(): boolean {\n return this._pricesIncludeTax;\n }\n\n get status(): AllowanceStatus {\n return this._status;\n }\n\n get type(): AllowanceType {\n return this._type;\n }\n\n /**\n * Check if this is a B2B allowance (has buyer tax ID)\n */\n get isB2B(): boolean {\n return !this._buyerTaxId.isNone();\n }\n\n /**\n * Check if allowance has been issued\n */\n get isIssued(): boolean {\n return this._allowanceNumber !== undefined;\n }\n}\n","import { Invoice, InvoiceStatus } from '../../domain/invoice/Invoice.js';\nimport { InvoiceItem } from '../../domain/invoice/InvoiceItem.js';\nimport { Allowance, AllowanceStatus } from '../../domain/allowance/Allowance.js';\nimport { AllowanceItem } from '../../domain/allowance/AllowanceItem.js';\nimport { TaxType } from '../../domain/shared/TaxType.js';\n\n/**\n * Amego API Invoice Item format (ProductItem)\n *\n * 根據光貿 API 文件規格\n */\nexport interface AmegoInvoiceItemPayload {\n /** 品名,不可超過256字 */\n Description: string;\n /** 數量,小數精準度到7位數 */\n Quantity: number;\n /** 單價,預設含稅,小數精準度到7位數 */\n UnitPrice: number;\n /** 小計,小數精準度到7位數 */\n Amount: number;\n /** 單位,不可超過6字 */\n Unit?: string;\n /** 備註,不可超過40字 */\n Remark?: string;\n /** 課稅別 1:應稅 2:零稅率 3:免稅 */\n TaxType: number;\n}\n\n/**\n * Amego API Invoice Issue payload (/json/f0401)\n *\n * 根據光貿 API 文件規格 (MIG 4.0)\n */\nexport interface AmegoInvoiceIssuePayload {\n /** 訂單編號,不可重複,不可超過40字 */\n OrderId: string;\n /** 指定字軌開立 (API指定代碼) */\n TrackApiCode?: string;\n /** 買方統一編號,沒有則填入 0000000000 */\n BuyerIdentifier: string;\n /** 買方名稱 */\n BuyerName: string;\n /** 買方地址 */\n BuyerAddress?: string;\n /** 買方電話 */\n BuyerTelephoneNumber?: string;\n /** 買方電子信箱 */\n BuyerEmailAddress?: string;\n /** 總備註,不可超過200字 */\n MainRemark?: string;\n /** 載具類別 (3J0002: 手機條碼, CQ0001: 自然人憑證, amego: 光貿會員載具) */\n CarrierType?: string;\n /** 載具顯碼 */\n CarrierId1?: string;\n /** 載具隱碼 */\n CarrierId2?: string;\n /** 捐贈碼 */\n NPOBAN?: string;\n /** 商品陣列,最多 9999 筆 */\n ProductItem: AmegoInvoiceItemPayload[];\n /** 應稅銷售額合計 */\n SalesAmount: number;\n /** 免稅銷售額合計 */\n FreeTaxSalesAmount: number;\n /** 零稅率銷售額合計 */\n ZeroTaxSalesAmount: number;\n /** 課稅別 1:應稅 2:零稅率 3:免稅 4:應稅(特種稅率) 9:混合 */\n TaxType: number;\n /** 稅率,為5%時本欄位值為 \"0.05\" */\n TaxRate: string;\n /** 營業稅額。有打統編才需計算5%稅額,沒打統編一律帶0 */\n TaxAmount: number;\n /** 總計 */\n TotalAmount: number;\n /** 通關方式註記 1:非經海關出口 2:經海關出口 (零稅率必填) */\n CustomsClearanceMark?: number;\n /** 零稅率原因 71-79 (零稅率必填) */\n ZeroTaxRateReason?: number;\n /** 品牌名稱 */\n BrandName?: string;\n /** 明細的單價及小計 0:未稅價 1:含稅價 (預設含稅價) */\n DetailVat?: number;\n /** 明細的小計處理方式 0:小數精準度7位 1:四捨五入到整數 */\n DetailAmountRound?: number;\n /** 熱感應機型號代碼 */\n PrinterType?: number;\n /** 熱感應機編碼 1:BIG5 2:GBK 3:UTF-8 */\n PrinterLang?: number;\n /** 是否列印明細 1:列印 0:不列印 */\n PrintDetail?: number;\n}\n\n/**\n * Amego API Invoice Issue response\n */\nexport interface AmegoInvoiceIssueResponse {\n /** 回應代碼 (0 = 成功) */\n code: number;\n /** 錯誤訊息 */\n msg: string;\n /** 發票號碼 */\n invoice_number?: string;\n /** 發票開立時間 (Unix timestamp) */\n invoice_time?: number;\n /** 隨機碼 */\n random_number?: string;\n /** 電子發票的條碼內容 */\n barcode?: string;\n /** 電子發票的左側 QRCODE 內容 */\n qrcode_left?: string;\n /** 電子發票的右側 QRCODE 內容 */\n qrcode_right?: string;\n /** base64編碼的列印格式字串 */\n base64_data?: string;\n}\n\n/**\n * Amego API Invoice Void payload (/json/f0501)\n */\nexport interface AmegoInvoiceVoidPayload {\n /** 發票號碼 */\n CancelInvoiceNumber: string;\n}\n\n/**\n * Amego API Invoice Query payload (/json/invoice_query)\n */\nexport interface AmegoInvoiceQueryPayload {\n /** 查詢類型 order:訂單編號 invoice:發票號碼 */\n type: 'order' | 'invoice';\n /** 訂單編號 (當 type=order 時使用) */\n order_id?: string;\n /** 發票號碼 (當 type=invoice 時使用) */\n invoice_number?: string;\n}\n\n/**\n * Amego API Invoice Query response\n */\nexport interface AmegoInvoiceQueryResponse {\n code: number;\n msg: string;\n data?: {\n invoice_number: string;\n invoice_type: string;\n invoice_status: number;\n invoice_date: string;\n invoice_time: string;\n buyer_identifier: string;\n buyer_name: string;\n buyer_zip: number;\n buyer_address: string;\n buyer_telephone_number: string;\n buyer_email_address: string;\n sales_amount: number;\n free_tax_sales_amount: number;\n zero_tax_sales_amount: number;\n tax_type: number;\n tax_rate: string;\n tax_amount: number;\n total_amount: number;\n print_mark: string;\n random_number: string;\n main_remark: string;\n customs_clearance_mark: number;\n carrier_type: string;\n carrier_id1: string;\n carrier_id2: string;\n npoban: string;\n cancel_date: number;\n invoice_lottery: number;\n order_id: string;\n detail_vat: number;\n detail_amount_round: number;\n create_date: number;\n product_item: Array<{\n tax_type: number;\n description: string;\n unit_price: number;\n quantity: number;\n unit: string;\n amount: number;\n remark: string;\n }>;\n wait?: Array<{\n invoice_type: string;\n create_date: number;\n }>;\n allowance?: Array<{\n invoice_type: number;\n invoice_status: number;\n allowance_type: string;\n allowance_number: string;\n allowance_date: string;\n tax_amount: number;\n total_amount: number;\n }>;\n };\n}\n\n/**\n * Amego API Invoice List payload (/json/invoice_list)\n */\nexport interface AmegoInvoiceListPayload {\n /** 日期條件 1:發票日期 2:建立日期 */\n date_select: number;\n /** 開始日期 YYYYMMDD (Number) */\n date_start: number;\n /** 結束日期 YYYYMMDD (Number) */\n date_end: number;\n /** 每頁顯示資料筆數 20~500 */\n limit?: number;\n /** 目前頁數 */\n page?: number;\n}\n\n/**\n * Amego API Invoice List response\n */\nexport interface AmegoInvoiceListResponse {\n code: number;\n msg: string;\n page_total?: number;\n page_now?: number;\n data_total?: number;\n data?: Array<{\n invoice_number: string;\n invoice_type: string;\n invoice_status: number;\n invoice_date: number;\n invoice_time: string;\n buyer_identifier: string;\n buyer_name: string;\n buyer_zip: number;\n buyer_address: string;\n buyer_telephone_number: string;\n buyer_email_address: string;\n sales_amount: number;\n free_tax_sales_amount: number;\n zero_tax_sales_amount: number;\n tax_type: number;\n tax_rate: string;\n tax_amount: number;\n total_amount: number;\n print_mark: string;\n random_number: string;\n main_remark: string;\n customs_clearance_mark: number;\n zero_tax_rate_reason: number;\n carrier_type: string;\n carrier_id1: string;\n carrier_id2: string;\n npoban: string;\n cancel_date: number;\n invoice_lottery: number;\n order_id: string;\n create_date: number;\n }>;\n}\n\n/**\n * Amego API Invoice Status payload (/json/invoice_status)\n */\nexport interface AmegoInvoiceStatusPayload {\n /** 發票號碼 */\n InvoiceNumber: string;\n}\n\n/**\n * Amego API Invoice Status response\n */\nexport interface AmegoInvoiceStatusResponse {\n code: number;\n msg: string;\n data?: Array<{\n invoice_number: string;\n type: string;\n status: number;\n total_amount: number;\n }>;\n}\n\n/**\n * Amego API Allowance Item format (ProductItem)\n */\nexport interface AmegoAllowanceItemPayload {\n /** 原發票號碼 */\n OriginalInvoiceNumber: string;\n /** 原發票日期 YYYYMMDD (Number) */\n OriginalInvoiceDate: number;\n /** 原品名,不可超過256字 */\n OriginalDescription: string;\n /** 數量 */\n Quantity: number;\n /** 單價 (不含稅) */\n UnitPrice: number;\n /** 小計 (不含稅) */\n Amount: number;\n /** 稅金 */\n Tax: number;\n /** 課稅別 1:應稅 2:零稅率 3:免稅 */\n TaxType: number;\n /** 單位 */\n Unit?: string;\n}\n\n/**\n * Amego API Allowance Issue payload (/json/g0401)\n */\nexport interface AmegoAllowanceIssuePayload {\n /** 折讓單編號,不可重複,不可超過16字 */\n AllowanceNumber: string;\n /** 折讓單日期 YYYYMMDD */\n AllowanceDate: string;\n /** 折讓單種類 1:買方開立折讓證明單 2:賣方折讓證明通知單 */\n AllowanceType: number;\n /** 買方統一編號,沒有則填入 0000000000 */\n BuyerIdentifier: string;\n /** 買方名稱 */\n BuyerName: string;\n /** 買方地址 */\n BuyerAddress?: string;\n /** 買方電話 */\n BuyerTelephoneNumber?: string;\n /** 買方電子信箱 */\n BuyerEmailAddress?: string;\n /** 商品陣列,最多 9999 筆 */\n ProductItem: AmegoAllowanceItemPayload[];\n /** 營業稅額 */\n TaxAmount: number;\n /** 金額合計 (不含稅) */\n TotalAmount: number;\n}\n\n/**\n * Amego API Allowance Issue response\n */\nexport interface AmegoAllowanceIssueResponse {\n code: number;\n msg: string;\n}\n\n/**\n * Amego API Allowance Void payload (/json/g0501)\n */\nexport interface AmegoAllowanceVoidPayload {\n /** 折讓單編號 */\n CancelAllowanceNumber: string;\n}\n\n/**\n * Amego API Allowance Query response\n */\nexport interface AmegoAllowanceQueryResponse {\n code: number;\n msg: string;\n data?: {\n allowance_number: string;\n invoice_type: string;\n invoice_status: number;\n allowance_date: number;\n allowance_type: number;\n buyer_identifier: string;\n buyer_name: string;\n buyer_zip: number;\n buyer_address: string;\n buyer_telephone_number: string;\n buyer_email_address: string;\n tax_amount: number;\n total_amount: number;\n cancel_date: number;\n detail_vat: number;\n create_date: number;\n product_item: Array<{\n original_invoice_number: string;\n original_invoice_date: number;\n tax_type: number;\n description: string;\n unit_price: number;\n quantity: number;\n unit: string;\n amount: number;\n tax: number;\n }>;\n wait?: Array<{\n invoice_type: string;\n create_date: number;\n }>;\n };\n}\n\n/**\n * Amego API Allowance List response\n */\nexport interface AmegoAllowanceListResponse {\n code: number;\n msg: string;\n page_total?: number;\n page_now?: number;\n data_total?: number;\n data?: Array<{\n allowance_number: string;\n invoice_type: string;\n invoice_status: number;\n allowance_date: number;\n allowance_type: number;\n buyer_identifier: string;\n buyer_name: string;\n buyer_zip: number;\n buyer_address: string;\n buyer_telephone_number: string;\n buyer_email_address: string;\n tax_amount: number;\n total_amount: number;\n cancel_date: number;\n create_date: number;\n product_item: Array<{\n original_invoice_date: number;\n original_invoice_number: string;\n tax_type: number;\n description: string;\n unit_price: number;\n quantity: number;\n unit: string;\n amount: number;\n tax: number;\n }>;\n }>;\n}\n\n/**\n * Amego API Allowance Status response\n */\nexport interface AmegoAllowanceStatusResponse {\n code: number;\n msg: string;\n data?: Array<{\n allowance_number: string;\n type: string;\n status: number;\n tax_amount: number;\n total_amount: number;\n }>;\n}\n\n/**\n * Amego Mapper\n *\n * Converts between domain objects and Amego API payloads.\n * 使用光貿 API 文件規格的欄位名稱 (PascalCase)\n */\nexport class AmegoMapper {\n /**\n * Convert Invoice domain object to API payload\n */\n static toInvoicePayload(invoice: Invoice): AmegoInvoiceIssuePayload {\n // Calculate amounts\n const salesAmount = invoice.calculateSalesAmount().toNumber();\n const freeTaxSalesAmount = invoice.calculateFreeTaxSalesAmount().toNumber();\n const zeroTaxSalesAmount = invoice.calculateZeroTaxSalesAmount().toNumber();\n const taxAmount = invoice.calculateTaxAmount().toNumber();\n const totalAmount = invoice.calculateTotalAmount().toNumber();\n\n const payload: AmegoInvoiceIssuePayload = {\n OrderId: invoice.orderId.toString(),\n BuyerIdentifier: invoice.buyer.taxId.isNone()\n ? '0000000000'\n : invoice.buyer.taxId.toString(),\n BuyerName: invoice.buyer.name,\n ProductItem: invoice.items.map(AmegoMapper.toInvoiceItemPayload),\n SalesAmount: salesAmount,\n FreeTaxSalesAmount: freeTaxSalesAmount,\n ZeroTaxSalesAmount: zeroTaxSalesAmount,\n TaxType: AmegoMapper.toApiTaxType(invoice.taxType),\n TaxRate: '0.05',\n TaxAmount: taxAmount,\n TotalAmount: totalAmount,\n DetailVat: invoice.pricesIncludeTax ? 1 : 0,\n };\n\n // Optional fields\n if (invoice.trackApiCode) {\n payload.TrackApiCode = invoice.trackApiCode;\n }\n if (invoice.buyer.address) {\n payload.BuyerAddress = invoice.buyer.address;\n }\n if (invoice.buyer.phone) {\n payload.BuyerTelephoneNumber = invoice.buyer.phone;\n }\n if (invoice.buyer.email) {\n payload.BuyerEmailAddress = invoice.buyer.email;\n }\n if (invoice.remark) {\n payload.MainRemark = invoice.remark;\n }\n if (invoice.hasCarrier) {\n payload.CarrierType = invoice.carrier.typeCode;\n payload.CarrierId1 = invoice.carrier.id;\n payload.CarrierId2 = invoice.carrier.id;\n }\n if (invoice.isDonated) {\n payload.NPOBAN = invoice.donation.code;\n }\n if (invoice.customsClearanceMark !== undefined) {\n payload.CustomsClearanceMark = invoice.customsClearanceMark;\n }\n if (invoice.zeroTaxRateReason !== undefined) {\n payload.ZeroTaxRateReason = invoice.zeroTaxRateReason;\n }\n if (invoice.brandName) {\n payload.BrandName = invoice.brandName;\n }\n\n return payload;\n }\n\n /**\n * Convert InvoiceItem to API payload (ProductItem)\n */\n static toInvoiceItemPayload(item: InvoiceItem): AmegoInvoiceItemPayload {\n const payload: AmegoInvoiceItemPayload = {\n Description: item.description,\n Quantity: item.quantity,\n UnitPrice: item.unitPrice.toNumber(),\n Amount: item.amount.toNumber(),\n TaxType: AmegoMapper.toApiTaxType(item.taxType),\n };\n\n if (item.unit) {\n payload.Unit = item.unit;\n }\n if (item.remark) {\n payload.Remark = item.remark;\n }\n\n return payload;\n }\n\n /**\n * Convert Allowance domain object to API payload\n */\n static toAllowancePayload(\n allowance: Allowance,\n allowanceNumber: string\n ): AmegoAllowanceIssuePayload {\n // Calculate totals\n let totalAmount = 0;\n let taxAmount = 0;\n\n const items = allowance.items.map((item): AmegoAllowanceItemPayload => {\n const amount = item.amount.toNumber();\n const tax = Math.round(amount * 0.05);\n totalAmount += amount;\n taxAmount += tax;\n\n return {\n OriginalInvoiceNumber: allowance.originalInvoiceNumber.toString(),\n OriginalInvoiceDate: AmegoMapper.formatDateNumber(\n allowance.originalInvoiceDate\n ),\n OriginalDescription: item.originalDescription,\n Quantity: item.quantity,\n UnitPrice: item.unitPrice.toNumber(),\n Amount: amount,\n Tax: tax,\n TaxType: AmegoMapper.toApiTaxType(item.taxType),\n Unit: item.unit,\n };\n });\n\n const payload: AmegoAllowanceIssuePayload = {\n AllowanceNumber: allowanceNumber,\n AllowanceDate: AmegoMapper.formatDate(new Date()),\n AllowanceType: 2, // 賣方折讓證明通知單\n BuyerIdentifier: allowance.buyerTaxId.isNone()\n ? '0000000000'\n : allowance.buyerTaxId.toString(),\n BuyerName: allowance.buyerName ?? '',\n ProductItem: items,\n TaxAmount: taxAmount,\n TotalAmount: totalAmount,\n };\n\n return payload;\n }\n\n /**\n * Convert AllowanceItem to API payload\n */\n static toAllowanceItemPayload(\n item: AllowanceItem,\n originalInvoiceNumber: string,\n originalInvoiceDate: Date\n ): AmegoAllowanceItemPayload {\n const amount = item.amount.toNumber();\n const tax = Math.round(amount * 0.05);\n\n return {\n OriginalInvoiceNumber: originalInvoiceNumber,\n OriginalInvoiceDate: AmegoMapper.formatDateNumber(originalInvoiceDate),\n OriginalDescription: item.originalDescription,\n Quantity: item.quantity,\n UnitPrice: item.unitPrice.toNumber(),\n Amount: amount,\n Tax: tax,\n TaxType: AmegoMapper.toApiTaxType(item.taxType),\n Unit: item.unit,\n };\n }\n\n /**\n * Convert domain TaxType to API tax type number\n */\n static toApiTaxType(taxType: TaxType): number {\n switch (taxType) {\n case TaxType.TAXABLE:\n return 1;\n case TaxType.ZERO_RATED:\n return 2;\n case TaxType.TAX_EXEMPT:\n return 3;\n case TaxType.MIXED:\n return 9;\n default:\n return 1;\n }\n }\n\n /**\n * Convert API tax type number to domain TaxType\n */\n static fromApiTaxType(apiTaxType: number): TaxType {\n switch (apiTaxType) {\n case 1:\n return TaxType.TAXABLE;\n case 2:\n return TaxType.ZERO_RATED;\n case 3:\n return TaxType.TAX_EXEMPT;\n case 4:\n return TaxType.TAXABLE; // 特種稅率 -> 應稅\n case 9:\n return TaxType.MIXED;\n default:\n return TaxType.TAXABLE;\n }\n }\n\n /**\n * Convert API status code to InvoiceStatus\n */\n static toInvoiceStatus(status: number): InvoiceStatus {\n switch (status) {\n case 1:\n return InvoiceStatus.PENDING;\n case 2:\n return InvoiceStatus.UPLOADING;\n case 3:\n return InvoiceStatus.UPLOADED;\n case 31:\n return InvoiceStatus.PROCESSING;\n case 32:\n return InvoiceStatus.AWAITING_CONFIRMATION;\n case 91:\n return InvoiceStatus.ERROR;\n case 99:\n return InvoiceStatus.COMPLETED;\n default:\n return InvoiceStatus.PENDING;\n }\n }\n\n /**\n * Convert API status code to AllowanceStatus\n */\n static toAllowanceStatus(status: number): AllowanceStatus {\n switch (status) {\n case 1:\n return AllowanceStatus.PENDING;\n case 2:\n return AllowanceStatus.UPLOADING;\n case 3:\n return AllowanceStatus.UPLOADED;\n case 31:\n return AllowanceStatus.PROCESSING;\n case 32:\n return AllowanceStatus.AWAITING_CONFIRMATION;\n case 91:\n return AllowanceStatus.ERROR;\n case 99:\n return AllowanceStatus.COMPLETED;\n default:\n return AllowanceStatus.PENDING;\n }\n }\n\n /**\n * Format date to YYYYMMDD string\n */\n static formatDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}${month}${day}`;\n }\n\n /**\n * Format date to YYYYMMDD number\n */\n static formatDateNumber(date: Date): number {\n return parseInt(AmegoMapper.formatDate(date), 10);\n }\n\n /**\n * Parse YYYYMMDD (string or number) to Date\n */\n static parseDate(dateValue: string | number): Date {\n const dateStr = String(dateValue);\n const year = parseInt(dateStr.substring(0, 4), 10);\n const month = parseInt(dateStr.substring(4, 6), 10) - 1;\n const day = parseInt(dateStr.substring(6, 8), 10);\n return new Date(year, month, day);\n }\n\n /**\n * Parse Unix timestamp to Date\n */\n static parseUnixTimestamp(timestamp: number): Date {\n return new Date(timestamp * 1000);\n }\n\n /**\n * Parse ISO date string to Date\n */\n static parseIsoDate(isoStr: string): Date {\n return new Date(isoStr);\n }\n}\n","import { InvalidInvoiceNumberError } from '../../errors/index.js';\n\n/**\n * Invoice Number (發票號碼) Value Object\n *\n * Format: 2 uppercase letters + 8 digits (e.g., AB12345678)\n */\nexport class InvoiceNumber {\n private static readonly PATTERN = /^[A-Z]{2}\\d{8}$/;\n\n private constructor(private readonly value: string) {}\n\n /**\n * Create an InvoiceNumber from string\n * @throws InvalidInvoiceNumberError if format is invalid\n */\n static create(value: string): InvoiceNumber {\n const normalized = value.trim().toUpperCase();\n\n if (!InvoiceNumber.isValid(normalized)) {\n throw new InvalidInvoiceNumberError(value);\n }\n\n return new InvoiceNumber(normalized);\n }\n\n /**\n * Try to create an InvoiceNumber, return null if invalid\n */\n static tryCreate(value: string): InvoiceNumber | null {\n try {\n return InvoiceNumber.create(value);\n } catch {\n return null;\n }\n }\n\n /**\n * Validate invoice number format\n */\n static isValid(value: string): boolean {\n return InvoiceNumber.PATTERN.test(value);\n }\n\n /**\n * Get the track (字軌) - first 2 letters\n */\n getTrack(): string {\n return this.value.substring(0, 2);\n }\n\n /**\n * Get the number part - last 8 digits\n */\n getNumber(): string {\n return this.value.substring(2);\n }\n\n /**\n * Get the full invoice number\n */\n toString(): string {\n return this.value;\n }\n\n /**\n * Check equality\n */\n equals(other: InvoiceNumber): boolean {\n return this.value === other.value;\n }\n}\n","import { Money } from '../shared/Money.js';\nimport { TaxType } from '../shared/TaxType.js';\nimport { ValidationError } from '../../errors/index.js';\n\n/**\n * Invoice Item properties for creation\n */\nexport interface InvoiceItemProps {\n /** 品名 (max 256 chars) */\n description: string;\n /** 數量 (up to 7 decimal places) */\n quantity: number;\n /** 單價 (up to 7 decimal places) */\n unitPrice: Money;\n /** 小計 (up to 7 decimal places) */\n amount: Money;\n /** 單位 (max 6 chars, optional) */\n unit?: string;\n /** 備註 (max 40 chars, optional) */\n remark?: string;\n /** 課稅別 */\n taxType?: TaxType;\n}\n\n/**\n * Invoice Item Entity\n *\n * Represents a line item in an invoice.\n */\nexport class InvoiceItem {\n private constructor(\n private readonly _description: string,\n private readonly _quantity: number,\n private readonly _unitPrice: Money,\n private readonly _amount: Money,\n private readonly _unit: string,\n private readonly _remark: string,\n private readonly _taxType: TaxType\n ) {}\n\n /**\n * Create an InvoiceItem\n */\n static create(props: InvoiceItemProps): InvoiceItem {\n // Validate description\n if (!props.description || props.description.trim().length === 0) {\n throw new ValidationError('description', 'Description is required');\n }\n if (props.description.length > 256) {\n throw new ValidationError(\n 'description',\n 'Description must not exceed 256 characters'\n );\n }\n\n // Validate quantity\n if (props.quantity === 0) {\n throw new ValidationError('quantity', 'Quantity cannot be zero');\n }\n\n // Validate unit\n if (props.unit && props.unit.length > 6) {\n throw new ValidationError('unit', 'Unit must not exceed 6 characters');\n }\n\n // Validate remark\n if (props.remark && props.remark.length > 40) {\n throw new ValidationError('remark', 'Remark must not exceed 40 characters');\n }\n\n return new InvoiceItem(\n props.description.trim(),\n props.quantity,\n props.unitPrice,\n props.amount,\n props.unit?.trim() ?? '',\n props.remark?.trim() ?? '',\n props.taxType ?? TaxType.TAXABLE\n );\n }\n\n /**\n * Create an InvoiceItem with auto-calculated amount\n */\n static createWithAutoAmount(\n props: Omit<InvoiceItemProps, 'amount'>\n ): InvoiceItem {\n const amount = props.unitPrice.multiply(props.quantity);\n return InvoiceItem.create({ ...props, amount });\n }\n\n // Getters\n get description(): string {\n return this._description;\n }\n\n get quantity(): number {\n return this._quantity;\n }\n\n get unitPrice(): Money {\n return this._unitPrice;\n }\n\n get amount(): Money {\n return this._amount;\n }\n\n get unit(): string {\n return this._unit;\n }\n\n get remark(): string {\n return this._remark;\n }\n\n get taxType(): TaxType {\n return this._taxType;\n }\n\n /**\n * Check if this is a discount item (negative amount)\n */\n isDiscount(): boolean {\n return this._amount.isNegative();\n }\n}\n","import { InvalidTaxIdError } from '../../errors/index.js';\n\n/**\n * Tax ID (統一編號) Value Object\n *\n * Validates Taiwan business tax ID using the official checksum algorithm.\n * Reference: https://www.fia.gov.tw/singlehtml/3?cntId=c4d9cff38c8642ef8872774ee9987283\n */\nexport class TaxId {\n private static readonly WEIGHTS = [1, 2, 1, 2, 1, 2, 4, 1];\n private static readonly NO_TAX_ID = '0000000000';\n\n private constructor(private readonly value: string) {}\n\n /**\n * Create a TaxId from string\n * @throws InvalidTaxIdError if the tax ID is invalid\n */\n static create(value: string): TaxId {\n const normalized = value.trim();\n\n if (!TaxId.isValid(normalized)) {\n throw new InvalidTaxIdError(value);\n }\n\n return new TaxId(normalized);\n }\n\n /**\n * Create a \"no tax ID\" placeholder (0000000000)\n * Used for B2C invoices without buyer's tax ID\n */\n static none(): TaxId {\n return new TaxId(TaxId.NO_TAX_ID);\n }\n\n /**\n * Try to create a TaxId, return null if invalid\n */\n static tryCreate(value: string): TaxId | null {\n try {\n return TaxId.create(value);\n } catch {\n return null;\n }\n }\n\n /**\n * Validate a tax ID string\n */\n static isValid(value: string): boolean {\n // Allow the special \"no tax ID\" value\n if (value === TaxId.NO_TAX_ID) {\n return true;\n }\n\n // Must be exactly 8 digits\n if (!/^\\d{8}$/.test(value)) {\n return false;\n }\n\n return TaxId.validateChecksum(value);\n }\n\n /**\n * Validate checksum using the official algorithm\n *\n * Algorithm:\n * 1. Multiply each digit by its weight [1,2,1,2,1,2,4,1]\n * 2. For each product, sum its digits (e.g., 18 -> 1+8=9)\n * 3. Sum all results\n * 4. If 7th digit is 7, check both (sum % 10 === 0) or ((sum + 1) % 10 === 0)\n * 5. Otherwise, check (sum % 10 === 0)\n */\n private static validateChecksum(value: string): boolean {\n const digits = value.split('').map(Number);\n let sum = 0;\n\n for (let i = 0; i < 8; i++) {\n const product = digits[i]! * TaxId.WEIGHTS[i]!;\n // Sum digits of product (e.g., 18 -> 1 + 8 = 9)\n sum += Math.floor(product / 10) + (product % 10);\n }\n\n // Special case: if 7th digit (index 6) is 7\n if (digits[6] === 7) {\n return sum % 10 === 0 || (sum + 1) % 10 === 0;\n }\n\n return sum % 10 === 0;\n }\n\n /**\n * Check if this is a \"no tax ID\" placeholder\n */\n isNone(): boolean {\n return this.value === TaxId.NO_TAX_ID;\n }\n\n /**\n * Get the string value\n */\n toString(): string {\n return this.value;\n }\n\n /**\n * Check equality with another TaxId\n */\n equals(other: TaxId): boolean {\n return this.value === other.value;\n }\n}\n","import { ValidationError } from '../../errors/index.js';\n\n/**\n * Order ID Value Object\n *\n * 訂單編號,用於識別發票對應的訂單。\n * 最大長度 40 字元,不可為空。\n */\nexport class OrderId {\n private static readonly MAX_LENGTH = 40;\n\n private constructor(private readonly value: string) {}\n\n /**\n * Create an OrderId\n * @throws ValidationError if invalid\n */\n static create(value: string): OrderId {\n const trimmed = value?.trim();\n\n if (!trimmed || trimmed.length === 0) {\n throw new ValidationError('orderId', 'Order ID is required');\n }\n\n if (trimmed.length > OrderId.MAX_LENGTH) {\n throw new ValidationError(\n 'orderId',\n `Order ID must not exceed ${OrderId.MAX_LENGTH} characters`\n );\n }\n\n return new OrderId(trimmed);\n }\n\n /**\n * Try to create an OrderId, returns null if invalid\n */\n static tryCreate(value: string): OrderId | null {\n try {\n return OrderId.create(value);\n } catch {\n return null;\n }\n }\n\n /**\n * Get the string value\n */\n toString(): string {\n return this.value;\n }\n\n /**\n * Check equality\n */\n equals(other: OrderId): boolean {\n return this.value === other.value;\n }\n}\n","import { TaxId } from './TaxId.js';\nimport { ValidationError } from '../../errors/index.js';\n\n/**\n * Buyer type\n */\nexport enum BuyerType {\n /** 個人消費者 (B2C) */\n ANONYMOUS = 'anonymous',\n /** 公司行號 (B2B) */\n COMPANY = 'company',\n}\n\n/**\n * Company buyer properties\n */\nexport interface CompanyBuyerProps {\n taxId: TaxId;\n name: string;\n address?: string;\n phone?: string;\n email?: string;\n}\n\n/**\n * Buyer Value Object\n *\n * 發票買方資訊。可以是個人消費者 (B2C) 或公司行號 (B2B)。\n */\nexport class Buyer {\n private constructor(\n private readonly _type: BuyerType,\n private readonly _taxId: TaxId,\n private readonly _name: string,\n private readonly _address: string,\n private readonly _phone: string,\n private readonly _email: string\n ) {}\n\n /**\n * Create an anonymous buyer (B2C)\n * @param name Buyer name (default: '消費者')\n */\n static anonymous(name?: string): Buyer {\n // If name is explicitly provided (including empty string), validate it\n // If name is undefined/not provided, use default\n const trimmedName = name === undefined ? '消費者' : name.trim();\n Buyer.validateName(trimmedName);\n\n return new Buyer(\n BuyerType.ANONYMOUS,\n TaxId.none(),\n trimmedName,\n '',\n '',\n ''\n );\n }\n\n /**\n * Create a company buyer (B2B)\n */\n static company(props: CompanyBuyerProps): Buyer {\n const name = props.name?.trim();\n Buyer.validateName(name);\n\n if (props.taxId.isNone()) {\n throw new ValidationError('taxId', 'Company buyer must have a tax ID');\n }\n\n return new Buyer(\n BuyerType.COMPANY,\n props.taxId,\n name,\n props.address?.trim() ?? '',\n props.phone?.trim() ?? '',\n props.email?.trim() ?? ''\n );\n }\n\n /**\n * Validate buyer name\n */\n private static validateName(name: string): void {\n if (!name || name.length === 0) {\n throw new ValidationError('buyerName', 'Buyer name is required');\n }\n\n const invalidNames = ['0', '00', '000', '0000'];\n if (invalidNames.includes(name)) {\n throw new ValidationError(\n 'buyerName',\n 'Buyer name cannot be 0, 00, 000, or 0000'\n );\n }\n }\n\n /**\n * Get the buyer type\n */\n get type(): BuyerType {\n return this._type;\n }\n\n /**\n * Get the tax ID\n */\n get taxId(): TaxId {\n return this._taxId;\n }\n\n /**\n * Get the name\n */\n get name(): string {\n return this._name;\n }\n\n /**\n * Get the address\n */\n get address(): string {\n return this._address;\n }\n\n /**\n * Get the phone\n */\n get phone(): string {\n return this._phone;\n }\n\n /**\n * Get the email\n */\n get email(): string {\n return this._email;\n }\n\n /**\n * Check if this is a B2B buyer (company)\n */\n get isCompany(): boolean {\n return this._type === BuyerType.COMPANY;\n }\n\n /**\n * Check if this is a B2C buyer (anonymous)\n */\n get isAnonymous(): boolean {\n return this._type === BuyerType.ANONYMOUS;\n }\n}\n","import { AmegoClient } from './AmegoClient.js';\nimport { AmegoConfig, AMEGO_ENDPOINTS } from './AmegoConfig.js';\nimport {\n AmegoMapper,\n AmegoInvoiceIssueResponse,\n AmegoInvoiceQueryPayload,\n AmegoInvoiceListPayload,\n AmegoInvoiceStatusPayload,\n AmegoInvoiceVoidPayload,\n} from './AmegoMapper.js';\nimport {\n InvoiceRepository,\n IssueInvoiceResult,\n InvoiceQueryResult,\n InvoiceStatusResult,\n ListInvoicesOptions,\n} from '../../domain/invoice/InvoiceRepository.js';\nimport { Invoice, InvoiceStatus } from '../../domain/invoice/Invoice.js';\nimport { InvoiceNumber } from '../../domain/invoice/InvoiceNumber.js';\nimport { InvoiceItem } from '../../domain/invoice/InvoiceItem.js';\nimport { TaxId } from '../../domain/shared/TaxId.js';\nimport { Money } from '../../domain/shared/Money.js';\nimport { OrderId } from '../../domain/shared/OrderId.js';\nimport { Buyer } from '../../domain/shared/Buyer.js';\nimport { Carrier, CarrierType } from '../../domain/shared/Carrier.js';\nimport { Donation } from '../../domain/shared/Donation.js';\n\n/**\n * API response for invoice query (/json/invoice_query)\n * 包含完整的 API 回應,data 裡面才是發票資料\n */\ninterface AmegoQueryApiResponse {\n code: number;\n msg: string;\n data?: {\n invoice_number: string;\n invoice_type: string;\n invoice_status: number;\n invoice_date: string;\n invoice_time: string;\n buyer_identifier: string;\n buyer_name: string;\n buyer_zip: number;\n buyer_address: string;\n buyer_telephone_number: string;\n buyer_email_address: string;\n sales_amount: number;\n free_tax_sales_amount: number;\n zero_tax_sales_amount: number;\n tax_type: number;\n tax_rate: string;\n tax_amount: number;\n total_amount: number;\n print_mark: string;\n random_number: string;\n main_remark: string;\n customs_clearance_mark: number;\n carrier_type: string;\n carrier_id1: string;\n carrier_id2: string;\n npoban: string;\n cancel_date: number;\n invoice_lottery: number;\n order_id: string;\n detail_vat: number;\n detail_amount_round: number;\n create_date: number;\n product_item: Array<{\n tax_type: number;\n description: string;\n unit_price: number;\n quantity: number;\n unit: string;\n amount: number;\n remark: string;\n }>;\n };\n}\n\n/** 發票查詢回應的 data 部分 */\ntype AmegoQueryResponseData = NonNullable<AmegoQueryApiResponse['data']>;\n\n/**\n * API response for invoice list (/json/invoice_list)\n */\ninterface AmegoListResponseData {\n page_total: number;\n page_now: number;\n data_total: number;\n data: Array<{\n invoice_number: string;\n invoice_type: string;\n invoice_status: number;\n invoice_date: number;\n invoice_time: string;\n buyer_identifier: string;\n buyer_name: string;\n buyer_zip: number;\n buyer_address: string;\n buyer_telephone_number: string;\n buyer_email_address: string;\n sales_amount: number;\n free_tax_sales_amount: number;\n zero_tax_sales_amount: number;\n tax_type: number;\n tax_rate: string;\n tax_amount: number;\n total_amount: number;\n print_mark: string;\n random_number: string;\n main_remark: string;\n customs_clearance_mark: number;\n zero_tax_rate_reason: number;\n carrier_type: string;\n carrier_id1: string;\n carrier_id2: string;\n npoban: string;\n cancel_date: number;\n invoice_lottery: number;\n order_id: string;\n create_date: number;\n }>;\n}\n\n/**\n * API response for invoice status (/json/invoice_status)\n */\ninterface AmegoStatusResponseData {\n data: Array<{\n invoice_number: string;\n type: string;\n status: number;\n total_amount: number;\n }>;\n}\n\n/**\n * Amego Invoice Repository\n *\n * Implements InvoiceRepository using Amego (光貿) API.\n * 所有 API 都使用 POST 方法,並使用 form-urlencoded 格式。\n */\nexport class AmegoInvoiceRepository implements InvoiceRepository {\n private readonly client: AmegoClient;\n\n constructor(config: AmegoConfig) {\n this.client = new AmegoClient(config);\n }\n\n /**\n * Issue a new invoice (開立發票)\n *\n * 使用 /json/f0401 endpoint\n */\n async issue(invoice: Invoice): Promise<IssueInvoiceResult> {\n const payload = AmegoMapper.toInvoicePayload(invoice);\n\n const response = await this.client.post<AmegoInvoiceIssueResponse>(\n AMEGO_ENDPOINTS.INVOICE_ISSUE,\n payload\n );\n\n // Response 使用 snake_case 欄位名稱\n const invoiceNumber = InvoiceNumber.create(response.invoice_number!);\n const invoiceTime = AmegoMapper.parseUnixTimestamp(response.invoice_time!);\n\n // Update the invoice with issued data\n invoice.setInvoiceNumber(\n invoiceNumber,\n invoiceTime,\n response.random_number!\n );\n invoice.updateStatus(InvoiceStatus.UPLOADED);\n\n return {\n invoiceNumber,\n invoiceTime,\n randomNumber: response.random_number!,\n barcode: response.barcode ?? '',\n qrcodeLeft: response.qrcode_left ?? '',\n qrcodeRight: response.qrcode_right ?? '',\n printData: response.base64_data,\n };\n }\n\n /**\n * Void an invoice (作廢發票)\n *\n * 使用 /json/f0501 endpoint\n */\n async void(invoiceNumber: InvoiceNumber): Promise<void> {\n const payload: AmegoInvoiceVoidPayload = {\n CancelInvoiceNumber: invoiceNumber.toString(),\n };\n\n await this.client.post(AMEGO_ENDPOINTS.INVOICE_VOID, payload);\n }\n\n /**\n * Query invoice by invoice number (查詢發票 - 依發票號碼)\n *\n * 使用 /json/invoice_query endpoint\n */\n async findByInvoiceNumber(\n invoiceNumber: InvoiceNumber\n ): Promise<InvoiceQueryResult | null> {\n try {\n const payload: AmegoInvoiceQueryPayload = {\n type: 'invoice',\n invoice_number: invoiceNumber.toString(),\n };\n\n const response = await this.client.post<AmegoQueryApiResponse>(\n AMEGO_ENDPOINTS.INVOICE_QUERY,\n payload\n );\n\n if (!response.data) {\n return null;\n }\n\n return this.mapQueryResponse(response.data);\n } catch {\n return null;\n }\n }\n\n /**\n * Query invoice by order ID (查詢發票 - 依訂單編號)\n *\n * 使用 /json/invoice_query endpoint\n */\n async findByOrderId(orderId: string): Promise<InvoiceQueryResult | null> {\n try {\n const payload: AmegoInvoiceQueryPayload = {\n type: 'order',\n order_id: orderId,\n };\n\n const response = await this.client.post<AmegoQueryApiResponse>(\n AMEGO_ENDPOINTS.INVOICE_QUERY,\n payload\n );\n\n if (!response.data) {\n return null;\n }\n\n return this.mapQueryResponse(response.data);\n } catch {\n return null;\n }\n }\n\n /**\n * Check invoice status (查詢發票狀態)\n *\n * 使用 /json/invoice_status endpoint\n */\n async getStatus(\n invoiceNumbers: InvoiceNumber[]\n ): Promise<InvoiceStatusResult[]> {\n // 光貿 API 一次只能查一張發票,需要多次呼叫\n const results: InvoiceStatusResult[] = [];\n\n for (const invoiceNumber of invoiceNumbers) {\n try {\n const payload: AmegoInvoiceStatusPayload = {\n InvoiceNumber: invoiceNumber.toString(),\n };\n\n const response = await this.client.post<AmegoStatusResponseData>(\n AMEGO_ENDPOINTS.INVOICE_STATUS,\n payload\n );\n\n if (response.data && response.data.length > 0) {\n for (const item of response.data) {\n results.push({\n invoiceNumber: item.invoice_number,\n type: item.type,\n status: AmegoMapper.toInvoiceStatus(item.status),\n totalAmount: item.total_amount,\n });\n }\n }\n } catch {\n // Skip failed queries, continue with next\n }\n }\n\n return results;\n }\n\n /**\n * List invoices (發票列表)\n *\n * 使用 /json/invoice_list endpoint\n */\n async list(options: ListInvoicesOptions): Promise<{\n invoices: InvoiceQueryResult[];\n totalPages: number;\n currentPage: number;\n totalCount: number;\n }> {\n // 轉換日期格式:YYYYMMDD string -> number\n const dateStart = parseInt(options.startDate, 10);\n const dateEnd = parseInt(options.endDate, 10);\n\n const payload: AmegoInvoiceListPayload = {\n date_select: options.dateType,\n date_start: dateStart,\n date_end: dateEnd,\n limit: options.limit ?? 20,\n page: options.page ?? 1,\n };\n\n const response = await this.client.post<AmegoListResponseData>(\n AMEGO_ENDPOINTS.INVOICE_LIST,\n payload\n );\n\n const invoices = (response.data ?? []).map((item) =>\n this.mapListItemResponse(item)\n );\n\n return {\n invoices,\n totalPages: response.page_total ?? 1,\n currentPage: response.page_now ?? 1,\n totalCount: response.data_total ?? 0,\n };\n }\n\n /**\n * Map API query response to domain query result\n */\n private mapQueryResponse(\n response: AmegoQueryResponseData\n ): InvoiceQueryResult {\n const items = (response.product_item ?? []).map((item) =>\n InvoiceItem.create({\n description: item.description,\n quantity: item.quantity,\n unitPrice: Money.create(item.unit_price),\n amount: Money.create(item.amount),\n unit: item.unit || undefined,\n remark: item.remark || undefined,\n taxType: AmegoMapper.fromApiTaxType(item.tax_type),\n })\n );\n\n // Build Buyer from API response\n const buyerTaxId = TaxId.tryCreate(response.buyer_identifier) ?? TaxId.none();\n const buyer = buyerTaxId.isNone()\n ? Buyer.anonymous(response.buyer_name || '消費者')\n : Buyer.company({\n taxId: buyerTaxId,\n name: response.buyer_name || '',\n address: response.buyer_address || undefined,\n phone: response.buyer_telephone_number || undefined,\n email: response.buyer_email_address || undefined,\n });\n\n // Build Carrier from API response\n const carrier = this.buildCarrier(\n response.carrier_type,\n response.carrier_id1\n );\n\n // Build Donation from API response\n const donation = response.npoban\n ? Donation.tryCreate(response.npoban)\n : Donation.none();\n\n const invoice = Invoice.create({\n orderId: OrderId.create(response.order_id || response.invoice_number),\n buyer,\n items,\n carrier,\n donation,\n remark: response.main_remark || undefined,\n });\n\n const invoiceNumber = InvoiceNumber.create(response.invoice_number);\n const invoiceTime = AmegoMapper.parseIsoDate(response.invoice_time);\n\n invoice.setInvoiceNumber(invoiceNumber, invoiceTime, response.random_number);\n invoice.updateStatus(AmegoMapper.toInvoiceStatus(response.invoice_status));\n\n return {\n invoice,\n status: AmegoMapper.toInvoiceStatus(response.invoice_status),\n };\n }\n\n /**\n * Map API list item response to domain query result\n */\n private mapListItemResponse(item: AmegoListResponseData['data'][0]): InvoiceQueryResult {\n // 列表 API 沒有商品明細,建立一個空的 placeholder item\n const placeholderItem = InvoiceItem.create({\n description: '(詳細請查詢單張發票)',\n quantity: 1,\n unitPrice: Money.create(item.total_amount),\n amount: Money.create(item.total_amount),\n taxType: AmegoMapper.fromApiTaxType(item.tax_type),\n });\n\n // Build Buyer from API response\n const buyerTaxId = TaxId.tryCreate(item.buyer_identifier) ?? TaxId.none();\n const buyer = buyerTaxId.isNone()\n ? Buyer.anonymous(item.buyer_name || '消費者')\n : Buyer.company({\n taxId: buyerTaxId,\n name: item.buyer_name || '',\n address: item.buyer_address || undefined,\n phone: item.buyer_telephone_number || undefined,\n email: item.buyer_email_address || undefined,\n });\n\n // Build Carrier from API response\n const carrier = this.buildCarrier(item.carrier_type, item.carrier_id1);\n\n // Build Donation from API response\n const donation = item.npoban\n ? Donation.tryCreate(item.npoban)\n : Donation.none();\n\n const invoice = Invoice.create({\n orderId: OrderId.create(item.order_id || item.invoice_number),\n buyer,\n items: [placeholderItem],\n carrier,\n donation,\n remark: item.main_remark || undefined,\n });\n\n const invoiceNumber = InvoiceNumber.create(item.invoice_number);\n // invoice_date 是 YYYYMMDD number,invoice_time 是 ISO string\n const invoiceTime = AmegoMapper.parseIsoDate(item.invoice_time);\n\n invoice.setInvoiceNumber(invoiceNumber, invoiceTime, item.random_number);\n invoice.updateStatus(AmegoMapper.toInvoiceStatus(item.invoice_status));\n\n return {\n invoice,\n status: AmegoMapper.toInvoiceStatus(item.invoice_status),\n };\n }\n\n /**\n * Build Carrier from API response fields\n */\n private buildCarrier(carrierType: string, carrierId: string): Carrier {\n if (!carrierType || carrierType === '') {\n return Carrier.none();\n }\n\n switch (carrierType) {\n case CarrierType.MOBILE:\n return Carrier.mobile(carrierId);\n case CarrierType.CERTIFICATE:\n return Carrier.certificate(carrierId);\n default:\n return Carrier.custom(carrierType as CarrierType, carrierId);\n }\n }\n}\n","import { ValidationError } from '../../errors/index.js';\n\n/**\n * Pagination Value Object\n *\n * 分頁參數。\n */\nexport class Pagination {\n private static readonly DEFAULT_LIMIT = 20;\n private static readonly MIN_LIMIT = 20;\n private static readonly MAX_LIMIT = 500;\n\n private constructor(\n private readonly _page: number,\n private readonly _limit: number\n ) {}\n\n /**\n * Create pagination with specified page and limit\n */\n static create(options: { page?: number; limit?: number } = {}): Pagination {\n const page = options.page ?? 1;\n const limit = options.limit ?? Pagination.DEFAULT_LIMIT;\n\n if (page < 1) {\n throw new ValidationError('page', 'Page must be at least 1');\n }\n\n if (limit < Pagination.MIN_LIMIT || limit > Pagination.MAX_LIMIT) {\n throw new ValidationError(\n 'limit',\n `Limit must be between ${Pagination.MIN_LIMIT} and ${Pagination.MAX_LIMIT}`\n );\n }\n\n return new Pagination(page, limit);\n }\n\n /**\n * Create first page with default limit\n */\n static first(limit?: number): Pagination {\n return Pagination.create({ page: 1, limit });\n }\n\n /**\n * Get the page number (1-based)\n */\n get page(): number {\n return this._page;\n }\n\n /**\n * Get the limit (items per page)\n */\n get limit(): number {\n return this._limit;\n }\n\n /**\n * Get the offset (0-based, for SQL queries)\n */\n get offset(): number {\n return (this._page - 1) * this._limit;\n }\n\n /**\n * Create next page pagination\n */\n next(): Pagination {\n return new Pagination(this._page + 1, this._limit);\n }\n\n /**\n * Create previous page pagination (min page 1)\n */\n previous(): Pagination {\n return new Pagination(Math.max(1, this._page - 1), this._limit);\n }\n}\n\n/**\n * Paginated result wrapper\n */\nexport interface PaginatedResult<T> {\n /** Items on current page */\n items: T[];\n /** Total number of items */\n totalCount: number;\n /** Total number of pages */\n totalPages: number;\n /** Current page number */\n currentPage: number;\n /** Items per page */\n pageSize: number;\n /** Whether there is a next page */\n hasNextPage: boolean;\n /** Whether there is a previous page */\n hasPreviousPage: boolean;\n}\n\n/**\n * Create a paginated result\n */\nexport function createPaginatedResult<T>(\n items: T[],\n totalCount: number,\n pagination: Pagination\n): PaginatedResult<T> {\n const totalPages = Math.ceil(totalCount / pagination.limit);\n return {\n items,\n totalCount,\n totalPages,\n currentPage: pagination.page,\n pageSize: pagination.limit,\n hasNextPage: pagination.page < totalPages,\n hasPreviousPage: pagination.page > 1,\n };\n}\n","import { ValidationError } from '../../errors/index.js';\n\n/**\n * LocalDate Value Object\n *\n * 表示日期(不含時間),類似 Java 的 LocalDate。\n * 內部使用 YYYYMMDD 格式儲存。\n */\nexport class LocalDate {\n private constructor(\n private readonly _year: number,\n private readonly _month: number,\n private readonly _day: number\n ) {}\n\n /**\n * Create a LocalDate from year, month, day\n */\n static of(year: number, month: number, day: number): LocalDate {\n if (month < 1 || month > 12) {\n throw new ValidationError('month', 'Month must be between 1 and 12');\n }\n if (day < 1 || day > 31) {\n throw new ValidationError('day', 'Day must be between 1 and 31');\n }\n return new LocalDate(year, month, day);\n }\n\n /**\n * Create a LocalDate from a JavaScript Date\n */\n static fromDate(date: Date): LocalDate {\n return new LocalDate(\n date.getFullYear(),\n date.getMonth() + 1,\n date.getDate()\n );\n }\n\n /**\n * Create a LocalDate from YYYYMMDD string or number\n */\n static parse(value: string | number): LocalDate {\n const str = String(value);\n if (str.length !== 8) {\n throw new ValidationError('date', 'Date must be in YYYYMMDD format');\n }\n\n const year = parseInt(str.substring(0, 4), 10);\n const month = parseInt(str.substring(4, 6), 10);\n const day = parseInt(str.substring(6, 8), 10);\n\n return LocalDate.of(year, month, day);\n }\n\n /**\n * Get today's date\n */\n static today(): LocalDate {\n return LocalDate.fromDate(new Date());\n }\n\n /**\n * Get the year\n */\n get year(): number {\n return this._year;\n }\n\n /**\n * Get the month (1-12)\n */\n get month(): number {\n return this._month;\n }\n\n /**\n * Get the day of month\n */\n get day(): number {\n return this._day;\n }\n\n /**\n * Convert to YYYYMMDD number (for API calls)\n */\n toNumber(): number {\n return this._year * 10000 + this._month * 100 + this._day;\n }\n\n /**\n * Convert to YYYYMMDD string\n */\n toString(): string {\n const month = String(this._month).padStart(2, '0');\n const day = String(this._day).padStart(2, '0');\n return `${this._year}${month}${day}`;\n }\n\n /**\n * Convert to JavaScript Date (at midnight)\n */\n toDate(): Date {\n return new Date(this._year, this._month - 1, this._day);\n }\n\n /**\n * Convert to ISO date string (YYYY-MM-DD)\n */\n toISOString(): string {\n const month = String(this._month).padStart(2, '0');\n const day = String(this._day).padStart(2, '0');\n return `${this._year}-${month}-${day}`;\n }\n\n /**\n * Check if this date is before another\n */\n isBefore(other: LocalDate): boolean {\n return this.toNumber() < other.toNumber();\n }\n\n /**\n * Check if this date is after another\n */\n isAfter(other: LocalDate): boolean {\n return this.toNumber() > other.toNumber();\n }\n\n /**\n * Check equality\n */\n equals(other: LocalDate): boolean {\n return this.toNumber() === other.toNumber();\n }\n}\n\n/**\n * DateRange Value Object\n *\n * 表示日期區間(起始日期 ~ 結束日期)。\n */\nexport class DateRange {\n private constructor(\n private readonly _start: LocalDate,\n private readonly _end: LocalDate\n ) {}\n\n /**\n * Create a date range between two dates\n */\n static between(start: LocalDate, end: LocalDate): DateRange {\n if (start.isAfter(end)) {\n throw new ValidationError(\n 'dateRange',\n 'Start date must be before or equal to end date'\n );\n }\n return new DateRange(start, end);\n }\n\n /**\n * Create a date range for a single day\n */\n static on(date: LocalDate): DateRange {\n return new DateRange(date, date);\n }\n\n /**\n * Get the start date\n */\n get start(): LocalDate {\n return this._start;\n }\n\n /**\n * Get the end date\n */\n get end(): LocalDate {\n return this._end;\n }\n\n /**\n * Check if a date is within this range (inclusive)\n */\n contains(date: LocalDate): boolean {\n return !date.isBefore(this._start) && !date.isAfter(this._end);\n }\n}\n\n/**\n * Date type for queries\n */\nexport enum DateType {\n /** 發票日期 */\n INVOICE_DATE = 1,\n /** 建立日期 */\n CREATE_DATE = 2,\n}\n","import { AmegoConfig } from './AmegoConfig.js';\nimport { AmegoInvoiceRepository } from './AmegoInvoiceRepository.js';\nimport {\n InvoiceService,\n IssueInvoiceResult,\n InvoiceStatusInfo,\n} from '../../domain/invoice/InvoiceService.js';\nimport { Invoice } from '../../domain/invoice/Invoice.js';\nimport { InvoiceNumber } from '../../domain/invoice/InvoiceNumber.js';\nimport { InvoiceQuery } from '../../domain/invoice/InvoiceQuery.js';\nimport {\n PaginatedResult,\n createPaginatedResult,\n} from '../../domain/shared/Pagination.js';\nimport { DateType } from '../../domain/shared/LocalDate.js';\n\n/**\n * Amego Invoice Service\n *\n * Implements InvoiceService using Amego (光貿) provider.\n */\nexport class AmegoInvoiceService implements InvoiceService {\n private readonly repository: AmegoInvoiceRepository;\n\n constructor(config: AmegoConfig) {\n this.repository = new AmegoInvoiceRepository(config);\n }\n\n /**\n * Issue a new invoice (開立發票)\n */\n async issue(invoice: Invoice): Promise<IssueInvoiceResult> {\n const result = await this.repository.issue(invoice);\n\n return {\n invoiceNumber: result.invoiceNumber,\n invoiceTime: result.invoiceTime,\n randomNumber: result.randomNumber,\n barcode: result.barcode,\n qrcodeLeft: result.qrcodeLeft,\n qrcodeRight: result.qrcodeRight,\n printData: result.printData,\n };\n }\n\n /**\n * Void an invoice (作廢發票)\n */\n async void(invoiceNumber: InvoiceNumber): Promise<void> {\n await this.repository.void(invoiceNumber);\n }\n\n /**\n * Find invoice by invoice number\n */\n async findByNumber(invoiceNumber: InvoiceNumber): Promise<Invoice | null> {\n const result = await this.repository.findByInvoiceNumber(invoiceNumber);\n return result?.invoice ?? null;\n }\n\n /**\n * Find invoice by order ID\n */\n async findByOrderId(orderId: string): Promise<Invoice | null> {\n const result = await this.repository.findByOrderId(orderId);\n return result?.invoice ?? null;\n }\n\n /**\n * List invoices with query\n */\n async list(query: InvoiceQuery): Promise<PaginatedResult<Invoice>> {\n const result = await this.repository.list({\n dateType: query.dateType === DateType.CREATE_DATE ? 2 : 1,\n startDate: query.dateRange.start.toNumber().toString(),\n endDate: query.dateRange.end.toNumber().toString(),\n limit: query.pagination.limit,\n page: query.pagination.page,\n });\n\n const invoices = result.invoices.map((r) => r.invoice);\n\n return createPaginatedResult(invoices, result.totalCount, query.pagination);\n }\n\n /**\n * Get invoice status\n */\n async getStatus(invoiceNumbers: InvoiceNumber[]): Promise<InvoiceStatusInfo[]> {\n const results = await this.repository.getStatus(invoiceNumbers);\n\n return results.map((r) => ({\n invoiceNumber: r.invoiceNumber,\n type: r.type,\n status: r.status,\n totalAmount: r.totalAmount,\n }));\n }\n}\n","import { Money } from '../shared/Money.js';\nimport { TaxType } from '../shared/TaxType.js';\nimport { ValidationError } from '../../errors/index.js';\n\n/**\n * Allowance Item properties for creation\n */\nexport interface AllowanceItemProps {\n /** 原發票品名 (max 256 chars) */\n originalDescription: string;\n /** 數量 (up to 7 decimal places) */\n quantity: number;\n /** 單價 (up to 7 decimal places) */\n unitPrice: Money;\n /** 金額 (up to 7 decimal places) */\n amount: Money;\n /** 單位 (max 6 chars, optional) */\n unit?: string;\n /** 課稅別 */\n taxType?: TaxType;\n}\n\n/**\n * Allowance Item Entity\n *\n * Represents a line item in an allowance (折讓明細).\n */\nexport class AllowanceItem {\n private constructor(\n private readonly _originalDescription: string,\n private readonly _quantity: number,\n private readonly _unitPrice: Money,\n private readonly _amount: Money,\n private readonly _unit: string,\n private readonly _taxType: TaxType\n ) {}\n\n /**\n * Create an AllowanceItem\n */\n static create(props: AllowanceItemProps): AllowanceItem {\n // Validate description\n if (\n !props.originalDescription ||\n props.originalDescription.trim().length === 0\n ) {\n throw new ValidationError(\n 'originalDescription',\n 'Original description is required'\n );\n }\n if (props.originalDescription.length > 256) {\n throw new ValidationError(\n 'originalDescription',\n 'Original description must not exceed 256 characters'\n );\n }\n\n // Validate quantity\n if (props.quantity === 0) {\n throw new ValidationError('quantity', 'Quantity cannot be zero');\n }\n\n // Validate unit\n if (props.unit && props.unit.length > 6) {\n throw new ValidationError('unit', 'Unit must not exceed 6 characters');\n }\n\n return new AllowanceItem(\n props.originalDescription.trim(),\n props.quantity,\n props.unitPrice,\n props.amount,\n props.unit?.trim() ?? '',\n props.taxType ?? TaxType.TAXABLE\n );\n }\n\n /**\n * Create an AllowanceItem with auto-calculated amount\n */\n static createWithAutoAmount(\n props: Omit<AllowanceItemProps, 'amount'>\n ): AllowanceItem {\n const amount = props.unitPrice.multiply(props.quantity);\n return AllowanceItem.create({ ...props, amount });\n }\n\n // Getters\n get originalDescription(): string {\n return this._originalDescription;\n }\n\n get quantity(): number {\n return this._quantity;\n }\n\n get unitPrice(): Money {\n return this._unitPrice;\n }\n\n get amount(): Money {\n return this._amount;\n }\n\n get unit(): string {\n return this._unit;\n }\n\n get taxType(): TaxType {\n return this._taxType;\n }\n}\n","import { AmegoClient } from './AmegoClient.js';\nimport { AmegoConfig, AMEGO_ENDPOINTS } from './AmegoConfig.js';\nimport {\n AmegoMapper,\n AmegoAllowanceVoidPayload,\n AmegoAllowanceListResponse,\n AmegoAllowanceQueryResponse,\n AmegoAllowanceStatusResponse,\n} from './AmegoMapper.js';\nimport {\n AllowanceRepository,\n IssueAllowanceResult,\n AllowanceQueryResult,\n AllowanceStatusResult,\n ListAllowancesOptions,\n} from '../../domain/allowance/AllowanceRepository.js';\nimport { Allowance, AllowanceStatus } from '../../domain/allowance/Allowance.js';\nimport { AllowanceItem } from '../../domain/allowance/AllowanceItem.js';\nimport { InvoiceNumber } from '../../domain/invoice/InvoiceNumber.js';\nimport { TaxId } from '../../domain/shared/TaxId.js';\nimport { Money } from '../../domain/shared/Money.js';\n\n/**\n * API response for allowance issue (/json/g0401)\n * 光貿 API 折讓開立回應(不含太多資料,只有成功訊息)\n */\ninterface AmegoAllowanceIssueResponseData {\n code: number;\n msg: string;\n}\n\n/**\n * API payload for allowance query (/json/allowance_query)\n */\ninterface AmegoAllowanceQueryPayload {\n /** 查詢類型 */\n type: 'allowance' | 'invoice';\n /** 折讓單編號 (當 type=allowance 時使用) */\n allowance_number?: string;\n /** 發票號碼 (當 type=invoice 時使用,查詢該發票的折讓) */\n invoice_number?: string;\n}\n\n/**\n * API payload for allowance list (/json/allowance_list)\n */\ninterface AmegoAllowanceListPayload {\n /** 日期條件 1:折讓日期 2:建立日期 */\n date_select: number;\n /** 開始日期 YYYYMMDD (Number) */\n date_start: number;\n /** 結束日期 YYYYMMDD (Number) */\n date_end: number;\n /** 每頁顯示資料筆數 20~500 */\n limit?: number;\n /** 目前頁數 */\n page?: number;\n}\n\n/**\n * API payload for allowance status (/json/allowance_status)\n */\ninterface AmegoAllowanceStatusPayload {\n /** 折讓單編號 */\n AllowanceNumber: string;\n}\n\n/**\n * Counter for generating unique allowance numbers\n */\nlet allowanceCounter = 0;\n\n/**\n * Generate a unique allowance number\n * Format: AL + YYYYMMDD + 6-digit sequence\n */\nfunction generateAllowanceNumber(): string {\n const now = new Date();\n const datePart = AmegoMapper.formatDate(now);\n const seq = String(++allowanceCounter % 1000000).padStart(6, '0');\n return `AL${datePart}${seq}`;\n}\n\n/**\n * Amego Allowance Repository\n *\n * Implements AllowanceRepository using Amego (光貿) API.\n * 所有 API 都使用 POST 方法,並使用 form-urlencoded 格式。\n */\nexport class AmegoAllowanceRepository implements AllowanceRepository {\n private readonly client: AmegoClient;\n\n constructor(config: AmegoConfig) {\n this.client = new AmegoClient(config);\n }\n\n /**\n * Issue a new allowance (開立折讓)\n *\n * 使用 /json/g0401 endpoint\n */\n async issue(allowance: Allowance): Promise<IssueAllowanceResult> {\n // 產生折讓單編號 (光貿 API 需要我們自己產生)\n const allowanceNumber = generateAllowanceNumber();\n const payload = AmegoMapper.toAllowancePayload(allowance, allowanceNumber);\n\n await this.client.post<AmegoAllowanceIssueResponseData>(\n AMEGO_ENDPOINTS.ALLOWANCE_ISSUE,\n payload\n );\n\n // 折讓開立成功,使用 payload 中的日期\n const allowanceDate = AmegoMapper.parseDate(payload.AllowanceDate);\n\n // Update the allowance with issued data\n allowance.setAllowanceNumber(allowanceNumber, allowanceDate);\n allowance.updateStatus(AllowanceStatus.UPLOADED);\n\n return {\n allowanceNumber,\n allowanceDate,\n };\n }\n\n /**\n * Void an allowance (作廢折讓)\n *\n * 使用 /json/g0501 endpoint\n */\n async void(allowanceNumber: string): Promise<void> {\n const payload: AmegoAllowanceVoidPayload = {\n CancelAllowanceNumber: allowanceNumber,\n };\n\n await this.client.post(AMEGO_ENDPOINTS.ALLOWANCE_VOID, payload);\n }\n\n /**\n * Query allowance by allowance number (查詢折讓 - 依折讓單編號)\n *\n * 使用 /json/allowance_query endpoint\n */\n async findByAllowanceNumber(\n allowanceNumber: string\n ): Promise<AllowanceQueryResult | null> {\n try {\n const payload: AmegoAllowanceQueryPayload = {\n type: 'allowance',\n allowance_number: allowanceNumber,\n };\n\n const response = await this.client.post<AmegoAllowanceQueryResponse>(\n AMEGO_ENDPOINTS.ALLOWANCE_QUERY,\n payload\n );\n\n if (!response.data) {\n return null;\n }\n\n return this.mapQueryResponse(response.data);\n } catch {\n return null;\n }\n }\n\n /**\n * Query allowances by original invoice number (查詢折讓 - 依原發票號碼)\n *\n * 使用 /json/allowance_query endpoint\n */\n async findByInvoiceNumber(\n invoiceNumber: InvoiceNumber\n ): Promise<AllowanceQueryResult[]> {\n try {\n const payload: AmegoAllowanceQueryPayload = {\n type: 'invoice',\n invoice_number: invoiceNumber.toString(),\n };\n\n const response = await this.client.post<AmegoAllowanceQueryResponse>(\n AMEGO_ENDPOINTS.ALLOWANCE_QUERY,\n payload\n );\n\n if (!response.data) {\n return [];\n }\n\n // 如果是查詢發票的折讓,可能回傳多筆\n // 這裡假設回傳單筆,如果 API 回傳陣列需要調整\n return [this.mapQueryResponse(response.data)];\n } catch {\n return [];\n }\n }\n\n /**\n * Check allowance status (查詢折讓狀態)\n *\n * 使用 /json/allowance_status endpoint\n */\n async getStatus(\n allowanceNumbers: string[]\n ): Promise<AllowanceStatusResult[]> {\n // 光貿 API 一次只能查一張折讓,需要多次呼叫\n const results: AllowanceStatusResult[] = [];\n\n for (const allowanceNumber of allowanceNumbers) {\n try {\n const payload: AmegoAllowanceStatusPayload = {\n AllowanceNumber: allowanceNumber,\n };\n\n const response = await this.client.post<AmegoAllowanceStatusResponse>(\n AMEGO_ENDPOINTS.ALLOWANCE_STATUS,\n payload\n );\n\n if (response.data && response.data.length > 0) {\n for (const item of response.data) {\n results.push({\n allowanceNumber: item.allowance_number,\n status: AmegoMapper.toAllowanceStatus(item.status),\n totalAmount: item.total_amount,\n });\n }\n }\n } catch {\n // Skip failed queries, continue with next\n }\n }\n\n return results;\n }\n\n /**\n * List allowances (折讓列表)\n *\n * 使用 /json/allowance_list endpoint\n */\n async list(options: ListAllowancesOptions): Promise<{\n allowances: AllowanceQueryResult[];\n totalPages: number;\n currentPage: number;\n totalCount: number;\n }> {\n // 轉換日期格式:YYYYMMDD string -> number\n const dateStart = parseInt(options.startDate, 10);\n const dateEnd = parseInt(options.endDate, 10);\n\n const payload: AmegoAllowanceListPayload = {\n date_select: options.dateType,\n date_start: dateStart,\n date_end: dateEnd,\n limit: options.limit ?? 20,\n page: options.page ?? 1,\n };\n\n const response = await this.client.post<AmegoAllowanceListResponse>(\n AMEGO_ENDPOINTS.ALLOWANCE_LIST,\n payload\n );\n\n const allowances = (response.data ?? []).map((item) =>\n this.mapListItemResponse(item)\n );\n\n return {\n allowances,\n totalPages: response.page_total ?? 1,\n currentPage: response.page_now ?? 1,\n totalCount: response.data_total ?? 0,\n };\n }\n\n /**\n * Map API query response to domain query result\n */\n private mapQueryResponse(\n data: NonNullable<AmegoAllowanceQueryResponse['data']>\n ): AllowanceQueryResult {\n const items = (data.product_item ?? []).map((item) =>\n AllowanceItem.create({\n originalDescription: item.description,\n quantity: item.quantity,\n unitPrice: Money.create(item.unit_price),\n amount: Money.create(item.amount),\n unit: item.unit || undefined,\n taxType: AmegoMapper.fromApiTaxType(item.tax_type),\n })\n );\n\n // 從 product_item 取得原發票資訊 (假設所有 item 來自同一張發票)\n const firstItem = data.product_item?.[0];\n const originalInvoiceNumber = firstItem?.original_invoice_number ?? '';\n const originalInvoiceDate = firstItem?.original_invoice_date\n ? AmegoMapper.parseDate(firstItem.original_invoice_date)\n : new Date();\n\n const allowance = Allowance.create({\n originalInvoiceNumber: InvoiceNumber.create(originalInvoiceNumber),\n originalInvoiceDate,\n buyerTaxId: TaxId.tryCreate(data.buyer_identifier) ?? TaxId.none(),\n sellerTaxId: TaxId.none(), // API 回應沒有賣方資訊,使用空值\n buyerName: data.buyer_name || '',\n items,\n });\n\n // 設定折讓編號和日期\n const allowanceDate = AmegoMapper.parseDate(data.allowance_date);\n allowance.setAllowanceNumber(data.allowance_number, allowanceDate);\n allowance.updateStatus(AmegoMapper.toAllowanceStatus(data.invoice_status));\n\n return {\n allowance,\n status: AmegoMapper.toAllowanceStatus(data.invoice_status),\n };\n }\n\n /**\n * Map API list item response to domain query result\n */\n private mapListItemResponse(\n item: NonNullable<AmegoAllowanceListResponse['data']>[0]\n ): AllowanceQueryResult {\n // 從 product_item 取得原發票資訊\n const firstProductItem = item.product_item?.[0];\n const originalInvoiceNumber = firstProductItem?.original_invoice_number ?? '';\n const originalInvoiceDate = firstProductItem?.original_invoice_date\n ? AmegoMapper.parseDate(firstProductItem.original_invoice_date)\n : new Date();\n\n // 建立折讓明細\n const items = (item.product_item ?? []).map((productItem) =>\n AllowanceItem.create({\n originalDescription: productItem.description,\n quantity: productItem.quantity,\n unitPrice: Money.create(productItem.unit_price),\n amount: Money.create(productItem.amount),\n unit: productItem.unit || undefined,\n taxType: AmegoMapper.fromApiTaxType(productItem.tax_type),\n })\n );\n\n // 如果沒有 product_item,建立 placeholder\n const allowanceItems = items.length > 0 ? items : [\n AllowanceItem.create({\n originalDescription: '(詳細請查詢單張折讓)',\n quantity: 1,\n unitPrice: Money.create(item.total_amount),\n amount: Money.create(item.total_amount),\n taxType: AmegoMapper.fromApiTaxType(1), // Default to taxable\n }),\n ];\n\n const allowance = Allowance.create({\n originalInvoiceNumber: InvoiceNumber.create(originalInvoiceNumber),\n originalInvoiceDate,\n buyerTaxId: TaxId.tryCreate(item.buyer_identifier) ?? TaxId.none(),\n sellerTaxId: TaxId.none(),\n buyerName: item.buyer_name || '',\n items: allowanceItems,\n });\n\n // 設定折讓編號和日期\n const allowanceDate = AmegoMapper.parseDate(item.allowance_date);\n allowance.setAllowanceNumber(item.allowance_number, allowanceDate);\n allowance.updateStatus(AmegoMapper.toAllowanceStatus(item.invoice_status));\n\n return {\n allowance,\n status: AmegoMapper.toAllowanceStatus(item.invoice_status),\n };\n }\n}\n","import { AmegoConfig } from './AmegoConfig.js';\nimport { AmegoAllowanceRepository } from './AmegoAllowanceRepository.js';\nimport {\n AllowanceService,\n IssueAllowanceResult,\n AllowanceStatusInfo,\n AllowanceQuery,\n} from '../../domain/allowance/AllowanceService.js';\nimport { Allowance } from '../../domain/allowance/Allowance.js';\nimport { InvoiceNumber } from '../../domain/invoice/InvoiceNumber.js';\nimport {\n PaginatedResult,\n createPaginatedResult,\n} from '../../domain/shared/Pagination.js';\nimport { DateType } from '../../domain/shared/LocalDate.js';\n\n/**\n * Amego Allowance Service\n *\n * Implements AllowanceService using Amego (光貿) provider.\n */\nexport class AmegoAllowanceService implements AllowanceService {\n private readonly repository: AmegoAllowanceRepository;\n\n constructor(config: AmegoConfig) {\n this.repository = new AmegoAllowanceRepository(config);\n }\n\n /**\n * Issue a new allowance (開立折讓)\n */\n async issue(allowance: Allowance): Promise<IssueAllowanceResult> {\n const result = await this.repository.issue(allowance);\n\n return {\n allowanceNumber: result.allowanceNumber,\n allowanceDate: result.allowanceDate,\n };\n }\n\n /**\n * Void an allowance (作廢折讓)\n */\n async void(allowanceNumber: string): Promise<void> {\n await this.repository.void(allowanceNumber);\n }\n\n /**\n * Find allowance by allowance number\n */\n async findByNumber(allowanceNumber: string): Promise<Allowance | null> {\n const result = await this.repository.findByAllowanceNumber(allowanceNumber);\n return result?.allowance ?? null;\n }\n\n /**\n * Find allowances by original invoice number\n */\n async findByInvoiceNumber(invoiceNumber: InvoiceNumber): Promise<Allowance[]> {\n const results = await this.repository.findByInvoiceNumber(invoiceNumber);\n return results.map((r) => r.allowance);\n }\n\n /**\n * List allowances with query\n */\n async list(query: AllowanceQuery): Promise<PaginatedResult<Allowance>> {\n const result = await this.repository.list({\n dateType: query.dateType === DateType.CREATE_DATE ? 2 : 1,\n startDate: query.dateRange.start.toNumber().toString(),\n endDate: query.dateRange.end.toNumber().toString(),\n limit: query.pagination.limit,\n page: query.pagination.page,\n });\n\n const allowances = result.allowances.map((r) => r.allowance);\n\n return createPaginatedResult(allowances, result.totalCount, query.pagination);\n }\n\n /**\n * Get allowance status\n */\n async getStatus(allowanceNumbers: string[]): Promise<AllowanceStatusInfo[]> {\n const results = await this.repository.getStatus(allowanceNumbers);\n\n return results.map((r) => ({\n allowanceNumber: r.allowanceNumber,\n status: r.status,\n totalAmount: r.totalAmount,\n }));\n }\n}\n","import {\n Provider,\n Capability,\n PROVIDER_CAPABILITIES,\n PROVIDER_NAMES,\n} from './Provider.js';\nimport {\n UnsupportedCapabilityError,\n ProviderNotImplementedError,\n} from './errors/index.js';\nimport { InvoiceService } from './domain/invoice/InvoiceService.js';\nimport { AllowanceService } from './domain/allowance/AllowanceService.js';\nimport { AmegoInvoiceService } from './infrastructure/amego/AmegoInvoiceService.js';\nimport { AmegoAllowanceService } from './infrastructure/amego/AmegoAllowanceService.js';\n\n/**\n * Zinvoice client configuration\n */\nexport interface ZinvoiceConfig {\n /** Provider to use */\n provider: Provider;\n /** Seller tax ID (統一編號) */\n sellerTaxId: string;\n /** API key */\n apiKey: string;\n /** API base URL (optional, uses provider default) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Zinvoice - Taiwan E-Invoice SDK\n *\n * Main entry point for the zinvoice SDK.\n * Provides a unified interface across different e-invoice providers.\n */\nexport class Zinvoice {\n private readonly _provider: Provider;\n private readonly _invoiceService: InvoiceService;\n private readonly _allowanceService: AllowanceService;\n private readonly _capabilities: Set<Capability>;\n\n private constructor(\n provider: Provider,\n invoiceService: InvoiceService,\n allowanceService: AllowanceService\n ) {\n this._provider = provider;\n this._invoiceService = invoiceService;\n this._allowanceService = allowanceService;\n this._capabilities = PROVIDER_CAPABILITIES[provider];\n }\n\n /**\n * Create a Zinvoice client\n */\n static create(config: ZinvoiceConfig): Zinvoice {\n switch (config.provider) {\n case Provider.AMEGO:\n return Zinvoice.createAmego(config);\n default:\n throw new ProviderNotImplementedError(config.provider);\n }\n }\n\n /**\n * Create a Zinvoice client for Amego provider\n */\n private static createAmego(config: ZinvoiceConfig): Zinvoice {\n const amegoConfig = {\n baseUrl: config.baseUrl ?? 'https://invoice-api.amego.tw',\n sellerTaxId: config.sellerTaxId,\n apiKey: config.apiKey,\n timeout: config.timeout,\n };\n\n const invoiceService = new AmegoInvoiceService(amegoConfig);\n const allowanceService = new AmegoAllowanceService(amegoConfig);\n\n return new Zinvoice(Provider.AMEGO, invoiceService, allowanceService);\n }\n\n /**\n * Get the invoice service\n */\n get invoices(): InvoiceService {\n return this._invoiceService;\n }\n\n /**\n * Get the allowance service\n */\n get allowances(): AllowanceService {\n return this._allowanceService;\n }\n\n /**\n * Get the current provider\n */\n get provider(): Provider {\n return this._provider;\n }\n\n /**\n * Get the provider display name\n */\n get providerName(): string {\n return PROVIDER_NAMES[this._provider];\n }\n\n /**\n * Check if a capability is supported\n */\n supports(capability: Capability): boolean {\n return this._capabilities.has(capability);\n }\n\n /**\n * Get all supported capabilities\n */\n getCapabilities(): Capability[] {\n return Array.from(this._capabilities);\n }\n\n /**\n * Assert that a capability is supported, throw if not\n */\n requireCapability(capability: Capability): void {\n if (!this.supports(capability)) {\n throw new UnsupportedCapabilityError(capability, this._provider);\n }\n }\n}\n","import { InvalidCarrierCodeError } from '../../errors/index.js';\n\n/**\n * Carrier types supported by Taiwan e-invoice system\n */\nexport enum CarrierType {\n /** Mobile barcode (手機條碼) */\n MOBILE = '3J0002',\n /** Natural person certificate (自然人憑證條碼) */\n CERTIFICATE = 'CQ0001',\n /** Amego member carrier (光貿會員載具) */\n AMEGO = 'amego',\n /** No carrier */\n NONE = '',\n}\n\n/**\n * Carrier Code Value Object\n *\n * Represents a carrier (載具) for Taiwan e-invoice.\n * Validates format based on carrier type.\n */\nexport class CarrierCode {\n private constructor(\n private readonly _type: CarrierType | string,\n private readonly _code1: string,\n private readonly _code2: string\n ) {}\n\n /**\n * Create a CarrierCode for mobile barcode\n * Format: /[A-Z0-9.+-]{7}\n */\n static mobile(code: string): CarrierCode {\n const normalized = code.trim().toUpperCase();\n\n if (!CarrierCode.isValidMobileBarcode(normalized)) {\n throw new InvalidCarrierCodeError(code, CarrierType.MOBILE);\n }\n\n return new CarrierCode(CarrierType.MOBILE, normalized, normalized);\n }\n\n /**\n * Create a CarrierCode for natural person certificate\n * Format: 2 letters + 14 digits\n */\n static certificate(code: string): CarrierCode {\n const normalized = code.trim().toUpperCase();\n\n if (!CarrierCode.isValidCertificate(normalized)) {\n throw new InvalidCarrierCodeError(code, CarrierType.CERTIFICATE);\n }\n\n return new CarrierCode(CarrierType.CERTIFICATE, normalized, normalized);\n }\n\n /**\n * Create a CarrierCode for Amego member\n * Format: a+phone number (a0911222333) or email\n */\n static amego(code: string): CarrierCode {\n const normalized = code.trim().toLowerCase();\n\n if (!CarrierCode.isValidAmego(normalized)) {\n throw new InvalidCarrierCodeError(code, CarrierType.AMEGO);\n }\n\n return new CarrierCode(CarrierType.AMEGO, normalized, normalized);\n }\n\n /**\n * Create a CarrierCode for custom carrier type\n */\n static custom(type: string, code1: string, code2: string): CarrierCode {\n return new CarrierCode(type, code1.trim(), code2.trim());\n }\n\n /**\n * Create an empty carrier (no carrier)\n */\n static none(): CarrierCode {\n return new CarrierCode(CarrierType.NONE, '', '');\n }\n\n /**\n * Validate mobile barcode format\n * Format: starts with \"/\" followed by 7 characters (A-Z, 0-9, +, -, .)\n */\n static isValidMobileBarcode(code: string): boolean {\n return /^\\/[A-Z0-9.+-]{7}$/.test(code);\n }\n\n /**\n * Validate natural person certificate format\n * Format: 2 uppercase letters + 14 digits\n */\n static isValidCertificate(code: string): boolean {\n return /^[A-Z]{2}\\d{14}$/.test(code);\n }\n\n /**\n * Validate Amego member carrier format\n * Format: \"a\" + phone number or email\n */\n static isValidAmego(code: string): boolean {\n // Phone format: a0911222333\n if (/^a09\\d{8}$/.test(code)) {\n return true;\n }\n // Email format\n if (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(code)) {\n return true;\n }\n return false;\n }\n\n /**\n * Get carrier type (alias for type property)\n */\n getType(): CarrierType | string {\n return this._type;\n }\n\n /**\n * Get carrier code 1 (顯碼)\n */\n getCode1(): string {\n return this._code1;\n }\n\n /**\n * Get carrier code 2 (隱碼)\n */\n getCode2(): string {\n return this._code2;\n }\n\n /**\n * Carrier type for API usage\n */\n get type(): CarrierType | string {\n return this._type;\n }\n\n /**\n * Carrier value (code1) for API usage\n */\n get value(): string {\n return this._code1;\n }\n\n /**\n * Check if this is an empty carrier\n */\n isEmpty(): boolean {\n return this._type === CarrierType.NONE;\n }\n\n /**\n * Check if this is a mobile barcode carrier\n */\n isMobile(): boolean {\n return this._type === CarrierType.MOBILE;\n }\n\n /**\n * Check equality\n */\n equals(other: CarrierCode): boolean {\n return (\n this._type === other._type &&\n this._code1 === other._code1 &&\n this._code2 === other._code2\n );\n }\n}\n","import { DateRange, DateType, LocalDate } from '../shared/LocalDate.js';\nimport { Pagination } from '../shared/Pagination.js';\n\n/**\n * Invoice Query Value Object\n *\n * 發票查詢條件。\n */\nexport class InvoiceQuery {\n private constructor(\n private readonly _dateRange: DateRange,\n private readonly _dateType: DateType,\n private readonly _pagination: Pagination\n ) {}\n\n /**\n * Create a query with all parameters\n */\n static create(options: {\n dateRange: DateRange;\n dateType?: DateType;\n pagination?: Pagination;\n }): InvoiceQuery {\n return new InvoiceQuery(\n options.dateRange,\n options.dateType ?? DateType.INVOICE_DATE,\n options.pagination ?? Pagination.first()\n );\n }\n\n /**\n * Create a query by invoice date\n */\n static byInvoiceDate(\n dateRange: DateRange,\n pagination?: Pagination\n ): InvoiceQuery {\n return InvoiceQuery.create({\n dateRange,\n dateType: DateType.INVOICE_DATE,\n pagination,\n });\n }\n\n /**\n * Create a query by create date\n */\n static byCreateDate(\n dateRange: DateRange,\n pagination?: Pagination\n ): InvoiceQuery {\n return InvoiceQuery.create({\n dateRange,\n dateType: DateType.CREATE_DATE,\n pagination,\n });\n }\n\n /**\n * Create a query for a specific month\n */\n static forMonth(year: number, month: number, pagination?: Pagination): InvoiceQuery {\n const start = LocalDate.of(year, month, 1);\n // Get last day of month\n const nextMonth = month === 12 ? 1 : month + 1;\n const nextYear = month === 12 ? year + 1 : year;\n const lastDay = new Date(nextYear, nextMonth - 1, 0).getDate();\n const end = LocalDate.of(year, month, lastDay);\n\n return InvoiceQuery.create({\n dateRange: DateRange.between(start, end),\n dateType: DateType.INVOICE_DATE,\n pagination,\n });\n }\n\n /**\n * Create a query for a specific year\n */\n static forYear(year: number, pagination?: Pagination): InvoiceQuery {\n return InvoiceQuery.create({\n dateRange: DateRange.between(\n LocalDate.of(year, 1, 1),\n LocalDate.of(year, 12, 31)\n ),\n dateType: DateType.INVOICE_DATE,\n pagination,\n });\n }\n\n /**\n * Get the date range\n */\n get dateRange(): DateRange {\n return this._dateRange;\n }\n\n /**\n * Get the date type\n */\n get dateType(): DateType {\n return this._dateType;\n }\n\n /**\n * Get the pagination\n */\n get pagination(): Pagination {\n return this._pagination;\n }\n\n /**\n * Create a new query with different pagination\n */\n withPagination(pagination: Pagination): InvoiceQuery {\n return new InvoiceQuery(this._dateRange, this._dateType, pagination);\n }\n\n /**\n * Create a query for the next page\n */\n nextPage(): InvoiceQuery {\n return this.withPagination(this._pagination.next());\n }\n}\n","import { Money } from '../shared/Money.js';\nimport { TaxType, TAX_RATE } from '../shared/TaxType.js';\nimport { InvoiceItem } from '../invoice/InvoiceItem.js';\nimport { AllowanceItem } from '../allowance/AllowanceItem.js';\n\n/**\n * Tax calculation result\n */\nexport interface TaxCalculationResult {\n /** 應稅銷售額 (含稅時為含稅金額) */\n taxableSales: Money;\n /** 免稅銷售額 */\n taxExemptSales: Money;\n /** 零稅率銷售額 */\n zeroRatedSales: Money;\n /** 營業稅額 */\n taxAmount: Money;\n /** 總計金額 */\n totalAmount: Money;\n}\n\n/**\n * Tax Calculator Domain Service\n *\n * Handles tax calculations following Taiwan's e-invoice specifications.\n * Supports both tax-included and tax-excluded pricing.\n */\nexport class TaxCalculator {\n /**\n * Calculate tax for invoice items\n */\n static calculateForInvoice(\n items: readonly InvoiceItem[],\n pricesIncludeTax: boolean,\n hasB2BTaxId: boolean\n ): TaxCalculationResult {\n const taxableSales = TaxCalculator.sumByTaxType(items, TaxType.TAXABLE);\n const taxExemptSales = TaxCalculator.sumByTaxType(items, TaxType.TAX_EXEMPT);\n const zeroRatedSales = TaxCalculator.sumByTaxType(items, TaxType.ZERO_RATED);\n\n // B2C invoices (no tax ID) have zero tax amount\n const taxAmount = hasB2BTaxId\n ? TaxCalculator.calculateTaxAmount(taxableSales, pricesIncludeTax)\n : Money.zero();\n\n const totalAmount = TaxCalculator.calculateTotal(\n taxableSales,\n taxExemptSales,\n zeroRatedSales,\n taxAmount,\n pricesIncludeTax\n );\n\n return {\n taxableSales,\n taxExemptSales,\n zeroRatedSales,\n taxAmount,\n totalAmount,\n };\n }\n\n /**\n * Calculate tax for allowance items\n */\n static calculateForAllowance(\n items: readonly AllowanceItem[],\n pricesIncludeTax: boolean\n ): TaxCalculationResult {\n const taxableSales = TaxCalculator.sumAllowanceByTaxType(\n items,\n TaxType.TAXABLE\n );\n const taxExemptSales = TaxCalculator.sumAllowanceByTaxType(\n items,\n TaxType.TAX_EXEMPT\n );\n const zeroRatedSales = TaxCalculator.sumAllowanceByTaxType(\n items,\n TaxType.ZERO_RATED\n );\n\n const taxAmount = TaxCalculator.calculateTaxAmount(\n taxableSales,\n pricesIncludeTax\n );\n\n const totalAmount = TaxCalculator.calculateTotal(\n taxableSales,\n taxExemptSales,\n zeroRatedSales,\n taxAmount,\n pricesIncludeTax\n );\n\n return {\n taxableSales,\n taxExemptSales,\n zeroRatedSales,\n taxAmount,\n totalAmount,\n };\n }\n\n /**\n * Calculate tax amount from taxable sales\n */\n static calculateTaxAmount(\n taxableSales: Money,\n pricesIncludeTax: boolean\n ): Money {\n if (pricesIncludeTax) {\n // Tax included: Extract tax from total\n // tax = total - round(total / 1.05)\n const beforeTax = taxableSales.divide(1 + TAX_RATE).round();\n return taxableSales.subtract(beforeTax);\n } else {\n // Tax excluded: Add tax to sales\n // tax = round(sales * 0.05)\n return taxableSales.multiply(TAX_RATE).round();\n }\n }\n\n /**\n * Calculate net amount (before tax) from tax-included amount\n */\n static extractNetAmount(taxIncludedAmount: Money): Money {\n return taxIncludedAmount.divide(1 + TAX_RATE).round();\n }\n\n /**\n * Calculate gross amount (after tax) from tax-excluded amount\n */\n static addTax(taxExcludedAmount: Money): Money {\n const tax = taxExcludedAmount.multiply(TAX_RATE).round();\n return taxExcludedAmount.add(tax);\n }\n\n /**\n * Sum invoice items by tax type\n */\n private static sumByTaxType(\n items: readonly InvoiceItem[],\n taxType: TaxType\n ): Money {\n return items\n .filter((item) => item.taxType === taxType)\n .reduce((sum, item) => sum.add(item.amount), Money.zero())\n .round();\n }\n\n /**\n * Sum allowance items by tax type\n */\n private static sumAllowanceByTaxType(\n items: readonly AllowanceItem[],\n taxType: TaxType\n ): Money {\n return items\n .filter((item) => item.taxType === taxType)\n .reduce((sum, item) => sum.add(item.amount), Money.zero())\n .round();\n }\n\n /**\n * Calculate total amount\n */\n private static calculateTotal(\n taxableSales: Money,\n taxExemptSales: Money,\n zeroRatedSales: Money,\n taxAmount: Money,\n pricesIncludeTax: boolean\n ): Money {\n if (pricesIncludeTax) {\n // Prices already include tax\n return taxableSales.add(taxExemptSales).add(zeroRatedSales);\n } else {\n // Add tax to total\n return taxableSales\n .add(taxExemptSales)\n .add(zeroRatedSales)\n .add(taxAmount);\n }\n }\n}\n","import { Invoice } from '../domain/invoice/Invoice.js';\nimport { InvoiceNumber } from '../domain/invoice/InvoiceNumber.js';\nimport { InvoiceItem } from '../domain/invoice/InvoiceItem.js';\nimport {\n InvoiceRepository,\n IssueInvoiceResult,\n InvoiceQueryResult,\n InvoiceStatusResult,\n ListInvoicesOptions,\n} from '../domain/invoice/InvoiceRepository.js';\nimport { TaxId } from '../domain/shared/TaxId.js';\nimport { Money } from '../domain/shared/Money.js';\nimport { TaxType } from '../domain/shared/TaxType.js';\nimport { OrderId } from '../domain/shared/OrderId.js';\nimport { Buyer } from '../domain/shared/Buyer.js';\nimport { Carrier } from '../domain/shared/Carrier.js';\nimport { Donation } from '../domain/shared/Donation.js';\n\n/**\n * Simplified input for creating invoice items\n */\nexport interface CreateInvoiceItemInput {\n /** 品名 */\n description: string;\n /** 數量 */\n quantity: number;\n /** 單價 */\n unitPrice: number;\n /** 小計 (optional, auto-calculated if not provided) */\n amount?: number;\n /** 單位 */\n unit?: string;\n /** 備註 */\n remark?: string;\n /** 課稅別 (default: TAXABLE) */\n taxType?: TaxType;\n}\n\n/**\n * Simplified input for issuing an invoice\n */\nexport interface IssueInvoiceInput {\n /** 訂單編號 */\n orderId: string;\n /** 買方統一編號 (empty or '0000000000' for B2C) */\n buyerTaxId?: string;\n /** 買方名稱 */\n buyerName: string;\n /** 商品明細 */\n items: CreateInvoiceItemInput[];\n /** 買方地址 */\n buyerAddress?: string;\n /** 買方電話 */\n buyerPhone?: string;\n /** 買方信箱 */\n buyerEmail?: string;\n /** 總備註 */\n remark?: string;\n /** 載具類型與號碼 */\n carrier?: {\n type: 'mobile' | 'certificate' | 'amego';\n value: string;\n };\n /** 捐贈碼 */\n donationCode?: string;\n /** 字軌 API 代碼 */\n trackApiCode?: string;\n /** 通關方式 (for zero-rated) */\n customsClearanceMark?: 1 | 2;\n /** 零稅率原因 (for zero-rated) */\n zeroTaxRateReason?: number;\n /** 品牌名稱 */\n brandName?: string;\n /** 明細含稅或未稅 (default: true) */\n pricesIncludeTax?: boolean;\n}\n\n/**\n * Invoice Application Service (Legacy)\n *\n * @deprecated Use Zinvoice facade instead:\n * ```typescript\n * const client = Zinvoice.create({ provider: Provider.AMEGO, ... });\n * await client.invoices.issue(invoice);\n * ```\n */\nexport class InvoiceService {\n constructor(private readonly repository: InvoiceRepository) {}\n\n /**\n * Issue a new invoice\n */\n async issue(input: IssueInvoiceInput): Promise<IssueInvoiceResult> {\n // Convert input items to domain items\n const items = input.items.map((item) => {\n const unitPrice = Money.create(item.unitPrice);\n\n if (item.amount !== undefined) {\n return InvoiceItem.create({\n description: item.description,\n quantity: item.quantity,\n unitPrice,\n amount: Money.create(item.amount),\n unit: item.unit,\n remark: item.remark,\n taxType: item.taxType,\n });\n }\n\n return InvoiceItem.createWithAutoAmount({\n description: item.description,\n quantity: item.quantity,\n unitPrice,\n unit: item.unit,\n remark: item.remark,\n taxType: item.taxType,\n });\n });\n\n // Build Buyer\n const buyerTaxId = input.buyerTaxId\n ? TaxId.tryCreate(input.buyerTaxId) ?? TaxId.none()\n : TaxId.none();\n\n const buyer = buyerTaxId.isNone()\n ? Buyer.anonymous(input.buyerName)\n : Buyer.company({\n taxId: buyerTaxId,\n name: input.buyerName,\n address: input.buyerAddress,\n phone: input.buyerPhone,\n email: input.buyerEmail,\n });\n\n // Build Carrier\n let carrier: Carrier | undefined;\n if (input.carrier) {\n switch (input.carrier.type) {\n case 'mobile':\n carrier = Carrier.mobile(input.carrier.value);\n break;\n case 'certificate':\n carrier = Carrier.certificate(input.carrier.value);\n break;\n case 'amego':\n carrier = Carrier.custom('amego' as any, input.carrier.value);\n break;\n }\n }\n\n // Build Donation\n const donation = input.donationCode\n ? Donation.tryCreate(input.donationCode)\n : undefined;\n\n // Create and issue invoice\n const invoice = Invoice.create({\n orderId: OrderId.create(input.orderId),\n buyer,\n items,\n carrier,\n donation,\n remark: input.remark,\n trackApiCode: input.trackApiCode,\n customsClearanceMark: input.customsClearanceMark,\n zeroTaxRateReason: input.zeroTaxRateReason,\n brandName: input.brandName,\n pricesIncludeTax: input.pricesIncludeTax,\n });\n\n return this.repository.issue(invoice);\n }\n\n /**\n * Void an invoice\n */\n async void(invoiceNumber: string): Promise<void> {\n const number = InvoiceNumber.create(invoiceNumber);\n return this.repository.void(number);\n }\n\n /**\n * Query invoice by invoice number\n */\n async findByInvoiceNumber(\n invoiceNumber: string\n ): Promise<InvoiceQueryResult | null> {\n const number = InvoiceNumber.create(invoiceNumber);\n return this.repository.findByInvoiceNumber(number);\n }\n\n /**\n * Query invoice by order ID\n */\n async findByOrderId(orderId: string): Promise<InvoiceQueryResult | null> {\n return this.repository.findByOrderId(orderId);\n }\n\n /**\n * Check invoice status\n */\n async getStatus(invoiceNumbers: string[]): Promise<InvoiceStatusResult[]> {\n const numbers = invoiceNumbers.map((n) => InvoiceNumber.create(n));\n return this.repository.getStatus(numbers);\n }\n\n /**\n * List invoices\n */\n async list(options: ListInvoicesOptions): Promise<{\n invoices: InvoiceQueryResult[];\n totalPages: number;\n currentPage: number;\n totalCount: number;\n }> {\n return this.repository.list(options);\n }\n}\n","import {\n Allowance,\n CreateAllowanceProps,\n} from '../domain/allowance/Allowance.js';\nimport { AllowanceItem } from '../domain/allowance/AllowanceItem.js';\nimport {\n AllowanceRepository,\n IssueAllowanceResult,\n AllowanceQueryResult,\n AllowanceStatusResult,\n ListAllowancesOptions,\n} from '../domain/allowance/AllowanceRepository.js';\nimport { InvoiceNumber } from '../domain/invoice/InvoiceNumber.js';\nimport { TaxId } from '../domain/shared/TaxId.js';\nimport { Money } from '../domain/shared/Money.js';\nimport { TaxType } from '../domain/shared/TaxType.js';\n\n/**\n * Simplified input for creating allowance items\n */\nexport interface CreateAllowanceItemInput {\n /** 原發票品名 */\n originalDescription: string;\n /** 數量 */\n quantity: number;\n /** 單價 */\n unitPrice: number;\n /** 金額 (optional, auto-calculated if not provided) */\n amount?: number;\n /** 單位 */\n unit?: string;\n /** 課稅別 (default: TAXABLE) */\n taxType?: TaxType;\n}\n\n/**\n * Simplified input for issuing an allowance\n */\nexport interface IssueAllowanceInput {\n /** 原發票號碼 */\n originalInvoiceNumber: string;\n /** 原發票日期 (Date object or YYYYMMDD string) */\n originalInvoiceDate: Date | string;\n /** 買方統一編號 */\n buyerTaxId?: string;\n /** 賣方統一編號 */\n sellerTaxId: string;\n /** 折讓明細 */\n items: CreateAllowanceItemInput[];\n /** 買方名稱 */\n buyerName?: string;\n /** 賣方名稱 */\n sellerName?: string;\n /** 明細含稅或未稅 (default: true) */\n pricesIncludeTax?: boolean;\n}\n\n/**\n * Allowance Application Service\n *\n * Provides high-level operations for allowance management.\n * Acts as the main entry point for allowance-related use cases.\n */\nexport class AllowanceService {\n constructor(private readonly repository: AllowanceRepository) {}\n\n /**\n * Issue a new allowance\n */\n async issue(input: IssueAllowanceInput): Promise<IssueAllowanceResult> {\n // Convert input items to domain items\n const items = input.items.map((item) => {\n const unitPrice = Money.create(item.unitPrice);\n\n if (item.amount !== undefined) {\n return AllowanceItem.create({\n originalDescription: item.originalDescription,\n quantity: item.quantity,\n unitPrice,\n amount: Money.create(item.amount),\n unit: item.unit,\n taxType: item.taxType,\n });\n }\n\n return AllowanceItem.createWithAutoAmount({\n originalDescription: item.originalDescription,\n quantity: item.quantity,\n unitPrice,\n unit: item.unit,\n taxType: item.taxType,\n });\n });\n\n // Parse date if string\n let invoiceDate: Date;\n if (typeof input.originalInvoiceDate === 'string') {\n const dateStr = input.originalInvoiceDate;\n if (dateStr.length === 8) {\n // YYYYMMDD format\n const year = parseInt(dateStr.substring(0, 4), 10);\n const month = parseInt(dateStr.substring(4, 6), 10) - 1;\n const day = parseInt(dateStr.substring(6, 8), 10);\n invoiceDate = new Date(year, month, day);\n } else {\n invoiceDate = new Date(dateStr);\n }\n } else {\n invoiceDate = input.originalInvoiceDate;\n }\n\n // Create allowance props\n const props: CreateAllowanceProps = {\n originalInvoiceNumber: InvoiceNumber.create(input.originalInvoiceNumber),\n originalInvoiceDate: invoiceDate,\n buyerTaxId: input.buyerTaxId\n ? TaxId.tryCreate(input.buyerTaxId) ?? TaxId.none()\n : TaxId.none(),\n sellerTaxId: TaxId.create(input.sellerTaxId),\n items,\n buyerName: input.buyerName,\n sellerName: input.sellerName,\n pricesIncludeTax: input.pricesIncludeTax,\n };\n\n // Create and issue allowance\n const allowance = Allowance.create(props);\n return this.repository.issue(allowance);\n }\n\n /**\n * Void an allowance\n */\n async void(allowanceNumber: string): Promise<void> {\n return this.repository.void(allowanceNumber);\n }\n\n /**\n * Query allowance by allowance number\n */\n async findByAllowanceNumber(\n allowanceNumber: string\n ): Promise<AllowanceQueryResult | null> {\n return this.repository.findByAllowanceNumber(allowanceNumber);\n }\n\n /**\n * Query allowances by original invoice number\n */\n async findByInvoiceNumber(\n invoiceNumber: string\n ): Promise<AllowanceQueryResult[]> {\n const number = InvoiceNumber.create(invoiceNumber);\n return this.repository.findByInvoiceNumber(number);\n }\n\n /**\n * Check allowance status\n */\n async getStatus(allowanceNumbers: string[]): Promise<AllowanceStatusResult[]> {\n return this.repository.getStatus(allowanceNumbers);\n }\n\n /**\n * List allowances\n */\n async list(options: ListAllowancesOptions): Promise<{\n allowances: AllowanceQueryResult[];\n totalPages: number;\n currentPage: number;\n totalCount: number;\n }> {\n return this.repository.list(options);\n }\n}\n"]}
|