я хочу чтобы ты мне помог доработать приложение для андроида на python kivy. приложение для учета парфюмерного магазина. раньше ты сгенерировал код который я тебе дам. мне надо его доработать а именно надо переписать на kivymd еще надо сделать все кнопки и надписи адаптивными, тоесть в зависимости от ширины и высоты экрана чтобы они подстраивались а то сейчас очень плохо потому что расчитано только на широкий экран. еще недостаток данного кода в том что кнопка шторки и окошко поиска скрыты за кнопкой "добавить позицию", а должны быть сверху. кнопка шторки слева сверху, а поиск сверху на ширину экрана. но поиск не должен мешать кнопке шторки и наоборот. когда боковая шторка выдвигается она должна быть поверх или смещать список позиций а сейчас список позиций вообще не реагирует на выдвижение шторки. если не знаешь какой либо участок кода то не выдумывай и отвечай только то что точно знаешь. не надо писать про тесты, что надо установить из зависимостей и все что не относится конкретно к коду приложения. ниже идет код приложения:  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  # Модуль для работы с датой и временем

# Класс для управления базой данных (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)
        # Используем FloatLayout для размещения элементов произвольно
        self.layout = FloatLayout()
        self.add_widget(self.layout)

        # Шапка приложения с кнопкой гамбургера и поиском
        header = BoxLayout(orientation='horizontal', size_hint=(1, 0.1), padding=5, spacing=10)
        self.hamburger_button = Button(text='☰', size_hint=(0.1, 1), font_size=24)  # Кнопка с тремя полосками
        self.hamburger_button.bind(on_release=self.toggle_sidebar)
        header.add_widget(self.hamburger_button)

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

        # Поле поиска
        self.search_input = TextInput(
            hint_text='Поиск...',
            size_hint=(0.4, 1),
            multiline=False,
            padding_x=10,
            font_size=16
        )
        self.search_input.bind(text=self.update_search)
        header.add_widget(self.search_input)

        self.layout.add_widget(header)

        # Основной контент (инвентарь и результаты поиска)
        self.main_content = BoxLayout(orientation='vertical', padding=10, spacing=10, size_hint=(1, 0.85), pos_hint={'top': 0.85})

        # ScrollView для прокрутки списка позиций
        self.scroll_view = ScrollView(size_hint=(1, 0.9))
        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, None), height=40, font_size=18)
        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.layout.add_widget(self.main_content)

        # Боковая шторка (sidebar)
        self.sidebar_width = 300  # Ширина шторки в пикселях
        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=18)
        sidebar_title.bind(size=sidebar_title.setter('text_size'))  # Для переноса текста
        close_button = Button(text='✕', size_hint=(0.2, 1), font_size=18)
        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.layout.add_widget(self.sidebar)

        # Список всех позиций для поиска
        self.all_items = []  # Список всех позиций

    def toggle_sidebar(self, instance):
        """Переключает видимость боковой шторки с анимацией."""
        if self.sidebar.pos[0] < 0:
            # Шторка скрыта, нужно выдвинуть
            anim = Animation(x=0, duration=0.3)
            anim.start(self.sidebar)
        else:
            # Шторка видна, нужно скрыть
            anim = Animation(x=-self.sidebar_width, duration=0.3)
            anim.start(self.sidebar)

    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()  # Загружаем все позиции
        for item in self.all_items:
            # Создаем кнопку для каждой позиции
            btn = Button(
                text=f"{item['name']} - Остаток: {item['quantity']} мл - Цена: {item['price']} руб/мл",
                size_hint_y=None,
                height=40,
                font_size=16,
                halign='left',  # Горизонтальное выравнивание текста
                valign='middle'  # Вертикальное выравнивание текста
            )
            btn.bind(on_release=lambda btn, name=item['name']: self.open_item_detail(name))
            # Обновляем текст_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=16)
            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=16,
                    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=18)
        back_button.bind(on_release=self.load_items)
        main_header.add_widget(back_button)

        monthly_label = Label(text=f'Дневные продажи за {filename[6:12]}', font_size=18, 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.9))
        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=16,
                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=18)
        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=18)
        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=18, 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.9))
        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_y=None, height=40, font_size=16, 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=18, 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=18)
        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=16)
            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=16,
                    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):
        """Отображает всплывающее окно с сообщением."""
        from kivy.uix.popup import Popup  # Импорт внутри метода, чтобы избежать циклических импортов
        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=16)
        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)
        # Используем FloatLayout для свободного размещения элементов
        self.layout = FloatLayout()
        self.add_widget(self.layout)

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

        header_label = Label(text='Добавить позицию', font_size=20, halign='center', valign='middle')
        header_label.bind(size=header_label.setter('text_size'))
        header.add_widget(header_label)
        header.add_widget(Label())  # Пустой виджет для выравнивания
        self.layout.add_widget(header)

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

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

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

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

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

        # Кнопка "Назад"
        back_button = Button(
            text='Отмена',
            size_hint=(1, None),
            height=40,
            font_size=18
        )
        back_button.bind(on_release=self.go_back)

        # Добавляем виджеты в форму
        form_layout.add_widget(self.name_input)
        form_layout.add_widget(self.quantity_input)
        form_layout.add_widget(self.price_input)
        form_layout.add_widget(save_button)
        form_layout.add_widget(back_button)

        self.layout.add_widget(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):
        """Отображает всплывающее окно с сообщением."""
        from kivy.uix.popup import Popup  # Импорт внутри метода, чтобы избежать циклических импортов
        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=16)
        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  # Текущая выбранная позиция

        # Используем FloatLayout для свободного размещения элементов
        self.layout = FloatLayout()
        self.add_widget(self.layout)

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

        header_label = Label(text='Детали позиции', font_size=20, halign='center', valign='middle')
        header_label.bind(size=header_label.setter('text_size'))
        header.add_widget(header_label)
        header.add_widget(Label())  # Пустой виджет для выравнивания
        self.layout.add_widget(header)

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

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

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

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

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

        # Добавляем виджеты в основной контент
        content_layout.add_widget(self.name_label)
        content_layout.add_widget(self.quantity_label)
        content_layout.add_widget(self.price_label)
        content_layout.add_widget(self.sold_input)
        content_layout.add_widget(sold_button)
        content_layout.add_widget(edit_button)

        self.layout.add_widget(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):
        """Отображает всплывающее окно с сообщением."""
        from kivy.uix.popup import Popup  # Импорт внутри метода, чтобы избежать циклических импортов
        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=16)
        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  # Хранит исходное имя позиции для идентификации

        # Используем FloatLayout для свободного размещения элементов
        self.layout = FloatLayout()
        self.add_widget(self.layout)

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

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

        # Основной контент формы
        form_layout = BoxLayout(orientation='vertical', padding=10, spacing=10, size_hint=(1, 0.85), pos_hint={'top': 0.85})

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

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

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

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

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

        # Добавляем виджеты в форму
        form_layout.add_widget(self.name_input)
        form_layout.add_widget(self.quantity_input)
        form_layout.add_widget(self.price_input)
        form_layout.add_widget(save_button)
        form_layout.add_widget(cancel_button)

        self.layout.add_widget(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):
        """Отображает всплывающее окно с сообщением."""
        from kivy.uix.popup import Popup  # Импорт внутри метода, чтобы избежать циклических импортов
        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=16)
        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):
        # Инициализируем менеджеры баз данных и продаж **до** создания экранов
        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  # Возвращаем менеджер экранов как корневой виджет приложения

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