Initial commit: monorepo scaffold for ROLAC

- Add .gitignore covering C#/.NET and Angular/Node
- Add placeholder structure for API (C#) and APP (Angular)
- Add project docs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Chris Chen
2026-05-24 20:54:10 -07:00
commit 9b28fbcfb6
11 changed files with 4215 additions and 0 deletions
+156
View File
@@ -0,0 +1,156 @@
# ROLAC — 年度奉獻收據 (IRS Annual Giving Statement)
**文件版本:** v0.1 (2026-05-24)
> **重要提示:** 本文件為技術設計參考。正式收據的法律用語及符合性,請在發送前諮詢持牌會計師或稅務顧問。
---
## 法律背景
- ROLAC 為 IRS **501(c)(3)** 免稅組織
- **EIN:** `42-2682968`(儲存為環境變數 `CHURCH_EIN`,不 hardcode
- 依 IRS 規定,單筆奉獻 **$250 或以上** 需提供書面確認
- 年度收據通常在每年 **1 月 31 日前** 寄出,供教友報稅使用
- **現金奉獻** 若無同時期的銀行記錄,IRS 要求有組織的書面記錄
---
## 收據必要欄位(IRS 要求)
| 欄位 | 說明 |
|------|------|
| 組織全名 | River Of Life Christian Church In Arcadia |
| EIN | 42-2682968 |
| 教友姓名 | 依登錄姓名 |
| 奉獻年度 | 例:January 1 December 31, 2025 |
| 奉獻明細 | 日期、金額、類型(每筆逐一列出) |
| 年度奉獻總計 | 所有非匿名奉獻的 Net Amount 加總 |
| 免稅聲明語 | 見下方標準語句 |
| 未提供商品或服務聲明 | 見下方標準語句 |
| 組織代表簽名 | 財務同工姓名、職稱、日期 |
---
## 標準免稅聲明語(中英雙語)
**英文版(收據上必須包含)**
```
River Of Life Christian Church In Arcadia is a tax-exempt organization
under Section 501(c)(3) of the Internal Revenue Code.
EIN: 42-2682968
No goods or services were provided in exchange for this contribution.
This letter serves as your official receipt for income tax purposes.
```
**繁體中文版(附於英文後,供教友參考)**
```
River Of Life Christian Church In Arcadia 為依據美國國稅局
第 501(c)(3) 條款登記之免稅組織。
稅務識別號碼 (EIN)42-2682968
貴教友所奉獻之款項未換取任何商品或服務。
本信函作為您申報所得稅之正式收據。
```
---
## PDF 收據版面設計
```
┌─────────────────────────────────────────────┐
│ [教會 Logo] │
│ River Of Life Christian Church In Arcadia │
│ [教會地址] | EIN: 42-2682968 │
├─────────────────────────────────────────────┤
│ Annual Giving Statement / 年度奉獻收據 │
│ Tax Year: January 1 December 31, {Year} │
├─────────────────────────────────────────────┤
│ Prepared for: {Member Full Name} │
│ Date Issued: {Issue Date} │
├─────────────────────────────────────────────┤
│ Giving Detail / 奉獻明細 │
│ ───────────────────────────────────── │
│ Date Type Method Amount │
│ 2025-01-05 Tithe Check $500.00 │
│ 2025-01-05 Offering Cash $50.00 │
│ 2025-02-02 Tithe Zelle $500.00 │
│ ... │
│ ───────────────────────────────────── │
│ Total Contributions: $X,XXX.XX │
│ (PayPal fees are excluded) │
├─────────────────────────────────────────────┤
│ [免稅聲明語(英文)] │
│ [免稅聲明語(繁中)] │
├─────────────────────────────────────────────┤
│ Authorized by: {Finance Staff Name} │
│ Title: Church Finance │
│ Date: {Issue Date} │
└─────────────────────────────────────────────┘
```
---
## 金額計算規則
| 支付方式 | 收據金額 | 備注 |
|----------|----------|------|
| 現金 | `Amount` | 以信封記錄為準 |
| 支票 | `Amount` | 以支票金額為準 |
| Zelle | `Amount` | 以轉入金額為準 |
| PayPal | `NetAmount`= Amount FeeAmount | PayPal 手續費不計入可扣稅金額 |
| 匿名奉獻 | **不列入** 個人收據 | 匿名奉獻無法與個人對應 |
---
## 系統流程
```
財務同工觸發 → 選擇年度
系統查詢該年度所有
非匿名 Giving 記錄
依 MemberId 分組加總
├── 產生個人 PDFQuestPDF
├── 上傳至 Azure Blob
│ receipts/{year}/{memberId}.pdf
└── Email 寄送給教友
(含 PDF 附件 + 語言偏好)
記錄至 ReceiptLog
(誰產生、何時、寄送狀態)
```
---
## 資料模型補充
```
GivingReceipt
├── Id
├── MemberId
├── TaxYear (int, e.g. 2025)
├── TotalAmount (decimal)
├── PdfBlobPath (Azure Blob 路徑)
├── GeneratedAt
├── GeneratedByUserId
├── SentAt (Email 寄送時間,null = 未寄)
├── SentToEmail
└── IsVoided (bool, 作廢旗標)
```
---
## 重要注意事項
1. **不要 hardcode EIN** — 存於環境變數 `CHURCH_EIN`,設定頁面可修改
2. **收據一旦發出即存檔** — 即使奉獻記錄事後修改,已發出的 PDF 不可覆蓋,只能補發新版
3. **補發流程** — 財務同工可為特定教友重新產生,系統記錄「重新發出」事件至 Audit Log
4. **作廢** — 設 `IsVoided = true`,但 PDF 原檔仍保留於 Blob,不可刪除
5. **稅務諮詢** — 建議每年收據發出前,讓持牌會計師審閱格式一次