Українська
Завдання
Відповідно до номера свого варіанта виконайте завдання обраного рівня складності.
Використовуйте Python 3.14 і PySide6. Для SQLite оберіть Qt SQL або власну модель над репозиторієм SQLAlchemy, якщо завдання не визначає конкретного шляху. Не підтримуйте два незалежні буфери редагування тих самих записів. Ціни й суми зберігайте цілими копійками; дати – ISO YYYY-MM-DD.
Варіанти
Варіант 1. Облік витрат
1. Початковий рівень. Створити графічний застосунок PySide6 «Облік витрат» для навчальних записів (id, дата, категорія, сума_коп). Дані задати в коді; реалізувати QTableView над QStandardItemModel, показати суму витрат. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Облік витрат» із записами (id, дата, категорія, сума_коп), QTableView над QStandardItemModel, показати суму витрат; додати діалог додавання з додатною сумою, делегат дати та фільтр категорії через проксі. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Облік витрат» із записами (id, дата, категорія, сума_коп), QTableView над QStandardItemModel, показати суму витрат та діалог додавання з додатною сумою, делегат дати та фільтр категорії через проксі; реалізувати SQLite з ручним збереженням пакета, скасуванням і експортом видимого фільтра CSV; перевірити rollback при неправильній сумі. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 2. Телефонний довідник
1. Початковий рівень. Створити графічний застосунок PySide6 «Телефонний довідник» для навчальних записів (id, ім’я, телефон). Дані задати в коді; реалізувати QTableView і буквальний пошук імені через QSortFilterProxyModel. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Телефонний довідник» із записами (id, ім’я, телефон), QTableView і буквальний пошук імені через QSortFilterProxyModel; додати QSqlTableModel зі SQLite, унікальний телефон із 10 ASCII-цифр і діалог редагування. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Телефонний довідник» із записами (id, ім’я, телефон), QTableView і буквальний пошук імені через QSortFilterProxyModel та QSqlTableModel зі SQLite, унікальний телефон із 10 ASCII-цифр і діалог редагування; реалізувати OnManualSubmit, імпорт CSV із перевіркою всіх рядків до транзакції, вибір файла й підтвердження відкидання незбережених змін. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 3. Бібліотека
1. Початковий рівень. Створити графічний застосунок PySide6 «Бібліотека» для навчальних записів (id_книги, назва, автор, доступно). Дані задати в коді; реалізувати QTableView каталогу з числовим сортуванням доступних примірників. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Бібліотека» із записами (id_книги, назва, автор, доступно), QTableView каталогу з числовим сортуванням доступних примірників; додати окремі таблиці книг і читачів, діалог видачі з перевіркою наявності примірника. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Бібліотека» із записами (id_книги, назва, автор, доступно), QTableView каталогу з числовим сортуванням доступних примірників та окремі таблиці книг і читачів, діалог видачі з перевіркою наявності примірника; реалізувати QSqlRelationalTableModel і делегат зовнішнього ключа читача, повернення книги та атомарну зміну видачі й залишку в SQLite. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 4. Складський облік
1. Початковий рівень. Створити графічний застосунок PySide6 «Складський облік» для навчальних записів (id, товар, кількість, мінімум). Дані задати в коді; реалізувати власну QAbstractTableModel і роль тла для кількості нижче мінімуму. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Складський облік» із записами (id, товар, кількість, мінімум), власну QAbstractTableModel і роль тла для кількості нижче мінімуму; додати редагування невід’ємної кількості через setData, dataChanged та фільтр дефіциту. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Складський облік» із записами (id, товар, кількість, мінімум), власну QAbstractTableModel і роль тла для кількості нижче мінімуму та редагування невід’ємної кількості через setData, dataChanged та фільтр дефіциту; реалізувати SQLite-репозиторій, діалог надходження/списання, заборону від’ємного залишку й журнал рухів в одній транзакції. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 5. Розклад занять
1. Початковий рівень. Створити графічний застосунок PySide6 «Розклад занять» для навчальних записів (id, день_1_5, урок_1_8, кабінет, викладач). Дані задати в коді; реалізувати QTableView записів і сортування за днем та уроком. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Розклад занять» із записами (id, день_1_5, урок_1_8, кабінет, викладач), QTableView записів і сортування за днем та уроком; додати діалог додавання, відхилення конфлікту кабінету або викладача в одному слоті. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Розклад занять» із записами (id, день_1_5, урок_1_8, кабінет, викладач), QTableView записів і сортування за днем та уроком та діалог додавання, відхилення конфлікту кабінету або викладача в одному слоті; реалізувати SQLite-збереження, пошук вільного кабінету з введеного переліку, перенесення заняття атомарною операцією й CSV-експорт. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 6. Кінотека
1. Початковий рівень. Створити графічний застосунок PySide6 «Кінотека» для навчальних записів (id, назва, рік, жанр). Дані задати в коді; реалізувати QTableView і фільтр назв без урахування регістру. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Кінотека» із записами (id, назва, рік, жанр), QTableView і фільтр назв без урахування регістру; додати QStyledItemDelegate з QComboBox жанрів і перевірку року 1888–2100 у моделі. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Кінотека» із записами (id, назва, рік, жанр), QTableView і фільтр назв без урахування регістру та QStyledItemDelegate з QComboBox жанрів і перевірку року 1888–2100 у моделі; реалізувати SQLite-каталог, діалог редагування, фільтр жанру та діапазону років, ручний submit/revert і збереження геометрії QSettings. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 7. Облік студентів
1. Початковий рівень. Створити графічний застосунок PySide6 «Облік студентів» для навчальних записів (id, ім’я, група, оцінка_0_100). Дані задати в коді; реалізувати QTableView студентів з окремим числовим EditRole для оцінки. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Облік студентів» із записами (id, ім’я, група, оцінка_0_100), QTableView студентів з окремим числовим EditRole для оцінки; додати QTreeView груп і таблицю студентів вибраної групи, редагування через setData з валідацією. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Облік студентів» із записами (id, ім’я, група, оцінка_0_100), QTableView студентів з окремим числовим EditRole для оцінки та QTreeView груп і таблицю студентів вибраної групи, редагування через setData з валідацією; реалізувати SQLite зі стабільними id, діалог переведення між групами, рейтинг та CSV-звіт; зберігати вибір за id після оновлення. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 8. Ательє
1. Початковий рівень. Створити графічний застосунок PySide6 «Ательє» для навчальних записів (id_замовлення, клієнт, опис, статус, ціна_коп). Дані задати в коді; реалізувати QTableView замовлень і підсумок вартості. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Ательє» із записами (id_замовлення, клієнт, опис, статус, ціна_коп), QTableView замовлень і підсумок вартості; додати делегат статусу нове/в_роботі/готове, діалог із непорожнім описом і невід’ємною ціною. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Ательє» із записами (id_замовлення, клієнт, опис, статус, ціна_коп), QTableView замовлень і підсумок вартості та делегат статусу нове/в_роботі/готове, діалог із непорожнім описом і невід’ємною ціною; реалізувати SQLAlchemy-репозиторій клієнтів та замовлень, master-detail, атомарну зміну статусу й журналу, фільтр незавершених. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 9. Автосервіс
1. Початковий рівень. Створити графічний застосунок PySide6 «Автосервіс» для навчальних записів (id_авто, номер, власник; id_ремонту, дата, сума_коп). Дані задати в коді; реалізувати дві QTableView з навчальними автомобілями та ремонтами вибраного авто. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Автосервіс» із записами (id_авто, номер, власник; id_ремонту, дата, сума_коп), дві QTableView з навчальними автомобілями та ремонтами вибраного авто; додати діалог ремонту, додатну суму й відхилення ремонту без вибраного авто. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Автосервіс» із записами (id_авто, номер, власник; id_ремонту, дата, сума_коп), дві QTableView з навчальними автомобілями та ремонтами вибраного авто та діалог ремонту, додатну суму й відхилення ремонту без вибраного авто; реалізувати SQLite із зовнішніми ключами, master-detail, заборону видалення авто з ремонтами без явного рішення, звіт сум і rollback помилкової операції. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 10. Спортивний щоденник
1. Початковий рівень. Створити графічний застосунок PySide6 «Спортивний щоденник» для навчальних записів (id, дата, вид, хвилини). Дані задати в коді; реалізувати QTableView тренувань і загальну тривалість. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Спортивний щоденник» із записами (id, дата, вид, хвилини), QTableView тренувань і загальну тривалість; додати діалог з хвилинами 1–1440, проксі-фільтр виду й включного періоду дат. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Спортивний щоденник» із записами (id, дата, вид, хвилини), QTableView тренувань і загальну тривалість та діалог з хвилинами 1–1440, проксі-фільтр виду й включного періоду дат; реалізувати SQLite, підсумки за тижнями, CSV-імпорт із повною валідацією та збереження фільтра в QSettings. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 11. Амбулаторна картка
1. Початковий рівень. Створити графічний застосунок PySide6 «Амбулаторна картка» для навчальних записів (id_пацієнта, ім’я; id_візиту, дата, примітка). Дані задати в коді; реалізувати master-detail з вигаданими пацієнтами й візитами. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Амбулаторна картка» із записами (id_пацієнта, ім’я; id_візиту, дата, примітка), master-detail з вигаданими пацієнтами й візитами; додати діалог візиту з непорожньою приміткою та вибором пацієнта, без реальних персональних даних. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Амбулаторна картка» із записами (id_пацієнта, ім’я; id_візиту, дата, примітка), master-detail з вигаданими пацієнтами й візитами та діалог візиту з непорожньою приміткою та вибором пацієнта, без реальних персональних даних; реалізувати SQLite-репозиторій, фільтр періоду, транзакційне додавання й експорт навчального звіту; не реалізовувати медичні висновки. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 12. Рецепти
1. Початковий рівень. Створити графічний застосунок PySide6 «Рецепти» для навчальних записів (id, страва, інгредієнт, кількість_г). Дані задати в коді; реалізувати QListView страв і таблицю інгредієнтів вибраної страви. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Рецепти» із записами (id, страва, інгредієнт, кількість_г), QListView страв і таблицю інгредієнтів вибраної страви; додати діалог інгредієнта з додатною кількістю, суму мас і вибір локального фото через QFileDialog. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Рецепти» із записами (id, страва, інгредієнт, кількість_г), QListView страв і таблицю інгредієнтів вибраної страви та діалог інгредієнта з додатною кількістю, суму мас і вибір локального фото через QFileDialog; реалізувати SQLite для страв та інгредієнтів, масштабування порцій у звіті без зміни базових даних, перевірку відсутнього файла фото і транзакційне редагування. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 13. Інвентаризація
1. Початковий рівень. Створити графічний застосунок PySide6 «Інвентаризація» для навчальних записів (id, код, назва, облікова_кількість, фактична_кількість). Дані задати в коді; реалізувати QTableView із розрахованою різницею фактичної та облікової кількості. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Інвентаризація» із записами (id, код, назва, облікова_кількість, фактична_кількість), QTableView із розрахованою різницею фактичної та облікової кількості; додати редагування невід’ємних кількостей, роль кольору розбіжностей і фільтр лише розбіжностей. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Інвентаризація» із записами (id, код, назва, облікова_кількість, фактична_кількість), QTableView із розрахованою різницею фактичної та облікової кількості та редагування невід’ємних кількостей, роль кольору розбіжностей і фільтр лише розбіжностей; реалізувати SQLite, діалог унікального коду, імпорт фактичних кількостей CSV одним пакетом та експорт відфільтрованого звіту. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 14. Музична колекція
1. Початковий рівень. Створити графічний застосунок PySide6 «Музична колекція» для навчальних записів (id, виконавець, альбом, трек, тривалість_с). Дані задати в коді; реалізувати QTreeView виконавець–альбом–трек на QStandardItemModel. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Музична колекція» із записами (id, виконавець, альбом, трек, тривалість_с), QTreeView виконавець–альбом–трек на QStandardItemModel; додати контекстне меню додавання й видалення, діалог із додатною тривалістю та підсумки альбомів. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Музична колекція» із записами (id, виконавець, альбом, трек, тривалість_с), QTreeView виконавець–альбом–трек на QStandardItemModel та контекстне меню додавання й видалення, діалог із додатною тривалістю та підсумки альбомів; реалізувати SQLite-репозиторій зі стабільними id вузлів, пошук треків і відновлення дерева, транзакційне переміщення треку між альбомами. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 15. Міні-готель
1. Початковий рівень. Створити графічний застосунок PySide6 «Міні-готель» для навчальних записів (id, номер, гість, заїзд, виїзд). Дані задати в коді; реалізувати QTableView бронювань із датами й тривалістю. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Міні-готель» із записами (id, номер, гість, заїзд, виїзд), QTableView бронювань із датами й тривалістю; додати діалог QDateEdit, виїзд строго після заїзду; конфлікт визначати перетином напіввідкритих інтервалів [заїзд,виїзд) одного номера. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Міні-готель» із записами (id, номер, гість, заїзд, виїзд), QTableView бронювань із датами й тривалістю та діалог QDateEdit, виїзд строго після заїзду; конфлікт визначати перетином напіввідкритих інтервалів [заїзд,виїзд) одного номера; реалізувати SQLite, фільтр вільних номерів на період, атомарне перенесення бронювання та тести суміжних дат без конфлікту. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 16. Кадровий облік
1. Початковий рівень. Створити графічний застосунок PySide6 «Кадровий облік» для навчальних записів (id, ім’я, відділ_id, зарплата_коп). Дані задати в коді; реалізувати QTableView працівників із підсумком зарплат. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Кадровий облік» із записами (id, ім’я, відділ_id, зарплата_коп), QTableView працівників із підсумком зарплат; додати QSqlRelationalTableModel для відділів і працівників, делегат вибору відділу, невід’ємну зарплату. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Кадровий облік» із записами (id, ім’я, відділ_id, зарплата_коп), QTableView працівників із підсумком зарплат та QSqlRelationalTableModel для відділів і працівників, делегат вибору відділу, невід’ємну зарплату; реалізувати SQLite, OnManualSubmit, фільтр відділу, діалог додавання та rollback порушення зовнішнього ключа; налаштування геометрії через QSettings. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 17. Задачі команди
1. Початковий рівень. Створити графічний застосунок PySide6 «Задачі команди» для навчальних записів (id, назва, виконавець, статус, пріоритет). Дані задати в коді; реалізувати QTableView завдань і пошук назви. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Задачі команди» із записами (id, назва, виконавець, статус, пріоритет), QTableView завдань і пошук назви; додати делегати статусу нове/в_роботі/готове та пріоритету 1–5, діалог непорожньої назви. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Задачі команди» із записами (id, назва, виконавець, статус, пріоритет), QTableView завдань і пошук назви та делегати статусу нове/в_роботі/готове та пріоритету 1–5, діалог непорожньої назви; реалізувати SQLite, кілька одночасних фільтрів, QSettings для стану вікна, експорт видимих рядків і збереження змін однією транзакцією. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 18. Журнал відвідувань
1. Початковий рівень. Створити графічний застосунок PySide6 «Журнал відвідувань» для навчальних записів (id_учня, ім’я, дата, присутній). Дані задати в коді; реалізувати QTableView з CheckStateRole для присутності. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Журнал відвідувань» із записами (id_учня, ім’я, дата, присутній), QTableView з CheckStateRole для присутності; додати власну setData для CheckStateRole, ItemIsUserCheckable, сигнал dataChanged і підсумок присутніх. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Журнал відвідувань» із записами (id_учня, ім’я, дата, присутній), QTableView з CheckStateRole для присутності та власну setData для CheckStateRole, ItemIsUserCheckable, сигнал dataChanged і підсумок присутніх; реалізувати SQLite з унікальністю пари учень–дата, вибір дня, пакетне позначення всіх із можливістю скасування до commit та CSV-звіт. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 19. Каталог товарів
1. Початковий рівень. Створити графічний застосунок PySide6 «Каталог товарів» для навчальних записів (id, назва, категорія, ціна_коп). Дані задати в коді; реалізувати власну QAbstractTableModel з числовим сортуванням ціни. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Каталог товарів» із записами (id, назва, категорія, ціна_коп), власну QAbstractTableModel з числовим сортуванням ціни; додати діалог і валідацію непорожньої назви, невід’ємної ціни та проксі-фільтр категорії. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Каталог товарів» із записами (id, назва, категорія, ціна_коп), власну QAbstractTableModel з числовим сортуванням ціни та діалог і валідацію непорожньої назви, невід’ємної ціни та проксі-фільтр категорії; реалізувати SQLAlchemy-репозиторій з пагінацією по 50 записів і стабільним порядком id; фільтр виконувати у запиті, показувати загальну кількість і обробляти порожню останню сторінку. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 20. Квиткова каса
1. Початковий рівень. Створити графічний застосунок PySide6 «Квиткова каса» для навчальних записів (id_сеансу, назва, час, місткість; місце, покупець). Дані задати в коді; реалізувати master-detail сеансів і зайнятих місць. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Квиткова каса» із записами (id_сеансу, назва, час, місткість; місце, покупець), master-detail сеансів і зайнятих місць; додати діалог продажу з місцем 1–місткість, унікальністю пари сеанс–місце й підтвердженням скасування. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Квиткова каса» із записами (id_сеансу, назва, час, місткість; місце, покупець), master-detail сеансів і зайнятих місць та діалог продажу з місцем 1–місткість, унікальністю пари сеанс–місце й підтвердженням скасування; реалізувати SQLite, UNIQUE-обмеження й транзакцію продажу, обробку одночасної спроби зайняти місце, звіт проданих і вільних місць. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 21. Облік техніки
1. Початковий рівень. Створити графічний застосунок PySide6 «Облік техніки» для навчальних записів (id, інвентарний_код, назва, отримувач, строк). Дані задати в коді; реалізувати QTableView пристроїв із роллю для прострочених видач. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Облік техніки» із записами (id, інвентарний_код, назва, отримувач, строк), QTableView пристроїв із роллю для прострочених видач; додати діалог видачі, заборону повторної видачі зайнятого пристрою й повернення. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Облік техніки» із записами (id, інвентарний_код, назва, отримувач, строк), QTableView пристроїв із роллю для прострочених видач та діалог видачі, заборону повторної видачі зайнятого пристрою й повернення; реалізувати SQLite із журналом, атомарну видачу/повернення, фільтр прострочень щодо вибраної дати та CSV-звіт без реальних персональних даних. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 22. Колекція монет
1. Початковий рівень. Створити графічний застосунок PySide6 «Колекція монет» для навчальних записів (id, країна, рік, номінал, шлях_фото). Дані задати в коді; реалізувати QTableView монет і форму деталей вибраної монети. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Колекція монет» із записами (id, країна, рік, номінал, шлях_фото), QTableView монет і форму деталей вибраної монети; додати діалог із роком 1–2100, непорожнім номіналом і вибором фото QFileDialog. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Колекція монет» із записами (id, країна, рік, номінал, шлях_фото), QTableView монет і форму деталей вибраної монети та діалог із роком 1–2100, непорожнім номіналом і вибором фото QFileDialog; реалізувати SQLite, фільтри країни й років, перевірку недоступного зображення, експорт CSV та безпечне скасування редагування. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 23. Тренерський журнал
1. Початковий рівень. Створити графічний застосунок PySide6 «Тренерський журнал» для навчальних записів (id, спортсмен, вік, результат). Дані задати в коді; реалізувати QTableView навчальних результатів і сортування числа. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Тренерський журнал» із записами (id, спортсмен, вік, результат), QTableView навчальних результатів і сортування числа; додати діалог із віком 6–100 та невід’ємним результатом, фільтр включного вікового інтервалу. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Тренерський журнал» із записами (id, спортсмен, вік, результат), QTableView навчальних результатів і сортування числа та діалог із віком 6–100 та невід’ємним результатом, фільтр включного вікового інтервалу; реалізувати SQLite, таблицю навчальних нормативів вікових груп, розраховану роль виконання нормативу й експорт; правила нормативів показувати явно. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 24. Книгарня
1. Початковий рівень. Створити графічний застосунок PySide6 «Книгарня» для навчальних записів (id_продажу, дата, книга, кількість, ціна_коп). Дані задати в коді; реалізувати QTableView продажів і розраховану суму кількість×ціна. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Книгарня» із записами (id_продажу, дата, книга, кількість, ціна_коп), QTableView продажів і розраховану суму кількість×ціна; додати діалог з додатною кількістю, невід’ємною ціною й фільтр періоду. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Книгарня» із записами (id_продажу, дата, книга, кількість, ціна_коп), QTableView продажів і розраховану суму кількість×ціна та діалог з додатною кількістю, невід’ємною ціною й фільтр періоду; реалізувати SQLite для книг і продажів, атомарне зменшення залишку без від’ємних значень, звіт за період та QFileDialog для CSV. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 25. Реєстр договорів
1. Початковий рівень. Створити графічний застосунок PySide6 «Реєстр договорів» для навчальних записів (id, номер, сторона, початок, кінець). Дані задати в коді; реалізувати QTableView навчальних договорів і сортування за кінцем строку. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Реєстр договорів» із записами (id, номер, сторона, початок, кінець), QTableView навчальних договорів і сортування за кінцем строку; додати діалог із кінцем не раніше початку, унікальним номером і фільтр прострочених на вибрану дату. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Реєстр договорів» із записами (id, номер, сторона, початок, кінець), QTableView навчальних договорів і сортування за кінцем строку та діалог із кінцем не раніше початку, унікальним номером і фільтр прострочених на вибрану дату; реалізувати SQLite, повідомлення QMessageBox перед видаленням, транзакційне продовження строку з історією та QSettings для фільтра. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 26. Термінологічний словник
1. Початковий рівень. Створити графічний застосунок PySide6 «Термінологічний словник» для навчальних записів (id, термін, переклад, примітка). Дані задати в коді; реалізувати QListView термінів і панель деталей. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Термінологічний словник» із записами (id, термін, переклад, примітка), QListView термінів і панель деталей; додати QSortFilterProxyModel з буквальним пошуком, діалог непорожнього терміна й перекладу. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Термінологічний словник» із записами (id, термін, переклад, примітка), QListView термінів і панель деталей та QSortFilterProxyModel з буквальним пошуком, діалог непорожнього терміна й перекладу; реалізувати SQLite, унікальність терміна без урахування регістру за явною нормалізацією, атомарний CSV-імпорт із повідомленням конфліктів і експорт. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 27. Благодійні внески
1. Початковий рівень. Створити графічний застосунок PySide6 «Благодійні внески» для навчальних записів (id, донор, дата, сума_коп). Дані задати в коді; реалізувати QTableView лише вигаданих внесків і загальну суму. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Благодійні внески» із записами (id, донор, дата, сума_коп), QTableView лише вигаданих внесків і загальну суму; додати діалог із додатною сумою, фільтр періоду й групування підсумків за донором. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Благодійні внески» із записами (id, донор, дата, сума_коп), QTableView лише вигаданих внесків і загальну суму та діалог із додатною сумою, фільтр періоду й групування підсумків за донором; реалізувати SQLite з транзакціями, підтвердження видалення, CSV-експорт видимих записів і загального підсумку; не використовувати реальні платіжні дані. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 28. Меню ресторану
1. Початковий рівень. Створити графічний застосунок PySide6 «Меню ресторану» для навчальних записів (id, категорія, страва, ціна_коп). Дані задати в коді; реалізувати QTreeView категорій та таблицю страв вибраної категорії. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Меню ресторану» із записами (id, категорія, страва, ціна_коп), QTreeView категорій та таблицю страв вибраної категорії; додати делегат ціни, відхилення від’ємного значення й діалог непорожньої назви. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Меню ресторану» із записами (id, категорія, страва, ціна_коп), QTreeView категорій та таблицю страв вибраної категорії та делегат ціни, відхилення від’ємного значення й діалог непорожньої назви; реалізувати SQLite з категоріями й стравами, реляційний вибір категорії, атомарне переміщення страви та CSV-експорт меню. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 29. Турнірна таблиця
1. Початковий рівень. Створити графічний застосунок PySide6 «Турнірна таблиця» для навчальних записів (id_матчу, команда_A, команда_B, голи_A, голи_B). Дані задати в коді; реалізувати QTableView матчів і розрахований рейтинг за очками 3/1/0. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Турнірна таблиця» із записами (id_матчу, команда_A, команда_B, голи_A, голи_B), QTableView матчів і розрахований рейтинг за очками 3/1/0; додати діалог невід’ємних голів, заборону гри із собою й автоматичне оновлення рейтингу після зміни. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Турнірна таблиця» із записами (id_матчу, команда_A, команда_B, голи_A, голи_B), QTableView матчів і розрахований рейтинг за очками 3/1/0 та діалог невід’ємних голів, заборону гри із собою й автоматичне оновлення рейтингу після зміни; реалізувати SQLite для матчів, власну модель рейтингу з точними сигналами або reset, атомарне редагування результату та сортування за очками, різницею голів, назвою. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Варіант 30. Облік пального
1. Початковий рівень. Створити графічний застосунок PySide6 «Облік пального» для навчальних записів (id, авто, дата, пробіг_км, літри). Дані задати в коді; реалізувати QTableView заправок і підсумок літрів. Порожній набір показувати без помилки.
2. Базовий рівень. Створити графічний застосунок PySide6 «Облік пального» із записами (id, авто, дата, пробіг_км, літри), QTableView заправок і підсумок літрів; додати діалог додатних літрів і невід’ємного пробігу, фільтр авто та зростання пробігу його послідовних записів. Помилки пояснювати у вікні, Cancel залишає попередні дані без змін.
3. Високий рівень. Створити графічний застосунок PySide6 «Облік пального» із записами (id, авто, дата, пробіг_км, літри), QTableView заправок і підсумок літрів та діалог додатних літрів і невід’ємного пробігу, фільтр авто та зростання пробігу його послідовних записів; реалізувати SQLite, розрахунок витрати між повними заправками: літри наступної / різниця пробігу ×100; нульову різницю відхилити, перший запис не має витрати, додати CSV-звіт. Додати pytest-перевірки моделі й тимчасової бази, включаючи неправильний запис, Cancel і відкат; зберігати дані після перезапуску й не губити незбережені зміни мовчки.
Порядок виконання та захисту роботи
- Визначте сутності, стабільні id, стовпці, ролі, правила редагування та зв’язки таблиць. Підготуйте лише навчальні дані.
- Реалізуйте модель і перевірте читання, допустиме редагування, відмову без зміни стану та сигнали вставлення/видалення.
- Додайте представлення, пошук і сортування. Окремо перевірте
mapToSourceпісля зміни порядку й фільтра. - Реалізуйте діалоги з валідацією та Cancel. Перед зміною стану перевіряйте весь запис або пакет імпорту.
- Для бази перевірте commit, rollback, повторний запуск, зовнішні ключі й незбережені зміни. Для CSV – заголовок, кодування, неправильний рядок та недоступний шлях.
- Для високого рівня додайте pytest-тести моделі й репозиторію з тимчасовою базою; offscreen-тести доповніть оглядом вікна. Збережіть код, схему, README, результати й скриншот форми.
- На захисті поясніть, хто володіє даними, моделлю, діалогом і транзакцією, та покажіть відмову без часткової зміни.