AKI106565/curtain-price-search
リリカラ FABRIC DECO 2026 カーテン価格検索アプリ
リリカラ FABRIC DECO 2026 の価格表PDFをもとに、品番・仕上り幅・仕上り丈・ヒダ倍率・数量から税抜上代価格を検索する Streamlit アプリです。
重要方針
- 出力価格は税抜上代のみです。
- 税込計算、消費税計算、値引き計算、掛け率計算は行いません。
- 価格表にないサイズの比例計算、推測価格、仮価格、サンプル価格の本番DB投入は禁止です。
- 本番DBへ入る価格は
data/validation/verified_pdf_price_cells.csvに登録された、PDF目視確認済みデータだけです。 - 開き方は価格条件に含めません。
- 第一段階はドレープ、1.5倍ヒダ、2倍ヒダ、数量に対応します。
セットアップ
python -m pip install -r requirements.txt起動
python -m streamlit run .\app\streamlit_app.py公開用モード
Streamlit Community Cloud などで検索機能だけを公開する場合は、環境変数 APP_MODE=public を設定してください。
APP_MODE=public の場合、表示されるのは「価格検索」だけです。以下の管理機能は非表示になります。
- 価格表登録
- PDF抽出候補レビュー
- DB確認
- 検証ステータス
- 一括承認などの管理操作
ローカルで管理機能も使う場合は、APP_MODE を未設定のまま起動するか、APP_MODE=admin を設定してください。
PowerShell で公開用モードを確認する例:
$env:APP_MODE="public"
python -m streamlit run .\app\streamlit_app.pyStreamlit Community Cloud へのデプロイ
- GitHub リポジトリにこのプロジェクトをpushします。
- Streamlit Community Cloud で「New app」を作成します。
- Repository にこのリポジトリを選択します。
- Branch を選択します。
- Main file path に次を指定します。
app/streamlit_app.py- Advanced settings または Secrets/環境変数設定で、次を設定します。
APP_MODE=public- Deploy を実行します。
公開用デプロイに最低限必要な主なファイルは以下です。
app/db/curtain_prices.sqlite3data/validation/requirements.txtREADME.md
data/extracted/pdf_price_candidates.csv や data/extracted/pdf_price_candidates.parquet は抽出・レビュー用の巨大な管理ファイルです。公開検索だけに使う場合はGitに含めない方針です。
Hugging Face Spaces へのデプロイ
Hugging Face Spaces では、この README.md 先頭の YAML header により Docker Space として認識されます。
設定内容:
sdk: docker
app_port: 8501Dockerfile 内で APP_MODE=public を設定しているため、Hugging Face Spaces では価格検索だけが表示されます。管理機能は非表示です。
明示する場合は、Space の Settings → Variables and secrets で次を設定してもかまいません。
APP_MODE=publicアップロード手順:
- Hugging Face にログインします。
- New Space を作成します。
- Space SDK は
Dockerを選択します。 - このプロジェクトから、公開検索に必要な最低限のファイルをアップロードします。
app/
db/curtain_prices.sqlite3
data/validation/
requirements.txt
README.md
Dockerfiledata/extracted/の巨大CSV/Parquet、data/raw/のPDFはアップロード不要です。- Space が
Dockerfileをビルドし、Streamlit を0.0.0.0:8501で起動します。
管理機能をSpacesで出したい場合は APP_MODE=admin を設定できますが、公開URLで運用する場合は public のままにしてください。
PDF補助スクリプト
python .\scripts\download_pdf.py
python .\scripts\inspect_pdf.py
python .\scripts\extract_tables_from_pdf.py
python .\scripts\extract_pdf_price_candidates.py
python .\scripts\validate_extracted_tables.pyextract_tables_from_pdf.py の出力は目視確認用です。抽出結果をそのまま本番DBに投入しません。
extract_pdf_price_candidates.py は PDF 内の価格表から候補データを data/extracted/pdf_price_candidates.csv に出力し、抽出ログを data/extracted/extraction_report.json に出力します。これは候補CSVであり、verified_pdf_price_cells.csv には自動で混ぜません。目視確認済みの行だけを verified_pdf_price_cells.csv に移してください。
価格表登録方法
- Streamlit の「価格表登録」タブを開きます。
- PDF価格表を目視確認したうえで、
product_code、catalog_name、table_name、style、fullness、source_pdf_pageを入力します。 width rangesとheight rangesを0-75,76-150のように入力します。price matrixに税抜上代をCSV貼り付け形式で入力します。行数は丈範囲、列数は幅範囲と一致させます。- プレビューを確認し、「verifiedpdfprice_cells.csv に追加」を押します。
- 検証用サンプルを20件以上
manual_check_samples.csvに追加します。 - 「normalize / import / verify を実行」を押します。
重複登録防止として、同じ product_code / table_name / style / fullness / width range / height range は追加しません。
検証方法
コマンドで実行する場合:
python .\scripts\normalize_price_tables.py
python .\scripts\import_to_db.py
python .\scripts\verify_manual_check_samples.pyverify_manual_check_samples.py は manual_check_samples.csv の expected_unit_price と expected_total_price を calculate_price の結果と照合します。
価格を返せる条件:
data/validation/verification_status.jsonのis_verifiedがtrueverified_sample_countが20件以上- 20件以上の手動確認サンプルがすべて一致
verification_status.json は手動で true にしないでください。scripts/verify_manual_check_samples.py が条件を満たした場合だけ true に更新します。
テスト
pytest初期状態では検証済み価格データが空のため、価格検索は次のメッセージを返します。
価格表データが未検証です。PDF価格表との照合が必要です。