Десктопное приложение на PySide6. Вся база — один JSON-документ, зашифрованный AES-256-GCM под паролем (ключ через scrypt), лежит в data/vault.fmdb и раз в час уезжает в этот репозиторий. Основное: - партии с дедлайном возврата себестоимости пекарне, FIFO-разнос продаж по партиям и прогресс покрытия к сроку; - типы выбытия: розница, другу по себестоимости, съел сам, подарок, списание — съеденное вычитается из прибыли, за него платить всё равно; - долги контрагентов с частичными оплатами; - номенклатура с историей изменения цен; - журнал изменений внутри базы: git хранит непрозрачные снимки, поэтому настоящая история ведётся здесь. Синхронизация коммитит только путь базы и схлопывает часовые пуши в один коммит на день через amend + force-with-lease. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
34 lines
722 B
Python
34 lines
722 B
Python
"""Точка входа."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
|
|
from PySide6.QtWidgets import QApplication, QDialog
|
|
|
|
from . import paths
|
|
from .ui import theme
|
|
from .ui.login import LoginDialog
|
|
from .ui.main_window import MainWindow
|
|
|
|
|
|
def main() -> int:
|
|
app = QApplication(sys.argv)
|
|
app.setApplicationName("Булочная")
|
|
app.setOrganizationName("food-market")
|
|
theme.apply(app)
|
|
|
|
paths.data_dir().mkdir(parents=True, exist_ok=True)
|
|
|
|
login = LoginDialog(paths.vault_path())
|
|
if login.exec() != QDialog.Accepted or login.vault is None:
|
|
return 0
|
|
|
|
window = MainWindow(login.vault)
|
|
window.show()
|
|
return app.exec()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|