3dnikita/main.py
2025-10-06 10:42:33 +05:00

201 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import sqlite3
#import datetime
import pandas as pd
import os
if os.path.exists('partners.db'):
os.remove('partners.db')
print(f"База данных {'partners.db'} удалена")
else:
print(f"База данных {'partners.db'} не найдена, создаем новую")
conn = sqlite3.connect('partners.db')
cursor = conn.cursor()
# Создаем таблицы
cursor.executescript('''
CREATE TABLE IF NOT EXISTS PartnerType (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type_name VARCHAR(100) NOT NULL UNIQUE);
CREATE TABLE IF NOT EXISTS Partner (
id INTEGER PRIMARY KEY AUTOINCREMENT,
partner_type_id INTEGER REFERENCES PartnerType(id),
name VARCHAR(255) NOT NULL,
director VARCHAR(255),
email VARCHAR(255),
phone VARCHAR(50),
legal_address TEXT,
inn VARCHAR(20) UNIQUE,
rating DECIMAL(3,2) DEFAULT 0.0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS ProductType (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type_name VARCHAR(100) NOT NULL UNIQUE,
coefficient DECIMAL(5,2) NOT NULL DEFAULT 1.0
);
CREATE TABLE IF NOT EXISTS Product (
id INTEGER PRIMARY KEY AUTOINCREMENT,
product_type_id INTEGER REFERENCES ProductType(id),
product_name VARCHAR(255) NOT NULL,
article VARCHAR(100) UNIQUE NOT NULL,
min_partner_price DECIMAL(15,2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS Sale (
id INTEGER PRIMARY KEY AUTOINCREMENT,
product_id INTEGER REFERENCES Product(id),
partner_id INTEGER REFERENCES Partner(id),
quantity INTEGER NOT NULL CHECK (quantity > 0),
sale_date DATE NOT NULL,
sale_price DECIMAL(15,2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_partner_type ON Partner(partner_type_id);
CREATE INDEX IF NOT EXISTS idx_partner_inn ON Partner(inn);
CREATE INDEX IF NOT EXISTS idx_product_type ON Product(product_type_id);
CREATE INDEX IF NOT EXISTS idx_product_article ON Product(article);
CREATE INDEX IF NOT EXISTS idx_sale_product ON Sale(product_id);
CREATE INDEX IF NOT EXISTS idx_sale_partner ON Sale(partner_id);
CREATE INDEX IF NOT EXISTS idx_sale_date ON Sale(sale_date);
''')
partner_types = [
('ЗАО',),
('ООО',),
('ПАО',),
('ОАО',)
]
cursor.executemany('INSERT OR IGNORE INTO PartnerType (type_name) VALUES (?)', partner_types)
partners = [
(1, 'База Строитель', 'Иванова Александра Ивановна', 'aleksandraivanova@ml.ru',
'493 123 45 67', '652050, Кемеровская область, город Юрга, ул. Лесная, 15', '2222455179', 7),
(2, 'Паркет 29', 'Петров Василий Петрович', 'vppetrov@vl.ru',
'987 123 56 78', '164500, Архангельская область, город Северодвинск, ул. Строителей, 18', '3333888520', 7),
(3, 'Стройсервис', 'Соловьев Андрей Николаевич', 'ansolovev@st.ru',
'812 223 32 00', '188910, Ленинградская область, город Приморск, ул. Парковая, 21', '4440391035', 7),
(4, 'Ремонт и отделка', 'Воробьева Екатерина Валерьевна', 'ekaterina.vorobeva@ml.ru',
'444 222 33 11', '143960, Московская область, город Реутов, ул. Свободы, 51', '1111520857', 5),
(1, 'МонтажПро', 'Степанов Степан Сергеевич', 'stepanov@stepan.ru',
'912 888 33 33', '309500, Белгородская область, город Старый Оскол, ул. Рабочая, 122', '5552431140', 10)
]
cursor.executemany('''
INSERT OR IGNORE INTO Partner (partner_type_id, name, director, email, phone, legal_address, inn, rating)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
''', partners)
# Заполняем типы продукции
product_types = [
('Ламинат', 2.35),
('Массивная доска', 5.15),
('Паркетная доска', 4.34),
('Пробковое покрытие', 1.5)
]
cursor.executemany('INSERT OR IGNORE INTO ProductType (type_name, coefficient) VALUES (?, ?)', product_types)
products = [
(3, 'Паркетная доска Ясень темный однополосная 14 мм', '8758385', 4456.90),
(3, 'Инженерная доска Дуб Французская елка однополосная 12 мм', '8858958', 7330.99),
(1, 'Ламинат Дуб дымчато-белый 33 класс 12 мм', '7750282', 1799.33),
(1, 'Ламинат Дуб серый 32 класс 8 мм с фаской', '7028748', 3890.41),
(4, 'Пробковое напольное клеевое покрытие 32 класс 4 мм', '5012543', 5450.59)
]
cursor.executemany('''
INSERT OR IGNORE INTO Product (product_type_id, product_name, article, min_partner_price)
VALUES (?, ?, ?, ?)
''', products)
# Заполняем продажи
sales_data = [
# Формат: (product_name, partner_name, quantity, sale_date)
('Паркетная доска Ясень темный однополосная 14 мм', 'База Строитель', 15500, '2023-03-23'),
('Ламинат Дуб дымчато-белый 33 класс 12 мм', 'База Строитель', 12350, '2023-12-18'),
('Ламинат Дуб серый 32 класс 8 мм с фаской', 'База Строитель', 37400, '2024-06-07'),
('Инженерная доска Дуб Французская елка однополосная 12 мм', 'Паркет 29', 35000, '2022-12-02'),
('Пробковое напольное клеевое покрытие 32 класс 4 мм', 'Паркет 29', 1250, '2023-05-17'),
('Ламинат Дуб дымчато-белый 33 класс 12 мм', 'Паркет 29', 1000, '2024-06-07'),
('Паркетная доска Ясень темный однополосная 14 мм', 'Паркет 29', 7550, '2024-07-01'),
('Паркетная доска Ясень темный однополосная 14 мм', 'Стройсервис', 7250, '2023-01-22'),
('Инженерная доска Дуб Французская елка однополосная 12 мм', 'Стройсервис', 2500, '2024-07-05'),
('Ламинат Дуб серый 32 класс 8 мм с фаской', 'Ремонт и отделка', 59050, '2023-03-20'),
('Ламинат Дуб дымчато-белый 33 класс 12 мм', 'Ремонт и отделка', 37200, '2024-03-12'),
('Пробковое напольное клеевое покрытие 32 класс 4 мм', 'Ремонт и отделка', 4500, '2024-05-14'),
('Ламинат Дуб дымчато-белый 33 класс 12 мм', 'МонтажПро', 50000, '2023-09-19'),
('Ламинат Дуб серый 32 класс 8 мм с фаской', 'МонтажПро', 670000, '2023-11-10'),
('Паркетная доска Ясень темный однополосная 14 мм', 'МонтажПро', 35000, '2024-04-15'),
('Инженерная доска Дуб Французская елка однополосная 12 мм', 'МонтажПро', 25000, '2024-06-12')
]
def get_ids(product_name, partner_name):
cursor.execute('SELECT id FROM Product WHERE product_name = ?', (product_name,))
product_id = cursor.fetchone()[0]
cursor.execute('SELECT id FROM Partner WHERE name = ?', (partner_name,))
partner_id = cursor.fetchone()[0]
cursor.execute('SELECT min_partner_price FROM Product WHERE product_name = ?', (product_name,))
sale_price = cursor.fetchone()[0]
return product_id, partner_id, sale_price
for sale in sales_data:
product_name, partner_name, quantity, sale_date = sale
try:
product_id, partner_id, sale_price = get_ids(product_name, partner_name)
cursor.execute('''
INSERT INTO Sale (product_id, partner_id, quantity, sale_date, sale_price)
VALUES (?, ?, ?, ?, ?)
''', (product_id, partner_id, quantity, sale_date, sale_price))
except Exception as e:
print(f"Ошибка при добавлении продажи: {sale}, ошибка: {e}")
conn.commit()
# print("╔" + "═" * 69 + "╗")
# print(f"║ {'КАРТОЧКА ПАРТНЕРА':^67} ║")
# print("╠" + "═" * 69 + "╣")
def print_patner_cars(partners_df):
"""Функция для вывода партнеров в виде карточек с выравниванием"""
if partners_df is None or partners_df.empty:
print("Нет данных о партнерах")
return
# for index, row in partners_df.iterrows():
# print("╔" + "═" * 69 + "╗")
# print(f"║ {'КАРТОЧКА ПАРТНЕРА':^67} ║")
# print("╠" + "═" * 69 + "╣")
#
# # Используем разные кавычки для избежания конфликта
# type_text = f"Тип: {row['Тип партнера' ]}"
# name_text = f"Наименование: {row['Наименование партнера' ]}"
# direktor_text = f"Директор: {row['Директор']}"
# rating_text = f"Рейтинг: {row['Рейтиннг']}"
# email_text = f"Контакты: {row['Контакты']}"
# phone_text = f"Телефон: {row['Телефон']}"
# inn_text = f"ИНН: {row['ИНН']}"
#
# address = row['Юридический адрес']
# if len(address) > 68:
# address = address[:57] + "..."
# address_text = f"Адрес; {address}"
#
# print(f"║ {})
if __name__== "__main__":
# Проверяем данные
print("данные уcпешно добавлы в базу данных!")
print("\nКолличество записей в таблицах:")
tables = ['PartnerType', 'Partner', 'ProductType', 'Product', 'Sale']
for table in tables:
cursor.execute(f'SELECT COUNT(*) FROM {table}')
count = cursor.fetchone()[0]
print(f"{table}: {count} записей")
# Закрываем соединение
conn.close()