Example #1
0
    def mainButtons(self):
        row = 0
        col = 0
        self.buttons = []

        mb = Menubutton(self.root, text="Select Application")
        mb.menu = Menu(mb, tearoff=0)
        mb["menu"] = mb.menu
        for app in APPLICATIONS:
            mb.menu.add_radiobutton(label=app, variable=self.appVar,
                                    command=self.onSelectApp)
        mb.grid(row=row, column=col, sticky="NEW")
        col += 1

        self.buttons.append(mb)
        otherButtons = (
            ("Run %12s" % self.appVar.get(), self.runApp),
            ("load Config", self.loadCfg),
            ("Save Config", self.saveCfg),
            ("Save Config as", self.saveCfgAs),
            ("Quit", self.root.quit),
        )

        for text, command in otherButtons:
            self.buttons.append(Button(self.root, text=text, command=command))
            self.buttons[-1].grid(row=row, column=col, sticky="NEW")
            col += 1
        return len(self.buttons)
Example #2
0
    def mainButtons(self):
        row = 0
        col = 0
        self.buttons = []

        mb = Menubutton(self.root, text="Select Application")
        mb.menu = Menu(mb, tearoff=0)
        mb["menu"] = mb.menu
        for app in APPLICATIONS:
            mb.menu.add_radiobutton(label=app, variable=self.appVar,
                                    command=self.onSelectApp)
        mb.grid(row=row, column=col, sticky="NEW")
        col += 1

        self.buttons.append(mb)
        otherButtons = (
            ("Run %12s" % self.appVar.get(), self.runApp),
            ("load Config", self.loadCfg),
            ("Save Config", self.saveCfg),
            ("Save Config as", self.saveCfgAs),
            ("Quit", self.root.quit),
        )

        for text, command in otherButtons:
            self.buttons.append(Button(self.root, text=text, command=command))
            self.buttons[-1].grid(row=row, column=col, sticky="NEW")
            col += 1
        return len(self.buttons)
Example #3
0
        def __init__(self, master):

            self.frame = Frame(master)
            self.frame.pack(side = LEFT)
            self.frame_lower_button = Frame(self.frame)
            self.frame_lower_button.pack(side=BOTTOM, fill=Y)
            #------------------------ Поле под списком --------#7
            self.memo = Text(self.frame, height=LOST_COMMENT_HEIGHT,
                  width = LOST_WIDTH+1, font=('Lucida Console', BILL_FONT_SIZE))
            self.memo.pack(side=BOTTOM)
            Label(self.frame, text=u'Дополнительный комментарий:',
                font=('Lucida Console', FONT_SIZE)).pack(side=BOTTOM, pady=5)
            #------------------------ Кнопки слева от списка ---------#
            self.frame_left_button = Frame(self.frame)
            self.frame_left_button.pack(side=LEFT, fill=Y)
            self.button_up = Button(self.frame_left_button,
                               image=data.IMG_INTERFACE[2], command=self.b_up)
            self.button_up.pack(side=TOP, padx=5, pady=10)
            self.button_down = Button(self.frame_left_button,
                               image=data.IMG_INTERFACE[1], command=self.b_down)
            self.button_down.pack(side=TOP, padx=5, pady=0)
            #------------------------ Собственно список ---------------#
            self.scrollbar = Scrollbar(self.frame)
            self.listbox = Listbox(self.frame,
                                   yscrollcommand=self.scrollbar.set,
                                   width = LOST_WIDTH, height=LOST_HEIGHT,
                                   activestyle='dotbox',
                                   font=('Lucida Console', BILL_FONT_SIZE))
            self.listbox.pack(side=LEFT, fill=BOTH)
            self.scrollbar.config(command=self.listbox.yview)
            self.scrollbar.pack(side=LEFT, fill=Y)
            #------------------------ Кнопки справа от списка --------#
            self.frame_right_button = Frame(self.frame)
            self.frame_right_button.pack(side=LEFT, fill=Y)
            self.button_plus = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[6],command=self.b_plus)
            self.button_plus.pack(side=TOP, padx=5, pady=2)
            self.button_minus = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[7],command=self.b_minus)
            self.button_minus.pack(side=TOP, padx=5, pady=2)
            self.button_info = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[9],command=self.b_info)
            self.button_info.pack(side=TOP, padx=5, pady=2)
            self.button_del = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[5],command=self.b_del,
                              state=DISABLED)
            self.button_del.pack(side=TOP, padx=5, pady=25)
            #-------------------------- Кнопки снизу от списка ------------№
            self.button_clear = Button(self.frame_lower_button,
                                text=u'Очистить\nсписок',
                                style='Little.TButton',command=self.b_clear)
            self.button_clear.pack(side=LEFT, padx=10, pady=10, fill=X)
            self.button_save = Button(self.frame_lower_button,
                                text=u'Сохранить\nсписок', style='Little.TButton',
                                command=self.b_save, state=DISABLED)
            self.button_save.pack(side=LEFT, padx=10, pady=10, fill=X)
            self.button_accept = Button(self.frame_lower_button,
                                text=u'Провести\nсписание',
                                style='Little.TButton', command=self.b_accept)
            self.button_accept.pack(side=LEFT, padx=10, pady=10, fill=X)
            #------------------- Причина списания под списком -----------------#
            self.lost_reason_frame = Frame(self.frame_lower_button,
                            relief=GROOVE, width=LOST_REASON_WIDTH, height=50)
            self.lost_reason_frame.pack_propagate(False)
            self.lost_reason_frame.pack(side=LEFT, fill=X)
            self.lostReasonsMenu = Menubutton(self.lost_reason_frame,
                                          text=u'Причина: ----',
                                          direction='below',style='TMenubutton')
            self.lostReasonsMenu.pack(fill=X, pady=5, padx=5)
            self.lostReasonsMenu.update()   #Подгонка по высоте
            self.lost_reason_frame.configure(
                                height=self.lostReasonsMenu.winfo_height() + 10)
            self.lostReasonsMenu.menu  =  Menu(self.lostReasonsMenu, tearoff=0)
            self.lostReasonsMenu['menu'] = self.lostReasonsMenu.menu

            for item in queries.lost_reasons_list():
                self.lostReasonsMenu.menu.add_command(label=item.reason,
                    font=('Verdana', FONT_SIZE_MENU),
                    command=lambda key=item.id: self.reason_change(key))
                                                               # Текущая скидка.
            if queries.lost_reasons_list():
                self.reason = queries.lost_reasons_list()[0]
                self.lostReasonsMenu.configure(text=u'Причина: %s' %
                                                             self.reason.reason)
            else:
                self.reason = None

            self.bill = []        # Содержание текущего списка (Wasted)
Example #4
0
    class Bill():
        """LOST: Класс, содержащий в себе виджеты списока блюд и ингредиентов,
        подлежащих списанию, набора кнопок управления, односящихся к этому
        списку."""

        def __init__(self, master):

            self.frame = Frame(master)
            self.frame.pack(side = LEFT)
            self.frame_lower_button = Frame(self.frame)
            self.frame_lower_button.pack(side=BOTTOM, fill=Y)
            #------------------------ Поле под списком --------#7
            self.memo = Text(self.frame, height=LOST_COMMENT_HEIGHT,
                  width = LOST_WIDTH+1, font=('Lucida Console', BILL_FONT_SIZE))
            self.memo.pack(side=BOTTOM)
            Label(self.frame, text=u'Дополнительный комментарий:',
                font=('Lucida Console', FONT_SIZE)).pack(side=BOTTOM, pady=5)
            #------------------------ Кнопки слева от списка ---------#
            self.frame_left_button = Frame(self.frame)
            self.frame_left_button.pack(side=LEFT, fill=Y)
            self.button_up = Button(self.frame_left_button,
                               image=data.IMG_INTERFACE[2], command=self.b_up)
            self.button_up.pack(side=TOP, padx=5, pady=10)
            self.button_down = Button(self.frame_left_button,
                               image=data.IMG_INTERFACE[1], command=self.b_down)
            self.button_down.pack(side=TOP, padx=5, pady=0)
            #------------------------ Собственно список ---------------#
            self.scrollbar = Scrollbar(self.frame)
            self.listbox = Listbox(self.frame,
                                   yscrollcommand=self.scrollbar.set,
                                   width = LOST_WIDTH, height=LOST_HEIGHT,
                                   activestyle='dotbox',
                                   font=('Lucida Console', BILL_FONT_SIZE))
            self.listbox.pack(side=LEFT, fill=BOTH)
            self.scrollbar.config(command=self.listbox.yview)
            self.scrollbar.pack(side=LEFT, fill=Y)
            #------------------------ Кнопки справа от списка --------#
            self.frame_right_button = Frame(self.frame)
            self.frame_right_button.pack(side=LEFT, fill=Y)
            self.button_plus = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[6],command=self.b_plus)
            self.button_plus.pack(side=TOP, padx=5, pady=2)
            self.button_minus = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[7],command=self.b_minus)
            self.button_minus.pack(side=TOP, padx=5, pady=2)
            self.button_info = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[9],command=self.b_info)
            self.button_info.pack(side=TOP, padx=5, pady=2)
            self.button_del = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[5],command=self.b_del,
                              state=DISABLED)
            self.button_del.pack(side=TOP, padx=5, pady=25)
            #-------------------------- Кнопки снизу от списка ------------№
            self.button_clear = Button(self.frame_lower_button,
                                text=u'Очистить\nсписок',
                                style='Little.TButton',command=self.b_clear)
            self.button_clear.pack(side=LEFT, padx=10, pady=10, fill=X)
            self.button_save = Button(self.frame_lower_button,
                                text=u'Сохранить\nсписок', style='Little.TButton',
                                command=self.b_save, state=DISABLED)
            self.button_save.pack(side=LEFT, padx=10, pady=10, fill=X)
            self.button_accept = Button(self.frame_lower_button,
                                text=u'Провести\nсписание',
                                style='Little.TButton', command=self.b_accept)
            self.button_accept.pack(side=LEFT, padx=10, pady=10, fill=X)
            #------------------- Причина списания под списком -----------------#
            self.lost_reason_frame = Frame(self.frame_lower_button,
                            relief=GROOVE, width=LOST_REASON_WIDTH, height=50)
            self.lost_reason_frame.pack_propagate(False)
            self.lost_reason_frame.pack(side=LEFT, fill=X)
            self.lostReasonsMenu = Menubutton(self.lost_reason_frame,
                                          text=u'Причина: ----',
                                          direction='below',style='TMenubutton')
            self.lostReasonsMenu.pack(fill=X, pady=5, padx=5)
            self.lostReasonsMenu.update()   #Подгонка по высоте
            self.lost_reason_frame.configure(
                                height=self.lostReasonsMenu.winfo_height() + 10)
            self.lostReasonsMenu.menu  =  Menu(self.lostReasonsMenu, tearoff=0)
            self.lostReasonsMenu['menu'] = self.lostReasonsMenu.menu

            for item in queries.lost_reasons_list():
                self.lostReasonsMenu.menu.add_command(label=item.reason,
                    font=('Verdana', FONT_SIZE_MENU),
                    command=lambda key=item.id: self.reason_change(key))
                                                               # Текущая скидка.
            if queries.lost_reasons_list():
                self.reason = queries.lost_reasons_list()[0]
                self.lostReasonsMenu.configure(text=u'Причина: %s' %
                                                             self.reason.reason)
            else:
                self.reason = None

            self.bill = []        # Содержание текущего списка (Wasted)

    #-----------------------------------------------------------

        def verify_calc(self, item, item_quantity):
            """Подсобная функция для работы функции verify(). Проверяет наличие
            на складе ингредиентов, входящих в сложный товар на момент списания.
            Возвращает True или False в зависимости от  наличия необходиомого
            количества товара на складе для списания."""

            result = True
            for calc in queries.item_calculation(item):

                if calc.ingredient.calculation:

                    for calc2 in queries.item_calculation(calc.ingredient):

                        quantity = int(queries.items_in_storage(
                                                              calc2.ingredient))
                        need_quantity = (item_quantity * calc2.quantity *
                                                                  calc.quantity)
                        if quantity < need_quantity:
                            tkMessageBox.showwarning(u'Внимание!',
                            u'Вы пытаетесь списать %d единицы товара "%s".' %
                            (need_quantity, calc2.ingredient.name) +
                            u'\nНа складе имеется всего %d единицы!'% quantity)
                            result = False

                else:
                    quantity = int(queries.items_in_storage(calc.ingredient))
                    need_quantity = item_quantity * calc.quantity

                    if quantity < need_quantity:
                        tkMessageBox.showwarning(u'Внимание!',
                        u'Вы пытаетесь списать %d единицы товара "%s".' %
                        (need_quantity, calc.ingredient.name) +
                        u'\nНа складе имеется всего %d единицы!'% quantity)
                        result = False

            return result


        def verify(self):
            """Проверяет наличие на складе товаров, входящих в счет, на момент
            списания. Возвращает True или False в зависимости от наличия
            необходиомого количества товара на складе для продажи."""

            all_present = True

            for element in self.bill:
                if element.item.calculation:
                    if not self.verify_calc(element.item, element.quantity):
                        all_present = False

                else:
                    quantity = int(queries.items_in_storage(element.item))

                    if quantity < element.quantity:
                        tkMessageBox.showwarning(u'Внимание!',
                    u'Вы пытаетесь списать %d единицы товара "%s".' %
                        (element.quantity, element.item.name) +
                    u'\nНа складе имеется всего %d единицы!' % quantity)
                        all_present = False

            return all_present


        def reason_change(self, key):
            """Меняет текущую причину для списания."""

            self.lostReasonsMenu.configure(text=u'Причина: %s' %
                               queries.get_lost_reason_by_id(key).reason)
            self.reason = queries.get_lost_reason_by_id(key)


        def make_list_string(self, lost):
            """Вспомогательная функция создания строки для списка списания"""

            string = u' %-' + unicode(27 +
                        (LOST_WIDTH - 63) /2) + u's %6d %3s  -  %s'
            string = string % (lost.item.name, lost.quantity,
                            lost.item.measure, lost.reason.reason)
            return string


        def add_eat(self, eat, number):
            """Добавляет товар в текущий список. Изменяет как отображение в
            списке виджета, так и данные в self.bill"""

            if self.reason:
                self.button_del.configure(state=NORMAL)
                lost = Wasted(eat, number, self.reason)
                self.bill.append(lost)
                string = self.make_list_string(lost)
                self.listbox.insert(END, string)
            else:
                tkMessageBox.showwarning('Однако!',
                'Списание невозможно, так как в настоящий момент\n' +
                'не предусмотрено ни одной причины для списания!')


        def b_up(self):
            """Срабатывает при нажатии кнопки "вверх" на панели списка.
            Поднимаем выделение в списке на предыдущую позицию (вверх)"""

            selected = self.listbox.curselection()
            if selected:
                index = int(selected[0])
                if index > 0:
                    self.listbox.selection_clear(index)
                    self.listbox.selection_set(index-1)
                    self.listbox.see(index-2)
            else:
                count = self.listbox.size()
                if count:
                    self.listbox.selection_set(count - 1)
                    self.listbox.see(count - 1)


        def b_down(self):
            """Срабатывает при нажатии кнопки "вниз" на панели списка.
            Опускаем выделение в списке на следующую позицию (вниз)"""

            selected = self.listbox.curselection()
            if selected:
                index = int(selected[0])
                if index < self.listbox.size() - 1:
                    self.listbox.selection_clear(index)
                    self.listbox.selection_set(index + 1)
                    self.listbox.see(index + 1)
            else:
                if self.listbox.size():
                    self.listbox.selection_set(0)
                    self.listbox.see(0)


        def b_plus(self):
            """Срабатывает при нажатии кнопки "+" на панели списка.
            Добавляет +1 к позиции в списке"""

            selected = self.listbox.curselection()
            if selected:
                index = int(selected[0])
                lost = self.bill[index]
                lost.quantity += 1
                self.listbox.delete(index)
                string = self.make_list_string(lost)
                self.listbox.insert(index, string)
                self.listbox.selection_set(index)
                self.listbox.see(index)


        def b_minus(self):
            """Срабатывает при нажатии кнопки "-" на панели списка.
            Убирает 1 к позиции в списке или удаляет, если и так была 1"""

            selected = self.listbox.curselection()
            if selected:
                index = int(selected[0])
                lost = self.bill[index]
                if lost.quantity == 1:
                    self.b_del()
                else:
                    lost.quantity -= 1
                    self.listbox.delete(index)
                    string = self.make_list_string(lost)
                    self.listbox.insert(index, string)
                    self.listbox.selection_set(index)
                    self.listbox.see(index)


        def b_del(self):
            """Срабатывает при нажатии кнопки "удалить" на панели списка.
            Полностью удаляем позицию в списка"""

            selected = self.listbox.curselection()
            if selected:
                index = int(selected[0])
                del self.bill[index]
                self.listbox.delete(index)
                if self.listbox.size() == 0:
                    self.button_del.configure(state=DISABLED)
                self.listbox.see(index)


        def b_info(self):
            """Срабатывает при нажатии кнопки "инфо" на панели списка.
            Меняет причину списания выделенного элемента списка на текущую"""

            selected = self.listbox.curselection()
            if selected:
                index = int(selected[0])
                lost = self.bill[index]
                lost.reason = self.reason
                self.listbox.delete(index)
                string = self.make_list_string(lost)
                self.listbox.insert(index, string)
                self.listbox.selection_set(index)
                self.listbox.see(index)


        def b_clear(self):
            """Срабатывает при нажатии кнопки "Очистить список".
            Соответственно, очищает список."""

            self.bill = []
            self.listbox.delete(0, END)
            self.button_del.configure(state=DISABLED)


        def b_save(self):
            """Срабатывает при нажатии кнопки "Сохранить список".
            Сохраняет чек в файл на диске"""

            pass                                                            #Не дописано.


        def b_accept(self):
            """Срабатывает при нажатии "Провести операцию" на панели списка.
            Полностью проводит списание по бухгалтерии, и убирая соответствющий
            товар. Изменяет базу данных"""

            if not self.bill:
                tkMessageBox.showwarning('Однако!',
                                        'Список пуст, списывать нечего.')

            elif not self.reason:
                tkMessageBox.showwarning('Однако!',
                                'Повторно напоминаю, что у вас не\n', +
                                'предусмотрено ни одной причины для списания!')

            elif self.verify() and tkMessageBox.askokcancel('Внимание!',
                              'Вы подтверждаете операцию проведения списания?'):

                list_item, list_quantity, list_reason = [], [], []
                for lost in self.bill:
                    list_item.append(lost.item)
                    list_quantity.append(lost.quantity)
                    list_reason.append(lost.reason)
                queries.execute_lost(list_item, list_quantity, list_reason,
                                                         self.memo.get(1.0,END))
                self.b_clear()

                #Возвращаем панель категорий на место

                show_lost.master.destroy()
                lostBottomFrame = Canvas(MasterFrame, highlightthickness=0)
                show_lost.master = lostBottomFrame

                if USE_BACKGROUND:
                    lostBottomFrame.create_image(0,0, anchor='nw',
                                                               image=data.photo)
                lostBottomFrame.pack(side=LEFT, fill=BOTH, expand=YES)
                show_lost_cathegory(lostBottomFrame)
Example #5
0
        def __init__(self, master):

            self.frame = Frame(master)
            self.frame.pack(side = LEFT)
            self.frame_lower_button = Frame(self.frame)
            self.frame_lower_button.pack(side=BOTTOM, fill=Y)
            #------------------------ Кнопки слева от счета ---------#
            self.frame_left_button = Frame(self.frame)
            self.frame_left_button.pack(side=LEFT, fill=Y)
            self.button_up = Button(self.frame_left_button,
                               image=data.IMG_INTERFACE[2], command=self.b_up)
            self.button_up.pack(side=TOP, padx=5, pady=10)
            self.button_down = Button(self.frame_left_button,
                               image=data.IMG_INTERFACE[1], command=self.b_down)
            self.button_down.pack(side=TOP, padx=5, pady=0)
            #------------------------ Собственно счет ---------------#
            self.scrollbar = Scrollbar(self.frame)
            self.listbox = Listbox(self.frame,
                                   yscrollcommand=self.scrollbar.set,
                                   width = BILL_WIDTH, height=BILL_HEIGHT,
                                   activestyle='dotbox',
                                   font=('Lucida Console', BILL_FONT_SIZE))
            self.listbox.pack(side=LEFT, fill=BOTH)
            self.scrollbar.config(command=self.listbox.yview)
            self.scrollbar.pack(side=LEFT, fill=Y)
            #------------------------ Кнопки справа от счета --------#
            self.frame_right_button = Frame(self.frame)
            self.frame_right_button.pack(side=LEFT, fill=Y)
            self.button_plus = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[6],command=self.b_plus)
            self.button_plus.pack(side=TOP, padx=5, pady=2)
            self.button_minus = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[7],command=self.b_minus)
            self.button_minus.pack(side=TOP, padx=5, pady=2)
            self.button_del = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[5],command=self.b_del,
                              state=DISABLED)
            self.button_del.pack(side=TOP, padx=5, pady=25)
            #-------------------------- Кнопки снизу от счета ------------№
            self.button_print = Button(self.frame_lower_button,
                                text=u'Распечатать\nчек',
                                style='Little.TButton',command=self.b_print)
            self.button_print.pack(side=LEFT, padx=10, pady=10, fill=X)
            self.button_save = Button(self.frame_lower_button,
                                text=u'Сохранить\nчек', style='Little.TButton',
                                command=self.b_save, state=DISABLED)
            self.button_save.pack(side=LEFT, padx=10, pady=10, fill=X)
            self.button_accept = Button(self.frame_lower_button,
                                text=u'Провести\nоперацию',
                                style='Little.TButton', command=self.b_accept)
            self.button_accept.pack(side=LEFT, padx=10, pady=10, fill=X)
            #------------------------- Метка с "итого" под счетом --------#
            self.label1 = Label(self.frame_lower_button,
                                       text=u'Итого:    0.00 грн.',
                                       font=('Lucida Console', FONT_SIZE_BIG),
                                       bg='white')
            self.label1.pack(side=LEFT, padx=10, pady=10, fill=X)
            #------------------------- скидка под счетом -----------------#
            self.discountMenu = Menubutton(self.frame_lower_button,
                      text=u'Скидка  0%', direction='below',style='TMenubutton')
            self.discountMenu.pack(side=LEFT, fill=X)
            self.discountMenu.menu  =  Menu(self.discountMenu, tearoff=0)
            self.discountMenu['menu'] = self.discountMenu.menu

            for item in queries.discount_list():
                self.discountMenu.menu.add_command(label=item.sinopsys,
                    font=('Verdana', FONT_SIZE_MENU),
                    command=lambda key=item.id: self.discount_change(key))

            self.discount = 0     # Текущая скидка.
            self.bill = []        # Содержание текущего счета (товар)
            self.quantity = []    # Содержание  счета (количество товара)
Example #6
0
    class Bill():
        """SELL: Класс, содержащий в себе виджеты списка заказанных блюд (счет),
        набора кнопок управления, односящихся к этому счету, включая
        отображение итоговой суммы по счету и кнопку скидки."""

        def __init__(self, master):

            self.frame = Frame(master)
            self.frame.pack(side = LEFT)
            self.frame_lower_button = Frame(self.frame)
            self.frame_lower_button.pack(side=BOTTOM, fill=Y)
            #------------------------ Кнопки слева от счета ---------#
            self.frame_left_button = Frame(self.frame)
            self.frame_left_button.pack(side=LEFT, fill=Y)
            self.button_up = Button(self.frame_left_button,
                               image=data.IMG_INTERFACE[2], command=self.b_up)
            self.button_up.pack(side=TOP, padx=5, pady=10)
            self.button_down = Button(self.frame_left_button,
                               image=data.IMG_INTERFACE[1], command=self.b_down)
            self.button_down.pack(side=TOP, padx=5, pady=0)
            #------------------------ Собственно счет ---------------#
            self.scrollbar = Scrollbar(self.frame)
            self.listbox = Listbox(self.frame,
                                   yscrollcommand=self.scrollbar.set,
                                   width = BILL_WIDTH, height=BILL_HEIGHT,
                                   activestyle='dotbox',
                                   font=('Lucida Console', BILL_FONT_SIZE))
            self.listbox.pack(side=LEFT, fill=BOTH)
            self.scrollbar.config(command=self.listbox.yview)
            self.scrollbar.pack(side=LEFT, fill=Y)
            #------------------------ Кнопки справа от счета --------#
            self.frame_right_button = Frame(self.frame)
            self.frame_right_button.pack(side=LEFT, fill=Y)
            self.button_plus = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[6],command=self.b_plus)
            self.button_plus.pack(side=TOP, padx=5, pady=2)
            self.button_minus = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[7],command=self.b_minus)
            self.button_minus.pack(side=TOP, padx=5, pady=2)
            self.button_del = Button(self.frame_right_button,
                              image=data.IMG_INTERFACE[5],command=self.b_del,
                              state=DISABLED)
            self.button_del.pack(side=TOP, padx=5, pady=25)
            #-------------------------- Кнопки снизу от счета ------------№
            self.button_print = Button(self.frame_lower_button,
                                text=u'Распечатать\nчек',
                                style='Little.TButton',command=self.b_print)
            self.button_print.pack(side=LEFT, padx=10, pady=10, fill=X)
            self.button_save = Button(self.frame_lower_button,
                                text=u'Сохранить\nчек', style='Little.TButton',
                                command=self.b_save, state=DISABLED)
            self.button_save.pack(side=LEFT, padx=10, pady=10, fill=X)
            self.button_accept = Button(self.frame_lower_button,
                                text=u'Провести\nоперацию',
                                style='Little.TButton', command=self.b_accept)
            self.button_accept.pack(side=LEFT, padx=10, pady=10, fill=X)
            #------------------------- Метка с "итого" под счетом --------#
            self.label1 = Label(self.frame_lower_button,
                                       text=u'Итого:    0.00 грн.',
                                       font=('Lucida Console', FONT_SIZE_BIG),
                                       bg='white')
            self.label1.pack(side=LEFT, padx=10, pady=10, fill=X)
            #------------------------- скидка под счетом -----------------#
            self.discountMenu = Menubutton(self.frame_lower_button,
                      text=u'Скидка  0%', direction='below',style='TMenubutton')
            self.discountMenu.pack(side=LEFT, fill=X)
            self.discountMenu.menu  =  Menu(self.discountMenu, tearoff=0)
            self.discountMenu['menu'] = self.discountMenu.menu

            for item in queries.discount_list():
                self.discountMenu.menu.add_command(label=item.sinopsys,
                    font=('Verdana', FONT_SIZE_MENU),
                    command=lambda key=item.id: self.discount_change(key))

            self.discount = 0     # Текущая скидка.
            self.bill = []        # Содержание текущего счета (товар)
            self.quantity = []    # Содержание  счета (количество товара)


        def verify_calc(self, item, item_quantity):
            """Подсобная функция для работы функции verify(). Проверяет наличие
            на складе ингредиентов, входящих в сложный товар на момент продажи.
            В случае недостатка предлагает совершить мгновенный приход товара.
            Возвращает True или False в зависимости от итогового наличия
            необходиомого количества товара на складе для продажи."""

            result = True
            for calc in queries.item_calculation(item):

                if calc.ingredient.calculation:

                    for calc2 in queries.item_calculation(calc.ingredient):

                        quantity = int(queries.items_in_storage(
                                                              calc2.ingredient))
                        need_quantity = (item_quantity * calc2.quantity *
                                                                  calc.quantity)
                        if quantity < need_quantity:
                            if tkMessageBox.askyesno(u'Внимание!',
                            u'Вы пытаетесь продать %d единицы товара "%s".' %
                            (need_quantity, calc2.ingredient.name) +
                            u'\nНа складе имеется всего %d единицы!'% quantity +
                            u'\nВыполнить мгновенную поставку товара?'):
                                incoming = panel()

                                if not queries.execute_incoming_express(
                                calc2.ingredient, incoming) or (need_quantity >
                                                           incoming + quantity):

                                    result = False
                            else:
                                 result = False

                else:
                    quantity = int(queries.items_in_storage(calc.ingredient))
                    need_quantity = item_quantity * calc.quantity

                    if quantity < need_quantity:
                        if tkMessageBox.askyesno(u'Внимание!',
                        u'Вы пытаетесь продать %d единицы товара "%s".' %
                        (need_quantity, calc.ingredient.name) +
                        u'\nНа складе имеется всего %d единицы!'% quantity +
                        u'\nВыполнить мгновенную поставку товара?'):
                            incoming = panel()

                            if not queries.execute_incoming_express(
                            calc.ingredient, incoming) or (need_quantity >
                                                           incoming + quantity):

                                result = False
                        else:
                             result = False
            return result


        def verify(self):
            """Проверяет наличие на складе товаров, входящих в счет, на момент
            продажи, в случае недостатка предлагает совершить мгновенный приход
            товара. Возвращает True или False в зависимости от итогового наличия
            необходиомого количества товара на складе для продажи."""

            all_present = True

            for item, item_quantity in zip(self.bill, self.quantity):
                if item.calculation:
                    if not self.verify_calc(item, item_quantity):
                        all_present = False

                else:
                    quantity = int(queries.items_in_storage(item))

                    if quantity < item_quantity:
                        if tkMessageBox.askyesno(u'Внимание!',
                    u'Вы пытаетесь продать %d единицы товара "%s".' %
                        (item_quantity, item.name) +
                    u'\nНа складе имеется всего %d единицы!' % quantity +
                    u'\nВыполнить мгновенную поставку товара?'):

                            incoming = panel()
                            if not queries.execute_incoming_express(item,
                            incoming) or (item_quantity > incoming + quantity):

                                all_present = False
                        else:
                            all_present = False

            return all_present


        def discount_change(self, key):
            """Меняет текущую скидку."""

            self.discountMenu.configure(text=u'Скидка %2s' %
                            str(queries.get_discount_by_id(key).discount) + '%')
            self.discount = queries.get_discount_by_id(key).discount
            self.itogo()


        def itogo(self):
            """Обсчитывает итоговую сумму счета, применяет скидку и выводит
            в соответствующую метку под счетом."""

            summ = 0
            for item, quantity in zip(self.bill, self.quantity):
                if queries.price_is_sales(item):
                    summ += quantity * queries.item_price(item)
                else:
                    summ += quantity * queries.item_price(item) * (100 -
                                                            self.discount) / 100

            summ = round(summ, 2)
            self.label1.configure(text='Итого:%8s грн.' % ('%5.2f' % summ))
            return summ


        def make_list_string (self, eat, quantity):
            """Вспомогательная функция создания строки для счета"""

            if queries.price_is_sales(eat):
                str_1 = u'*'
            else:
                str_1 = u' '
            string = str_1 + u'%-' + unicode(BILL_WIDTH - 36) + \
                                        u's %2d   %6.2f грн.   %6.2f грн.'
            string = string % (eat.name, quantity, queries.item_price(eat),
                               quantity * queries.item_price(eat))
            return string


        def add_eat(self, cath, eat):
            """Добавляет товар в текущий счет. Изменяет как отображение в списке
            виджета, так и данные в self.bill"""

            self.button_del.configure(state=NORMAL)

            if eat in self.bill:
                eat_index = self.bill.index(eat)
                self.quantity[eat_index] += 1
                self.listbox.delete(eat_index)
                string = self.make_list_string(eat, self.quantity[eat_index])
                self.listbox.insert(eat_index, string)

            else:
                self.bill.append(eat)
                self.quantity.append(1)
                string = self.make_list_string(eat, 1)
                self.listbox.insert(END, string)

            self.itogo()


        def b_up(self):
            """Срабатывает при нажатии кнопки "вверх" на панели счета.
            Поднимаем выделение в счете на предыдущую позицию (вверх)"""

            selected = self.listbox.curselection()
            if selected:
                index = int(selected[0])
                if index > 0:
                    self.listbox.selection_clear(index)
                    self.listbox.selection_set(index-1)
                    self.listbox.see(index-2)
            else:
                count = self.listbox.size()
                if count:
                    self.listbox.selection_set(count - 1)
                    self.listbox.see(count - 1)


        def b_down(self):
            """Срабатывает при нажатии кнопки "вниз" на панели счета.
            Опускаем выделение в счете на следующую позицию (вниз)"""

            selected = self.listbox.curselection()
            if selected:
                index = int(selected[0])
                if index < self.listbox.size() - 1:
                    self.listbox.selection_clear(index)
                    self.listbox.selection_set(index + 1)
                    self.listbox.see(index + 1)
            else:
                if self.listbox.size():
                    self.listbox.selection_set(0)
                    self.listbox.see(0)


        def b_plus(self):
            """Срабатывает при нажатии кнопки "+" на панели счета.
            Добавляет +1 к позиции в счете"""

            selected = self.listbox.curselection()
            if selected:
                index = int(selected[0])
                eat = self.bill[index]
                self.quantity[index] += 1
                self.listbox.delete(index)
                string = self.make_list_string(eat, self.quantity[index])
                self.listbox.insert(index, string)
                self.listbox.selection_set(index)
                self.listbox.see(index)
                self.itogo()


        def b_minus(self):
            """Срабатывает при нажатии кнопки "-" на панели счета.
            Убирает 1 к позиции в счете или удаляет, если и так была 1"""

            selected = self.listbox.curselection()
            if selected:
                index = int(selected[0])

                if self.quantity[index] == 1:
                    self.b_del()
                else:
                    eat = self.bill[index]
                    self.quantity[index] -= 1
                    self.listbox.delete(index)
                    string = self.make_list_string(eat, self.quantity[index])
                    self.listbox.insert(index, string)
                    self.listbox.selection_set(index)
                    self.listbox.see(index)
                    self.itogo()


        def b_del(self):
            """Срабатывает при нажатии кнопки "удалить" на панели счета.
            Полностью удаляем позицию в счете"""

            selected = self.listbox.curselection()
            if selected:
                index = int(selected[0])
                del(self.bill[index])
                del(self.quantity[index])
                self.listbox.delete(index)
                if self.listbox.size() == 0:
                    self.button_del.configure(state=DISABLED)
                self.listbox.see(index)
                self.itogo()


        def check_generate(self):
            """Cоздает текстовый вариант чека."""                           #Чисто времянка, переписать.

            check = []
            check.append(u'-'*60 + '\n')
            check.append(u'Это чек, распечатанный в Митяйском кафе.\n')
            check.append(u'Hиипу, какие там должны быть реквизиты,')
            check.append(u'потому пока набросаю, что есть, а потом перепишу')
            check.append(u'по уму, с использованием шаблона.')
            check.append(u'Пока жрите, что дают.\n')
            for index in range(self.listbox.size()):
                check.append(self.listbox.get(index))           #Здесь при выводе в консоль иногда падает из-за кривой кодировки
            check.append(u' ' * 45 + u'=' * 15)                 #при выводе на принтер не должно
            if self.discount:
                check.append(u' ' * 12 +
                            u'Итого (с учетом скидки в %2d%%): %11.2f грн.' %
                            (self.discount, self.itogo()))
            else:
                check.append(u' ' * 36 + u'Итого: %11.2f грн.' % self.itogo())
            check.append(u'-'*60 + '\n')

            return check


        def b_print(self):
            """Срабатывает при нажатии кнопки "Распечатать чек" на панели счета.
            Соответственно, печатает чек."""
            if not self.bill:
                tkMessageBox.showwarning('Однако!',
                                        'Счет пуст, печатать нечего.')
            else:
                for string in self.check_generate():
                    print string
                                                                            #Не дописано.

        def b_save(self):
            """Срабатывает при нажатии кнопки "Сохранить чек" на панели счета.
            Сохраняет чек в файл на диске"""

            pass                                                            #Не дописано.


        def b_accept(self):
            """Срабатывает при нажатии "Провести операцию" на панели счета.
            Полностью проводит счет по бухгалтерии, добавляя в приход деньги
            и убирая соответствющий товар. Изменяет базу данных"""

            if not self.bill:
                tkMessageBox.showwarning('Однако!',
                                        'Счет пуст, проводить нечего.')
            elif not self.verify():
                tkMessageBox.showwarning('Однако!',
                                'Товара для продажи недостаточно.')

            elif tkMessageBox.askokcancel('Внимание!',
                                'Вы подтверждаете операцию проведения счета?'):
                if queries.execute_sell(self.bill, self.quantity, self.discount):

                    show_sell_bills.label_renew()

                    w_name = note.select()
                    window_names = note.tabs()
                    index = window_names.index(w_name)
                    note.forget(note.select())
                    del(bills[index])

                    #Возвращаем категории на панель

                    show_sell.master.destroy()
                    sellBottomFrame = Canvas(MasterFrame, highlightthickness=0)
                    show_sell.master = sellBottomFrame

                    if USE_BACKGROUND:
                        sellBottomFrame.create_image(0,0, anchor='nw',
                                                               image=data.photo)
                    sellBottomFrame.pack(side=LEFT, fill=BOTH, expand=YES)
                    show_sell_cathegory()
Example #7
0
def show_report(master, data):
    """Выводит панель генерации отчетов."""


    def choose_assortiment(event):
        """Функция, срабатывающая при выборе товара из списка товаров."""

        select = listbox_goods.curselection()
        if select:
            index = int(select[0])
            if assortiment[index]:
                show_report.goods = assortiment[index]
                title.configure(text=assortiment[index].name)
            else:
                show_report.goods = None
                title.configure(text=u'Товары:')
        checks_fill()

    #---------------------------------------

    def assortiment_fill():
        """Функция заполнения списков товаров/ингредиентов"""

        for q in range(len(assortiment)):       # Очищаем список товаров
            del(assortiment[0])
        listbox_goods.delete(0, END)

        for cath in queries.cathegories():
            assortiment.append(None)
            listbox_goods.insert(END, '')
            assortiment.append(None)
            head = '-' * (REPORT_WIDTH - len(cath.name) -1) + cath.name + u'-'
            listbox_goods.insert(END, head)

            for item in queries.items_in_cathegory(cath):
                assortiment.append(item)
                listbox_goods.insert(END, ' ' + item.name)
                if not item.show:
                    listbox_goods.itemconfig(END, {'fg':'grey'})

        assortiment.append(None)
        listbox_goods.insert(END, '')
        assortiment.append(None)
        head = '-' * (REPORT_WIDTH - len(u'Ингредиенты') -1) + u'Ингредиенты-'
        listbox_goods.insert(END, head)

        for item in queries.items_in_cathegory(None):
            assortiment.append(item)
            listbox_goods.insert(END, ' ' + item.name)
            if not item.show:
                listbox_goods.itemconfig(END, {'fg':'grey'})

    #---------------------------------------

    def checks_fill(event=None):
        """Функция заполнения списка параметров для отчета"""

        listbox_checks.delete(0, END)
        reporing = radioVar.get()
        listbox_checks.insert(END, reporing + ':')

        if varGoods.get():
            listbox_checks.insert(END, u'- товар' )
            if reporing == u'Расходы':
                listbox_checks.itemconfig(END, {'fg':'grey'})
            elif not show_report.goods:
                listbox_checks.itemconfig(END, {'fg':'red'})

        if varDate.get():
            listbox_checks.insert(END, u'- дата' )
            if reporing == u'Остатки':
                listbox_checks.itemconfig(END, {'fg':'grey'})
            elif not (cal_from.selection or cal_to.selection):
                listbox_checks.itemconfig(END, {'fg':'red'})

            elif (cal_from.selection and cal_to.selection) and (
                  cal_from.selection > cal_to.selection):
                listbox_checks.itemconfig(END, {'fg':'red'})

        if varCath.get():
            listbox_checks.insert(END, u'- категория' )
            if reporing == u'Расходы':
                listbox_checks.itemconfig(END, {'fg':'grey'})

        if varCheck.get():
            listbox_checks.insert(END, u'- чек' )
            if reporing <> u'Продажи':
                listbox_checks.itemconfig(END, {'fg':'grey'})
            else:
                try:
                    check1 = int(chekVar1.get())
                    check2 = int(chekVar2.get())
                except:
                    listbox_checks.itemconfig(END, {'fg':'red'})
                else:
                    if check1 > check2:
                        listbox_checks.itemconfig(END, {'fg':'red'})

        if varLost.get():
            listbox_checks.insert(END, u'- причина' )
            if reporing <> u'Списания':
                listbox_checks.itemconfig(END, {'fg':'grey'})

        if radioVar2.get() <> u'Не учитывать':
            listbox_checks.insert(END, u'- скидка' )
            if reporing <> u'Продажи':
                listbox_checks.itemconfig(END, {'fg':'grey'})


    #---------------------------------------

    class Calendar2(Calendar):
        """Класс с переопределенным (дополненным) методом клика по календарю."""

        def _pressed(self, evt):
            """Clicked somewhere in the calendar."""

            Calendar._pressed(self, evt)
            checks_fill()

    #---------------------------------------

    def apply():
        """Открывает окно с выбранным отчетом на основании выбранных фильтров"""

        args = {}

        if varGoods.get() and radioVar.get() <> u'Расходы':
            if show_report.goods:
                args['item'] = show_report.goods
            else:
                tkMessageBox.showinfo(u'Внимание!',
                          u'Товар не был выбран, так что учитываться не будет!')

        if varDate.get() and radioVar.get() <> u'Остатки':
            if cal_from.selection or cal_to.selection:
                if (cal_from.selection > cal_to.selection):
                    tkMessageBox.showinfo(u'Ошибка!',
              u'Начальный день акции больше конечного!\nФильтр не учитывается.')
                else:
                    if cal_from.selection:
                        args['from_date'] = cal_from.selection
                    if cal_to.selection:
                        args['to_date'] = cal_to.selection
            else:
                tkMessageBox.showinfo(u'Внимание!',
                         u'Даты не были выбраны, так что учитываться не будут!')

        if varCath.get():
            if radioVar.get() <> u'Расходы':
                args['cathegory'] = show_report.cathegory

        if varCheck.get():
            if radioVar.get() == u'Продажи':
                try:
                    check1 = int(chekVar1.get())
                    check2 = int(chekVar2.get())
                except:
                    tkMessageBox.showinfo(u'Ошибка!',
            u'Проверьте содержимое числовых полей чека!\nФильтр не учитвается.')
                else:
                    if check1 > check2:
                        tkMessageBox.showinfo(u'Ошибка!',
              u'Начальный номер чека больше конечного!\nФильтр не учитывается.')
                    else:
                        args['from_check'] = check1
                        args['to_check'] = check2

        if varLost.get():
            if radioVar.get() == u'Списания':
                args['reason'] = show_report.lost


        if radioVar2.get() <> u'Не учитывать':
            if radioVar.get() == u'Продажи':
                if radioVar2.get() == u'Со скидкой':
                    args['discount'] = True
                else:
                    args['discount'] = False


        if radioVar.get() == u'Продажи':
            report_sell(master, **args)
        elif radioVar.get() == u'Списания':
            report_lost(master, **args)
        elif radioVar.get() == u'Остатки':
            report_storage(master, **args)
        elif radioVar.get() == u'Приход':
            report_incoming(master, **args)
        elif radioVar.get() == u'Расходы':
            report_cash(master, **args)

    #=========================== СОЗДАНИЕ ИНТЕРФЕЙСА ===========================

    frame = Canvas(master, relief=GROOVE, highlightthickness=0)
    frame.pack(side=TOP, fill=BOTH, expand=YES)
    if USE_BACKGROUND:
        frame.create_image(0,0, anchor='nw', image=data.photo)

    #------------------------------ ЛЕВЫЙ ФРЕЙМ --------------------------------

    leftFrame = Frame(frame, relief=GROOVE)
    leftFrame.pack(side=LEFT, fill=Y, pady=CONTROL_PAD, padx=CONTROL_PAD/2)

    title = Label(leftFrame, text=u'Товары:',
                                        font=('Lucida Console', FONT_SIZE_BIG))
    title.pack(pady=5)

    varGoods = IntVar(leftFrame)
    chb_goods = Checkbutton(leftFrame, text=u'Фильтр по товару',
                                         variable=varGoods, command=checks_fill)
    chb_goods.pack(side=BOTTOM)

    assortiment = []
    show_report.goods = None

    scrollbar_goods = Scrollbar(leftFrame)
    listbox_goods = Listbox(leftFrame,
                       yscrollcommand=scrollbar_goods.set,
                       width = REPORT_WIDTH,
                       activestyle='dotbox',
                       font=('Lucida Console', BILL_FONT_SIZE))
    listbox_goods.pack(side=LEFT, fill=BOTH)
    scrollbar_goods.config(command=listbox_goods.yview)
    scrollbar_goods.pack(side=LEFT, fill=Y)

    listbox_goods.bind('<<ListboxSelect>>', choose_assortiment)

    #------------------------------ СРЕДНИЙ ФРЕЙМ ------------------------------

    middleFrame = Frame(frame, relief=GROOVE)
    middleFrame.pack(side=TOP, pady=CONTROL_PAD, padx=CONTROL_PAD, anchor='w',
                                       ipadx=CONTROL_PAD/3, ipady=CONTROL_PAD/3)

    radioVar = StringVar(middleFrame)
    radioVar.set("Продажи")

    variants = ("Продажи", "Остатки", "Приход", "Списания", "Расходы")

    listbox_checks = Listbox(middleFrame, width = 12, height=6,
                  activestyle='dotbox', font=('Lucida Console', BILL_FONT_SIZE))
    listbox_checks.pack(side=RIGHT, fill=Y, padx=CONTROL_PAD/2,
                                                             pady=CONTROL_PAD/2)

    Button(middleFrame, text='СФОРМИРОВАТЬ\nОТЧЕТ', style='Chosen.TButton',
                             command=apply).pack(side=RIGHT, padx = CONTROL_PAD,
                                         pady = CONTROL_PAD, ipadx=10, ipady=10)

    for txt in variants:
        Radiobutton(middleFrame, text=txt,indicatoron = 0, width = 10,
                         variable=radioVar, command=checks_fill, value=txt,
                         font=('Verdana', FONT_SIZE)).pack(padx = CONTROL_PAD,
                                                   pady=CONTROL_PAD/3, anchor=W)

    #-----------------------------------------

    middleFrame2 = Frame(frame, relief=GROOVE)
    middleFrame2.pack(padx=CONTROL_PAD, pady=CONTROL_PAD, anchor='w')


    date_from = Label(middleFrame2, text=u'Начальная дата:',
                                                  font = ('Verdana', FONT_SIZE))
    date_from.grid(column=0, row=0)
    cal_from = Calendar2(middleFrame2, firstweekday=0)
    cal_from.grid(column=0, row=1, pady=CONTROL_PAD, padx=CONTROL_PAD)

    date_to = Label(middleFrame2, text=u'Конечная дата\n(включительно):',
                                                  font = ('Verdana', FONT_SIZE))
    date_to.grid(column=1, row=0)
    cal_to = Calendar2(middleFrame2, firstweekday=0)
    cal_to.grid(column=1, row=1, pady=CONTROL_PAD, padx=CONTROL_PAD)

    varDate = IntVar(leftFrame)
    chb_date = Checkbutton(middleFrame2, text=u'Фильтр по датам',
                                          variable=varDate, command=checks_fill)
    chb_date.grid(column=0, row=2, columnspan=2, pady=CONTROL_PAD/3)


    #---------------------- Меню выбора категории --------------

    middleFrame3 = Frame(frame, relief=GROOVE)
    middleFrame3.pack(padx=CONTROL_PAD, pady=CONTROL_PAD, anchor='w')


    def menu_change(key):
        """Меняет текущую категорию."""
        if key:
            cathMenu.configure(text=key.name)
        else:
            cathMenu.configure(text=u'-Отсутствует-')
        show_report.cathegory = key


    def menu_update():
        """Обновляет меню выбора категорий."""

        menu  =  Menu(cathMenu, tearoff=0)
        cathMenu['menu'] = menu

        for cath in queries.cathegories():
            menu.add_command(label=cath.name, font=('Verdana', FONT_SIZE_BIG),
                                      command=lambda key=cath: menu_change(key))
        menu.add_command(label=u'-Отсутствует-', font=('Verdana',FONT_SIZE_BIG),
                                    command=lambda: menu_change(None))


    Style().configure('TMenubutton', font=('lucida console', FONT_SIZE_BIG),
                                                                justify='left')
    show_report.cathegory = None

    varCath = IntVar(middleFrame3)
    chb_cath = Checkbutton(middleFrame3, text=u'Фильтр по категории',
                                          variable=varCath, command=checks_fill)
    chb_cath.grid(column=0, row=1, columnspan=2,
                                              pady=(0, CONTROL_PAD))

    Label(middleFrame3, text='Категория:', font=('Verdana', FONT_SIZE_BIG)
                       ).grid(column=0, row=0, pady=CONTROL_PAD/3)

    smallFrame = Frame(middleFrame3, relief=GROOVE)
    smallFrame.grid(column=1, row=0, pady=CONTROL_PAD/3)


    cathMenu = Menubutton(smallFrame, text=u'-Отсутствует-', width=15,
                                                            style='TMenubutton')
    cathMenu.pack(fill=BOTH, pady=5, padx=5)
    menu_update()

    #----------------------------- ЧЕКИ ----------------------------

    check_frame = TkFrame(middleFrame3, relief=GROOVE, bg='#' + REPORT_COLOR)
    check_frame.grid(column=0, row=2, columnspan=2, pady=(CONTROL_PAD/3, 0),
                                                                  sticky='nwes')
    varCheck = IntVar(middleFrame3)
    chb_check = Checkbutton(middleFrame3, text=u'Фильтр по номеру чека',
                variable=varCheck, command=checks_fill, activebackground='#' +
                                     REPORT_COLOR, bg='#' + REPORT_COLOR)
    chb_check.grid(column=0, row=3, columnspan=2, pady=(0, CONTROL_PAD),
                                                                  sticky='nwes')

    chekVar1 = StringVar(check_frame, value=u'')
    ent1 = Entry(check_frame, textvariable=chekVar1, width=7,font=('Verdana',
       FONT_SIZE_BIG))
    ent1.pack(side=LEFT, pady=CONTROL_PAD/3, padx=CONTROL_PAD)
    ent1.bind("<KeyRelease>", checks_fill)

    Label(check_frame, text=u'<= номера чеков <=', bg='#' + REPORT_COLOR,
                                font = ('Verdana', FONT_SIZE)).pack(side=LEFT,
                                           pady=CONTROL_PAD/3, padx=CONTROL_PAD)
    chekVar2 = StringVar(check_frame, value=u'')
    ent2 = Entry(check_frame, textvariable=chekVar2, width=7,font=('Verdana',
       FONT_SIZE_BIG))
    ent2.pack(side=LEFT, pady=CONTROL_PAD/3, padx=CONTROL_PAD)
    ent2.bind("<KeyRelease>", checks_fill)

    #---------------------- Меню выбора причины списания --------------

    def menu_change_lost(key):
        """Меняет текущую причину списания."""
        if key:
            lostMenu.configure(text=key.reason)
        show_report.lost = key


    def menu_update_lost():
        """Обновляет меню выбора причин списания."""

        menu  =  Menu(cathMenu, tearoff=0)
        lostMenu['menu'] = menu

        for lost in queries.full_lost_reasons_list():
            menu.add_command(label=lost.reason, font=('Verdana', FONT_SIZE_BIG),
                                 command=lambda key=lost: menu_change_lost(key))


    Style().configure('TMenubutton', font=('lucida console', FONT_SIZE_BIG),
                                                                justify='left')
    lost_reasons_list = queries.lost_reasons_list()
    show_report.lost = lost_reasons_list[0] if lost_reasons_list else None

    varLost = IntVar(middleFrame)
    chb_lost = Checkbutton(middleFrame3, text=u'Фильтр по причине списания',
                                          variable=varLost, command=checks_fill)
    chb_lost.grid(column=0, row=5, columnspan=2, pady=(0, CONTROL_PAD))

    Label(middleFrame3, text='Причина списания:', font=('Verdana', FONT_SIZE_BIG)
                 ).grid(column=0, row=4, pady=CONTROL_PAD/3, padx=CONTROL_PAD/3)

    smallFrame2 = Frame(middleFrame3, relief=GROOVE)
    smallFrame2.grid(column=1, row=4, pady=CONTROL_PAD/3)

    lostMenu = Menubutton(smallFrame2, text=u'брак', width=19,
                                                            style='TMenubutton')
    lostMenu.pack(fill=BOTH, pady=5, padx=5)
    menu_update_lost()

    #--------------------------------------------------------------

    Label(middleFrame3, text='Фильтр по скидке.', font=('Verdana', FONT_SIZE),
            bg='#' + REPORT_COLOR).grid(column=0, row=7, sticky='nwes',
                                                                   columnspan=2)

    discFrame = TkFrame(middleFrame3, relief=GROOVE, bg='#' + REPORT_COLOR)
    discFrame.grid(column=0, row=6, columnspan=2, ipady=(CONTROL_PAD),
                                                                  sticky='nwes')
    radioVar2 = StringVar(middleFrame)
    radioVar2.set(u'Не учитывать')

    variants = (u'Не учитывать', u'Со скидкой', u'Без скидки')

    for txt in variants:
        Radiobutton(discFrame, text=txt,indicatoron = 0, width = 13,
            variable=radioVar2, command=checks_fill, value=txt,
            font=('Verdana', FONT_SIZE)).pack(side=LEFT, padx = CONTROL_PAD/2,
                                                  pady=CONTROL_PAD/3, anchor=W)

    #--------------------------------первый запуск-----------------------------

    assortiment_fill()
    checks_fill()