From 6cc9bb4439cf569f5219cc0831e3fdaffbe44ce6 Mon Sep 17 00:00:00 2001 From: andy Date: Wed, 5 Aug 2026 23:04:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=8B=E5=B7=A5=E5=BC=80?= =?UTF-8?q?=E7=A5=A8=20MING=20SONG=20=E5=85=AC=E5=8F=B8=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/tests/manualInvoiceView.spec.ts | 46 +++++++++++++++++++ .../ReservationManualInvoiceView.vue | 13 ++++++ .../backend-to-frontend-notes.md | 2 +- .../M009-manual-invoice-generation-v1.md | 1 + 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/client/src/tests/manualInvoiceView.spec.ts b/client/src/tests/manualInvoiceView.spec.ts index 30c64cb..8b5ac95 100644 --- a/client/src/tests/manualInvoiceView.spec.ts +++ b/client/src/tests/manualInvoiceView.spec.ts @@ -527,6 +527,52 @@ describe('ReservationManualInvoiceView', () => { expect(wrapper.find('a[href="https://oss.example/invoices/manual-91001.pdf"]').exists()).toBe(true) }) + it('prefills MING SONG 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('MING_SONG') + + expect((wrapper.find('[data-testid="recipient-contact-id"]').element as HTMLSelectElement).value).toBe( + 'MING_SONG_KHUN_JIN', + ) + expect((wrapper.find('[data-testid="recipient-company-input"]').element as HTMLInputElement).value).toBe( + 'MING SONG CO.LTD', + ) + expect((wrapper.find('[data-testid="recipient-attention-input"]').element as HTMLInputElement).value).toBe( + 'KHUN JIN', + ) + expect((wrapper.find('[data-testid="recipient-address"]').element as HTMLTextAreaElement).value).toBe( + '290 Soi Lat Phrao 94 (Panjamit), Phlapphla Subdistrict, Wang Thonglang District, Bangkok, TH, 10310', + ) + expect((wrapper.find('[data-testid="recipient-telephone"]').element as HTMLInputElement).value).toBe( + '098-2519896', + ) + expect((wrapper.find('[data-testid="recipient-email"]').element as HTMLInputElement).value).toBe( + 'taiziyoutravel@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: 'MING_SONG', + contact_id: 'MING_SONG_KHUN_JIN', + company: 'MING SONG CO.LTD', + attention: 'KHUN JIN', + address: '290 Soi Lat Phrao 94 (Panjamit), Phlapphla Subdistrict, Wang Thonglang District, Bangkok, TH, 10310', + telephone: '098-2519896', + email: 'taiziyoutravel@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 b3b1623..688f235 100644 --- a/client/src/views/reservation/ReservationManualInvoiceView.vue +++ b/client/src/views/reservation/ReservationManualInvoiceView.vue @@ -870,6 +870,19 @@ const recipientCompanies: RecipientCompanySeed[] = [ }, ], }, + { + company_code: 'MING_SONG', + company: 'MING SONG CO.LTD', + contacts: [ + { + contact_id: 'MING_SONG_KHUN_JIN', + attention: 'KHUN JIN', + address: '290 Soi Lat Phrao 94 (Panjamit), Phlapphla Subdistrict, Wang Thonglang District, Bangkok, TH, 10310', + telephone: '098-2519896', + email: 'taiziyoutravel@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 f279ad4..4a9a8c4 100644 --- a/docs/project/frontend-backend/backend-to-frontend-notes.md +++ b/docs/project/frontend-backend/backend-to-frontend-notes.md @@ -447,7 +447,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`;`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`;`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 387b818..5e496c4 100644 --- a/docs/project/requirements/M009-manual-invoice-generation-v1.md +++ b/docs/project/requirements/M009-manual-invoice-generation-v1.md @@ -113,6 +113,7 @@ | --- | --- | --- | --- | --- | --- | --- | | `LIAN_TAI` | `LIAN TAI TRAVEL (THAILAND) CO., LTD.` | `LIAN_TAI_KHUN_ANN` | `Khun Ann` | `2/86 Rajpattana Road, Rajpattana, Sapansoong, Bangkok, TH, 10240` | `061-397-2675` | `op.liantaitravel@gmail.com` | | `QBD` | `Q.B.D. TRAVEL GROUP CO., LTD` | `QBD_JITDANUN_PANAPHUCHONG` | `Jitdanun Panaphuchong` | `2/90 Rajpattana,Rajpattana,Sapansoong, Bangkok, TH, 10240` | `089-032 0176` | `op.qbdtravel@gmail.com` | +| `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` | | `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` |