帳票設計書とは

帳票設計書(Report Design Document)は、システムが出力するPDF・CSV・Excel帳票の仕様を定義した設計書です。帳票には「請求書」「納品書」のように法的根拠を持つものや、「売上集計レポート」のように経営判断に使用されるものが含まれます。

帳票設計書には帳票レイアウト(モックアップ)と出力項目定義表・データ取得SQL(または擬似コード)をセットで作成します。

💡 帳票設計で特に注意すべき点

法的帳票(請求書・領収書・納品書)は記載必須項目が法令・商慣習で定められています。インボイス制度(適格請求書等保存方式)対応が必要な場合は、登録番号・適用税率・消費税額別の記載が必須です。設計前に法務確認を行うこと。

① 帳票一覧の定義

システムが出力する全帳票を一覧化します。帳票IDを付与して後のドキュメントから参照できるようにします。

帳票ID帳票名出力形式用途出力単位関連機能ID
R001受注確認書PDF顧客への受注確認送付受注1件単位F010
R002納品書PDF顧客への納品時添付書類受注1件単位F020
R003請求書PDF顧客への請求(インボイス対応)請求1件単位F030
R010売上日報Excel日次売上集計(管理者向け)日次F040
R011月次売上集計表Excel月次売上集計(経営報告)月次F040
R020商品マスタダウンロードCSV商品情報の一括エクスポート全件 or 条件抽出F001
R021受注データエクスポートCSV会計システムへのデータ連携期間指定F010

② 出力項目の定義

各帳票に出力する全項目を定義します。項目ごとに出力値の取得元(テーブル・カラム)と書式(日付フォーマット・数値フォーマット・ゼロ埋め)を明記します。

No.項目名取得元テーブル.カラム書式備考
1受注番号t_order.order_noOD-000000(6桁ゼロ埋め)
2受注日t_order.order_dateYYYY年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 / 見出し: 12ptPDF埋め込みフォント使用
ヘッダー(全ページ共通)自社ロゴ・帳票タイトル・発行日
フッター(全ページ共通)ページ番号(X / Y 形式)最終ページのみ「以上」記載
改ページ明細15行を超えた場合に自動改ページ改ページ後もヘッダー・列見出し再印字
エンコーディング(CSV)UTF-8 BOM付きExcel で直接開けるようBOM付きとする

④ データ取得SQL・ロジックの定義

帳票のデータを取得するSQLを基本設計段階で記載します。JOIN・集計(GROUP BY)・ソート順を明示することで、詳細設計・実装の工数を削減できます。

SQL — 受注確認書データ取得
-- 受注確認書(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では reportlabweasyprint(HTML→PDF)を使ってPDF帳票を生成できます。以下はreportlabを使ったシンプルな請求書生成サンプルです。

Python — reportlabで請求書PDF生成
"""
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)が網羅されているか
□ 法的必須項目が含まれているか請求書・領収書にインボイス制度対応項目が含まれているか
□ 出力項目の取得元が定義されているか全出力項目のテーブル名・カラム名が明記されているか
□ 数値・日付の書式が定義されているかカンマ区切り・日付フォーマット・小数桁数が定義されているか
□ レイアウト(モックアップ)が添付されているか業務担当者がイメージできるレベルのモックアップが存在するか
□ 出力権限・再出力可否が定義されているか誰がいつ出力でき、再発行時の扱いが定義されているか
□ 業務担当者のサインオフが得られているか業務担当者が帳票仕様を確認・承認しているか