導入(問題提起)
見積・請求・入金消込は毎月必ず発生する“定常業務”です。Excelテンプレに複写してPDF化、メール添付で送付し、入金が来たらまたExcelで消込——現場は回っているように見えて、実は「版ズレ」「記入ミス」「重複請求」「回収漏れ」といった致命的なリスクを孕みます。さらに、見込み→売上の予実管理や粗利の把握が困難になり、経営判断が遅れます。本記事では、最小のWebシステム開発で見積/請求をExcel Web化し、Pythonによる小規模実装で“今日から”改善を始める方法を解説します。キーワードは「Webシステム開発」「業務システム」「Python」「Excel Web化」です。
課題の詳細説明
Excel運用で典型的に発生する問題は次の通りです。
- 顧客マスタの分散:担当者PC、過去メール、個人Excelに分散し、表記揺れや重複が多発。
- 案件と請求の紐付け不備:受注したのに請求が立っていない、または同一案件に二重請求。
- 帳票の手作業化:PDF生成、メール送付、宛先ミス防止のWチェックなどが人力で非効率。
- 消費税・端数処理のブレ:テンプレごとに計算式が異なり、数円単位のズレが累積。
- 締めと売上集計の重労働:月末月初に“転記地獄”。視点(顧客/担当/商品)の切り替えも困難。
- 内部統制の弱さ:発行後の修正が可能なため、履歴が追えず、回収トラブル時に説明できない。
解決方法
まずは機能を“最小”に絞り、データを正しくつなぐことに注力します。
- データ正規化:
customers / items / quotes / orders / invoices / paymentsを定義し、キーで一貫接続。 - ワークフロー整流化:
見積 → 受注 → 請求 → 入金 → 消込の一方向ステータス。発行後はロック。 - 自動採番:見積番号・請求番号は重複禁止の連番。年度や拠点コードでプレフィックス管理。
- 帳票テンプレ:Jinja2 + HTML/CSSでPDFを生成。テンプレはGitで版管理し、法令変更にも即応。
- 送付自動化:送信ログ、閲覧トラッキング、誤送信チェック(宛先と社名の突合)。BCCで社内共有。
- ダッシュボード:売上・売掛・未入金・滞留日数・回収予定を可視化。
- 技術スタック: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でエクスポートし、勘定科目や税区分の整合を取る。
導入の流れ
- 既存Excelの列項目・数式・運用ルールを棚卸し、データ標準(顧客コード/税計算)を決める。
- PoC(1顧客×1案件)で“見積→請求→送付→入金”の一連をPythonミニWebで通す。
- 帳票テンプレの固め:法定記載事項・社印・但書・注意書きの確定と版管理。
- 月次化:定期請求とダッシュボードを導入し、回収漏れゼロを目指す。
- 連携:会計にCSV連携し、仕訳取込の粒度・勘定科目のマッピングを調整。
まとめ
請求は“止まると会社が止まる”重要領域です。Excel運用をExcel Web化してWebに一本化するだけで、作業時間・ミス・回収漏れが大幅に減ります。Pythonによる小規模業務システムであれば、短期間で試しながら育てられます。まずは最小構成で運用に乗せ、効果を確認しつつ段階拡張しましょう。
「Webシステム開発のご相談は monou まで」