{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/checkMaintenance.ts","../src/validateInput.ts","../src/utils.ts","../src/validateVoucher.ts"],"sourcesContent":["import { BASE_URL } from \"./constants\";\r\nimport { checkMaintenance } from \"./checkMaintenance\";\r\nimport { validateInput } from \"./validateInput\";\r\nimport { bahtToSatang } from \"./utils\";\r\nimport { isValidVoucher } from \"./validateVoucher\";\r\nimport type {\r\n  RedeemVoucherResponse,\r\n  ReturnData,\r\n  Options,\r\n  StatusCode,\r\n} from \"./types\";\r\n\r\n/**\r\n * แลกคูปอง TrueMoney Wallet\r\n * @param phoneNumber - เบอร์โทรศัพท์ผู้รับเงิน\r\n * @param voucherUrl - URL ของคูปอง\r\n * @param options - ตัวเลือกเพิ่มเติม\r\n * @returns Promise<ReturnData>\r\n * @throws {TmnVoucherError}\r\n */\r\nexport default async function redeemvouchers(\r\n  phoneNumber: string,\r\n  voucherUrl: string,\r\n  options?: Options\r\n): Promise<ReturnData> {\r\n  const urlParams = new URLSearchParams(new URL(voucherUrl).search);\r\n  const voucherCode = urlParams.get('v');\r\n\r\n\r\n  // Validate input\r\n  const inputValidation = await validateInput(phoneNumber, voucherUrl, options);\r\n  if (!inputValidation.success) {\r\n    return inputValidation;\r\n  }\r\n\r\n  // Check maintenance\r\n  const maintenance = await checkMaintenance();\r\n  if (!maintenance.success) {\r\n    return maintenance;\r\n  }\r\n\r\n  if (options) {\r\n    const verifyResponse: RedeemVoucherResponse = await fetch(\r\n      BASE_URL + \"/campaign/vouchers/\" + voucherCode + \"/verify\"\r\n    ).then((response) => response.json());\r\n\r\n    if (!verifyResponse.data || verifyResponse.status.code !== \"SUCCESS\") {\r\n      return {\r\n        success: false,\r\n        code: verifyResponse.status.code as Exclude<StatusCode, \"SUCCESS\">,\r\n        message: verifyResponse.status.message,\r\n      };\r\n    }\r\n\r\n    const { voucher } = verifyResponse.data;\r\n\r\n    // Validate voucher conditions\r\n    if (!isValidVoucher(voucher, options)) {\r\n      return {\r\n        success: false,\r\n        code: \"CONDITION_NOT_MET\",\r\n        message: \"ไม่ตรงเงื่อนไข\",\r\n      };\r\n    }\r\n  }\r\n\r\n  const redeemResponse: RedeemVoucherResponse = await fetch(\r\n    BASE_URL + \"/campaign/vouchers/\" + voucherCode + \"/redeem\",\r\n    {\r\n      method: \"POST\",\r\n      headers: {\r\n        \"Content-Type\": \"application/json\",\r\n      },\r\n      body: JSON.stringify({\r\n        mobile: phoneNumber,\r\n        voucher_hash: voucherCode,\r\n      }),\r\n    }\r\n  ).then((response) => response.json());\r\n\r\n  if (redeemResponse.status.code === \"SUCCESS\") {\r\n    const successResponse = redeemResponse as Extract<\r\n      RedeemVoucherResponse,\r\n      { status: { code: \"SUCCESS\" } }\r\n    >;\r\n    return {\r\n      success: true,\r\n      code: \"SUCCESS\",\r\n      message: redeemResponse.status.message,\r\n      amount: bahtToSatang(successResponse.data.my_ticket.amount_baht),\r\n      data: successResponse.data,\r\n    };\r\n  }\r\n\r\n  return {\r\n    success: false,\r\n    code: redeemResponse.status.code,\r\n    message: redeemResponse.status.message,\r\n    data: redeemResponse.data,\r\n  };\r\n}","export const BASE_URL = \"https://gift.truemoney.com\" as const;","import { BASE_URL } from \"./constants\";\r\nimport type { MaintenanceResponse } from \"./types\";\r\n\r\nexport async function checkMaintenance(): Promise<MaintenanceResponse> {\r\n  const response = await fetch(BASE_URL + \"/campaign/vouchers/configuration\");\r\n  const data = await response.json();\r\n\r\n  if (data?.status?.code === \"SUCCESS\") {\r\n    return {\r\n      success: true,\r\n      code: \"SUCCESS\",\r\n    };\r\n  }\r\n\r\n  console.log(\"!ทรูมันนี่ปิดปรับปรุงระบบ\");\r\n  return {\r\n    success: false,\r\n    code: \"MAINTEINANCE\",\r\n    message: data.data.ma.title_th,\r\n  };\r\n}\r\n","import z from \"zod\";\r\nimport { BASE_URL } from \"./constants\";\r\nimport type { ValidateInputResponse, Options } from \"./types\";\r\n\r\nconst inputSchema = z.object({\r\n  phoneNumber: z\r\n    .string()\r\n    .length(10, \"หมายเลขโทรศัพท์ต้องมี 10 หลัก\")\r\n    .refine((x) => /^\\d+$/.test(x), \"หมายเลขโทรศัพท์ต้องเป็นตัวเลข\")\r\n    .refine((x) => x.startsWith(\"0\"), \"หมายเลขโทรศัพท์ต้องขึ้นต้นด้วย 0\"),\r\n  voucherUrl: z\r\n    .string()\r\n    .refine(\r\n      (x) => x.startsWith(BASE_URL + \"/campaign/?v=\") || \r\n              x.startsWith(BASE_URL + \"/campaign?v=\") || \r\n              x.startsWith(BASE_URL + \"/campaign/voucher_detail?v=\") || \r\n              x.startsWith(BASE_URL + \"/campaign/voucher_detail/?v=\"),\r\n      \"รูปแบบ URL Voucher ไม่ถูกต้อง\"\r\n    )\r\n    .refine(\r\n      (x) => /^https:\\/\\/gift\\.truemoney\\.com\\/campaign(\\/voucher_detail)?(\\?v=|\\/\\?v=)[A-Za-z0-9]+$/.test(x),\r\n      \"รูปแบบ URL Voucher ไม่ถูกต้อง\"\r\n    ),\r\n});\r\n\r\nconst optionsSchema = z.object({\r\n  amount: z\r\n    .number()\r\n    .int(\"amount: ต้องเป็นจำนวนเต็ม\")\r\n    .positive()\r\n    .min(100, \"amount: จำนวนเงินขั้นต่ำ 100 บาท\")\r\n    .max(20000000, \"amount: จำนวนเงินต้องไม่เกิน 200,000 บาท\"),\r\n});\r\n\r\nexport async function validateInput(\r\n  phoneNumber: string,\r\n  voucherUrl: string,\r\n  options?: Options\r\n): Promise<ValidateInputResponse> {\r\n  const validationResult = inputSchema.safeParse({ phoneNumber, voucherUrl });\r\n  if (!validationResult.success) {\r\n    return {\r\n      success: false,\r\n      code: \"INVALID_INPUT\",\r\n      message: validationResult.error.errors[0].message,\r\n    };\r\n  }\r\n\r\n  if (options) {\r\n    const optionsValidationResult = optionsSchema.safeParse(options);\r\n    if (!optionsValidationResult.success) {\r\n      optionsValidationResult.error.errors.map((error) => {\r\n        console.log(error.message);\r\n      });\r\n      return {\r\n        success: false,\r\n        code: \"INVALID_INPUT\",\r\n        message: optionsValidationResult.error.errors[0].message,\r\n      };\r\n    }\r\n  }\r\n\r\n  return {\r\n    success: true,\r\n    code: \"SUCCESS\",\r\n  };\r\n}\r\n","export function satangToBaht(satang: number): string {\r\n  const baht = satang / 100;\r\n  return baht.toFixed(2);\r\n}\r\n\r\nexport function bahtToSatang(bahtStr: string): number {\r\n  // แปลงสตริงเป็นจำนวนทศนิยมโดยตรง\r\n  const bahtFloat = parseFloat(bahtStr);\r\n  // คูณด้วย 100 เพื่อแปลงเป็นสตางค์\r\n  const satang = bahtFloat * 100;\r\n  // ปัดเศษเป็นจำนวนเต็ม\r\n  return Math.round(satang);\r\n}\r\n","import { satangToBaht, bahtToSatang } from \"./utils\";\r\nimport type { Options, Voucher } from \"./types\";\r\n\r\n// Utility function to validate voucher conditions\r\nexport function isValidVoucher(voucher: Voucher, options: Options): boolean {\r\n  const { amount_baht, redeemed_amount_baht, available, type, member } =\r\n    voucher;\r\n\r\n  const amountInSatang = bahtToSatang(amount_baht); // จำนวนเงินในซองทั้งหมด\r\n\r\n  if (member === 1) {\r\n    return satangToBaht(options.amount) === amount_baht;\r\n  }\r\n\r\n  if (member > 1) {\r\n    // ถ้าซองเป็น สุ่มจำนวน\r\n    if (type === \"R\") {\r\n      const balance = amountInSatang - bahtToSatang(redeemed_amount_baht);\r\n      return available === 1 && options.amount === balance;\r\n    }\r\n\r\n    // ถ้าซองเป็น แบ่งเท่ากัน\r\n    if (type === \"F\") {\r\n      const balance = amountInSatang / member;\r\n      return options.amount === balance;\r\n    }\r\n  }\r\n\r\n  return false;\r\n}\r\n"],"mappings":"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","names":["z"]}