172 lines
6 KiB
Python
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)
|