Skip to content

strnh/quotebuilder

Repository files navigation

QuoteBuilder

御見積書の作成・管理だけを行う、小規模事業者向けの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 認証へ差し替え予定)

API 概要

  • apiResource: /api/customers /api/sender-profiles /api/quotes
  • 取込: POST /api/quotes/import
  • バックアップ(admin 認可 + 監査ログ): GET /api/backup/downloadPOST /api/backup/restoreGET /api/backupsPOST /api/backupsGET /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_DISKBACKUP_DIRECTORY、保持ルールは BACKUP_RETENTION_DAYSBACKUP_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 テーブルを含むため、未適用分だけが実行されます)。

スコープ外(非目標)

  • 請求書・納品書・受発注管理・在庫管理
  • 複数拠点・大人数での同時利用を前提としたスケール対応
  • 見積書レイアウトの自由なカスタマイズ(現状は固定レイアウト)

License

MIT

About

見積管理アプリ (Laravel + React/TS)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors