h-1.flet.3/app_slip_adaptive.py
2026-02-20 23:24:01 +09:00

172 lines
6 KiB
Python

"""
業態適応型伝票システム
事業者の業態に応じて最適なフォームを提供
"""
import flet as ft
import sqlite3
import signal
import sys
import logging
from datetime import datetime
class AdaptiveSlipSystem:
def __init__(self, page: ft.Page):
self.page = page
self.setup_page()
self.setup_database()
self.setup_ui()
def setup_page(self):
self.page.title = "業態適応伝票"
self.page.window.width = 420
self.page.window.height = 900
self.page.window.resizable = False
self.page.window_center = True
def setup_database(self):
try:
self.conn = sqlite3.connect('sales_assist.db')
self.cursor = self.conn.cursor()
# 業態マスター
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS business_types (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE,
slip_mode TEXT
)
''')
# サンプル業態
business_types = [
("小売店", "detail"), # 明細書モード
("配達業", "simple"), # 簡素モード
("サービス業", "detail"), # 明細書モード
("製造業", "detail"), # 明細書モード
]
for bt in business_types:
self.cursor.execute(
"INSERT OR IGNORE INTO business_types (name, slip_mode) VALUES (?, ?)", bt
)
self.conn.commit()
except Exception as e:
logging.error(f"DBエラー: {e}")
def setup_ui(self):
# 業態選択
self.business_type_dropdown = ft.Dropdown(
label="業態を選択",
options=[
ft.dropdown.Option("小売店"),
ft.dropdown.Option("配達業"),
ft.dropdown.Option("サービス業"),
ft.dropdown.Option("製造業"),
],
on_change=self.on_business_change
)
# 動的フォームコンテナ
self.form_container = ft.Container()
# メインレイアウト
self.page.add(
ft.Column([
ft.Text("🏢 業態適応伝票システム", size=20, weight=ft.FontWeight.BOLD),
self.business_type_dropdown,
self.form_container
], spacing=20)
)
def on_business_change(self, e):
business_type = e.control.value
self.load_adaptive_form(business_type)
def load_adaptive_form(self, business_type: str):
"""業態に応じたフォーム読み込み"""
if business_type == "配達業":
self.form_container.content = self.create_simple_form()
else:
self.form_container.content = self.create_detail_form()
self.page.update()
def create_simple_form(self):
"""簡素フォーム(配達業向け)"""
return ft.Container(
content=ft.Column([
ft.Text("⛽ 簡素伝票モード", size=16, weight=ft.FontWeight.BOLD),
ft.TextField(label="顧客名"),
ft.Row([
ft.TextField(label="数量", width=100),
ft.TextField(label="単価", width=100),
ft.TextField(label="金額", width=100, read_only=True)
]),
ft.TextField(label="配達先"),
ft.ElevatedButton("保存", bgcolor=ft.Colors.BLUE, color=ft.Colors.WHITE)
], spacing=10),
padding=20,
bgcolor=ft.Colors.WHITE,
border_radius=10
)
def create_detail_form(self):
"""明細フォーム(小売店・サービス業向け)"""
return ft.Container(
content=ft.Column([
ft.Text("📋 明細伝票モード", size=16, weight=ft.FontWeight.BOLD),
ft.TextField(label="顧客名"),
# 明細テーブル
ft.DataTable(
columns=[
ft.DataColumn(ft.Text("商品名")),
ft.DataColumn(ft.Text("数量")),
ft.DataColumn(ft.Text("単価")),
ft.DataColumn(ft.Text("金額")),
],
rows=[
ft.DataRow(
cells=[
ft.DataCell(ft.TextField(hint_text="商品名")),
ft.DataCell(ft.TextField(hint_text="数量")),
ft.DataCell(ft.TextField(hint_text="単価")),
ft.DataCell(ft.TextField(hint_text="金額")),
]
)
]
),
ft.Row([
ft.Text("小計:", weight=ft.FontWeight.BOLD),
ft.TextField(label="小計", width=100, read_only=True)
]),
ft.Row([
ft.Text("税:", weight=ft.FontWeight.BOLD),
ft.TextField(label="消費税", width=100, read_only=True)
]),
ft.Row([
ft.Text("合計:", weight=ft.FontWeight.BOLD),
ft.TextField(label="合計", width=100, read_only=True)
]),
ft.ElevatedButton("保存", bgcolor=ft.Colors.BLUE, color=ft.Colors.WHITE)
], spacing=10),
padding=20,
bgcolor=ft.Colors.WHITE,
border_radius=10
)
def main(page: ft.Page):
try:
app = AdaptiveSlipSystem(page)
logging.info("業態適応伝票システム起動")
except Exception as e:
logging.error(f"起動エラー: {e}")
if __name__ == "__main__":
ft.run(main)