# 扣繳明細及寄發通知 - 實現指南 ## 概述 此文檔說明如何完成 "扣繳明細及寄發通知" 功能的後端實現。前端 UI 與基本服務框架已完成,需要實現核心的業務邏輯。 ## 已實現的部分 ### 1. 前端 (ASPX + Vue.js) - ✅ Tab 1 UI 布局完整,包括: - 查詢條件輸入欄位 - 查詢結果表格(支持展開/收合明細) - 郵件設定區塊 - 郵件預覽與發送功能 - ✅ JavaScript 邏輯框架: - `loadDetailTableDropdowns()` - 加載下拉清單 - `searchDetailTable()` - 查詢資料 - `exportDetailTable()` - 匯出 Excel - `previewEmail()` - 預覽郵件 - `sendEmail()` - 發送郵件 - `toggleSelectAll()` - 全選/反選 ### 2. 後端服務基框架 (Services/領據處理.asmx.cs) 已新增三個服務方法,框架完整但需實現 SQL 邏輯: - `SearchDetailTable()` - 扣繳明細查詢與匯出 - `SendEmail()` - 郵件發送與預覽 - `GetDropdownLists()` - 已存在,返回下拉清單 ## 需要實現的部分 ### 1. SearchDetailTable 方法 (Services/領據處理.asmx.cs) **位置**: 約 900 行 **任務**: - 根據查詢條件查詢扣繳明細資料 - 支持 DATA(回傳資料)和 EXPORT(匯出 Excel)兩種模式 **返回資料結構**(DATA 模式): ```csharp List 或 DataTable { 編號 (或 ID/no) - 用於郵件發送時識別收件者 領款人姓名 身分證字號 戶籍地址 扣繳類別 合計金額 應扣繳稅額 服務費 已發送 (boolean) - 判斷是否已發送過郵件 明細 - List 或 nested DataTable { 計畫代號 活動日期 活動名稱 扣繳類別 金額 (講師/勞務費) 應扣繳稅額 服務費 } } ``` **實現建議**: 1. 使用 DAC_領據 與相關 DAC 類別查詢 2. 按日期與身分別條件篩選 3. 使用講師非講師編號進行分組 4. 對於 EXPORT 模式,可建立新的 Report 類別或使用現有的 Excel 工具 ### 2. SendEmail 方法 (Services/領據處理.asmx.cs) **位置**: 約 950 行 **任務**: - PREVIEW 模式:組織郵件預覽資料 - SENDMAIL 模式:實際發送郵件 **實現建議**: 1. PREVIEW 模式:返回將發送的郵件預覽,供確認 2. SENDMAIL 模式: - 遍歷 `講師非講師編號` 列表 - 根據編號查詢收件者郵箱地址 - 使用 .NET 的 SmtpClient 或郵件服務發送 - 記錄發送時間至資料庫(更新「已發送」欄位) - 返回成功/失敗統計 **注意**: - 需要配置 SMTP 服務設定(郵件伺服器、帳號密碼等) - 考慮錯誤處理:單個郵件失敗不應中斷整個流程 - 建議記錄郵件發送日誌 ### 3. 資料庫相關 **需要確認**: - 講師/非講師資料表中是否有郵箱欄位 - 是否有「郵件發送記錄」表來追蹤已發送狀態 - 領據資料表的結構與關聯 ### 4. DAC 擴展(如需要) **可能需要新增方法**: - `DAC_領據.SelectDetailByDate()` - 按日期範圍查詢明細 - 郵件發送記錄相關的 DAC 操作 - 收件者郵箱查詢方法 ## 前端資料綁定說明 ### ASPX 欄位映射 查詢結果表格預期從後端接收以下欄位: | 前端顯示 | 資料欄位 | 說明 | |---------|--------|------| | 要發送勾選 | item.selected | Vue.js 雙向綁定 | | 已發送 | item.已發送 | boolean | | 領款人姓名 | item.領款人姓名 | string | | 身分證字號 | item.身分證字號 | string | | 戶籍地址 | item.戶籍地址 | string | | 扣繳類別 | item.扣繳類別 | string | | 合計金額 | item.合計金額 | decimal | | 應扣繳稅額 | item.應扣繳稅額 | decimal | | 服務費 | item.服務費 | decimal | | 明細展開 | item.showDetail | Vue.js 控制 | | 明細列表 | item.明細 | List | ## 編號欄位處理 JavaScript 代碼支持多種 ID 欄位名稱: ```javascript item.ID || item.編號 || item.no ``` **選擇一個作為主要欄位即可** ## 測試檢查清單 - [ ] GetDropdownLists 能正確返回身分別與憑證類別 - [ ] SearchDetailTable(DATA) 返回結構化的查詢結果 - [ ] SearchDetailTable(EXPORT) 能成功匯出 Excel - [ ] SendEmail(PREVIEW) 能正確組織郵件預覽資料 - [ ] SendEmail(SENDMAIL) 能正確發送郵件 - [ ] 郵件發送後,已發送欄位應更新為是 ## 相關檔案 - 前端: `Forms\領據系統\財稅作業與領據關帳.aspx` - JavaScript: `Scripts\財稅作業與領據關帳.js` - 後端服務: `Services\領據處理.asmx.cs` - 資料存取: `DAC\領據系統\DAC_領據2.cs` - 文件: `DOC\扣繳明細及寄發通知.md`