帳票設計書とは
帳票設計書(Report Design Document)は、システムが出力するPDF・CSV・Excel帳票の仕様を定義した設計書です。帳票には「請求書」「納品書」のように法的根拠を持つものや、「売上集計レポート」のように経営判断に使用されるものが含まれます。
帳票設計書には帳票レイアウト(モックアップ)と出力項目定義表・データ取得SQL(または擬似コード)をセットで作成します。
💡 帳票設計で特に注意すべき点
法的帳票(請求書・領収書・納品書)は記載必須項目が法令・商慣習で定められています。インボイス制度(適格請求書等保存方式)対応が必要な場合は、登録番号・適用税率・消費税額別の記載が必須です。設計前に法務確認を行うこと。
① 帳票一覧の定義
システムが出力する全帳票を一覧化します。帳票IDを付与して後のドキュメントから参照できるようにします。
| 帳票ID | 帳票名 | 出力形式 | 用途 | 出力単位 | 関連機能ID |
|---|---|---|---|---|---|
| R001 | 受注確認書 | 顧客への受注確認送付 | 受注1件単位 | F010 | |
| R002 | 納品書 | 顧客への納品時添付書類 | 受注1件単位 | F020 | |
| R003 | 請求書 | 顧客への請求(インボイス対応) | 請求1件単位 | F030 | |
| R010 | 売上日報 | Excel | 日次売上集計(管理者向け) | 日次 | F040 |
| R011 | 月次売上集計表 | Excel | 月次売上集計(経営報告) | 月次 | F040 |
| R020 | 商品マスタダウンロード | CSV | 商品情報の一括エクスポート | 全件 or 条件抽出 | F001 |
| R021 | 受注データエクスポート | CSV | 会計システムへのデータ連携 | 期間指定 | F010 |
② 出力項目の定義
各帳票に出力する全項目を定義します。項目ごとに出力値の取得元(テーブル・カラム)と書式(日付フォーマット・数値フォーマット・ゼロ埋め)を明記します。
| No. | 項目名 | 取得元テーブル.カラム | 書式 | 備考 |
|---|---|---|---|---|
| 1 | 受注番号 | t_order.order_no | OD-000000(6桁ゼロ埋め) | — |
| 2 | 受注日 | t_order.order_date | YYYY年MM月DD日 | — |
| 3 | 顧客名 | m_customer.customer_name | — | — |
| 4 | 顧客住所 | m_customer.address | 〒XXX-XXXX 都道府県...形式 | 郵便番号から自動フォーマット |
| 5 | 小計(税抜) | 計算値 | ¥#,##0(3桁カンマ区切り) | 標準税率・軽減税率別に集計 |
| 6 | 消費税額(10%) | 計算値 | ¥#,##0 | 小数点以下切り捨て |
| 7 | 消費税額(8%) | 計算値 | ¥#,##0 | 小数点以下切り捨て |
| 8 | 合計金額(税込) | 計算値 | ¥#,##0 | — |
| 9 | 適格請求書発行事業者登録番号 | 固定値(システム設定) | T-XXXXXXXXXXXXXX | インボイス制度対応 |
③ レイアウト設計(用紙・ヘッダー・フッター)
帳票のレイアウト仕様を定義します。
| 設計項目 | 設定値 | 備考 |
|---|---|---|
| 用紙サイズ | A4縦 | — |
| 余白 | 上20mm / 下15mm / 左右15mm | — |
| フォント | 本文: IPAゴシック 10pt / 見出し: 12pt | PDF埋め込みフォント使用 |
| ヘッダー(全ページ共通) | 自社ロゴ・帳票タイトル・発行日 | — |
| フッター(全ページ共通) | ページ番号(X / Y 形式) | 最終ページのみ「以上」記載 |
| 改ページ | 明細15行を超えた場合に自動改ページ | 改ページ後もヘッダー・列見出し再印字 |
| エンコーディング(CSV) | UTF-8 BOM付き | Excel で直接開けるようBOM付きとする |
④ データ取得SQL・ロジックの定義
帳票のデータを取得するSQLを基本設計段階で記載します。JOIN・集計(GROUP BY)・ソート順を明示することで、詳細設計・実装の工数を削減できます。
-- 受注確認書(R001)データ取得SQL
SELECT
o.order_no,
o.order_date,
c.customer_name,
c.postal_code,
c.address,
od.product_name,
od.quantity,
od.unit_price,
od.tax_type,
od.quantity * od.unit_price AS subtotal_excl_tax
FROM
t_order o
INNER JOIN m_customer c ON o.customer_id = c.customer_id
INNER JOIN t_order_detail od ON o.order_id = od.order_id
WHERE
o.order_id = :order_id -- バインドパラメータ
AND o.delete_flg = FALSE
ORDER BY
od.order_detail_seq ASC;
⑤ 出力タイミングと権限の定義
帳票をいつ・誰が出力できるかを定義します。
| 帳票ID | 出力タイミング | 出力権限 | 再出力可否 |
|---|---|---|---|
| R001 受注確認書 | 受注登録完了時(手動出力) | 担当者以上 | ○ 何度でも再出力可 |
| R003 請求書 | 請求確定処理後(手動出力) | 経理担当者・管理者 | ○ 再出力時に「再発行」透かしを印字 |
| R010 売上日報 | 毎日23:59 バッチ自動生成 | 管理者のみ閲覧 | ○ 手動再生成可 |
| R021 受注データエクスポート | 随時(ユーザー操作) | 経理担当者・管理者 | — |
Python Tips — PythonでPDF帳票を生成する
Pythonでは reportlab や weasyprint(HTML→PDF)を使ってPDF帳票を生成できます。以下はreportlabを使ったシンプルな請求書生成サンプルです。
"""
reportlabで請求書PDFを生成するサンプル。
pip install reportlab
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfgen import canvas
from dataclasses import dataclass
from datetime import date
@dataclass
class InvoiceItem:
product_name: str
quantity: int
unit_price: float
tax_type: int # 10 or 8
@dataclass
class Invoice:
invoice_no: str
issue_date: date
customer_name: str
items: list[InvoiceItem]
registration_no: str # インボイス登録番号
def generate_invoice_pdf(invoice: Invoice, output_path: str) -> None:
"""請求書PDFを生成する"""
# フォント設定(IPAゴシック使用 - インストールパスを確認すること)
# pdfmetrics.registerFont(TTFont("IPAGothic", "/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf"))
c = canvas.Canvas(output_path, pagesize=A4)
width, height = A4
# タイトル
c.setFont("Helvetica-Bold", 18)
c.drawCentredString(width / 2, height - 30 * mm, "請 求 書")
# 発行日・請求書番号
c.setFont("Helvetica", 10)
c.drawRightString(width - 20 * mm, height - 45 * mm, f"発行日: {invoice.issue_date.strftime('%Y年%m月%d日')}")
c.drawRightString(width - 20 * mm, height - 52 * mm, f"請求書番号: {invoice.invoice_no}")
c.drawRightString(width - 20 * mm, height - 59 * mm, f"登録番号: {invoice.registration_no}")
# 宛先
c.setFont("Helvetica-Bold", 12)
c.drawString(20 * mm, height - 55 * mm, f"{invoice.customer_name} 御中")
# 明細テーブルヘッダー
y = height - 80 * mm
c.setFont("Helvetica-Bold", 9)
c.drawString(20 * mm, y, "品名")
c.drawString(100 * mm, y, "数量")
c.drawString(120 * mm, y, "単価")
c.drawString(145 * mm, y, "金額")
c.drawString(170 * mm, y, "税率")
# 明細
c.setFont("Helvetica", 9)
subtotal_10 = subtotal_8 = 0.0
for item in invoice.items:
y -= 8 * mm
amount = item.quantity * item.unit_price
if item.tax_type == 10:
subtotal_10 += amount
else:
subtotal_8 += amount
c.drawString(20 * mm, y, item.product_name)
c.drawRightString(115 * mm, y, str(item.quantity))
c.drawRightString(143 * mm, y, f"¥{item.unit_price:,.0f}")
c.drawRightString(168 * mm, y, f"¥{amount:,.0f}")
c.drawString(172 * mm, y, f"{item.tax_type}%")
# 合計
y -= 15 * mm
tax_10 = int(subtotal_10 * 0.1)
tax_8 = int(subtotal_8 * 0.08)
total = int(subtotal_10 + subtotal_8 + tax_10 + tax_8)
c.setFont("Helvetica-Bold", 10)
c.drawString(120 * mm, y, f"10%対象: ¥{subtotal_10:,.0f} 消費税: ¥{tax_10:,}")
y -= 7 * mm
c.drawString(120 * mm, y, f" 8%対象: ¥{subtotal_8:,.0f} 消費税: ¥{tax_8:,}")
y -= 10 * mm
c.setFont("Helvetica-Bold", 12)
c.drawString(120 * mm, y, f"合計(税込): ¥{total:,}")
c.save()
print(f"{output_path} を出力しました")
if __name__ == "__main__":
sample = Invoice(
invoice_no="INV-2026-001",
issue_date=date(2026, 6, 30),
customer_name="株式会社サンプル",
registration_no="T-1234567890123",
items=[
InvoiceItem("商品A", 10, 5000, 10),
InvoiceItem("商品B(食料品)", 5, 2000, 8),
]
)
generate_invoice_pdf(sample, "invoice_sample.pdf")
✅ WeasyPrint(HTML→PDF)の活用
より複雑なレイアウトが必要な場合は、JinjaテンプレートでHTMLを生成し、weasyprintでPDF変換する方式が柔軟です。CSS Grid/Flexboxでレイアウトできるため、デザイナーが参加しやすい設計になります。
定義チェックリスト
| チェック項目 | 確認ポイント |
|---|---|
| □ 全帳票が一覧化されているか | 業務フローで発生する全帳票(PDF/CSV/Excel)が網羅されているか |
| □ 法的必須項目が含まれているか | 請求書・領収書にインボイス制度対応項目が含まれているか |
| □ 出力項目の取得元が定義されているか | 全出力項目のテーブル名・カラム名が明記されているか |
| □ 数値・日付の書式が定義されているか | カンマ区切り・日付フォーマット・小数桁数が定義されているか |
| □ レイアウト(モックアップ)が添付されているか | 業務担当者がイメージできるレベルのモックアップが存在するか |
| □ 出力権限・再出力可否が定義されているか | 誰がいつ出力でき、再発行時の扱いが定義されているか |
| □ 業務担当者のサインオフが得られているか | 業務担当者が帳票仕様を確認・承認しているか |