SCREEN PREVIEW
在庫の登録・更新・削除・CSV一括インポート/エクスポートと、入出庫の変更ログを備えた小規模業務システムです。同じCRUD+CSVの構成は、勤怠管理・受発注・会員管理のような Access/kintone 代替の小規模システムにそのまま転用できます。
| code | name | quantity | unitPrice | status | updatedAt |
|---|---|---|---|---|---|
| SKU-001 | ノートPC 14インチ | 7 | 68,000 | 在庫僅少 | 2026-07-31 09:05 |
| SKU-003 | USB-Cハブ | 45 | 3,200 | 適正 | 2026-07-31 09:10 |
| SKU-004 | モバイルディスプレイ | 8 | 15,800 | 在庫僅少 | 2026-07-31 09:00 |
status は quantity が10未満の行を「在庫僅少」として画面表示用に色分けしたものです(しきい値は表示上の例)。
| code | type | delta | reason | at |
|---|---|---|---|---|
| SKU-004 | create | +8 | 新規登録 | 09:00:00 |
| SKU-001 | out | -5 | 出庫: 発注分出荷 | 09:05:00 |
| SKU-003 | in | +20 | 入庫: 定期発注分 | 09:10:00 |
| SKU-002 | delete | -40 | 廃番 | 09:15:00 |
在庫の増減は create/in/out/delete の種別・差分・理由・日時で自動記録され、Excelの上書き入力と違って履歴が残ります。
コード重複・数量マイナス化・型チェックは登録・更新の全経路で共通のバリデーション関数を通すため、CLIから入れてもCSVから入れても同じルールが効きます。
node src/runDemo.js)初期在庫3件に対し、CSV一括インポート(1件追加・1件スキップ)→ 出庫 → 入庫 → 廃番(削除)→ CSVエクスポートを固定シナリオで通しで実行した、実際のコンソール出力です。
$ node src/runDemo.js
# 在庫管理デモ 実行結果
## インポート結果
- 追加: SKU-004
- スキップ: SKU-002(code SKU-002 は既に存在します(重複))
## 現在庫(エクスポート後)
| code | name | quantity | unitPrice | updatedAt |
|---|---|---|---|---|
| SKU-001 | ノートPC 14インチ | 7 | 68000 | 2026-07-31T09:05:00.000Z |
| SKU-003 | USB-Cハブ | 45 | 3200 | 2026-07-31T09:10:00.000Z |
| SKU-004 | モバイルディスプレイ | 8 | 15800 | 2026-07-31T09:00:00.000Z |
## 入出庫ログ(movements)
| code | type | delta | reason | at |
|---|---|---|---|---|
| SKU-004 | create | 8 | 新規登録 | 2026-07-31T09:00:00.000Z |
| SKU-001 | out | -5 | 出庫: 発注分出荷 | 2026-07-31T09:05:00.000Z |
| SKU-003 | in | 20 | 入庫: 定期発注分 | 2026-07-31T09:10:00.000Z |
| SKU-002 | delete | -40 | 廃番 | 2026-07-31T09:15:00.000Z |
時刻は固定値のため何度実行しても同じ結果になります。この出力は reports/summary_sample.md としてリポジトリにコミット済みで、上の表・ログと同一データです。
$ node src/cli.js <add|update|delete|list|import|export> [--file path] [flags]
add --code <c> --name <n> --quantity <n> --unitPrice <n>
update --code <c> --delta <±n> [--reason <text>]
delete --code <c>
list
import --csv <path>
export --csv <path>
これは cli.js の usage 出力そのものです。個別コマンドとしても、上記シナリオとしても同じロジック(src/store.js)で動作します。