御見積書の作成・管理だけを行う、小規模事業者向けのWebアプリケーションです。
請求書・納品書・受注管理などは扱いません。「見積を作る → 印刷/PDFで渡す → 結果(受注/失注)を記録して集計する」という流れに機能を絞ります。
- 個人〜少人数、PC1台での運用を前提とした最小構成(SQLite・単一サーバー)
- 過去の見積ファイル(xlsx/ods、quotebuilder 出力PDF)を取り込んで移行できる
- データは利用者自身の手元に置き、バックアップ・復元も自己完結できる
| 層 | 技術 |
|---|---|
| Backend | PHP 8.3 / Laravel 13 |
| Frontend | React 19 + TypeScript / Vite / Tailwind CSS 4(SPA、同一オリジン配信) |
| DB | SQLite(PostgreSQL対応は検討中: #27) |
| 取込 | PhpSpreadsheet(xlsx / ods) |
| 集計表示 | Recharts |
| テスト | PHPUnit(Feature)/ Playwright(E2E)/ tsc |
見積
- 見積の作成・編集・一覧・プレビュー(明細行、税率、合計・税額の自動計算)
- ステータス管理:
draft/sent/accepted/rejected - 見積番号の一意性をDB制約で保証(取込の競合対策を含む)
- 一覧の年月別・取引先別フィルタ
- ブラウザ印刷によるPDF保存(プレビュー画面の「印刷 / PDF保存」)
取込(移行)
- 御見積書ファイル(xlsx / ods / quotebuilder 出力PDF)のアップロード取込。ファイル名の取引先識別子で顧客マスターと突合し、見積データを生成する
- 内容ベースのMIME検査(拡張子偽装対策)、1リクエスト最大20ファイル
- PDF取込は quotebuilder の印刷画面から保存したPDFに対応(他レイアウトは誤取込防止のため非対応)
- PDF取込を使うサーバーには Poppler の
pdftotextコマンドが必要(別パスの場合はPDFTOTEXT_BINARYで指定)
マスター管理
- 顧客マスター(取引先識別子
customer_signatureの複数登録に対応) - 基本情報(自社情報・見積書の差出人プロフィール)
集計
- 年別・月別の見積件数/受注件数/見積金額/受注金額のグラフ表示
バックアップ / リストア
- JSONエクスポート・リストア(データ移行向け。旧形式 version 1 の取込にも対応)
- SQLiteフルSQL dump(障害復旧向け。一貫スナップショット + メタデータ生成)
- データ管理画面からの作成・一覧・ダウンロード、保持ルールによる世代管理
- 操作の監査ログ記録(
backup_audit_logs)、backup系APIの admin 認可
詳細は後述の「バックアップ」を参照してください。
現在は認証がフロントエンドのモックログイン(localStorage)のみで、backend認証がありません。以下を段階的に実装します。
| 機能 | Issue | 概要 |
|---|---|---|
| backend認証 | #5 | session + Laravel Sanctum(SPAモード)で確定。login/logout API、既存APIへの auth:sanctum 適用 |
| ユーザー管理画面 | #28 | admin role の運用UI。ユーザー一覧・作成・role変更、初期adminのブートストラップ |
| 復元の本DB切替 | #20 | 一時DB検証・事前退避を伴う安全なフルバックアップ復元 |
| バックアップ管理画面の拡充 | #22 | 画面からの復元操作 |
| 差分バックアップ | #23 | 方式設計とMVP範囲の確定 |
| 見積一覧のTAB化 | #17 | ステータス別TABでの一覧表示 |
| PostgreSQL対応 | #27 | DB pluginの検討 |
| Windows簡易アプリ化 | #2 | NativePHPによる非技術者向け配布 |
さらに先の構想として、OAuth2 / MFA(メール)による認証強化があります(#5 に記載)。
| パス | 画面 |
|---|---|
/ |
見積一覧(年月・取引先フィルタ) |
/quotes/new /quotes/:id/edit |
見積の作成・編集 |
/quotes/:id |
見積プレビュー・印刷 / PDF保存 |
/import |
御見積書ファイル取込 |
/summary |
年別・月別集計 |
/customers |
顧客マスター |
/sender-profiles |
基本情報(自社情報) |
/data |
データ管理(バックアップ作成・一覧・ダウンロード、JSONエクスポート・リストア) |
/login /register /forgot-password |
認証(現状はフロントのモック。#5 で backend 認証へ差し替え予定) |
apiResource:/api/customers/api/sender-profiles/api/quotes- 取込:
POST /api/quotes/import - バックアップ(admin 認可 + 監査ログ):
GET /api/backup/download、POST /api/backup/restore、GET /api/backups、POST /api/backups、GET /api/backups/{id}/download - テスト/デモ用(local / testing 環境のみ):
POST /api/test/reset— DBをデモデータへ初期化(migrate:fresh --seed)
git clone <repo>
cd quotebuilder
./scripts/init.sh # 依存導入・.env生成・migrate・ビルドまで一括または composer run setup でも同等の初期化ができます。開発サーバーの起動は:
composer run dev # serve + queue + logs + vite を並行起動テスト:
php artisan test # Feature テスト
npm run type-check # TypeScript 型検査
npm run test:e2e # Playwright E2E用途に応じて2種類のバックアップを使い分けます。
php artisan backup:export: 基本情報・顧客・取引先識別子・見積データをJSONで出力します。内容を確認しやすく、別環境へのデータ移行や競合を制御した取込み向けです。schema、ユーザー、ジョブなどは含みません。php artisan backup:sqlite-dump: SQLite DB全体をschemaとdataを含むSQLで出力します。同時書き込みに対して一貫したスナップショットを作り、障害復旧用のフルバックアップとして使用します。SQLite以外では実行できません。
フルバックアップは、既定では storage/app/private/backups/ にSQLと <SQLファイル>.meta.json を生成します。出力先は次のように指定できます。
php artisan backup:sqlite-dump --output=/secure/backup/quotebuilder.sqlメタデータJSONには作成日時、アプリバージョン、migration状態、元DBのファイル名、サイズ、スナップショットのSHA-256が含まれます。SQLは空のSQLite DBへ適用して復元確認できます。
sqlite3 restored.sqlite < /secure/backup/quotebuilder.sqlデータ管理画面から作成したフルバックアップは、既定で非公開の local disk内に保存されます。保存先は BACKUP_DISK と BACKUP_DIRECTORY、保持ルールは BACKUP_RETENTION_DAYS と BACKUP_MAX_GENERATIONS で変更できます。画面の一覧から作成日時・種別・schema状態・サイズを確認し、SQLをダウンロードできます。
backup作成・一覧・ダウンロード・restore APIは、Laravelで認証された role=admin のユーザーだけが利用できます。Issue #5のbackend認証が完成するまでは、frontendのlocalStorageログインだけでは利用できません。操作結果は backup_audit_logs に記録され、CLI操作の主体は actor_type=cli / actor_identifier=console です。request内容、backup内容、入力ファイル名、例外messageは監査ログへ保存しません。
本番DBへの切替はこのコマンドの対象外です(#20 で対応予定)。SQLとメタデータは同じ世代として一緒に保管してください。
古い世代のフルバックアップを現行スキーマへ復元する場合は、SQLを新しいDBファイルへ適用して差し替えた後、php artisan migrate --force で差分migrationを適用します(dumpは migrations テーブルを含むため、未適用分だけが実行されます)。
- 請求書・納品書・受発注管理・在庫管理
- 複数拠点・大人数での同時利用を前提としたスケール対応
- 見積書レイアウトの自由なカスタマイズ(現状は固定レイアウト)
MIT