python-simpletables 0.1.30__py3-none-any.whl → 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- python_simpletables/__main__.db.py +0 -0
- python_simpletables/__main__.md.py +124 -0
- python_simpletables/__main__.png.py +0 -0
- python_simpletables/__main__.sql.py +63 -0
- {python_simpletables-0.1.30.dist-info → python_simpletables-0.2.1.dist-info}/METADATA +1 -1
- python_simpletables-0.2.1.dist-info/RECORD +13 -0
- python_simpletables-0.1.30.dist-info/RECORD +0 -9
- {python_simpletables-0.1.30.dist-info → python_simpletables-0.2.1.dist-info}/WHEEL +0 -0
- {python_simpletables-0.1.30.dist-info → python_simpletables-0.2.1.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Проектная документация
|
|
2
|
+
## Информационная система управления заказами, производством и спецификациями
|
|
3
|
+
|
|
4
|
+
### 1. Введение
|
|
5
|
+
Настоящая документация описывает функциональное назначение и методы реализации информационной системы (ИС) для управления деятельностью предприятия, выпускающего продукцию по спецификациям. Система обеспечивает ведение справочников заказчиков, товаров, заказов, производственных партий, спецификаций, а также авторизацию пользователей с разграничением прав доступа. Разработка выполнена в рамках демонстрационного экзамена по специальности 09.02.07 «Информационные системы и программирование» (базовый уровень).
|
|
6
|
+
|
|
7
|
+
### 2. Функциональное назначение
|
|
8
|
+
ИС предназначена для автоматизации следующих бизнес-процессов:
|
|
9
|
+
|
|
10
|
+
- Хранение и редактирование данных о заказчиках (покупателях и продавцах);
|
|
11
|
+
- Учёт товаров (продукции) с ценой за единицу и единицами измерения;
|
|
12
|
+
- Оформление заказов с указанием исполнителя, заказчика и даты;
|
|
13
|
+
- Формирование позиций заказов (товар, количество);
|
|
14
|
+
- Учёт производственных партий (дата производства);
|
|
15
|
+
- Составление материальных и продуктовых спецификаций на производство;
|
|
16
|
+
- Расчёт полной стоимости заказа на основе себестоимости материалов;
|
|
17
|
+
- Разграничение доступа через авторизацию с ролями «Администратор» и «Пользователь»;
|
|
18
|
+
- Защита от несанкционированного доступа с помощью интерактивной капчи (пазл) и блокировки учётной записи после трёх неудачных попыток.
|
|
19
|
+
|
|
20
|
+
### 3. Архитектура и используемые методы
|
|
21
|
+
|
|
22
|
+
#### 3.1. Общая архитектура
|
|
23
|
+
Приложение построено по модели **клиент-сервер** на уровне локального подключения: графический интерфейс (Tkinter) взаимодействует с файлом базы данных SQLite. Вся логика управления данными инкапсулирована в классах `Table` и `TableUsers` (наследник). Модуль `__main__.py` содержит главное окно приложения и реализацию всех пользовательских сценариев.
|
|
24
|
+
|
|
25
|
+
#### 3.2. Работа с базой данных
|
|
26
|
+
- Используется **SQLite3** как встроенная СУБД. Файл базы данных `__main__.db` создаётся при первом запуске.
|
|
27
|
+
- Инициализация схемы выполняется скриптом `__main__.sql` (создание всех таблиц, включение внешних ключей).
|
|
28
|
+
- Дополнительно создаётся таблица `Users` для хранения учётных записей (логин, пароль, роль, флаг блокировки, счётчик попыток).
|
|
29
|
+
- Все операции с БД выполняются через методы класса `Table`, обеспечивающие CRUD (создание, чтение, обновление, удаление) с проверкой целостности и пользовательскими валидаторами.
|
|
30
|
+
|
|
31
|
+
**Методы класса `Table` (основные):**
|
|
32
|
+
- `data_create(row)` – вставка новой записи;
|
|
33
|
+
- `data_set(key, row)` – обновление записи по первичному ключу;
|
|
34
|
+
- `data_delete(key)` – удаление записи;
|
|
35
|
+
- `data_get(primary_value)` – выборка записи по ключу;
|
|
36
|
+
- `data_readall()` – чтение всех записей;
|
|
37
|
+
- `conn_execute(cmd, args)` – выполнение SQL-запроса с обработкой ошибок.
|
|
38
|
+
|
|
39
|
+
**Параметры:**
|
|
40
|
+
- `row` – список или словарь значений полей;
|
|
41
|
+
- `key` – значение первичного ключа.
|
|
42
|
+
|
|
43
|
+
#### 3.3. Визуальный интерфейс и управление таблицами
|
|
44
|
+
- Для каждой таблицы создаётся вкладка (кнопка-переключатель) в верхней части окна.
|
|
45
|
+
- Данные отображаются в виджете `ttk.Treeview`, колонки настраиваются через объекты `Field`.
|
|
46
|
+
- Каждая таблица снабжена кнопками: **Создать**, **Изменить**, **Удалить**, **Экспорт в JSON/Excel**, **Импорт из JSON/Excel**.
|
|
47
|
+
- Для полей задаются функции отображения (`show`) и ввода (`ask`), что позволяет кастомизировать представление (например, пароль скрывается звёздочками, булевы значения показываются как «Да/Нет»).
|
|
48
|
+
|
|
49
|
+
**Класс `Field`** содержит атрибуты:
|
|
50
|
+
- `name` – имя поля в БД;
|
|
51
|
+
- `title` – заголовок в интерфейсе;
|
|
52
|
+
- `show` – функция преобразования значения в строку;
|
|
53
|
+
- `ask` – функция вызова диалога для ввода/редактирования;
|
|
54
|
+
- `ref` – ссылка на другую таблицу для поддержки внешних ключей.
|
|
55
|
+
|
|
56
|
+
#### 3.4. Авторизация и капча-пазл
|
|
57
|
+
- При запуске приложения появляется окно `LoginWindow` с полями ввода логина и пароля.
|
|
58
|
+
- Капча представляет собой пазл из 4 фрагментов исходного изображения (файлы 1.png … 4.png в папке `__main__`). Фрагменты перемешиваются случайным образом; пользователь должен кликать на два фрагмента для их обмена, чтобы восстановить правильный порядок.
|
|
59
|
+
- После каждой неудачной попытки (неверный пароль или неправильно собранный пазл) счётчик `attempts` увеличивается. При достижении 3 – запись блокируется (`is_blocked = 1`).
|
|
60
|
+
- При успешной авторизации счётчик сбрасывается, пользователь получает сообщение и переходит в главное окно.
|
|
61
|
+
|
|
62
|
+
**Методы:**
|
|
63
|
+
- `try_login()` – проверка логина/пароля, сборки пазла и блокировки;
|
|
64
|
+
- `draw_puzzle()` – отрисовка фрагментов на Canvas;
|
|
65
|
+
- `on_piece_click()` – обработка обмена фрагментов;
|
|
66
|
+
- Проверка сборки: `self.current_order == list(range(4))`.
|
|
67
|
+
|
|
68
|
+
#### 3.5. Расчёт стоимости заказа
|
|
69
|
+
- Для заказа, выбранного в таблице «Заказы», по кнопке **Рассчитать стоимость** запускается диалог `CalcPriceDialog`.
|
|
70
|
+
- SQL-запрос (сложный `LEFT JOIN`) собирает позиции заказа, для каждой позиции ищет соответствующую спецификацию (если есть), затем для каждого материала спецификации вычисляет долю стоимости в расчёте на единицу продукции.
|
|
71
|
+
- Итоговая стоимость вычисляется как сумма по всем позициям:
|
|
72
|
+
`price_piece = COALESCE( op.amount * gm.price_for_unit * sm.amount / s.amount, op.amount * g.price_for_unit )`
|
|
73
|
+
- Результат отображается в табличном виде с детализацией по ингредиентам и общей суммой.
|
|
74
|
+
|
|
75
|
+
**Параметры запроса:**
|
|
76
|
+
- `order_id` – идентификатор заказа (передаётся либо из выделенной строки, либо через аргумент).
|
|
77
|
+
|
|
78
|
+
#### 3.6. Импорт/экспорт данных
|
|
79
|
+
- Поддерживаются форматы **JSON** и **Excel** (через библиотеку `pandas`).
|
|
80
|
+
- При импорте выполняется проверка корректности каждой записи методом `is_valid(row)`. В случае Excel первая встреченная некорректная строка считается концом данных.
|
|
81
|
+
- Экспорт выгружает все поля текущей таблицы.
|
|
82
|
+
|
|
83
|
+
**Методы:**
|
|
84
|
+
- `export_json(file)` – сериализует все записи в JSON;
|
|
85
|
+
- `import_json(file)` – десериализует и добавляет записи;
|
|
86
|
+
- `export_excel(file)` – создаёт DataFrame и сохраняет в Excel;
|
|
87
|
+
- `import_excel(file)` – читает Excel, преобразует типы (`fromnp`) и добавляет записи.
|
|
88
|
+
|
|
89
|
+
#### 3.7. Ролевая модель и управление пользователями
|
|
90
|
+
- В таблице `Users` хранятся поля: `id`, `login`, `password`, `role` ('admin' или 'user'), `is_blocked`, `attempts`.
|
|
91
|
+
- При входе определяется роль, и для администратора отображается вкладка «Пользователи» с возможностью создавать, редактировать и разблокировать учётные записи.
|
|
92
|
+
- Класс `TableUsers` переопределяет методы `data_create` и `data_set` для проверки уникальности логина.
|
|
93
|
+
|
|
94
|
+
### 4. Структура базы данных
|
|
95
|
+
Схема БД включает следующие таблицы (все с первичным ключом `id` AUTOINCREMENT):
|
|
96
|
+
|
|
97
|
+
| Таблица | Назначение | Внешние ключи |
|
|
98
|
+
|---------|------------|---------------|
|
|
99
|
+
| `Customers` | Заказчики (ФИО, ИНН, адрес, телефон, флаги продавца/покупателя) | – |
|
|
100
|
+
| `Goods` | Товары (наименование, цена за единицу, единица измерения) | – |
|
|
101
|
+
| `Orders` | Заказы (исполнитель, заказчик, дата) | `executor` → `Customers.id`, `customer` → `Customers.id` |
|
|
102
|
+
| `OrderPositions` | Позиции заказа (заказ, продукт, количество) | `order_id` → `Orders.id`, `product` → `Goods.id` |
|
|
103
|
+
| `Productions` | Производственные партии (дата) | – |
|
|
104
|
+
| `ProductionMaterials` | Используемые материалы в производстве | `prod_id` → `Productions.id`, `product` → `Goods.id` |
|
|
105
|
+
| `ProductionProducts` | Выпущенные продукты в производстве | `prod_id` → `Productions.id`, `product` → `Goods.id` |
|
|
106
|
+
| `Specs` | Спецификации (исполнитель, продукт, количество) | `executor` → `Customers.id`, `production` → `Goods.id` |
|
|
107
|
+
| `SpecMaterial` | Материалы спецификации | `spec_id` → `Specs.id`, `product` → `Goods.id` |
|
|
108
|
+
| `Users` | Пользователи (логин, пароль, роль, блокировка, попытки) | – |
|
|
109
|
+
|
|
110
|
+
Все внешние ключи включены (`PRAGMA foreign_keys = ON`), обеспечивая ссылочную целостность.
|
|
111
|
+
|
|
112
|
+
### 5. Интерфейс пользователя
|
|
113
|
+
Главное окно содержит панель вкладок (кнопки) для переключения между таблицами. Каждая вкладка представляет собой фрейм с табличным представлением и панелью управления внизу. Для администратора доступна вкладка «Пользователи» с функциями управления учётными записями.
|
|
114
|
+
|
|
115
|
+
Окно авторизации содержит поля ввода, кнопку «Войти» и область для сборки пазла (Canvas). При успешном входе выводится информационное сообщение, при ошибках – соответствующие диалоги с предупреждениями.
|
|
116
|
+
|
|
117
|
+
### 6. Используемые технологии и библиотеки
|
|
118
|
+
- **Python 3** (стандартная библиотека: `tkinter`, `sqlite3`, `json`, `os`, `random`, `dataclasses`);
|
|
119
|
+
- **Pillow** – для работы с изображениями (загрузка и масштабирование фрагментов пазла);
|
|
120
|
+
- **pandas** – для импорта/экспорта Excel;
|
|
121
|
+
- **numpy** – для преобразования типов данных при импорте.
|
|
122
|
+
|
|
123
|
+
### 7. Заключение
|
|
124
|
+
Разработанная информационная система полностью удовлетворяет требованиям технического задания: реализованы все необходимые сущности, поддерживаются CRUD-операции, расчёт стоимости заказа, ролевая модель с блокировкой и капча-пазл. Система готова к использованию в учебных целях и может служить основой для дальнейшей доработки под реальные производственные задачи.
|
|
Binary file
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
|
|
2
|
+
PRAGMA foreign_keys = ON;
|
|
3
|
+
CREATE TABLE IF NOT EXISTS "Customers" (
|
|
4
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5
|
+
name TEXT NOT NULL,
|
|
6
|
+
inn TEXT NOT NULL,
|
|
7
|
+
addres TEXT NOT NULL,
|
|
8
|
+
phone TEXT NOT NULL,
|
|
9
|
+
is_salesman INTEGER NOT NULL,
|
|
10
|
+
is_buyer INTEGER NOT NULL
|
|
11
|
+
);
|
|
12
|
+
CREATE TABLE IF NOT EXISTS "Goods" (
|
|
13
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
14
|
+
name TEXT NOT NULL,
|
|
15
|
+
price_for_unit REAL NOT NULL,
|
|
16
|
+
unit TEXT NOT NULL
|
|
17
|
+
);
|
|
18
|
+
CREATE TABLE IF NOT EXISTS "Orders" (
|
|
19
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
20
|
+
executor INTEGER NOT NULL REFERENCES "Customers"(id),
|
|
21
|
+
customer INTEGER NOT NULL REFERENCES "Customers"(id),
|
|
22
|
+
order_date DATE NOT NULL
|
|
23
|
+
);
|
|
24
|
+
CREATE TABLE IF NOT EXISTS "OrderPositions" (
|
|
25
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
26
|
+
order_id INTEGER NOT NULL REFERENCES "Orders"(id),
|
|
27
|
+
product INTEGER NOT NULL REFERENCES "Goods"(id),
|
|
28
|
+
amount REAL NOT NULL
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE TABLE IF NOT EXISTS "Productions" (
|
|
32
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
33
|
+
production_date DATE NOT NULL
|
|
34
|
+
);
|
|
35
|
+
CREATE TABLE IF NOT EXISTS "ProductionMaterials" (
|
|
36
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
37
|
+
prod_id INTEGER NOT NULL REFERENCES "Productions"(id),
|
|
38
|
+
product INTEGER NOT NULL REFERENCES "Goods"(id),
|
|
39
|
+
amount REAL NOT NULL
|
|
40
|
+
);
|
|
41
|
+
CREATE TABLE IF NOT EXISTS "ProductionProducts" (
|
|
42
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
43
|
+
prod_id INTEGER NOT NULL REFERENCES "Productions"(id),
|
|
44
|
+
product INTEGER NOT NULL REFERENCES "Goods"(id),
|
|
45
|
+
amount REAL NOT NULL
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
CREATE TABLE IF NOT EXISTS "Specs" (
|
|
49
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
50
|
+
executor INTEGER NOT NULL REFERENCES "Customers"(id),
|
|
51
|
+
production INTEGER NOT NULL REFERENCES "Goods"(id),
|
|
52
|
+
amount REAL NOT NULL
|
|
53
|
+
);
|
|
54
|
+
CREATE TABLE IF NOT EXISTS "SpecMaterial" (
|
|
55
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
56
|
+
spec_id INTEGER NOT NULL REFERENCES "Specs"(id),
|
|
57
|
+
product INTEGER NOT NULL REFERENCES "Goods"(id),
|
|
58
|
+
amount REAL NOT NULL
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
python_simpletables/__init__.py,sha256=tT2si4YdJPkxm4gGLVUfI7ORt-VM86_O0bFdgYXMyyo,41
|
|
2
|
+
python_simpletables/__main__(1).py,sha256=PT0xbND81WcqQJJ1DSsDx0_4Zx5fdjHnjmlQPIwSr5c,12412
|
|
3
|
+
python_simpletables/__main__(2).py,sha256=Cdlsbs9ldHw4p9M7l808cmxFduD1ZOgR21JcuII3pNQ,16955
|
|
4
|
+
python_simpletables/__main__.db.py,sha256=gozIUfWG-l-cfZrWP4FyS_Gz1gstmQ568ubcsmxmEDw,53248
|
|
5
|
+
python_simpletables/__main__.md.py,sha256=xsAaxYpJVXYJSgayt2zu3CCFAD--f46wkG1iiJfcciw,14854
|
|
6
|
+
python_simpletables/__main__.png.py,sha256=kBvgQcfrpjXPCtgzX4hOUeexiAH2lOqBbbLP_Lh2cMc,106337
|
|
7
|
+
python_simpletables/__main__.py,sha256=qPboB6kuppJ2m2ySS3pL49ul1Hw2cIQZ404wlwTFKHs,21527
|
|
8
|
+
python_simpletables/__main__.sql.py,sha256=0dTU-8wSbzUfgkzvI7Xr-jBJhKO5Q2mO2LG3WTjHDi4,1876
|
|
9
|
+
python_simpletables/table.py,sha256=jYbZc13m1-4nECcgK94FoVj95ooGfe8HnuAvhXL_26Y,9431
|
|
10
|
+
python_simpletables-0.2.1.dist-info/METADATA,sha256=O6oHbx2nKjUDRLZ0FMUI8xNidTnonHXMMdjLcLPA5KM,227
|
|
11
|
+
python_simpletables-0.2.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
12
|
+
python_simpletables-0.2.1.dist-info/top_level.txt,sha256=WhVQcD7ccNKNb-lZhcmTM0kTkcbxh7tE11YiN1ZwE9E,20
|
|
13
|
+
python_simpletables-0.2.1.dist-info/RECORD,,
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
python_simpletables/__init__.py,sha256=tT2si4YdJPkxm4gGLVUfI7ORt-VM86_O0bFdgYXMyyo,41
|
|
2
|
-
python_simpletables/__main__(1).py,sha256=PT0xbND81WcqQJJ1DSsDx0_4Zx5fdjHnjmlQPIwSr5c,12412
|
|
3
|
-
python_simpletables/__main__(2).py,sha256=Cdlsbs9ldHw4p9M7l808cmxFduD1ZOgR21JcuII3pNQ,16955
|
|
4
|
-
python_simpletables/__main__.py,sha256=qPboB6kuppJ2m2ySS3pL49ul1Hw2cIQZ404wlwTFKHs,21527
|
|
5
|
-
python_simpletables/table.py,sha256=jYbZc13m1-4nECcgK94FoVj95ooGfe8HnuAvhXL_26Y,9431
|
|
6
|
-
python_simpletables-0.1.30.dist-info/METADATA,sha256=S0RO4wfChI1ROVFzOGUs-Rj--LleFjAfPZlAyikNT6Q,228
|
|
7
|
-
python_simpletables-0.1.30.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
8
|
-
python_simpletables-0.1.30.dist-info/top_level.txt,sha256=WhVQcD7ccNKNb-lZhcmTM0kTkcbxh7tE11YiN1ZwE9E,20
|
|
9
|
-
python_simpletables-0.1.30.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|