導入(問題提起)

見積・請求・入金消込は毎月必ず発生する“定常業務”です。Excelテンプレに複写してPDF化、メール添付で送付し、入金が来たらまたExcelで消込——現場は回っているように見えて、実は「版ズレ」「記入ミス」「重複請求」「回収漏れ」といった致命的なリスクを孕みます。さらに、見込み→売上の予実管理や粗利の把握が困難になり、経営判断が遅れます。本記事では、最小のWebシステム開発で見積/請求をExcel Web化し、Pythonによる小規模実装で“今日から”改善を始める方法を解説します。キーワードは「Webシステム開発」「業務システム」「Python」「Excel Web化」です。

課題の詳細説明

Excel運用で典型的に発生する問題は次の通りです。

  • 顧客マスタの分散:担当者PC、過去メール、個人Excelに分散し、表記揺れや重複が多発。
  • 案件と請求の紐付け不備:受注したのに請求が立っていない、または同一案件に二重請求。
  • 帳票の手作業化:PDF生成、メール送付、宛先ミス防止のWチェックなどが人力で非効率。
  • 消費税・端数処理のブレ:テンプレごとに計算式が異なり、数円単位のズレが累積。
  • 締めと売上集計の重労働:月末月初に“転記地獄”。視点(顧客/担当/商品)の切り替えも困難。
  • 内部統制の弱さ:発行後の修正が可能なため、履歴が追えず、回収トラブル時に説明できない。

解決方法

まずは機能を“最小”に絞り、データを正しくつなぐことに注力します。

  1. データ正規化:customers / items / quotes / orders / invoices / payments を定義し、キーで一貫接続。
  2. ワークフロー整流化:見積 → 受注 → 請求 → 入金 → 消込 の一方向ステータス。発行後はロック。
  3. 自動採番:見積番号・請求番号は重複禁止の連番。年度や拠点コードでプレフィックス管理。
  4. 帳票テンプレ:Jinja2 + HTML/CSSでPDFを生成。テンプレはGitで版管理し、法令変更にも即応。
  5. 送付自動化:送信ログ、閲覧トラッキング、誤送信チェック(宛先と社名の突合)。BCCで社内共有。
  6. ダッシュボード:売上・売掛・未入金・滞留日数・回収予定を可視化。
  7. 技術スタック:Python Webアプリ(Bottle/FastAPI) + SQLiteで開始。成長時はPostgreSQLへ移行。

具体例

運用に直結する具体機能の例です。

  • 帳票ひな形:品目、単価、数量、税率、値引、送料、支払条件、振込先、但し書き、担当者印。
  • 自動計算:消費税(切り上げ/切り捨て/四捨五入)、端数処理、手数料控除の扱いを統一。
  • 内部統制:作成者/承認者/発行者の分離。発行後は数値項目の編集不可、訂正は「差替」扱い。
  • 回収リスク低減:期限前リマインド、入金予定表、未入金の自動抽出と担当アサイン。
  • 定期請求:月次/年次の自動生成と、件名・品目・金額のテンプレ化。

技術的な解説(Pythonでの最小実装)

  • データモデル(SQLite想定)

CREATE TABLE customers(
  id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT, code TEXT UNIQUE
);
CREATE TABLE items(
  id INTEGER PRIMARY KEY, sku TEXT UNIQUE, name TEXT, unit_price INTEGER
);
CREATE TABLE quotes(
  id INTEGER PRIMARY KEY, no TEXT UNIQUE, customer_id INTEGER, status TEXT, total INTEGER, created_at DATETIME
);
CREATE TABLE invoices(
  id INTEGER PRIMARY KEY, no TEXT UNIQUE, quote_id INTEGER, customer_id INTEGER, total INTEGER, tax INTEGER,
  issued_at DATE, due_date DATE, status TEXT
);
CREATE TABLE payments(
  id INTEGER PRIMARY KEY, invoice_id INTEGER, amount INTEGER, paid_at DATE, method TEXT
);
  • ルーティング(Bottle例)

from bottle import Bottle, request, response
import sqlite3
app = Bottle()

def db():
    return sqlite3.connect('billing.db')

@app.post('/invoice')
def create_invoice():
    d = request.json
    with db() as con:
        # 採番(例: 2026-000123)
        no = con.execute('SELECT printf("%s-%06d","2026", COALESCE(MAX(id),0)+1) FROM invoices').fetchone()[0]
        con.execute('INSERT INTO invoices(no,customer_id,total,tax,issued_at,due_date,status) VALUES(?,?,?,?,date("now"),?,"ISSUED")',
                    (no, d['customer_id'], d['total'], d['tax'], d['due_date']))
    return {'no': no}

@app.post('/send')
def send_invoice():
    # メール送信は疑似。実際はSMTP/SendGrid等
    d = request.json
    # 宛先チェック・BCC社内・送信ログ記録など
    return {'ok': True}
  • PDF生成:WeasyPrintやwkhtmltopdfを利用可能。HTMLテンプレに会社ロゴ・印影・銀行情報を差し込む。
  • セキュリティ:ログイン必須、権限で閲覧制限。発行後の改竄は不可、差替履歴を保全。
  • 連携:会計ソフトにはまずCSVでエクスポートし、勘定科目や税区分の整合を取る。

導入の流れ

  1. 既存Excelの列項目・数式・運用ルールを棚卸し、データ標準(顧客コード/税計算)を決める。
  2. PoC(1顧客×1案件)で“見積→請求→送付→入金”の一連をPythonミニWebで通す。
  3. 帳票テンプレの固め:法定記載事項・社印・但書・注意書きの確定と版管理。
  4. 月次化:定期請求とダッシュボードを導入し、回収漏れゼロを目指す。
  5. 連携:会計にCSV連携し、仕訳取込の粒度・勘定科目のマッピングを調整。

まとめ

請求は“止まると会社が止まる”重要領域です。Excel運用をExcel Web化してWebに一本化するだけで、作業時間・ミス・回収漏れが大幅に減ります。Pythonによる小規模業務システムであれば、短期間で試しながら育てられます。まずは最小構成で運用に乗せ、効果を確認しつつ段階拡張しましょう。

「Webシステム開発のご相談は monou まで」