мне надо помочь доработать мобильное приложение для андроида на python kivy. ранее ты сгенерировал код для приложение и мне надо ее доработать я скажу тебе какие изменения сделать. если не знаешь какой либо участок кода не выдумывай, а пиши только то что точно знаешь. для того что бы ты понимал весь контекст я дам тебе код полностью тобой же сгенерированный и ты продолжишь дальше дорабатывать. далее что надо сделать: когда нажимаешь на главном экране на одну из позиций для того чтобы ввести сколько продал  надо добавить окошко для ввода числа скидки, это окошко должно быть не обязательно заполнять, то есть если заполняешь то сумма продажи рассчитывается исходя из скидки, например в позиции 100 мл и один миллилитр стоит 50 рублей как обычно в окошко миллилитров вводим количество миллилитров на основе этого высчитывается сумма как и сейчас, но если в новое окошко скидки ввести например 100 то это сотня вычетается из суммы продажи и в файл продаж тоже делается данная заметка что скидка была 100 рублей и итоговая сумма продажи, если не далается скидка то все работает как работает. и окошко для скидки это окошко которая не обязательна для заполнения. далее я дан код приложения полностью сделай на ее основе и доработай: import os  # Модуль для работы с операционной системой
from kivy.app import App  # Основной класс приложения Kivy
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition  # Менеджер экранов и тип перехода
from kivy.uix.boxlayout import BoxLayout  # Макет для размещения виджетов в виде коробки
from kivy.uix.floatlayout import FloatLayout  # Макет для свободного размещения виджетов
from kivy.uix.scrollview import ScrollView  # Виджет для добавления прокрутки
from kivy.uix.button import Button  # Виджет кнопки
from kivy.uix.label import Label  # Виджет метки (текста)
from kivy.uix.textinput import TextInput  # Виджет для ввода текста
from kivy.animation import Animation  # Модуль для анимации
from openpyxl import Workbook, load_workbook  # Модули для работы с Excel файлами
from datetime import datetime  # Модуль для работы с датой и временем
from kivy.core.window import Window  # Для работы с размерами окна
from kivy.uix.popup import Popup  # Для всплывающих окон

# Класс для управления базой данных (xlsx файл)
class DatabaseManager:
    def __init__(self, filename='database.xlsx'):
        self.filename = filename
        # Если файл не существует, создаем его и добавляем заголовки
        if not os.path.exists(self.filename):
            self.workbook = Workbook()
            self.sheet = self.workbook.active
            # Устанавливаем заголовки столбцов
            self.sheet.append(['Имя позиции', 'Количество (мл)', 'Цена за мл'])
            self.workbook.save(self.filename)
        else:
            # Если файл существует, загружаем его
            self.workbook = load_workbook(self.filename)
            self.sheet = self.workbook.active

    def add_item(self, name, quantity, price):
        """Добавляет новую позицию в базу данных."""
        self.sheet.append([name, quantity, price])
        self.workbook.save(self.filename)

    def get_all_items(self):
        """Возвращает список всех позиций в базе данных."""
        items = []
        for row in self.sheet.iter_rows(min_row=2, values_only=True):
            items.append({
                'name': row[0],
                'quantity': row[1],
                'price': row[2]
            })
        return items

    def update_quantity(self, item_name, sold_quantity):
        """Обновляет количество позиции после продажи."""
        for row in self.sheet.iter_rows(min_row=2):
            if row[0].value == item_name:
                current_quantity = row[1].value
                if current_quantity >= sold_quantity:
                    row[1].value = current_quantity - sold_quantity
                    self.workbook.save(self.filename)
                    return True
                else:
                    return False
        return False

    def update_item(self, original_name, new_name, new_quantity, new_price):
        """Обновляет информацию о позиции в базе данных."""
        for row in self.sheet.iter_rows(min_row=2):
            if row[0].value == original_name:
                row[0].value = new_name
                row[1].value = new_quantity
                row[2].value = new_price
                self.workbook.save(self.filename)  # Сохраняем изменения
                return True
        return False

# Класс для управления файлами продаж
class SalesManager:
    def __init__(self, sales_dir='sales'):
        self.sales_dir = sales_dir
        # Если директория для продаж не существует, создаем ее
        if not os.path.exists(self.sales_dir):
            os.makedirs(self.sales_dir)

    def get_sales_filename(self, year, month):
        """Возвращает имя файла продаж для указанного года и месяца."""
        filename = f"sales_{year}_{month}.xlsx"
        return os.path.join(self.sales_dir, filename)

    def add_sale(self, sale_data):
        """Добавляет запись о продаже в файл продаж."""
        now = datetime.now()
        filename = self.get_sales_filename(now.year, now.month)
        if not os.path.exists(filename):
            workbook = Workbook()
            sheet = workbook.active
            # Устанавливаем заголовки столбцов
            sheet.append(['Дата', 'Наименование', 'Количество (мл)', 'Цена за мл', 'Сумма'])
        else:
            workbook = load_workbook(filename)
            sheet = workbook.active
        # Добавляем данные о продаже
        sheet.append([
            sale_data['date'],
            sale_data['name'],
            sale_data['quantity'],
            sale_data['price'],
            sale_data['total']
        ])
        workbook.save(filename)

    def get_monthly_sales_files(self):
        """Возвращает список всех месячных файлов продаж."""
        files = []
        for file in os.listdir(self.sales_dir):
            if file.startswith('sales_') and file.endswith('.xlsx'):
                files.append(file)
        return sorted(files)  # Сортировка по имени файла

# Главный экран приложения
class MainScreen(Screen):
    def __init__(self, **kwargs):
        super(MainScreen, self).__init__(**kwargs)
        # Используем BoxLayout с вертикальной ориентацией для основного макета
        self.layout = BoxLayout(orientation='vertical')
        self.add_widget(self.layout)

        # Шапка приложения с кнопкой гамбургера и поиском
        header_height = 0.1  # 10% высоты экрана
        self.header = BoxLayout(orientation='horizontal', size_hint=(1, header_height), padding=5, spacing=5)

        # Кнопка гамбургера
        self.hamburger_button = Button(
            text='☰',
            size_hint=(None, 1),
            width=Window.width * 0.1,  # 10% ширины экрана
            font_size='24sp'
        )
        self.hamburger_button.bind(on_release=self.toggle_sidebar)
        self.header.add_widget(self.hamburger_button)

        # Метка заголовка
        self.header_label = Label(
            text='Perfume',
            font_size='20sp',
            halign='center',
            valign='middle'
        )
        self.header_label.bind(size=self.header_label.setter('text_size'))  # Для переноса текста при необходимости
        self.header.add_widget(self.header_label)

        # Поле поиска
        self.search_input = TextInput(
            hint_text='Поиск...',
            size_hint=(1, 1),  # Остальная часть ширины
            multiline=False,
            padding_x=10,
            font_size='16sp'
        )
        self.search_input.bind(text=self.update_search)
        self.header.add_widget(self.search_input)

        self.layout.add_widget(self.header)

        # Основной контент и шторка
        self.content_layout = FloatLayout(size_hint=(1, 0.9))  # Остальные 90% высоты

        # Счетчик состояния шторки
        self.sidebar_open = False

        # Боковая шторка (sidebar)
        self.sidebar_width = Window.width * 0.8  # Ширина шторки 80% ширины экрана
        self.sidebar = BoxLayout(
            orientation='vertical',
            size_hint=(None, 1),
            width=self.sidebar_width,
            padding=10,
            spacing=10
        )
        self.sidebar.pos = (-self.sidebar_width, 0)  # Изначально скрыта за экраном

        # Заголовок шторки
        sidebar_header = BoxLayout(orientation='horizontal', size_hint_y=None, height=40, padding=5)
        sidebar_title = Label(text='Файлы продаж', font_size='18sp')
        sidebar_title.bind(size=sidebar_title.setter('text_size'))  # Для переноса текста
        close_button = Button(text='✕', size_hint=(0.2, 1), font_size='18sp')
        close_button.bind(on_release=self.toggle_sidebar)
        sidebar_header.add_widget(sidebar_title)
        sidebar_header.add_widget(close_button)
        self.sidebar.add_widget(sidebar_header)

        # ScrollView для списка файлов продаж
        self.sidebar_scroll = ScrollView(size_hint=(1, 1))
        self.sidebar_files_layout = BoxLayout(orientation='vertical', size_hint_y=None, spacing=10)
        self.sidebar_files_layout.bind(minimum_height=self.sidebar_files_layout.setter('height'))
        self.sidebar_scroll.add_widget(self.sidebar_files_layout)
        self.sidebar.add_widget(self.sidebar_scroll)

        self.content_layout.add_widget(self.sidebar)

        # Основной список позиций
        self.main_content = BoxLayout(orientation='vertical', padding=10, spacing=10, pos=(0,0), size_hint=(1,1))

        # ScrollView для прокрутки списка позиций
        self.scroll_view = ScrollView(size_hint=(1, 0.95))  # Щит прокрутки занимает 95% высоты основного контента
        self.items_layout = BoxLayout(orientation='vertical', size_hint_y=None, spacing=10)
        self.items_layout.bind(minimum_height=self.items_layout.setter('height'))
        self.scroll_view.add_widget(self.items_layout)

        # Кнопка "Добавить позицию"
        add_button = Button(
            text='Добавить позицию',
            size_hint=(1, 0.05),  # 5% высоты основного контента
            font_size='18sp'
        )
        add_button.bind(on_release=self.go_to_add_item)  # Привязываем событие нажатия

        # Добавляем виджеты в основной контент
        self.main_content.add_widget(self.scroll_view)
        self.main_content.add_widget(add_button)

        self.content_layout.add_widget(self.main_content)

        self.layout.add_widget(self.content_layout)

        # Боковая шторка и основной контент находятся внутри content_layout
        # При открытии шторки будем двигать main_content вправо

    def toggle_sidebar(self, instance):
        """Переключает видимость боковой шторки с анимацией и сдвигом основного контента."""
        if not self.sidebar_open:
            # Открываем шторку
            anim_sidebar = Animation(x=0, duration=0.3, t='out_quad')
            anim_sidebar.start(self.sidebar)
            # Сдвигаем основной контент вправо
            anim_content = Animation(x=self.sidebar_width, duration=0.3, t='out_quad')
            anim_content.start(self.main_content)
            self.sidebar_open = True
        else:
            # Закрываем шторку
            anim_sidebar = Animation(x=-self.sidebar_width, duration=0.3, t='in_quad')
            anim_sidebar.start(self.sidebar)
            # Возвращаем основной контент на место
            anim_content = Animation(x=0, duration=0.3, t='in_quad')
            anim_content.start(self.main_content)
            self.sidebar_open = False

    def on_pre_enter(self):
        """Метод, вызываемый перед входом на экран. Загружает данные из базы."""
        self.load_items()

    def load_items(self):
        """Загружает позиции из базы данных и отображает их."""
        self.items_layout.clear_widgets()  # Очищаем текущий список
        self.all_items = App.get_running_app().db_manager.get_all_items()  # Загружаем все позиции
        if not self.all_items:
            no_items_label = Label(text='Нет доступных позиций.', size_hint_y=None, height=40, font_size='16sp')
            no_items_label.bind(size=no_items_label.setter('text_size'))
            self.items_layout.add_widget(no_items_label)
        else:
            for item in self.all_items:
                # Создаем кнопку для каждой позиции
                btn = Button(
                    text=f"{item['name']} - Остаток: {item['quantity']} мл - Цена: {item['price']} руб/мл",
                    size_hint_y=None,
                    height=40,
                    font_size='16sp',
                    halign='left',  # Горизонтальное выравнивание текста
                    valign='middle'
                )
                btn.bind(on_release=lambda btn, name=item['name']: self.open_item_detail(name))
                # Обновляем text_size для переноса текста
                btn.bind(size=btn.setter('text_size'))
                self.items_layout.add_widget(btn)  # Добавляем кнопку в макет

        # Загрузка списка файлов продаж в шторку
        self.load_sales_files()

    def load_sales_files(self):
        """Загружает список месячных файлов продаж и отображает их в шторке."""
        self.sidebar_files_layout.clear_widgets()
        sales_manager = App.get_running_app().sales_manager
        sales_files = sales_manager.get_monthly_sales_files()
        if not sales_files:
            no_files_label = Label(text='Нет файлов продаж.', size_hint_y=None, height=40, font_size='16sp')
            no_files_label.bind(size=no_files_label.setter('text_size'))
            self.sidebar_files_layout.add_widget(no_files_label)
        else:
            for file in sales_files:
                btn = Button(
                    text=file,
                    size_hint_y=None,
                    height=40,
                    font_size='16sp',
                    halign='left',
                    valign='middle'
                )
                btn.bind(on_release=lambda btn, filename=file: self.display_monthly_sales(filename))
                btn.bind(size=btn.setter('text_size'))
                self.sidebar_files_layout.add_widget(btn)

    def display_monthly_sales(self, filename):
        """Отображает дневные продажи для выбранного месячного файла."""
        self.toggle_sidebar(None)  # Скрываем шторку
        sales_manager = App.get_running_app().sales_manager
        filepath = os.path.join(sales_manager.sales_dir, filename)
        if not os.path.exists(filepath):
            self.show_popup("Ошибка", "Файл продаж не найден.")
            return

        wb = load_workbook(filepath)
        sheet = wb.active
        sales = []
        for row in sheet.iter_rows(min_row=2, values_only=True):
            sale_date = row[0]  # Дата продажи
            sale_total = row[4]  # Сумма продажи
            sales.append({
                'date': sale_date,
                'total': sale_total
            })

        # Группировка продаж по дню
        daily_sales = {}
        for sale in sales:
            day = sale['date'].split(' ')[0]  # Извлекаем только дату без времени
            if day in daily_sales:
                daily_sales[day] += sale['total']
            else:
                daily_sales[day] = sale['total']

        # Обновляем основной контент для отображения дневных продаж
        self.main_content.clear_widgets()

        # Шапка основного контента с кнопкой возврата
        main_header = BoxLayout(orientation='horizontal', size_hint=(1, 0.1), padding=5, spacing=10)
        back_button = Button(text='← Назад', size_hint=(0.2, 1), font_size='18sp')
        back_button.bind(on_release=self.load_items)
        main_header.add_widget(back_button)

        monthly_label = Label(text=f'Дневные продажи за {filename[6:12]}', font_size='18sp', halign='center', valign='middle')
        monthly_label.bind(size=monthly_label.setter('text_size'))
        main_header.add_widget(monthly_label)
        main_header.add_widget(Label())  # Пустой виджет для выравнивания
        self.main_content.add_widget(main_header)

        # ScrollView для списка дневных продаж
        daily_scroll = ScrollView(size_hint=(1, 0.8))
        daily_layout = BoxLayout(orientation='vertical', size_hint_y=None, spacing=10)
        daily_layout.bind(minimum_height=daily_layout.setter('height'))

        for day, total in sorted(daily_sales.items()):
            btn = Button(
                text=f"{day} - Общая сумма: {total:.2f} руб",
                size_hint_y=None,
                height=40,
                font_size='16sp',
                halign='left',
                valign='middle'
            )
            btn.bind(on_release=lambda btn, day=day: self.display_daily_sales(filename, day))
            btn.bind(size=btn.setter('text_size'))
            daily_layout.add_widget(btn)

        daily_scroll.add_widget(daily_layout)
        self.main_content.add_widget(daily_scroll)

        # Кнопка "Добавить позицию" остаётся
        add_button = Button(text='Добавить позицию', size_hint=(1, None), height=40, font_size='18sp')
        add_button.bind(on_release=self.go_to_add_item)
        self.main_content.add_widget(add_button)

    def display_daily_sales(self, filename, day):
        """Отображает все продажи за выбранный день."""
        sales_manager = App.get_running_app().sales_manager
        filepath = os.path.join(sales_manager.sales_dir, filename)
        if not os.path.exists(filepath):
            self.show_popup("Ошибка", "Файл продаж не найден.")
            return

        wb = load_workbook(filepath)
        sheet = wb.active
        sales = []
        total_sum = 0
        for row in sheet.iter_rows(min_row=2, values_only=True):
            sale_date = row[0]
            sale_day = sale_date.split(' ')[0]
            if sale_day == day:
                sales.append({
                    'datetime': sale_date,
                    'name': row[1],
                    'quantity': row[2],
                    'price': row[3],
                    'total': row[4]
                })
                total_sum += row[4]

        # Обновляем основной контент для отображения детальной информации о продажах
        self.main_content.clear_widgets()

        # Шапка основного контента с кнопкой возврата
        main_header = BoxLayout(orientation='horizontal', size_hint=(1, 0.1), padding=5, spacing=10)
        back_button = Button(text='← Назад', size_hint=(0.2, 1), font_size='18sp')
        back_button.bind(on_release=lambda x: self.display_monthly_sales(filename))
        main_header.add_widget(back_button)

        detailed_label = Label(text=f'Продажи за {day}', font_size='18sp', halign='center', valign='middle')
        detailed_label.bind(size=detailed_label.setter('text_size'))
        main_header.add_widget(detailed_label)
        main_header.add_widget(Label())  # Пустой виджет для выравнивания
        self.main_content.add_widget(main_header)

        # ScrollView для списка продаж за день
        detailed_scroll = ScrollView(size_hint=(1, 0.7))  # Уменьшил до 70% для места под общую сумму
        detailed_layout = BoxLayout(orientation='vertical', size_hint_y=None, spacing=10)
        detailed_layout.bind(minimum_height=detailed_layout.setter('height'))

        for sale in sales:
            sale_info = f"{sale['datetime']} - {sale['name']} - {sale['quantity']} мл - {sale['price']} руб/мл - {sale['total']} руб"
            lbl = Label(text=sale_info, size_hint=(1, None), height=40, font_size='16sp', halign='left', valign='middle')
            lbl.bind(size=lbl.setter('text_size'))  # Чтобы текст переносился
            detailed_layout.add_widget(lbl)

        detailed_scroll.add_widget(detailed_layout)
        self.main_content.add_widget(detailed_scroll)

        # Метка общей суммы
        total_label = Label(text=f'Общая сумма продаж: {total_sum:.2f} руб', size_hint=(1, None), height=40, font_size='18sp', halign='right', valign='middle')
        total_label.bind(size=total_label.setter('text_size'))  # Перенос текста
        self.main_content.add_widget(total_label)

        # Кнопка "Добавить позицию" остаётся
        add_button = Button(text='Добавить позицию', size_hint=(1, None), height=40, font_size='18sp')
        add_button.bind(on_release=self.go_to_add_item)
        self.main_content.add_widget(add_button)

    def open_item_detail(self, item_name):
        """Переход на экран детализации выбранной позиции."""
        detail_screen = self.manager.get_screen('item_detail')
        detail_screen.set_item(item_name)
        self.manager.current = 'item_detail'

    def go_to_add_item(self, instance):
        """Переход на экран добавления новой позиции."""
        self.manager.current = 'add_item'

    def update_search(self, instance, value):
        """Обновляет список позиций в соответствии с поисковым запросом."""
        search_text = value.strip().lower()
        self.items_layout.clear_widgets()  # Очищаем текущий список

        if search_text == '':
            # Если поиск пустой, показываем все позиции
            filtered_items = self.all_items
        else:
            # Фильтруем позиции по совпадению с поисковым запросом
            filtered_items = [item for item in self.all_items if search_text in item['name'].lower()]

        if not filtered_items:
            no_results_label = Label(text='Совпадений не найдено.', size_hint_y=None, height=40, font_size='16sp')
            no_results_label.bind(size=no_results_label.setter('text_size'))
            self.items_layout.add_widget(no_results_label)
        else:
            for item in filtered_items:
                # Создаем кнопку для каждой найденной позиции
                btn = Button(
                    text=f"{item['name']} - Остаток: {item['quantity']} мл - Цена: {item['price']} руб/мл",
                    size_hint_y=None,
                    height=40,
                    font_size='16sp',
                    halign='left',
                    valign='middle'
                )
                btn.bind(on_release=lambda btn, name=item['name']: self.open_item_detail(name))
                btn.bind(size=btn.setter('text_size'))
                self.items_layout.add_widget(btn)

    def show_popup(self, title, message):
        """Отображает всплывающее окно с сообщением."""
        popup_layout = BoxLayout(orientation='vertical', padding=10, spacing=10)
        popup_label = Label(text=message, halign='center', valign='middle')
        popup_label.bind(size=popup_label.setter('text_size'))
        ok_button = Button(text='OK', size_hint=(1, 0.3), font_size='16sp')
        popup_layout.add_widget(popup_label)
        popup_layout.add_widget(ok_button)

        popup = Popup(title=title, content=popup_layout, size_hint=(0.7, 0.4), auto_dismiss=False)
        ok_button.bind(on_release=popup.dismiss)
        popup.open()

# Экран добавления новой позиции
class AddItemScreen(Screen):
    def __init__(self, **kwargs):
        super(AddItemScreen, self).__init__(**kwargs)
        # Используем BoxLayout с вертикальной ориентацией для основного макета
        self.layout = BoxLayout(orientation='vertical')
        self.add_widget(self.layout)

        # Шапка экрана с названием и кнопкой возврата
        header_height = 0.1  # 10% высоты экрана
        self.header = BoxLayout(orientation='horizontal', size_hint=(1, header_height), padding=5, spacing=5)

        # Кнопка "Назад"
        back_button = Button(text='← Назад', size_hint=(0.2, 1), font_size='18sp')
        back_button.bind(on_release=self.go_back)
        self.header.add_widget(back_button)

        # Метка заголовка
        header_label = Label(text='Добавить позицию', font_size='20sp', halign='center', valign='middle')
        header_label.bind(size=header_label.setter('text_size'))  # Для переноса текста
        self.header.add_widget(header_label)

        # Пустой виджет для выравнивания
        self.header.add_widget(Label())
        self.layout.add_widget(self.header)

        # Основной контент формы
        form_height = 0.9  # Остальные 90%
        self.form_layout = BoxLayout(orientation='vertical', padding=10, spacing=10, size_hint=(1, form_height), pos_hint={'top':1})

        # Поле ввода имени позиции
        self.name_input = TextInput(
            hint_text='Имя позиции',
            size_hint=(1, None),
            height=40,
            font_size='16sp',
            multiline=False,
            padding_x=10
        )
        self.form_layout.add_widget(self.name_input)

        # Поле ввода количества в мл
        self.quantity_input = TextInput(
            hint_text='Количество в миллилитрах',
            size_hint=(1, None),
            height=40,
            input_filter='int',
            font_size='16sp',
            multiline=False,
            padding_x=10
        )
        self.form_layout.add_widget(self.quantity_input)

        # Поле ввода цены за мл
        self.price_input = TextInput(
            hint_text='Цена за один миллилитр',
            size_hint=(1, None),
            height=40,
            input_filter='float',
            font_size='16sp',
            multiline=False,
            padding_x=10
        )
        self.form_layout.add_widget(self.price_input)

        # Кнопка "Сохранить"
        save_button = Button(
            text='Сохранить',
            size_hint=(1, None),
            height=40,
            font_size='18sp'
        )
        save_button.bind(on_release=self.save_item)
        self.form_layout.add_widget(save_button)

        # Кнопка "Отмена"
        cancel_button = Button(
            text='Отмена',
            size_hint=(1, None),
            height=40,
            font_size='18sp'
        )
        cancel_button.bind(on_release=self.go_back)
        self.form_layout.add_widget(cancel_button)

        self.layout.add_widget(self.form_layout)

    def save_item(self, instance):
        """Сохраняет новую позицию в базе данных."""
        name = self.name_input.text.strip()
        quantity = self.quantity_input.text.strip()
        price = self.price_input.text.strip()

        # Проверка на корректность ввода
        if not name or not quantity or not price:
            self.show_popup("Ошибка", "Все поля обязательны для заполнения.")
            return

        try:
            quantity = float(quantity)
            price = float(price)
        except ValueError:
            self.show_popup("Ошибка", "Количество и цена должны быть числами.")
            return

        # Добавляем позицию в базу данных через менеджер базы данных приложения
        App.get_running_app().db_manager.add_item(name, quantity, price)

        # Возвращаемся на главный экран
        self.go_back()

    def go_back(self, instance=None):
        """Возвращается на главный экран."""
        self.manager.current = 'main'

    def show_popup(self, title, message):
        """Отображает всплывающее окно с сообщением."""
        popup_layout = BoxLayout(orientation='vertical', padding=10, spacing=10)
        popup_label = Label(text=message, halign='center', valign='middle')
        popup_label.bind(size=popup_label.setter('text_size'))
        ok_button = Button(text='OK', size_hint=(1, 0.3), font_size='16sp')
        popup_layout.add_widget(popup_label)
        popup_layout.add_widget(ok_button)

        popup = Popup(title=title, content=popup_layout, size_hint=(0.7, 0.4), auto_dismiss=False)
        ok_button.bind(on_release=popup.dismiss)
        popup.open()

# Экран детализации позиции
class ItemDetailScreen(Screen):
    def __init__(self, **kwargs):
        super(ItemDetailScreen, self).__init__(**kwargs)
        self.current_item = None  # Текущая выбранная позиция

        # Используем BoxLayout с вертикальной ориентацией для основного макета
        self.layout = BoxLayout(orientation='vertical')
        self.add_widget(self.layout)

        # Шапка экрана с названием и кнопкой возврата
        header_height = 0.1  # 10% высоты экрана
        self.header = BoxLayout(orientation='horizontal', size_hint=(1, header_height), padding=5, spacing=5)

        # Кнопка "Назад"
        back_button = Button(text='← Назад', size_hint=(0.2, 1), font_size='18sp')
        back_button.bind(on_release=self.go_back)
        self.header.add_widget(back_button)

        # Метка заголовка
        header_label = Label(text='Детали позиции', font_size='20sp', halign='center', valign='middle')
        header_label.bind(size=header_label.setter('text_size'))  # Для переноса текста
        self.header.add_widget(header_label)

        # Пустой виджет для выравнивания
        self.header.add_widget(Label())
        self.layout.add_widget(self.header)

        # Основной контент формы
        content_height = 0.85  # Остальные 85%
        self.content_layout = BoxLayout(orientation='vertical', padding=10, spacing=10, size_hint=(1, content_height), pos_hint={'top':1})

        # Метки для отображения информации о позиции
        self.name_label = Label(text='Имя позиции: ', size_hint=(1, None), height=40, font_size='16sp', halign='left', valign='middle')
        self.name_label.bind(size=self.name_label.setter('text_size'))
        self.content_layout.add_widget(self.name_label)

        self.quantity_label = Label(text='Остаток: ', size_hint=(1, None), height=40, font_size='16sp', halign='left', valign='middle')
        self.quantity_label.bind(size=self.quantity_label.setter('text_size'))
        self.content_layout.add_widget(self.quantity_label)

        self.price_label = Label(text='Цена за мл: ', size_hint=(1, None), height=40, font_size='16sp', halign='left', valign='middle')
        self.price_label.bind(size=self.price_label.setter('text_size'))
        self.content_layout.add_widget(self.price_label)

        # Поле ввода количества проданного
        self.sold_input = TextInput(
            hint_text='Количество продано (мл)',
            size_hint=(1, None),
            height=40,
            input_filter='int',
            font_size='16sp',
            multiline=False,
            padding_x=10
        )
        self.content_layout.add_widget(self.sold_input)

        # Кнопка "Продал"
        sold_button = Button(
            text='Продал',
            size_hint=(1, None),
            height=40,
            font_size='18sp'
        )
        sold_button.bind(on_release=self.process_sale)
        self.content_layout.add_widget(sold_button)

        # Кнопка "Редактировать"
        edit_button = Button(
            text='Редактировать',
            size_hint=(1, None),
            height=40,
            font_size='18sp'
        )
        edit_button.bind(on_release=self.go_to_edit_item)
        self.content_layout.add_widget(edit_button)

        self.layout.add_widget(self.content_layout)

    def set_item(self, item_name):
        """Устанавливает текущую позицию и обновляет отображение."""
        items = App.get_running_app().db_manager.get_all_items()
        for item in items:
            if item['name'] == item_name:
                self.current_item = item
                break
        if self.current_item:
            # Обновляем метки с информацией о позиции
            self.name_label.text = f"Имя позиции: {self.current_item['name']}"
            self.quantity_label.text = f"Остаток: {self.current_item['quantity']} мл"
            self.price_label.text = f"Цена за мл: {self.current_item['price']} руб/мл"

    def process_sale(self, instance):
        """Обрабатывает продажу позиции."""
        if not self.current_item:
            return

        sold_quantity = self.sold_input.text.strip()
        if not sold_quantity:
            self.show_popup("Ошибка", "Введите количество проданного товара.")
            return

        try:
            sold_quantity = float(sold_quantity)
        except ValueError:
            self.show_popup("Ошибка", "Количество должно быть числом.")
            return

        # Обновляем количество в базе данных
        success = App.get_running_app().db_manager.update_quantity(
            self.current_item['name'], sold_quantity
        )

        if success:
            # Добавляем запись о продаже
            sale_data = {
                'date': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                'name': self.current_item['name'],
                'quantity': sold_quantity,
                'price': self.current_item['price'],
                'total': sold_quantity * self.current_item['price']
            }
            App.get_running_app().sales_manager.add_sale(sale_data)
            # Очищаем поле ввода
            self.sold_input.text = ''
            # Обновляем информацию о позиции
            self.set_item(self.current_item['name'])
            # Обновляем главный экран
            main_screen = self.manager.get_screen('main')
            main_screen.load_items()
        else:
            self.show_popup("Ошибка", "Недостаточно товара на складе.")

    def go_back(self, instance=None):
        """Возвращается на главный экран."""
        self.manager.current = 'main'

    def go_to_edit_item(self, instance):
        """Переход на экран редактирования позиции."""
        edit_screen = self.manager.get_screen('edit_item')
        edit_screen.set_item(self.current_item)  # Передаем текущую позицию для редактирования
        self.manager.current = 'edit_item'

    def show_popup(self, title, message):
        """Отображает всплывающее окно с сообщением."""
        popup_layout = BoxLayout(orientation='vertical', padding=10, spacing=10)
        popup_label = Label(text=message, halign='center', valign='middle')
        popup_label.bind(size=popup_label.setter('text_size'))
        ok_button = Button(text='OK', size_hint=(1, 0.3), font_size='16sp')
        popup_layout.add_widget(popup_label)
        popup_layout.add_widget(ok_button)

        popup = Popup(title=title, content=popup_layout, size_hint=(0.7, 0.4), auto_dismiss=False)
        ok_button.bind(on_release=popup.dismiss)
        popup.open()

# Экран редактирования позиции
class EditItemScreen(Screen):
    def __init__(self, **kwargs):
        super(EditItemScreen, self).__init__(**kwargs)
        self.original_name = None  # Хранит исходное имя позиции для идентификации

        # Используем BoxLayout с вертикальной ориентацией для основного макета
        self.layout = BoxLayout(orientation='vertical')
        self.add_widget(self.layout)

        # Шапка экрана с названием и кнопкой возврата
        header_height = 0.1  # 10% высоты экрана
        self.header = BoxLayout(orientation='horizontal', size_hint=(1, header_height), padding=5, spacing=5)

        # Кнопка "Назад"
        back_button = Button(text='← Назад', size_hint=(0.2, 1), font_size='18sp')
        back_button.bind(on_release=self.go_back)
        self.header.add_widget(back_button)

        # Метка заголовка
        header_label = Label(text='Редактировать позицию', font_size='20sp', halign='center', valign='middle')
        header_label.bind(size=header_label.setter('text_size'))  # Для переноса текста
        self.header.add_widget(header_label)

        # Пустой виджет для выравнивания
        self.header.add_widget(Label())
        self.layout.add_widget(self.header)

        # Основной контент формы
        form_height = 0.9  # Остальные 90%
        self.form_layout = BoxLayout(orientation='vertical', padding=10, spacing=10, size_hint=(1, form_height), pos_hint={'top':1})

        # Поле ввода имени позиции
        self.name_input = TextInput(
            hint_text='Имя позиции',
            size_hint=(1, None),
            height=40,
            font_size='16sp',
            multiline=False,
            padding_x=10
        )
        self.form_layout.add_widget(self.name_input)

        # Поле ввода количества в мл
        self.quantity_input = TextInput(
            hint_text='Количество в миллилитрах',
            size_hint=(1, None),
            height=40,
            input_filter='int',
            font_size='16sp',
            multiline=False,
            padding_x=10
        )
        self.form_layout.add_widget(self.quantity_input)

        # Поле ввода цены за мл
        self.price_input = TextInput(
            hint_text='Цена за один миллилитр',
            size_hint=(1, None),
            height=40,
            input_filter='float',
            font_size='16sp',
            multiline=False,
            padding_x=10
        )
        self.form_layout.add_widget(self.price_input)

        # Кнопка "Сохранить изменения"
        save_button = Button(
            text='Сохранить изменения',
            size_hint=(1, None),
            height=40,
            font_size='18sp'
        )
        save_button.bind(on_release=self.save_item)
        self.form_layout.add_widget(save_button)

        # Кнопка "Отмена"
        cancel_button = Button(
            text='Отмена',
            size_hint=(1, None),
            height=40,
            font_size='18sp'
        )
        cancel_button.bind(on_release=self.go_back)
        self.form_layout.add_widget(cancel_button)

        self.layout.add_widget(self.form_layout)

    def set_item(self, item):
        """Устанавливает текущую позицию для редактирования и заполняет поля."""
        self.original_name = item['name']
        self.name_input.text = item['name']
        self.quantity_input.text = str(int(item['quantity']))  # Округляем до целого числа
        self.price_input.text = str(item['price'])

    def save_item(self, instance):
        """Сохраняет изменения в базе данных."""
        new_name = self.name_input.text.strip()
        new_quantity = self.quantity_input.text.strip()
        new_price = self.price_input.text.strip()

        # Проверка на корректность ввода
        if not new_name or not new_quantity or not new_price:
            self.show_popup("Ошибка", "Все поля обязательны для заполнения.")
            return

        try:
            new_quantity = float(new_quantity)
            new_price = float(new_price)
        except ValueError:
            self.show_popup("Ошибка", "Количество и цена должны быть числами.")
            return

        # Обновляем позицию в базе данных
        success = App.get_running_app().db_manager.update_item(
            self.original_name, new_name, new_quantity, new_price
        )

        if success:
            self.show_popup("Успех", "Позиция успешно обновлена.")
            # Переход на главный экран
            self.go_back()
        else:
            self.show_popup("Ошибка", "Ошибка при обновлении позиции.")

    def go_back(self, instance=None):
        """Возвращается на главный экран."""
        self.manager.current = 'main'

    def show_popup(self, title, message):
        """Отображает всплывающее окно с сообщением."""
        popup_layout = BoxLayout(orientation='vertical', padding=10, spacing=10)
        popup_label = Label(text=message, halign='center', valign='middle')
        popup_label.bind(size=popup_label.setter('text_size'))
        ok_button = Button(text='OK', size_hint=(1, 0.3), font_size='16sp')
        popup_layout.add_widget(popup_label)
        popup_layout.add_widget(ok_button)

        popup = Popup(title=title, content=popup_layout, size_hint=(0.7, 0.4), auto_dismiss=False)
        ok_button.bind(on_release=popup.dismiss)
        popup.open()

# Менеджер экранов
class WindowManager(ScreenManager):
    pass

# Основной класс приложения
class MainApp(App):
    def build(self):
        # Установка минимального размера окна (опционально)
        Window.minimum_width = 360
        Window.minimum_height = 640

        # Инициализируем менеджеры баз данных и продаж **до** создания экранов
        self.db_manager = DatabaseManager()
        self.sales_manager = SalesManager()

        # Инициализируем менеджер экранов с плавным переходом
        wm = WindowManager(transition=FadeTransition())

        # Создаем экземпляры экранов и добавляем их в менеджер
        wm.add_widget(MainScreen(name='main'))
        wm.add_widget(AddItemScreen(name='add_item'))
        wm.add_widget(ItemDetailScreen(name='item_detail'))
        wm.add_widget(EditItemScreen(name='edit_item'))  # Добавляем экран редактирования

        return wm  # Возвращаем менеджер экранов как корневой виджет приложения

    def on_start(self):
        """Обработчик события завершения загрузки приложения."""
        # Здесь можно добавить дополнительные действия при старте приложения
        pass

# Запускаем приложение
if __name__ == '__main__':
    MainApp().run()