diff --git a/client/src/tests/manualInvoiceView.spec.ts b/client/src/tests/manualInvoiceView.spec.ts index 35d0dd0..307e723 100644 --- a/client/src/tests/manualInvoiceView.spec.ts +++ b/client/src/tests/manualInvoiceView.spec.ts @@ -666,6 +666,52 @@ describe('ReservationManualInvoiceView', () => { ) }) + it('prefills KANGLER TRAVEL directory data and submits its stable recipient codes', async () => { + vi.mocked(service.generateManualReservationInvoice).mockResolvedValue(createResult()) + const wrapper = mountView() + + await wrapper.find('[data-testid="recipient-company-code"]').setValue('KANGLER_TRAVEL') + + expect((wrapper.find('[data-testid="recipient-contact-id"]').element as HTMLSelectElement).value).toBe( + 'KANGLER_TRAVEL_KHUN_DOW', + ) + expect((wrapper.find('[data-testid="recipient-company-input"]').element as HTMLInputElement).value).toBe( + 'KANGLER TRAVEL GROUP CO.,LTD', + ) + expect((wrapper.find('[data-testid="recipient-attention-input"]').element as HTMLInputElement).value).toBe( + 'Khun Dow', + ) + expect((wrapper.find('[data-testid="recipient-address"]').element as HTMLTextAreaElement).value).toBe( + 'เลขที่290/27, Soi Ladprao 84, Wangthonglang,Bangkok,10310', + ) + expect((wrapper.find('[data-testid="recipient-telephone"]').element as HTMLInputElement).value).toBe( + '081-1237170', + ) + expect((wrapper.find('[data-testid="recipient-email"]').element as HTMLInputElement).value).toBe( + 'kanglertravel.op91@gmail.com', + ) + + await fillMinimumInvoiceForm(wrapper) + await wrapper.find('[data-testid="manual-invoice-submit"]').trigger('click') + await flushPromises() + + expect(service.generateManualReservationInvoice).toHaveBeenCalledWith( + expect.objectContaining({ + invoice_payload: expect.objectContaining({ + recipient: expect.objectContaining({ + company_code: 'KANGLER_TRAVEL', + contact_id: 'KANGLER_TRAVEL_KHUN_DOW', + company: 'KANGLER TRAVEL GROUP CO.,LTD', + attention: 'Khun Dow', + address: 'เลขที่290/27, Soi Ladprao 84, Wangthonglang,Bangkok,10310', + telephone: '081-1237170', + email: 'kanglertravel.op91@gmail.com', + }), + }), + }), + ) + }) + it('downloads the generated PDF through a browser blob URL', async () => { vi.mocked(service.generateManualReservationInvoice).mockResolvedValue(createResult()) const fetchMock = vi.fn().mockResolvedValue({ diff --git a/client/src/views/reservation/ReservationManualInvoiceView.vue b/client/src/views/reservation/ReservationManualInvoiceView.vue index b3cafae..c412340 100644 --- a/client/src/views/reservation/ReservationManualInvoiceView.vue +++ b/client/src/views/reservation/ReservationManualInvoiceView.vue @@ -909,6 +909,19 @@ const recipientCompanies: RecipientCompanySeed[] = [ }, ], }, + { + company_code: 'KANGLER_TRAVEL', + company: 'KANGLER TRAVEL GROUP CO.,LTD', + contacts: [ + { + contact_id: 'KANGLER_TRAVEL_KHUN_DOW', + attention: 'Khun Dow', + address: 'เลขที่290/27, Soi Ladprao 84, Wangthonglang,Bangkok,10310', + telephone: '081-1237170', + email: 'kanglertravel.op91@gmail.com', + }, + ], + }, { company_code: 'HANATOUR', company: 'HANATOUR TD CO., LTD.', diff --git a/docs/project/frontend-backend/backend-to-frontend-notes.md b/docs/project/frontend-backend/backend-to-frontend-notes.md index 95cc5bf..e44adbe 100644 --- a/docs/project/frontend-backend/backend-to-frontend-notes.md +++ b/docs/project/frontend-backend/backend-to-frontend-notes.md @@ -448,7 +448,7 @@ M009 后端 CP2 已实现:页面可不依赖订单或任务,用户手工填 - 从任务进入时,后续可以使用 `GET /api/reservation/tasks/{taskId}` 的 `fields[]`、草稿或确认 payload 预填;从订单进入时,需要明确选择具体任务或提示仅使用订单摘要,避免一个订单多任务时字段来源不清。 - Company、Attention、Address、Tel、Email、Booking Date 第一阶段可以按“选择 + Manual 手填”控件处理。 - Company、Attention、Address、Tel、Email 是一组收件方联系人档案,不是五个互相独立字段;选择 Company 后应刷新 Attention 候选,选择 Attention 后应带出 Address、Tel、Email。Booking Date 展示在同一区域,但不属于联系人档案,应作为 `document.booking_date` 独立提交。 -- 第一阶段已确认六组客户 / 旅行社种子数据:`LIAN_TAI` / `LIAN TAI TRAVEL (THAILAND) CO., LTD.` + `Khun Ann`;`QBD` / `Q.B.D. TRAVEL GROUP CO., LTD` + `Jitdanun Panaphuchong`;`MING_SONG` / `MING SONG CO.LTD` + `KHUN JIN`;`TEIGER_TRAVEL` / `TEIGER TRAVEL GROUP CO.,LTD` + `Khun Nutkritta Upamai (Kwan)`;`CLOVER_HOLIDAY` / `CLOVER HOLIDAY` + `KHUN JANE`;`HANATOUR` / `HANATOUR TD CO., LTD.` + 7 个联系人。完整数据以 `docs/project/requirements/M009-manual-invoice-generation-v1.md` 为准。 +- 第一阶段已确认七组客户 / 旅行社种子数据:`LIAN_TAI` / `LIAN TAI TRAVEL (THAILAND) CO., LTD.` + `Khun Ann`;`QBD` / `Q.B.D. TRAVEL GROUP CO., LTD` + `Jitdanun Panaphuchong`;`MING_SONG` / `MING SONG CO.LTD` + `KHUN JIN`;`TEIGER_TRAVEL` / `TEIGER TRAVEL GROUP CO.,LTD` + `Khun Nutkritta Upamai (Kwan)`;`CLOVER_HOLIDAY` / `CLOVER HOLIDAY` + `KHUN JANE`;`KANGLER_TRAVEL` / `KANGLER TRAVEL GROUP CO.,LTD` + `Khun Dow`;`HANATOUR` / `HANATOUR TD CO., LTD.` + 7 个联系人。完整数据以 `docs/project/requirements/M009-manual-invoice-generation-v1.md` 为准。 - Room Type、Room Rate、Extra Bed 建议也预留“选择 + 可手填 / 可覆盖”能力,后续接 PMS 房型、Rate Code 或价格配置。 - Room Rate / 费用明细 Rate 第一阶段只校验必填、数字格式和非负数,允许 `0`;Quantity 和 Nights 仍必须大于 `0`。 - No.of Night(s) 前端默认按 `Departure Date - Arrival Date` 自动填入第一条费用明细 Night(s),用户手工修改后保留用户输入,不再因日期变化覆盖。 diff --git a/docs/project/requirements/M009-manual-invoice-generation-v1.md b/docs/project/requirements/M009-manual-invoice-generation-v1.md index eb5300d..66cf67e 100644 --- a/docs/project/requirements/M009-manual-invoice-generation-v1.md +++ b/docs/project/requirements/M009-manual-invoice-generation-v1.md @@ -116,6 +116,7 @@ | `MING_SONG` | `MING SONG CO.LTD` | `MING_SONG_KHUN_JIN` | `KHUN JIN` | `290 Soi Lat Phrao 94 (Panjamit), Phlapphla Subdistrict, Wang Thonglang District, Bangkok, TH, 10310` | `098-2519896` | `taiziyoutravel@gmail.com` | | `TEIGER_TRAVEL` | `TEIGER TRAVEL GROUP CO.,LTD` | `TEIGER_TRAVEL_KHUN_NUTKRITTA_UPAMAI` | `Khun Nutkritta Upamai (Kwan)` | `20,22 Soi Rinrada,Srinakarin, Pattanakarn,Bangkok,TH, 10250` | `063-516-8294` | `nutkritta.upamai@gmail.com` | | `CLOVER_HOLIDAY` | `CLOVER HOLIDAY` | `CLOVER_HOLIDAY_KHUN_JANE` | `KHUN JANE` | `290 SOI Lat Phrao 94 (Panjamit), Phlapphla Subdistrict, 555,555/1 Moo 1, Na Jomtien, Sattahip` | `083-1470352` | `longtai.maleemalee@gmail.com` | +| `KANGLER_TRAVEL` | `KANGLER TRAVEL GROUP CO.,LTD` | `KANGLER_TRAVEL_KHUN_DOW` | `Khun Dow` | `เลขที่290/27, Soi Ladprao 84, Wangthonglang,Bangkok,10310` | `081-1237170` | `kanglertravel.op91@gmail.com` | | `HANATOUR` | `HANATOUR TD CO., LTD.` | `HANATOUR_WICHIENPRAKARN` | `Wichienprakarn, Nuanphae, Khun.` | `HanaTour Bldg, 41,Insadong 5-gil, Jongno-gu, KR` | `066 124 - 7297` | `HI219@hanatour.com` | | `HANATOUR` | `HANATOUR TD CO., LTD.` | `HANATOUR_PHONGBUPPA` | `Phongbuppa, Buppachat` | `HanaTour Bldg, 41,Insadong 5-gil, Jongno-gu, KR` | `096 051 3587` | `HI223@hanatour.com` | | `HANATOUR` | `HANATOUR TD CO., LTD.` | `HANATOUR_KANG_SUNG_HWA` | `Kang,Sung Hwa` | `HanaTour Bldg, 41,Insadong 5-gil, Jongno-gu, KR` | `82 051 804 0707` | `k8040707@nave.com` |