Три правки по замечаниям. 1. База и код разъехались по разным репозиториям. Автокоммит и раньше трогал только vault.fmdb, но лежал он в той же ветке, что и исходники, поэтому пуш тащил всю историю программы. Теперь data/ — самостоятельный клон food-records со своим .git, а исходники его игнорируют целиком. При первом запуске приложение встаёт на уже существующую историю сервера, а не заводит параллельную. 2. Фасовки товара. Пачка печенья 10 шт за 200 ₽ и та же печенька поштучно за 30 ₽ — один товар с двумя фасовками. Остатки, себестоимость и FIFO считаются в базовых единицах, поэтому поштучные продажи вычитаются из купленных пачек. Размер фасовки хранится в документе слепком. Миграция схемы 1→2 не меняет поведение уже заведённых данных. 3. Быстрый ввод продаж за период: выбор диапазона дат, строка таблицы — отдельная продажа, ввод с клавиатуры, запись всех разом. Незнакомое имя заводится как контрагент, повтор периода подсвечивается. Тесты больше не имеют настроенного remote, чтобы не ходить в сеть. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
"""Где лежат данные.
|
||
|
||
Код и база живут в **разных** репозиториях. Исходники — в food-market,
|
||
зашифрованная база — в food-records. Смешивать их нельзя: пуш отправляет всю
|
||
ветку целиком, поэтому в общем репозитории история данных неизбежно тащила бы
|
||
за собой историю программы.
|
||
|
||
На диске это выглядит так: exe лежит в корне, а рядом с ним папка data —
|
||
самостоятельный клон репозитория с данными, со своим .git. Исходники папку
|
||
data игнорируют полностью.
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
VAULT_NAME = "vault.fmdb"
|
||
DATA_DIR_NAME = "data"
|
||
|
||
DEFAULT_DATA_REMOTE = "https://gt.ser.gay/kizya/food-records.git"
|
||
|
||
|
||
def app_root() -> Path:
|
||
if getattr(sys, "frozen", False):
|
||
return Path(sys.executable).resolve().parent
|
||
return Path(__file__).resolve().parent.parent
|
||
|
||
|
||
def data_dir() -> Path:
|
||
"""Корень репозитория с данными. Внутри — только база и её служебные файлы."""
|
||
return app_root() / DATA_DIR_NAME
|
||
|
||
|
||
def vault_path() -> Path:
|
||
return data_dir() / VAULT_NAME
|
||
|
||
|
||
def vault_rel_posix() -> str:
|
||
"""Путь базы внутри репозитория данных. База лежит в его корне."""
|
||
return VAULT_NAME
|
||
|
||
|
||
def backup_path() -> Path:
|
||
return data_dir() / f"{VAULT_NAME}.bak"
|
||
|
||
|
||
def remote_copy_path() -> Path:
|
||
"""Куда складывается удалённая версия базы при расхождении веток."""
|
||
return data_dir() / "vault.remote.fmdb"
|