適用對象:
負責人員:後端 API 開發人員、儲存程序開發人員
欄位名稱 | PK | 資料型態 | 說明 | 畫面欄位中文 | 畫面說明 |
---|---|---|---|---|---|
VOUCHER_NO | Y | VARCHAR2(12) | 傳票編號,唯一性 | 傳票編號 | 必填,作為查詢和維護的主要識別碼。 |
ACCNT_YEAR | VARCHAR2(4) | 會計年度 | 會計年度 | 必填,格式為 YYYY。 | |
ACCNT_PERIOD | VARCHAR2(2) | 會計期間 | 會計期間 | 必填,格式為 MM。 | |
VOUCHER_DATE | DATE | 傳票日期 | 傳票日期 | 必填,格式為 YYYY-MM-DD。 | |
LAST_UPDATE_DATE | DATE | 最近維護日期 | 最後維護日 | 系統自動填入,不需輸入。 |
欄位名稱 | PK | 資料型態 | 說明 | 畫面欄位中文 | 畫面說明 |
---|---|---|---|---|---|
VOUCHER_NO | Y | VARCHAR2(12) | 傳票編號 | 傳票編號 | 對應主檔,必填。 |
SEQ_NO | Y | NUMBER(4) | 明細序號 | 明細序號 | 系統自動產生,不需輸入。 |
ACCNT_NO | VARCHAR2(10) | 科目代號 | 科目代號 | 必填,按 F9 開啟選擇視窗。 |
|
DEBIT_AMT | NUMBER | 借方金額 | 借方金額 | 若為借方金額,則必填且不可為負數。 | |
CREDIT_AMT | NUMBER | 貸方金額 | 貸方金額 | 若為貸方金額,則必填且不可為負數。 |
負責人員:後端 API 開發人員
GLM001Controller
包含多個 API 路由,用於處理傳票的新增、修改、刪除和查詢等操作。以下是詳細說明各個路由的用途、參數、回應結構和錯誤處理:
GLM001Controller
POST /api/GLM001/QueryAccnt
inputVo
(AccntSpread_InputVo
):包含查詢條件,如科目代號、科目名稱。List<Accnt_OutputVo>
,包含符合條件的科目代號清單。RESULT_CODE
為 SysMessage.S0000001
。[Route("QueryAccnt")]
[HttpPost]
public ApiResult<List<Accnt_OutputVo>> QueryAccnt([FromBody] AccntSpread_InputVo inputVo)
{
ApiResult<List<Accnt_OutputVo>> result = new ApiResult<List<Accnt_OutputVo>>();
ServiceResult<List<Accnt_OutputVo>> serviceResult = _commonService.GetAccntList(inputVo);
switch (serviceResult.status)
{
case CommonEnum.ACTION_STATUS.SUCCESS:
result.RESULT = serviceResult.result;
result.RESULT_CODE = SysMessage.S0000001;
break;
case CommonEnum.ACTION_STATUS.NOTFOUND:
result.RESULT_CODE = SysMessage.S0000001;
break;
case CommonEnum.ACTION_STATUS.FAILURE:
result.RESULT_CODE = SysMessage.S0010001;
break;
}
return result;
}
POST /api/GLM001/AddVoucher
voucherInput
(Voucher_InputVo
):包含新增的傳票主檔和明細資訊,如傳票編號、科目代號、借方金額等。RESULT_CODE
為 SysMessage.S0000000
。RESULT_CODE
為 SysMessage.S0000002
,並包含錯誤訊息。[Route("AddVoucher")]
[HttpPost]
public ApiResult AddVoucher([FromBody] Voucher_InputVo voucherInput)
{
ApiResult result = new ApiResult();
ServiceResult serviceResult = _voucherService.AddVoucher(voucherInput);
switch (serviceResult.status)
{
case CommonEnum.ACTION_STATUS.SUCCESS:
result.RESULT_CODE = SysMessage.S0000000;
break;
case CommonEnum.ACTION_STATUS.FAILURE:
result.RESULT_CODE = SysMessage.S0000002;
result.RESULT_MSG = serviceResult.message;
break;
}
return result;
}
PUT /api/GLM001/UpdateVoucher
voucherInput
(Voucher_InputVo
):包含修改的傳票資訊。RESULT_CODE
為 SysMessage.S0000000
。RESULT_CODE
為 SysMessage.S0000003
,並提供錯誤訊息。[Route("UpdateVoucher")]
[HttpPut]
public ApiResult UpdateVoucher([FromBody] Voucher_InputVo voucherInput
)
{
ApiResult result = new ApiResult();
ServiceResult serviceResult = _voucherService.UpdateVoucher(voucherInput);
switch (serviceResult.status)
{
case CommonEnum.ACTION_STATUS.SUCCESS:
result.RESULT_CODE = SysMessage.S0000000;
break;
case CommonEnum.ACTION_STATUS.FAILURE:
result.RESULT_CODE = SysMessage.S0000003;
result.RESULT_MSG = serviceResult.message;
break;
}
return result;
}
#### 3.1.4 刪除傳票
- **API 路徑**:`DELETE /api/GLM001/DeleteVoucher/{voucherNo}`
- **描述**:刪除指定的傳票資料,需確認無沖銷資料才能執行刪除。
- **參數**:
- `voucherNo`(`string`):要刪除的傳票編號。
- **回應**:
- 成功:回傳 `RESULT_CODE` 為 `SysMessage.S0000000`。
- 異常狀況:若存在沖銷資料或刪除失敗,回傳 `RESULT_CODE` 為 `SysMessage.S0000004`,並提供錯誤訊息。
- **程式碼片段**:
```csharp
[Route("DeleteVoucher/{voucherNo}")]
[HttpDelete]
public ApiResult DeleteVoucher(string voucherNo)
{
ApiResult result = new ApiResult();
ServiceResult serviceResult = _voucherService.DeleteVoucher(voucherNo);
switch (serviceResult.status)
{
case CommonEnum.ACTION_STATUS.SUCCESS:
result.RESULT_CODE = SysMessage.S0000000;
break;
case CommonEnum.ACTION_STATUS.FAILURE:
result.RESULT_CODE = SysMessage.S0000004;
result.RESULT_MSG = serviceResult.message;
break;
}
return result;
}
GET /api/GLM001/GetVoucher/{voucherNo}
voucherNo
(string
):要查詢的傳票編號。Voucher_OutputVo
,包含傳票主檔和明細檔資料。RESULT_CODE
為 SysMessage.S0000001
。[Route("GetVoucher/{voucherNo}")]
[HttpGet]
public ApiResult<Voucher_OutputVo> GetVoucher(string voucherNo)
{
ApiResult<Voucher_OutputVo> result = new ApiResult<Voucher_OutputVo>();
ServiceResult<Voucher_OutputVo> serviceResult = _voucherService.GetVoucher(voucherNo);
switch (serviceResult.status)
{
case CommonEnum.ACTION_STATUS.SUCCESS:
result.RESULT = serviceResult.result;
result.RESULT_CODE = SysMessage.S0000000;
break;
case CommonEnum.ACTION_STATUS.NOTFOUND:
result.RESULT_CODE = SysMessage.S0000001;
break;
}
return result;
}
負責人員:前端開發人員
ACCNT_NO
)UNIT_ID
)OBJECT_NO
)RELATION_NO
)RELATION_DATE
)OFFSET_NO
)OFFSET_VOUCHER
)SEQ_NO
)ACCNT_NAME
)UNIT_NAME
)DEBIT_AMT
)VOUCHER_DESC
)OFFSET_VOUCHER_SEQ
)DUE_DATE
)CREDIT_AMT
)此圖幫助開發人員了解傳票畫面中每個欄位的位置和名稱,方便在新增和修改操作時進行欄位輸入。
傳票字頭:在輸入傳票編號時,選擇適當的傳票字頭。
示意圖:
圖2 - 傳票字頭選擇
圖2顯示了在新增傳票時輸入傳票編號的傳票字頭選擇界面,用戶可在此設定適當的傳票編號格式。
科目代號:按下 F9
鍵顯示科目代號選擇視窗,從 gl_accnt_master
表中選擇科目代號。
示意圖:
圖8 - 科目代號查詢視窗
圖8顯示了科目代號的查詢視窗,讓用戶可以輸入科目代號或名稱進行搜尋,並選擇適當的科目。
單位別:在單位欄位中輸入或選擇單位,並根據輸入內容進行驗證。
示意圖:
圖9 - 單位代號查詢視窗
圖9顯示了單位代號的查詢視窗,讓用戶可以搜尋並選擇相應的單位代號。
對象代號:按下 F9
鍵顯示對象代號選擇視窗,從客戶資料表中選擇相應的客戶代號。
示意圖:
圖10 - 客戶代號查詢視窗
圖10展示了客戶代號查詢的視窗,用戶可以輸入客戶名稱進行搜尋,並選擇相應的客戶代號。
摘要:按下 F9
鍵顯示摘要選擇視窗,從標準摘要資料中選擇合適的摘要內容。
示意圖:
圖11 - 標準摘要查詢視窗
圖11展示了標準摘要的查詢視窗,用戶可以搜尋並選擇合適的摘要內容。
沖銷傳票:輸入沖銷代號、沖銷傳票號、沖銷到期日等欄位。
示意圖:
圖5 - 沖銷傳票操作界面
圖5顯示了沖帳作業的相關欄位,包括沖銷代號、沖銷傳票號、沖銷到期日等,幫助用戶在新增或修改傳票時設定沖銷資訊。
沖銷代號:按下 F9
鍵顯示沖銷代號選擇視窗,從沖銷代號資料中選擇合適的代號。
示意圖:
圖12 - 沖銷代號查詢視窗
圖12展示了沖銷代號的查詢視窗,用戶可以搜尋並選擇合適的沖銷代號。
沖銷傳票序號:在進行沖帳操作時,選擇待沖銷的傳票序號。
示意圖:
圖13 - 沖銷傳票序號查詢視窗
圖13展示了沖銷傳票序號的查詢視窗,包含傳票編號、序號、摘要、待沖銷餘額等資訊,供用戶選擇適當的沖銷傳票。
查詢傳票:輸入查詢條件(如傳票編號、會計年度),點擊查詢按鈕,顯示符合條件的傳票資料。
示意圖:
圖14 - 傳票資料查詢作業
圖14顯示了查詢和修改傳票的操作畫面,用戶可以根據輸入的查詢條件(如傳票編號、會計期間)顯示傳票資料,並進行相關修改。
更新內容:選擇要修改的傳票,更新傳票內容,如科目代號、金額等。
示意圖:
圖15 - 傳票修改作業
圖15展示了傳票修改的畫面,包含了傳票內容的詳細資訊,讓用戶進行調整和更新。
存檔:完成修改後,點擊存檔按鈕,將更新的內容保存至資料庫。
負責人員:儲存程序開發人員
欄位名稱 | 資料型態 | 說明 |
---|---|---|
公司別(P_COMPANY_ID) | VARCHAR2(10) | 從 MIS_USER 表中取得,不可為空值。 |
科目代號(P_ACCNT_NO) | VARCHAR2(10) | 必須為有效的科目代號,系統自動進行驗證。 |
借方金額(P_DEBIT_AMT) | NUMBER | 若金額為負數,則顯示錯誤訊息。 |
貸方金額(P_CREDIT_AMT) | NUMBER | 若金額為負數,則顯示錯誤訊息。 |
負責人員:前端開發人員、儲存程序開發人員
異常訊息 | 處理方式 |
---|---|
公司別不可為空值 | 顯示錯誤訊息,並阻止操作繼續。 |
傳票編號重複 | 顯示錯誤訊息,提示使用者輸入新的傳票編號。 |
借方金額不可為負 | 顯示錯誤訊息,要求重新輸入借方金額。 |
科目代號不存在 | 顯示錯誤訊息,阻止存檔操作,要求選擇有效的科目代號。 |
負責人員:儲存程序開發人員
GL_VOUCHER_MASTER.VOUCHER_NO
必須為 11 碼,且在相同年度中具有唯一性。以下是優化後的 8. DB 物件說明
,包含每個儲存程序的詳細運作流程、參數說明、SQL 操作細節和錯誤處理邏輯。這樣的格式將更有助於儲存程序開發人員編寫相應的儲存程序。
負責人員:儲存程序開發人員
本節詳細描述 GLM001
傳票維護中涉及的資料庫物件,包括各儲存程序、函數的用途、參數、運作流程和 SQL 操作細節,以協助儲存程序開發人員正確編寫程式碼。
物件名稱 | 類型 | 說明 | 相關業務規則 |
---|---|---|---|
GLM001 |
Package | 包含傳票維護相關的主要邏輯。 | 負責新增、修改、刪除傳票的業務邏輯處理。 |
DEL_CHECK_APM |
Function | 檢查應付帳款子畫面是否存在資料。 | 在刪除傳票前,確認應付帳款是否已沖銷。 |
DEL_CHECK_ARM |
Function | 檢查應收帳款子畫面是否存在資料。 | 在刪除傳票前,確認應收帳款是否已沖銷。 |
CHECK_UNIT |
Procedure | 檢查單位別的有效性。 | 驗證傳票明細中的單位別是否存在及有效。 |
GL_CREATE_OFFSET |
Procedure | 建立沖銷餘額。 | 負責處理沖銷相關的業務邏輯。 |
GLM001
GLM001
是處理傳票新增、修改、刪除的核心 Package,包含多個儲存程序和函數來執行各項操作。DEL_CHECK_APM
P_VOUCHER_NO
(VARCHAR2
):要檢查的傳票編號。P_RESULT
(OUT VARCHAR2
):返回檢查結果,若有沖銷記錄,則返回錯誤訊息。P_VOUCHER_NO
。SELECT COUNT(*)
INTO v_count
FROM ap_payable
WHERE voucher_no = P_VOUCHER_NO
AND status = 'UNPAID';
v_count > 0
,則表示存在未沖銷的應付帳款記錄,設置 P_RESULT
為錯誤訊息:「該傳票存在未沖銷的應付帳款,無法刪除」。P_RESULT
為空,表示檢查通過。CREATE OR REPLACE FUNCTION DEL_CHECK_APM (
P_VOUCHER_NO IN VARCHAR2,
P_RESULT OUT VARCHAR2
) RETURN BOOLEAN IS
v_count NUMBER;
BEGIN
-- 查詢應付帳款狀態
SELECT COUNT(*)
INTO v_count
FROM ap_payable
WHERE voucher_no = P_VOUCHER_NO
AND status = 'UNPAID';
-- 檢查結果
IF v_count > 0 THEN
P_RESULT := '該傳票存在未沖銷的應付帳款,無法刪除';
RETURN FALSE;
ELSE
P_RESULT := NULL;
RETURN TRUE;
END IF;
EXCEPTION
WHEN OTHERS THEN
P_RESULT := '檢查應付帳款時發生錯誤:' || SQLERRM;
RETURN FALSE;
END DEL_CHECK_APM;
CHECK_UNIT
UNIT_ID
)是否合法及有效,防止錯誤的單位別被寫入傳票。P_UNIT
(VARCHAR2
):要檢查的單位別代碼。P_ACCNT
(VARCHAR2
):要檢查的科目代號。P_MSG
(OUT VARCHAR2
):返回錯誤訊息,若單位別無效則提供詳細錯誤描述。P_UNIT
和 P_ACCNT
。gl_unit_store_view
表中查找 P_UNIT
,並確認該單位別是否在有效期間內,SQL 如下:SELECT COUNT(*)
INTO v_count
FROM gl_unit_store_view
WHERE unit_id = P_UNIT
AND SYSDATE BETWEEN EFF_DATE_FROM AND EFF_DATE_TO;
v_count = 0
,則設置 P_MSG
為「該單位別無效或已失效」。v_count > 0
,設置 P_MSG
為空,表示檢查通過。CREATE OR REPLACE PROCEDURE CHECK_UNIT (
P_UNIT IN VARCHAR2,
P_ACCNT IN VARCHAR2,
P_MSG OUT VARCHAR2
) AS
v_count NUMBER;
BEGIN
-- 檢查單位別有效性
SELECT COUNT(*)
INTO v_count
FROM gl_unit_store_view
WHERE unit_id = P_UNIT
AND SYSDATE BETWEEN EFF_DATE_FROM AND EFF_DATE_TO;
-- 設置錯誤訊息
IF v_count = 0 THEN
P_MSG := '該單位別無效或已失效';
ELSE
P_MSG := NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
P_MSG := '檢查單位別時發生錯誤:' || SQLERRM;
END CHECK_UNIT;
GL_CREATE_OFFSET
P_OFFSET_NO
(VARCHAR2
):沖銷傳票編號。P_AMOUNT
(NUMBER
):沖銷金額。P_RESULT
(OUT VARCHAR2
):返回操作結果,若操作失敗則提供詳細錯誤描述。P_OFFSET_NO
和 P_AMOUNT
。UPDATE gl_create_offset_balance
SET balance_amount = balance_amount - P_AMOUNT
WHERE offset_no = P_OFFSET_NO;
P_RESULT
為「沖銷金額超出可用餘額」並回滾交易。GL_CREATE_OFFSET_BALANCE
表中的狀態欄位。P_RESULT
為操作結果,成功時返回空值,失敗時返回錯誤訊息。CREATE OR REPLACE PROCEDURE GL_CREATE_OFFSET (
P_OFFSET_NO IN VARCHAR2,
P_AMOUNT IN NUMBER,
P_RESULT OUT VARCHAR2) AS
BEGIN
-- 更新沖銷餘額
UPDATE gl_create_offset_balance
SET balance_amount = balance_amount - P_AMOUNT
WHERE offset_no = P_OFFSET_NO;
-- 檢查餘額
IF SQL%ROWCOUNT = 0 THEN
P_RESULT := '沖銷傳票不存在或金額超過可用餘額';
ROLLBACK;
ELSE
P_RESULT := NULL;
END IF;
EXCEPTION
WHEN OTHERS THEN
P_RESULT := '建立沖銷餘額時發生錯誤:' || SQLERRM;
ROLLBACK;
END GL_CREATE_OFFSET;
負責人員:儲存程序開發人員
變數名稱 | 資料型態 | 說明 |
---|---|---|
P_COMPANY_ID | VARCHAR2 | 公司別,從 MIS_USER 表中取得。 |
負責人員:前端開發人員
新增傳票流程:
修改傳票流程:
負責人員:前端開發人員
快捷鍵 | 功能描述 |
---|---|
F4 | 刪除目前選中的資料。 |
F9 | 開啟科目代號選擇視窗。 |
適用對象:全體開發人員
本文件為開發人員提供傳票維護系統的使用流程、API 設計、資料表結構、異常處理和操作規則。請在開發過程中參考本文件。