Advertisement
ALEXANDAR_GEORGIEV

dna_import_form

Dec 2nd, 2022 (edited)
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 56.59 KB | Source Code | 0 0
  1. from tkinter import *
  2. from widget_factory import *
  3. from mapped_acc_calculations import *
  4. from json_file_io import JsonFileIo
  5. from Opiti.from_excel.classes.global_inc import registry
  6.  
  7.  
  8. class DnaFormImport(Tk):
  9.     def __init__(self):
  10.         Tk.__init__(self)
  11.         self.account_tree = AccountTree()
  12.         self.widget_factory = WidgetsFactory()
  13.         self.excel_acc_data = ExcelAccData()
  14.         self.mapped_calculations = MappedCalculations()
  15.         self.excel_acc_data.convert_json_data()
  16.         self.acc_data_bycode = self.excel_acc_data.get_acc_data_bycode()
  17.         self.min_top_group_digits = self.excel_acc_data.get_min_top_group_digits()
  18.         self.max_top_group_digits = self.excel_acc_data.get_max_top_group_digits()
  19.         self.max_groups = self.excel_acc_data.get_max_groups()
  20.  
  21.         json_file_io = JsonFileIo(file_name=registry["mapped_account_file_name"])
  22.         acc_data_mapped = json_file_io.read_content()  # {"121": ["СК"], "121-13": ["СК"], "121-14": ["СК"],
  23.  
  24.         self.acc_data_mapped_da = {}  # Речник с маркираните сметки с вид 'ДА'
  25.         for acc_code in self.acc_data_bycode:
  26.             self.account_tree.add_code(acc_code)  # Захранваме наследственото дърво
  27.         self.acc_data = []
  28.         self.max_depth_da = 0
  29.         for acc_code in acc_data_mapped:
  30.             acc_types = acc_data_mapped[acc_code]
  31.             if 'ДА' in acc_types and len(acc_types) == 1:
  32.                 self.acc_data_mapped_da[acc_code] = acc_data_mapped[acc_code]
  33.                 depth = self.account_tree.get_depth(acc_code)
  34.                 if depth > self.max_depth_da:
  35.                     self.max_depth_da = depth
  36.         for acc_code in self.acc_data_bycode:
  37.             if acc_code in self.acc_data_mapped_da:
  38.                 acc_row = self.acc_data_bycode[acc_code]
  39.                 self.acc_data.append(acc_row)
  40.         # -----------------------
  41.         self.acc_rec_dna = {
  42.             'prd': {'ns': 0, 'ns_amo': 0, 'assets': [], 'amort': [], 'assets_re': {'inc': 0.0, 'dec': 0.0, 'diff': 0},
  43.                     'amort_re': {'inc': 0.0, 'dec': 0.0, 'diff': 0}},
  44.             'pp': {'ns': 0, 'ns_amo': 0, 'assets': [], 'amort': [], 'assets_re': {'inc': 0.0, 'dec': 0.0, 'diff': 0},
  45.                    'amort_re': {'inc': 0.0, 'dec': 0.0, 'diff': 0}},
  46.             'tr': {'ns': 0, 'ns_amo': 0, 'assets': [], 'amort': [], 'assets_re': {'inc': 0.0, 'dec': 0.0, 'diff': 0},
  47.                    'amort_re': {'inc': 0.0, 'dec': 0.0, 'diff': 0}},
  48.             'rpna': {'ns': 0, 'ns_amo': 0, 'assets': [], 'amort': [], 'assets_re': {'inc': 0.0, 'dec': 0.0, 'diff': 0},
  49.                      'amort_re': {'inc': 0.0, 'dec': 0.0, 'diff': 0}},
  50.             'adv': {'ns': 0, 'ns_amo': 0, 'assets': [], 'amort': [], 'assets_re': {'inc': 0.0, 'dec': 0.0, 'diff': 0},
  51.                     'amort_re': {'inc': 0.0, 'dec': 0.0, 'diff': 0}}}
  52.         # -------------------------
  53.         self.check_assets = IntVar()  # Radiobutton tab - преоценка активи
  54.         self.check_amort = IntVar()  # Radiobutton tab - преоценка амортизации
  55.         self.last_entry = Entry()  # Четене на Entry code
  56.         self.l_open_bal_prd = Entry(self)
  57.         self.acc_data = []
  58.         self.scr_bar = None
  59.         self.tab_names = {
  60.             "act": "Активи",
  61.             "amort": "Амортизации",
  62.             "act_p": "Преоценка активи",
  63.             "amort_p": "Преоценка амортизации",
  64.         }
  65.         self.current_tab = ''
  66.         self.open = 'str_open_d'
  67.         self.close = 'str_close_d'
  68.         self.term_dc = 'debit'
  69.         self.term = None
  70.         self.all_accounts = []
  71.         self.list_unadded_accs = []
  72.         self.unadded_spin = ''
  73.         self.parents_with_unadded_children = []
  74.         self.selected_accs = []  # Данните, които трябва да се запишат във файл за да се маркират сметките в Treeview
  75.         self.selected_accs_amo = []  # Маркирани сметки в Treeview АМортизации
  76.         self.dict_entries = {}  # Списък с Ентритата на Активите
  77.         self.dict_entries_amo = {}  # Списък с Ентрита на Амортизации
  78.         self.get_sums = {}
  79.         self.get_sums_amo = {}
  80.         self.get_total = {'total': {'od': 0.0, 'oc': 0.0, 'td': 0.0, 'tc': 0.0, 'cd': 0.0, 'cc': 0.0}}
  81.         self.get_total_amo = {'total': {'od': 0.0, 'oc': 0.0, 'td': 0.0, 'tc': 0.0, 'cd': 0.0, 'cc': 0.0}}
  82.         self.user_ns = {'prd': 0, 'pp': 0, 'tr': 0, 'rpna': 0, 'adv': 0}
  83.         self.user_ns_amo = {'prd': 0, 'pp': 0, 'tr': 0}
  84.         self.assets_re = {'prd': {'inc': 0.0, 'dec': 0.0}, 'pp': {'inc': 0.0, 'dec': 0.0}, 'tr': {'inc': 0.0, 'dec': 0.0}}
  85.         self.amort_re = {'prd': {'inc': 0.0, 'dec': 0.0}, 'pp': {'inc': 0.0, 'dec': 0.0}, 'tr': {'inc': 0.0, 'dec': 0.0}}
  86.         self.pop_message_answer = ''
  87.         self.selected_code = None
  88.  
  89.         self.title('Нематериални активи')  # TODO -> Главен прозорец
  90.         self.geometry('1300x500+200+150')  # 480
  91.         self.resizable(True, False)
  92.         self.attributes('-topmost', 'true')
  93.  
  94.         # TODO -> Notebook
  95.         self.tabs = ttk.Notebook(self)  # TODO -> Табове
  96.         self.tabs.pack(pady=(1, 56), anchor='w')  # class_, cursor, padding, relief, style, takefocus, height and width
  97.         self.tab1 = Frame(self.tabs, width=550, height=399, relief=GROOVE, borderwidth=5)
  98.         self.tab1.pack()  # fill=”X” specifies, fill=”Y”
  99.         self.tabs.add(self.tab1, text=self.tab_names['act'], padding=(2, 10))  #
  100.         self.tab2 = Frame(self.tabs, width=550, height=399, relief=GROOVE, borderwidth=5, bg='white')  # bg='lightgrey'
  101.         self.tab2.pack(fill='both', expand=1)
  102.         self.tabs.add(self.tab2, text=self.tab_names['amort'], padding=(2, 10))
  103.         self.tab3 = Frame(self.tabs, width=550, height=399, relief=GROOVE, borderwidth=5,
  104.                           bg='mint cream')  # bg='lightgrey'
  105.         self.tab3.pack(fill='both', expand=1)
  106.         self.tabs.add(self.tab3, text=self.tab_names['act_p'],
  107.                       state='hidden')  # compound must be none, text, image, center, top, bottom, left, or right
  108.         self.tab4 = Frame(self.tabs, width=550, height=399, relief=GROOVE, borderwidth=5,
  109.                           bg='lemon chiffon')  # bg='lightgrey'
  110.         self.tab4.pack(fill='both', expand=1)
  111.         self.tabs.add(self.tab4, text=self.tab_names['amort_p'],
  112.                       state='hidden')  #
  113.         self.tabs.bind('<<NotebookTabChanged>>', self.get_tab)
  114.         # TODO -> LABELS
  115.         self.widget_factory.get_label_un(self.tab1, 'с/ка: АКТИВИ', 20, 20, 'w', 26, 'blue', bg_border='red')
  116.         self.widget_factory.get_label_un(self.tab1, 'Група I.: Нематериални активи', 20, 50, 'w', 26, bg_border='red')
  117.         self.widget_factory.get_label_un(self.tab1, 'НС\n(хил.лв)', 275, 50, 'w', 6, 'black', bg_border='red',
  118.                                          j='center')
  119.         self.widget_factory.get_label_un(self.tab1, 'НС\n(лева)', 340, 50, 'center', 11, 'black', bg_border='red',
  120.                                          j='center')
  121.         self.widget_factory.get_label_un(self.tab1, 'с/ка:\n(код)', 460, 50, 'center', 4, 'black', bg_border='green')
  122.         self.widget_factory.get_label_un(self.tab1, 'Продукти от развойна дейност', 20, 100, 'w', 26, bg_border='green')
  123.         self.widget_factory.get_label_un(self.tab1, 'Програмни продукти, концесии,\nи други подобни права', 20, 140,
  124.                                          'w', 26, bg_border='green', j='left')
  125.         self.widget_factory.get_label_un(self.tab1, 'Търговска репутация', 20, 200, 'w', 20, bg_border='green')
  126.         self.widget_factory.get_label_un(self.tab1, 'Нематериални активи в\n процес на изграждане', 20, 240,
  127.                                          'w', 26, bg_border='green', j='left')
  128.         self.widget_factory.get_label_un(self.tab1, 'Предоставени аванси', 20, 300, 'w', 26, bg_border='green')
  129.         # TODO -> Entries
  130.         self.user_prd = self.widget_factory.get_entry(self.tab1, 280, 100, 5, 'right')
  131.         self.user_prd.bind("<KeyRelease>", lambda e: self.update_state_open_bal(self.user_prd, "prd", "od"))
  132.         self.l_open_bal_prd = self.widget_factory.get_label_un(self.tab1, '0', 340, 100, 'e', 11, 'black',
  133.                                                                bg_border='green', j='left', name='prd')
  134.         self.e_prd = self.widget_factory.get_entry(self.tab1, 450, 100, 9, 'left', name='prd')
  135.         self.e_prd.bind("<KeyRelease>", lambda e: self.on_entry_key_release(self.e_prd))
  136.         self.e_prd.bind("<FocusIn>", lambda e: self.entry_on_focus(self.e_prd))
  137.         self.user_pp = self.widget_factory.get_entry(self.tab1, 280, 150, 5, 'right')
  138.         self.user_pp.bind("<KeyRelease>", lambda e: self.update_state_open_bal(self.user_pp, "pp", "od"))
  139.         self.l_open_balance_pp = self.widget_factory.get_label_un(self.tab1, '0', 340, 150, 'e', 11,
  140.                                                                   'black', bg_border='green', j='left')
  141.         self.e_pp = self.widget_factory.get_entry(self.tab1, 450, 150, 9, name='pp')
  142.         self.e_pp.bind("<KeyRelease>", lambda e: self.on_entry_key_release(self.e_pp))
  143.         self.e_pp.bind("<FocusIn>", lambda e: self.entry_on_focus(self.e_pp))
  144.         self.user_tr = self.widget_factory.get_entry(self.tab1, 280, 200, 5, 'right')
  145.         self.user_tr.bind("<KeyRelease>", lambda e: self.update_state_open_bal(self.user_tr, "tr", "od"))
  146.         self.l_open_balance_tr = self.widget_factory.get_label_un(self.tab1, '0', 340, 200, 'e', 11,
  147.                                                                   'black', bg_border='green', j='left')
  148.         self.e_tr = self.widget_factory.get_entry(self.tab1, 450, 200, 9, name='tr')
  149.         self.e_tr.bind("<KeyRelease>", lambda e: self.on_entry_key_release(self.e_tr))
  150.         self.e_tr.bind("<FocusIn>", lambda e: self.entry_on_focus(self.e_tr))
  151.         self.user_rpna = self.widget_factory.get_entry(self.tab1, 280, 250, 5, 'right')
  152.         self.user_rpna.bind("<KeyRelease>", lambda e: self.update_state_open_bal(self.user_rpna, "rpna", "od"))
  153.         self.l_open_balance_rpna = self.widget_factory.get_label_un(self.tab1, '0', 340, 250, 'e', 11,
  154.                                                                     'black', bg_border='green', j='left')
  155.         self.e_rpna = self.widget_factory.get_entry(self.tab1, 450, 250, 9, name='rpna')
  156.         self.e_rpna.bind("<KeyRelease>", lambda e: self.on_entry_key_release(self.e_rpna))
  157.         self.e_rpna.bind("<FocusIn>", lambda e: self.entry_on_focus(self.e_rpna))
  158.         self.user_adv = self.widget_factory.get_entry(self.tab1, 280, 300, 5, 'right')
  159.         self.user_adv.bind("<KeyRelease>", lambda e: self.update_state_open_bal(self.user_adv, "adv", "od"))
  160.         self.l_open_balance_adv = self.widget_factory.get_label_un(self.tab1, '0', 340, 300, 'e', 11,
  161.                                                                    'black', bg_border='green', j='left')
  162.         self.e_adv = self.widget_factory.get_entry(self.tab1, 450, 300, 9, name='adv')
  163.         self.e_adv.bind("<KeyRelease>", lambda e: self.on_entry_key_release(self.e_adv))
  164.         self.e_adv.bind("<FocusIn>", lambda e: self.entry_on_focus(self.e_adv))
  165.         # TODO -> DOWN LABELS
  166.         self.widget_factory.get_label(self.tab1, 90, 350, 'В началното', 12, 'e', font=10)
  167.         self.widget_factory.get_label(self.tab1, 195, 350, 'Увеличение', 12, 'e', font=10)
  168.         self.widget_factory.get_label(self.tab1, 300, 350, 'Намаление', 12, 'e', font=10)
  169.         self.widget_factory.get_label(self.tab1, 410, 350, 'В края', 12, 'e', font=10)
  170.         self.widget_factory.get_label(self.tab1, 20, 370, 'Група I.:', 10, 'w', font=10)
  171.         self.l_open_total = self.widget_factory.get_label(self.tab1, 90, 370, 0.0, 12, 'e', color='black',
  172.                                                           font=10)
  173.         self.l_turn_d_total = self.widget_factory.get_label(self.tab1, 195, 370, 0.0, 12, 'e', color='black',
  174.                                                             font=10)
  175.         self.l_turn_c_total = self.widget_factory.get_label(self.tab1, 300, 370, 0.0, 12, 'e', color='black',
  176.                                                             font=10)
  177.         self.l_close_total = self.widget_factory.get_label(self.tab1, 410, 370, 0.0, 12, 'e', color='black',
  178.                                                            font=10)
  179.         self.widget_factory.get_label_un(self, 'Налични сметки:', 720, 1, 'w', 20, 'blue', bg_color=None,
  180.                                          bg_border='red')
  181.         # TODO -> CHECKBUTTON
  182.         self.check_asset = Checkbutton(self.tab1, text="преоценка", variable=self.check_assets,
  183.                                        command=lambda: self.act_c1())
  184.         self.check_asset.place(x=275, y=20)
  185.         # TODO TREEVIEW
  186.         self.tv_frame = Frame(self)
  187.         self.tv_frame.place(x=560, y=30)
  188.         self.dict_columns = {"code_i": 'код', "acc_name": 'Сметка', 'open_di': 'НС Дебит', 'turn_di': 'Оборот Дт',
  189.                              'turn_ci': 'Оборот Кт', "close_di": 'КС Дебит'}
  190.         self.treeview_acc = self.widget_factory.get_treeview(self.tv_frame, **self.dict_columns)
  191.         self.treeview_acc.config(selectmode='browse')
  192.         # TODO SCROLLBAR
  193.         self.scr_bar = Scrollbar(self.tv_frame, orient=VERTICAL)
  194.         self.scr_bar.pack(side=RIGHT, fill=Y)
  195.         self.treeview_acc.config(yscrollcommand=self.scr_bar.set)
  196.         self.scr_bar.config(command=self.treeview_acc.yview, bg="red", activebackground="orange")
  197.         self.treeview_acc.bind('<ButtonRelease-1>', lambda e: self.on_selected_acc(self.treeview_acc))
  198.         self.treeview_acc.pack(side=LEFT)
  199.         # TODO Spinboxes
  200.         self.min_spin_2 = self.min_top_group_digits
  201.         self.max_spin_2 = self.max_top_group_digits + self.max_groups
  202.         self.var_spin_1 = StringVar(self)
  203.         self.list_spin_1 = ['всички', 'недобавени']
  204.         self.spin_1 = self.widget_factory.get_list_spinbox(self, self.list_spin_1, 12, 'center',
  205.                                                            self.var_spin_1, 560, 4)
  206.         self.spin_1.configure(command=lambda: self.fill_treeview(term_dc=self.term_dc))
  207.         # print("self.min_spin_2", self.min_spin_2, "self.max_depth_da", self.max_depth_da)
  208.         self.var_spin_2 = StringVar(self, value=str(self.max_depth_da))
  209.         self.spin_2 = self.widget_factory.get_spinbox(self, self.min_spin_2, str(self.max_depth_da), 4, 'center', self.var_spin_2, 660, 4)
  210.         self.spin_2.configure(command=lambda: self.fill_treeview(term_dc=self.term_dc))
  211.         # TODO Buttons
  212.         # Button Добави
  213.         self.b_add = self.widget_factory.get_save_button(self, 466, 455, text='ДОБАВИ')  # 460, 435
  214.         self.b_add.bind('<ButtonRelease-1>', lambda e: self.on_add())
  215.         # Button Корекции
  216.         self.b_note = self.widget_factory.get_correction_button(self, 360, 455)
  217.         self.b_note.bind('<ButtonRelease-1>', lambda e: self.on_correction())
  218.         # Button Помощ
  219.         self.b_help = self.widget_factory.get_help_button(self, 20, 455)
  220.         self.b_help.bind('<ButtonRelease-1>')
  221.         # Button Save
  222.         self.b_save = self.widget_factory.get_ok_button(self, 830, 455)
  223.         self.b_save.bind('<ButtonRelease-1>', lambda e: self.on_save())
  224.         # Button Отказ
  225.         self.b_exit = self.widget_factory.get_correction_esc(self, 930, 455)
  226.         self.b_exit.config(command=self.destroy)
  227.         # TODO AMORTIZATION Амортизации
  228.         self.widget_factory.get_label_un(self.tab2, 'с/ка: АМОРТИЗАЦИИ', 20, 20, 'w', 26, 'red', bg_color='white',
  229.                                          bg_border='blue')
  230.         self.widget_factory.get_label_un(self.tab2, 'Група I.: Нематериални активи', 20, 50, 'w', 26, bg_color='white',
  231.                                          bg_border='blue')
  232.         self.widget_factory.get_label_un(self.tab2, 'НС\n(хил.лв)', 275, 50, 'w', 6, 'black', bg_color='white',
  233.                                          bg_border='blue', j='center')
  234.         self.widget_factory.get_label_un(self.tab2, 'НС\n(лева)', 340, 50, 'center', 11, 'black', bg_color='white',
  235.                                          bg_border='blue', j='center')
  236.         self.widget_factory.get_label_un(self.tab2, 'с/ка:\n(код)', 460, 50, 'center', 4, 'black', bg_color='white',
  237.                                          bg_border='green')
  238.         self.widget_factory.get_label_un(self.tab2, 'Продукти от развойна дейност', 20, 100, 'w', 26, bg_color='white',
  239.                                          bg_border='green')
  240.         self.widget_factory.get_label_un(self.tab2, 'Програмни продукти, концесии,\nи други подобни права', 20, 140,
  241.                                          'w', 26, bg_color='white', bg_border='green', j='left')
  242.         self.widget_factory.get_label_un(self.tab2, 'Търговска репутация', 20, 200, 'w', 20, bg_color='white',
  243.                                          bg_border='green')
  244.         # TODO -> Entries
  245.         self.user_amo_prd = self.widget_factory.get_entry(self.tab2, 280, 100, 5, 'right')
  246.         self.user_amo_prd.bind("<KeyRelease>", lambda e: self.update_state_open_bal(self.user_amo_prd, "prd", "oc"))
  247.         self.l_open_amo_prd = self.widget_factory.get_label_un(self.tab2, '0', 340, 100, 'e', 11, 'black',
  248.                                                                bg_color='white', bg_border='green', j='left',
  249.                                                                name='amo_prd')
  250.  
  251.         self.e_amo_prd = self.widget_factory.get_entry(self.tab2, 450, 100, 9, 'left', name='prd')
  252.         self.e_amo_prd.bind("<KeyRelease>", lambda e: self.on_entry_key_release(self.e_amo_prd))
  253.         self.e_amo_prd.bind("<FocusIn>", lambda e: self.entry_on_focus(self.e_amo_prd))
  254.  
  255.         self.user_amo_pp = self.widget_factory.get_entry(self.tab2, 280, 150, 5, 'right')
  256.         self.user_amo_pp.bind("<KeyRelease>", lambda e: self.update_state_open_bal(self.user_amo_pp, "pp", "oc"))
  257.         self.l_open_amo_pp = self.widget_factory.get_label_un(self.tab2, '0', 340, 150, 'e', 11, 'black',
  258.                                                               bg_color='white', bg_border='green', j='left',
  259.                                                               name='amo_pp')
  260.         self.e_amo_pp = self.widget_factory.get_entry(self.tab2, 450, 150, 9, name='pp')
  261.         self.e_amo_pp.bind("<KeyRelease>", lambda e: self.on_entry_key_release(self.e_amo_pp))
  262.         self.e_amo_pp.bind("<FocusIn>", lambda e: self.entry_on_focus(self.e_amo_pp))
  263.  
  264.         self.user_amo_tr = self.widget_factory.get_entry(self.tab2, 280, 200, 5, 'right')
  265.         self.user_amo_tr.bind("<KeyRelease>", lambda e: self.update_state_open_bal(self.user_amo_tr, "tr", "oc"))
  266.         self.l_open_amo_tr = self.widget_factory.get_label_un(self.tab2, '0', 340, 200, 'e', 11, 'black',
  267.                                                               bg_color='white', bg_border='green', j='left',
  268.                                                               name='amo_pp')
  269.         self.e_amo_tr = self.widget_factory.get_entry(self.tab2, 450, 200, 9, name='tr')
  270.         self.e_amo_tr.bind("<KeyRelease>", lambda e: self.on_entry_key_release(self.e_amo_tr))
  271.         self.e_amo_tr.bind("<FocusIn>", lambda e: self.entry_on_focus(self.e_amo_tr))
  272.         # TODO Check button Amort
  273.         self.check_b2 = Checkbutton(self.tab2, text="преоценка", bg='white', variable=self.check_amort,
  274.                                     command=lambda: self.act_c2())
  275.         self.check_b2.place(x=275, y=20)
  276.         # TODO -> DOWN LABELS
  277.         self.widget_factory.get_label(self.tab2, 90, 350, 'В началното', 12, 'e', font=10, bg_color='white')
  278.         self.widget_factory.get_label(self.tab2, 195, 350, 'Увеличение', 12, 'e', font=10, bg_color='white')
  279.         self.widget_factory.get_label(self.tab2, 300, 350, 'Намаление', 12, 'e', font=10, bg_color='white')
  280.         self.widget_factory.get_label(self.tab2, 410, 350, 'В края', 12, 'e', font=10, bg_color='white')
  281.         self.widget_factory.get_label(self.tab2, 20, 370, 'Група I.:', 10, 'w', font=10, bg_color='white')
  282.         self.l_amo_open_total = self.widget_factory.get_label(self.tab2, 90, 370, 0.0, 12, 'e', color='black',
  283.                                                               font=10, bg_color='white')
  284.         self.l_amo_turn_d_total = self.widget_factory.get_label(self.tab2, 195, 370, 0.0, 12, 'e', color='black',
  285.                                                                 font=10, bg_color='white')
  286.         self.l_amo_turn_c_total = self.widget_factory.get_label(self.tab2, 300, 370, 0.0, 12, 'e', color='black',
  287.                                                                 font=10, bg_color='white')
  288.         self.l_amo_close_total = self.widget_factory.get_label(self.tab2, 410, 370, 0.0, 12, 'e', color='black',
  289.                                                                font=10, bg_color='white')
  290.         # TODO Преоценка Активи
  291.         self.widget_factory.get_label_un(self.tab3, 'С/ка: АКТИВИ', 20, 20, 'w', 26, 'black', bg_color='mint cream',
  292.                                          bg_border='red')
  293.         self.widget_factory.get_label_un(self.tab3, 'Група I.: ПРЕОЦЕНКА !', 20, 50, 'w', 26, 'black',
  294.                                          bg_color='mint cream', bg_border='red')
  295.         self.widget_factory.get_label_un(self.tab3, 'Увеличение\n(лева)', 280, 50, 'w', 10, 'black',
  296.                                          bg_color='mint cream', bg_border='red', j='center')
  297.         self.widget_factory.get_label_un(self.tab3, 'Намаление\n(лева)', 370, 50, 'w', 10, 'black',
  298.                                          bg_color='mint cream', bg_border='red', j='center')
  299.         self.widget_factory.get_label_un(self.tab3, 'Салдо\n(разлика)', 470, 50, 'w', 7, 'black',
  300.                                          bg_color='mint cream', bg_border='green')
  301.         self.widget_factory.get_label_un(self.tab3, 'Продукти от развойна дейност', 20, 100, 'w', 26, 'black',
  302.                                          bg_color='mint cream', bg_border='green')
  303.         self.widget_factory.get_label_un(self.tab3, 'Програмни продукти, концесии,\nи други подобни права', 20, 140,
  304.                                          'w', 26, 'black', bg_color='mint cream', bg_border='green', j='left')
  305.         self.widget_factory.get_label_un(self.tab3, 'Търговска репутация', 20, 200, 'w', 20, 'black',
  306.                                          bg_color='mint cream', bg_border='green')
  307.         self.widget_factory.get_label_un(self.tab3, 'Нематериални активи в\n процес на изграждане', 20, 240,
  308.                                          'w', 26, bg_color='mint cream', bg_border='green', j='left')
  309.         self.widget_factory.get_label_un(self.tab3, 'Предоставени аванси', 20, 300, 'w', 26, bg_color='mint cream',
  310.                                          bg_border='green')
  311.         # TODO -> Entries
  312.         self.turn_d_prd = self.widget_factory.get_entry(self.tab3, 280, 100, 12, 'right')
  313.         self.turn_d_prd.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_d_prd, "prd", "inc"))
  314.         self.turn_c_prd = self.widget_factory.get_entry(self.tab3, 370, 100, 12, 'right')
  315.         self.turn_c_prd.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_c_prd, "prd", "dec"))
  316.         self.prd = self.widget_factory.get_label(self.tab3, 490, 100, '0', 3, 'e', color='red', font=10,
  317.                                                  bg_color='mint cream')
  318.         self.turn_d_pp = self.widget_factory.get_entry(self.tab3, 280, 150, 12, 'right')
  319.         self.turn_d_pp.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_d_pp, "pp", "inc"))
  320.         self.turn_c_pp = self.widget_factory.get_entry(self.tab3, 370, 150, 12, 'right')
  321.         self.turn_c_pp.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_c_pp, "pp", "dec"))
  322.         self.pp = self.widget_factory.get_label(self.tab3, 490, 150, '0', 3, 'e', color='red', font=10,
  323.                                                 bg_color='mint cream')
  324.         self.turn_d_tr = self.widget_factory.get_entry(self.tab3, 280, 200, 12, 'right')
  325.         self.turn_d_tr.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_d_tr, "tr", "inc"))
  326.         self.turn_c_tr = self.widget_factory.get_entry(self.tab3, 370, 200, 12, 'right')
  327.         self.turn_c_tr.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_c_tr, "tr", "dec"))
  328.         self.tr = self.widget_factory.get_label(self.tab3, 490, 200, '0', 3, 'e', color='red', font=10,
  329.                                                 bg_color='mint cream')
  330.         self.rpna = self.widget_factory.get_label(self.tab3, 490, 250, '0', 3, 'e', color='red', font=10,
  331.                                                   bg_color='mint cream')
  332.         self.adv = self.widget_factory.get_label(self.tab3, 490, 300, '0', 3, 'e', color='red', font=10,
  333.                                                  bg_color='mint cream')
  334.         # TODO Преоценка Амортизации
  335.         self.widget_factory.get_label_un(self.tab4, 'С/ка: АМОРТИЗАЦИИ', 20, 20, 'w', 26, 'black',
  336.                                          bg_color='lemon chiffon', bg_border='red')
  337.         self.widget_factory.get_label_un(self.tab4, 'Група I.: ПРЕОЦЕНКА !', 20, 50, 'w', 26, 'black',
  338.                                          bg_color='lemon chiffon', bg_border='red')
  339.         self.widget_factory.get_label_un(self.tab4, 'Увеличение\n(лева)', 280, 50, 'w', 10, 'black',
  340.                                          bg_color='lemon chiffon', bg_border='red', j='center')
  341.         self.widget_factory.get_label_un(self.tab4, 'Намаление\n(лева)', 370, 50, 'w', 10, 'black',
  342.                                          bg_color='lemon chiffon', bg_border='red', j='center')
  343.         self.widget_factory.get_label_un(self.tab4, 'Салдо\n(разлика)', 470, 50, 'w', 7, 'black',
  344.                                          bg_color='lemon chiffon', bg_border='green')
  345.         self.widget_factory.get_label_un(self.tab4, 'Продукти от развойна дейност', 20, 100, 'w', 26, 'black',
  346.                                          bg_color='lemon chiffon', bg_border='green')
  347.         self.widget_factory.get_label_un(self.tab4, 'Програмни продукти, концесии,\nи други подобни права', 20, 140,
  348.                                          'w', 26, 'black', bg_color='lemon chiffon', bg_border='green', j='left')
  349.         self.widget_factory.get_label_un(self.tab4, 'Търговска репутация', 20, 200, 'w', 20, 'black',
  350.                                          bg_color='lemon chiffon', bg_border='green')
  351.         # TODO -> Entries
  352.         self.turn_d_amo_prd = self.widget_factory.get_entry(self.tab4, 280, 100, 12, 'right')
  353.         self.turn_d_amo_prd.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_d_amo_prd, "prd", "inc"))
  354.         self.turn_c_amo_prd = self.widget_factory.get_entry(self.tab4, 370, 100, 12, 'right')
  355.         self.turn_c_amo_prd.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_c_amo_prd, "prd", "dec"))
  356.         self.amo_prd = self.widget_factory.get_label(self.tab4, 490, 100, '0', 3, 'e', color='red', font=10,
  357.                                                      bg_color='lemon chiffon')
  358.         self.turn_d_amo_pp = self.widget_factory.get_entry(self.tab4, 280, 150, 12, 'right')
  359.         self.turn_d_amo_pp.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_d_amo_pp, "pp", "inc"))
  360.         self.turn_c_amo_pp = self.widget_factory.get_entry(self.tab4, 370, 150, 12, 'right')
  361.         self.turn_c_amo_pp.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_c_amo_pp, "pp", "dec"))
  362.         self.amo_pp = self.widget_factory.get_label(self.tab4, 490, 150, '0', 3, 'e', color='red', font=10,
  363.                                                     bg_color='lemon chiffon')
  364.         self.turn_d_amo_tr = self.widget_factory.get_entry(self.tab4, 280, 200, 12, 'right')
  365.         self.turn_d_amo_tr.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_d_amo_tr, "tr", "inc"))
  366.         self.turn_c_amo_tr = self.widget_factory.get_entry(self.tab4, 370, 200, 12, 'right')
  367.         self.turn_c_amo_tr.bind("<KeyRelease>", lambda e: self.revaluations(self.turn_c_amo_tr, "tr", "dec"))
  368.         self.amo_tr = self.widget_factory.get_label(self.tab4, 490, 200, '0', 3, 'e', color='red', font=10,
  369.                                                     bg_color='lemon chiffon')
  370.  
  371.     def get_tab(self, *args):
  372.         self.current_tab = self.tabs.tab(self.tabs.select(), "text")
  373.         if self.current_tab == 'Активи' or self.current_tab == 'Преоценка активи':
  374.             self.open, self.close = 'str_open_d', 'str_close_d'
  375.             self.treeview_acc.heading('#3', text='НС Дебит  ')
  376.             self.treeview_acc.heading('#6', text='КС Дебит  ')
  377.             self.term_dc = 'debit'
  378.             if self.current_tab == 'Активи':
  379.                 self.treeview_acc.configure(selectmode='browse')
  380.                 self.e_prd.focus_set()
  381.                 self.b_add['state'] = 'normal'
  382.                 self.b_note['state'] = 'normal'
  383.             else:
  384.                 self.treeview_acc.configure(selectmode='none')
  385.                 self.b_note['state'] = 'disabled'
  386.         else:
  387.             self.open, self.close = 'str_open_c', 'str_close_c'
  388.             self.treeview_acc.heading('#3', text='НС Кредит  ')
  389.             self.treeview_acc.heading('#6', text='КС Кредит  ')
  390.             self.term_dc = 'credit'
  391.             if self.current_tab == "Амортизации":
  392.                 self.treeview_acc.configure(selectmode='browse')
  393.                 self.e_amo_prd.focus_set()
  394.                 self.b_note['state'] = 'normal'
  395.             else:
  396.                 self.treeview_acc.configure(selectmode='none')
  397.                 self.b_note['state'] = 'disabled'
  398.         self.fill_treeview(term_dc=self.term_dc)
  399.         self.fill_labels()
  400.  
  401.     def set_pop_message_answer(self, answer):
  402.         self.pop_message_answer = answer
  403.  
  404.     def on_save(self):
  405.         # TODO -> Попълваме Началното салдо, въведено от потребителя:
  406.         for entry in self.user_ns:
  407.             self.acc_rec_dna[entry]['ns'] = self.user_ns[entry]
  408.         for entry in self.user_ns_amo:
  409.             self.acc_rec_dna[entry]['ns_amo'] = self.user_ns_amo[entry]
  410.         # TODO -> Попълваме сметките, по Ентрита на активи и амортизации
  411.         if not self.dict_entries:  # Речника е празен
  412.             for entry in self.acc_rec_dna:
  413.                 self.acc_rec_dna[entry]['assets'].clear()
  414.         if not self.dict_entries_amo:  # Речника е празен
  415.             for entry in self.acc_rec_dna:
  416.                 self.acc_rec_dna[entry]['amort'].clear()
  417.         for entry in self.dict_entries:
  418.             if self.dict_entries[entry] is None:
  419.                 self.dict_entries[entry] = []
  420.             self.acc_rec_dna[entry]['assets'] = self.dict_entries[entry]
  421.         for entry in self.dict_entries_amo:
  422.             if self.dict_entries_amo[entry] is None:
  423.                 self.dict_entries_amo[entry] = []
  424.             self.acc_rec_dna[entry]['amort'] = self.dict_entries_amo[entry]
  425.         # TODO -> попълване на сумите на преоценката
  426.         for entry in self.assets_re:
  427.             for way in self.assets_re[entry]:
  428.                 self.acc_rec_dna[entry]['assets_re'][way] = self.assets_re[entry][way]
  429.         for entry in self.amort_re:
  430.             for way in self.amort_re[entry]:
  431.                 self.acc_rec_dna[entry]['amort_re'][way] = self.amort_re[entry][way]
  432.  
  433.         json_file_io = JsonFileIo(file_name=registry['dna_import_form_acc_rec_dna_file_name'])
  434.         json_file_io.write_content(self.acc_rec_dna)
  435.         # TODO -> Проверка за недобавена сметка и съобщение !!!!!
  436.         if len(self.list_unadded_accs) > 0:
  437.             # TODO -> Показва pop_message "Има недобавени сметки !
  438.             pop_message = self.widget_factory.get_pop_message(self, lambda answer: self.set_pop_message_answer(answer),
  439.                                                               "Има недобавени сметки !", 1, 'red')
  440.             self.wait_window(pop_message.pop)
  441.             # TODO -> Ако "ДА"
  442.             self.destroy()
  443.             return
  444.         else:
  445.             pop_message = self.widget_factory.get_pop_message(self, lambda answer: self.set_pop_message_answer(answer),
  446.                                                               "Всички сметки са добавени !", 1, 'green')
  447.             self.wait_window(pop_message.pop)
  448.             # TODO -> Ако "ДА"
  449.             self.destroy()
  450.             return
  451.  
  452.     def on_correction(self):
  453.         if self.b_note['state'] == 'disabled':
  454.             return
  455.         if self.current_tab == 'Активи':
  456.             # TODO -> Махаме маркировката на Treeview и забраната за селекция
  457.             for code in self.selected_accs:
  458.                 self.treeview_acc.tag_configure(code, background='lightgrey')
  459.             self.selected_accs.clear()
  460.             # TODO -> Изтриваме стойностите на речника, на ентритата и лейбълите
  461.             self.dict_entries.clear()
  462.             self.get_total = {'total': {'od': 0.0, 'oc': 0.0, 'td': 0.0, 'tc': 0.0, 'cd': 0.0, 'cc': 0.0}}
  463.             self.l_open_bal_prd['text'] = 0
  464.             self.l_open_balance_pp['text'] = 0
  465.             self.l_open_balance_tr['text'] = 0
  466.             self.l_open_balance_rpna['text'] = 0
  467.             self.l_open_balance_adv['text'] = 0
  468.             self.prd['text'] = 0
  469.             self.pp['text'] = 0
  470.             self.tr['text'] = 0
  471.             self.rpna['text'] = 0
  472.             self.adv['text'] = 0
  473.         elif self.current_tab == 'Амортизации':
  474.             # TODO -> Махаме маркировката на Treeview и забраната за селекция
  475.             for code in self.selected_accs_amo:
  476.                 self.treeview_acc.tag_configure(code, background='lightgrey')
  477.             self.selected_accs_amo.clear()
  478.             # TODO -> Изтриваме стойностите на речника, на ентритата и лейбълите
  479.             self.dict_entries_amo.clear()
  480.             self.get_total_amo = {'total': {'od': 0.0, 'oc': 0.0, 'td': 0.0, 'tc': 0.0, 'cd': 0.0, 'cc': 0.0}}
  481.             self.l_open_amo_prd['text'] = 0
  482.             self.l_open_amo_pp['text'] = 0
  483.             self.l_open_amo_tr['text'] = 0
  484.             self.amo_prd['text'] = 0
  485.             self.amo_pp['text'] = 0
  486.             self.amo_tr['text'] = 0
  487.  
  488.         self.fill_labels()
  489.  
  490.         self.fill_treeview(term_dc=self.term_dc)
  491.  
  492.     # TODO -> Преоценка на активи
  493.     def revaluations(self, re_val: Entry, key1: str, key2: str):
  494.         revaluation = re_val.get()
  495.         if ' ' in revaluation:
  496.             re_val.delete(0, END)
  497.             re_val.insert(0, revaluation)
  498.         is_good = True
  499.         if revaluation == '':
  500.             revaluation = 0.0
  501.         else:
  502.             try:
  503.                 float(revaluation)
  504.             except:
  505.                 is_good = False
  506.                 revaluation = 0.0
  507.         if is_good:
  508.             re_val.configure(bg='white')
  509.         else:
  510.             re_val.configure(bg='red')
  511.         if self.current_tab == 'Преоценка активи':
  512.             self.assets_re[key1][key2] = float(revaluation)
  513.         elif self.current_tab == 'Преоценка амортизации':
  514.             self.amort_re[key1][key2] = float(revaluation)
  515.  
  516.     # TODO -> ЗА разлики между НС от потребителя и НС от сметките
  517.     def update_state_open_bal(self, open_bal: Entry, key1: str, key2: str):
  518.         name_entry = open_bal.winfo_name()
  519.         user_1000 = open_bal.get()
  520.         try:
  521.             user_1000 = int(user_1000)
  522.         except:
  523.             user_1000 = 0
  524.         calc = self.get_sum_string(key1, key2)
  525.         calc_1000 = int(round(calc / 1000))
  526.         if user_1000 == calc_1000:  # TODO оцвети нещо
  527.             open_bal.configure(bg='white')
  528.         else:
  529.             open_bal.configure(bg='red')
  530.         # TODO -> Да се попълни речник с НС, въведени от потребителя !
  531.         if self.current_tab == 'Активи':
  532.             self.user_ns[key1] = user_1000
  533.         elif self.current_tab == 'Амортизации':
  534.             self.user_ns_amo[key1] = user_1000
  535.         if name_entry == 'user_prd':
  536.             self.prd['text'] = user_1000 - calc_1000
  537.             self.acc_rec_dna['prd']['assets_re']['diff'] = user_1000 - calc_1000
  538.         elif name_entry == 'user_pp':
  539.             self.pp['text'] = int(user_1000 - calc_1000)
  540.             self.acc_rec_dna['pp']['assets_re']['diff'] = int(user_1000 - calc_1000)
  541.         elif name_entry == 'user_tr':
  542.             self.tr['text'] = int(user_1000 - calc_1000)
  543.             self.acc_rec_dna['tr']['assets_re']['diff'] = int(user_1000 - calc_1000)
  544.         elif name_entry == 'user_rpna':
  545.             self.rpna['text'] = int(user_1000 - calc_1000)
  546.             self.acc_rec_dna['rpna']['assets_re']['diff'] = int(user_1000 - calc_1000)
  547.         elif name_entry == 'user_adv':
  548.             self.adv['text'] = int(user_1000 - calc_1000)
  549.             self.acc_rec_dna['adv']['assets_re']['diff'] = int(user_1000 - calc_1000)
  550.         elif name_entry == 'user_amo_prd':
  551.             self.amo_prd['text'] = int(user_1000 - calc_1000)
  552.             self.acc_rec_dna['prd']['amort_re']['diff'] = int(user_1000 - calc_1000)
  553.         elif name_entry == 'user_amo_pp':
  554.             self.amo_pp['text'] = int(user_1000 - calc_1000)
  555.             self.acc_rec_dna['pp']['amort_re']['diff'] = int(user_1000 - calc_1000)
  556.         elif name_entry == 'user_amo_tr':
  557.             self.amo_tr['text'] = int(user_1000 - calc_1000)
  558.             self.acc_rec_dna['tr']['amort_re']['diff'] = int(user_1000 - calc_1000)
  559.  
  560.     def get_sum_string(self, key1, key2):
  561.         if self.current_tab == 'Активи':
  562.             if key1 in self.get_sums:
  563.                 return self.get_sums[key1][key2]
  564.         elif self.current_tab == 'Амортизации':
  565.             if key1 in self.get_sums_amo:
  566.                 return self.get_sums_amo[key1][key2]
  567.         return 0
  568.  
  569.     def fill_labels(self):
  570.         for entry in self.dict_entries_amo:
  571.             if self.dict_entries_amo[entry] is None:
  572.                 self.dict_entries_amo[entry] = []
  573.         for entry in self.dict_entries:
  574.             if self.dict_entries[entry] is None:
  575.                 self.dict_entries[entry] = []
  576.         if self.current_tab == 'Активи':
  577.             if len(self.dict_entries) > 0:
  578.                 self.get_sums, self.get_total = self.mapped_calculations.get_sum_list_accounts(self.dict_entries)
  579.                 for entr in self.get_sums:
  580.                     if entr == 'prd':
  581.                         self.l_open_bal_prd['text'] = f"{self.get_sums['prd']['od']:,.2f}".replace(',', ' ')
  582.                         self.update_state_open_bal(self.user_prd, "prd", "od")
  583.                     elif entr == 'pp':
  584.                         self.l_open_balance_pp['text'] = f"{self.get_sums['pp']['od']:,.2f}".replace(',', ' ')
  585.                         self.update_state_open_bal(self.user_pp, "pp", "od")
  586.                     elif entr == 'tr':
  587.                         self.l_open_balance_tr['text'] = f"{self.get_sums['tr']['od']:,.2f}".replace(',', ' ')
  588.                         self.update_state_open_bal(self.user_tr, "tr", "od")
  589.                     elif entr == 'rpna':
  590.                         self.l_open_balance_rpna['text'] = f"{self.get_sums['rpna']['od']:,.2f}".replace(',', ' ')
  591.                         self.update_state_open_bal(self.user_rpna, "rpna", "od")
  592.                     elif entr == 'adv':
  593.                         self.l_open_balance_adv['text'] = f"{self.get_sums['adv']['od']:,.2f}".replace(',', ' ')
  594.                         self.update_state_open_bal(self.user_adv, "adv", "od")
  595.             self.l_open_total['text'] = f"{self.get_total['total']['od']:,.2f}".replace(',', ' ')
  596.             self.l_turn_d_total['text'] = f"{self.get_total['total']['td']:,.2f}".replace(',', ' ')
  597.             self.l_turn_c_total['text'] = f"{self.get_total['total']['tc']:,.2f}".replace(',', ' ')
  598.             self.l_close_total['text'] = f"{self.get_total['total']['cd']:,.2f}".replace(',', ' ')
  599.         elif self.current_tab == 'Амортизации':
  600.             if len(self.dict_entries_amo) > 0:
  601.                 self.get_sums_amo, self.get_total_amo = self.mapped_calculations.get_sum_list_accounts(self.dict_entries_amo)
  602.                 for entr in self.get_sums_amo:
  603.                     if entr == 'prd':
  604.                         self.l_open_amo_prd['text'] = f"{self.get_sums_amo['prd']['oc']:,.2f}".replace(',', ' ')
  605.                         self.update_state_open_bal(self.user_amo_prd, "prd", "oc")
  606.                     elif entr == 'pp':
  607.                         self.l_open_amo_pp['text'] = f"{self.get_sums_amo['pp']['oc']:,.2f}".replace(',', ' ')
  608.                         self.update_state_open_bal(self.user_amo_pp, "pp", "oc")
  609.                     elif entr == 'tr':
  610.                         self.l_open_amo_tr['text'] = f"{self.get_sums_amo['tr']['oc']:,.2f}".replace(',', ' ')
  611.                         self.update_state_open_bal(self.user_amo_tr, "tr", "oc")
  612.             self.l_amo_open_total['text'] = f"{self.get_total_amo['total']['oc']:,.2f}".replace(',', ' ')
  613.             self.l_amo_turn_d_total['text'] = f"{self.get_total_amo['total']['td']:,.2f}".replace(',', ' ')
  614.             self.l_amo_turn_c_total['text'] = f"{self.get_total_amo['total']['tc']:,.2f}".replace(',', ' ')
  615.             self.l_amo_close_total['text'] = f"{self.get_total_amo['total']['cc']:,.2f}".replace(',', ' ')
  616.  
  617.     def on_add(self):
  618.         if self.current_tab == 'Активи':
  619.             acc_code = self.last_entry.get()  # '203'
  620.             if acc_code is None or acc_code == '':
  621.                 return
  622.             self.selected_accs.append(list(self.treeview_acc.selection()))  # current_selection:  ('200',) Всички избори
  623.             # TODO -> На името на Entry да добавим сметката
  624.             name_entry = self.last_entry.winfo_name()
  625.             if name_entry not in self.dict_entries:
  626.                 self.dict_entries[name_entry] = ()
  627.             self.dict_entries[name_entry] += self.treeview_acc.selection()  # Добавям маркираната сметка
  628.             # TODO -> Добавяне на децата и родителите на добавената сметка
  629.             all_children = self.account_tree.get_all_children(acc_code)  # all_children:  ['200', '203', '205']
  630.             all_parents = self.account_tree.get_all_parents(acc_code)  # acc_code = 223 - > all_parents:  ['22', '2']
  631.             self.selected_accs.extend(all_children)
  632.             self.selected_accs.extend(all_parents)
  633.             # TODO -> След добавяне да се изпразват всички ентрита, а не само добавеното !!!!!
  634.             if self.e_prd.get() != '': self.e_prd.delete(0, 'end')
  635.             if self.e_pp.get() != '': self.e_pp.delete(0, 'end')
  636.             if self.e_tr.get() != '': self.e_tr.delete(0, 'end')
  637.             if self.e_rpna.get() != '': self.e_rpna.delete(0, 'end')
  638.             if self.e_adv.get() != '': self.e_adv.delete(0, 'end')
  639.  
  640.         elif self.current_tab == 'Амортизации':
  641.             acc_code = self.last_entry.get()  # '203'
  642.             if acc_code is None or acc_code == '':
  643.                 return
  644.             self.selected_accs_amo.append(list(self.treeview_acc.selection()))
  645.             # TODO -> На името на Entry да добавим сметката
  646.             name_entry = self.last_entry.winfo_name()
  647.             if name_entry not in self.dict_entries_amo:
  648.                 self.dict_entries_amo[name_entry] = ()
  649.             self.dict_entries_amo[name_entry] += self.treeview_acc.selection()
  650.             # TODO -> Добавяне на децата и родителите на добавената сметка
  651.             all_children = self.account_tree.get_all_children(acc_code)  # all_children:  ['200', '203', '205']
  652.             all_parents = self.account_tree.get_all_parents(acc_code)  # acc_code = 223 - > all_parents:  ['22', '2']
  653.             self.selected_accs_amo.extend(all_children)
  654.             self.selected_accs_amo.extend(all_parents)
  655.             # TODO -> След добавяне да се изпразват всички ентрита, а не само добавеното !!!!!
  656.             if self.e_amo_prd.get() != '': self.e_amo_prd.delete(0, 'end')
  657.             if self.e_amo_pp.get() != '': self.e_amo_pp.delete(0, 'end')
  658.             if self.e_amo_tr.get() != '': self.e_amo_tr.delete(0, 'end')
  659.  
  660.         self.fill_labels()
  661.         # TODO -> Попълваме Treeview
  662.         self.fill_treeview(term_dc=self.term_dc)
  663.  
  664.     def act_c1(self):
  665.         if self.check_assets.get() == 1:  # state: must be normal, disabled, or hidden
  666.             self.tabs.tab(self.tab3, state='normal')
  667.         elif self.check_assets.get() == 0:
  668.             self.tabs.tab(self.tab3, state='hidden')
  669.  
  670.     def act_c2(self):
  671.         if self.check_amort.get() == 1:  # state: must be normal, disabled, or hidden
  672.             self.tabs.tab(self.tab4, state='normal')
  673.         elif self.check_amort.get() == 0:
  674.             self.tabs.tab(self.tab4, state='hidden')
  675.  
  676.     def verify_selection(self):  # Забрана за маркиране
  677.         for code in self.selected_accs:
  678.             if self.treeview_acc.exists(code):
  679.                 self.treeview_acc.selection_remove(code)
  680.         for code in self.selected_accs_amo:
  681.             if self.treeview_acc.exists(code):
  682.                 self.treeview_acc.selection_remove(code)
  683.  
  684.     def on_selected_acc(self, source_treeview):
  685.         self.verify_selection()
  686.         current_item = source_treeview.focus()
  687.         if current_item in self.selected_accs or current_item in self.selected_accs_amo:  # <class 'tuple'>
  688.             return
  689.         values = source_treeview.item(current_item)["values"]
  690.         if not isinstance(values, list):
  691.             return
  692.         code = values[0]
  693.         self.selected_code = values[0]
  694.         # if self.last_entry is not None:   # TODO -> MAЙ НЕ ВЪРШИ НИКАКВА РАБОТА
  695.         self.last_entry.delete(0, END)
  696.         self.last_entry.insert(0, code)
  697.  
  698.     def entry_on_focus(self, entry):
  699.         self.last_entry = entry
  700.  
  701.     def on_entry_key_release(self, entry):
  702.         self.last_entry = entry
  703.         entry_text = entry.get()
  704.         if len(entry_text) < 2:
  705.             self.fill_treeview(term_dc=self.term_dc)
  706.             return
  707.         term = entry_text
  708.         self.fill_treeview(term=term, term_dc=self.term_dc)
  709.  
  710.     def dna(self):
  711.         try:
  712.             json_file_io = JsonFileIo(file_name=registry["dna_import_form_acc_rec_dna_file_name"])
  713.             tmp_acc_rec_dna = json_file_io.read_content()
  714.             if tmp_acc_rec_dna is not None:
  715.                 self.acc_rec_dna = tmp_acc_rec_dna
  716.             self.refill_form()
  717.             self.get_tab()  # Рефрешва таба, попълва self.current_tab
  718.         except:
  719.             pass
  720.         self.fill_treeview(term_dc=self.term_dc)
  721.         self.mainloop()
  722.  
  723.     def refill_form(self):
  724.         # TODO -> Попълваме Treeview с маркирани и забранени за селектиране сметки
  725.         for entry in self.acc_rec_dna:
  726.             self.dict_entries[entry] = self.acc_rec_dna[entry]['assets']
  727.         for entry in self.acc_rec_dna:
  728.             self.dict_entries_amo[entry] = self.acc_rec_dna[entry]['amort']
  729.         # TODO -> Попълваме сметките, децата и родителите на сметките в self.selected_accs, self.selected_accs_amo
  730.         for entry_name in self.dict_entries:
  731.             for acc_code in self.dict_entries[entry_name]:
  732.                 if acc_code not in self.selected_accs:
  733.                     self.selected_accs.append(acc_code)
  734.                     all_children = self.account_tree.get_all_children(acc_code)  # all_children:['200', '203', '205']
  735.                     all_parents = self.account_tree.get_all_parents(acc_code)  # acc_code = 223 all_parents:['22', '2']
  736.                     self.selected_accs.extend([a for a in all_children if a not in self.selected_accs])
  737.                     self.selected_accs.extend([a for a in all_parents if a not in self.selected_accs])
  738.         for entry_name in self.dict_entries_amo:
  739.             for acc_code in self.dict_entries_amo[entry_name]:
  740.                 if acc_code not in self.selected_accs_amo:
  741.                     self.selected_accs_amo.append(acc_code)
  742.                     all_children = self.account_tree.get_all_children(acc_code)  # all_children:['200', '203', '205']
  743.                     all_parents = self.account_tree.get_all_parents(acc_code)
  744.                     self.selected_accs_amo.extend([a for a in all_children if a not in self.selected_accs_amo])
  745.                     self.selected_accs_amo.extend([a for a in all_parents if a not in self.selected_accs_amo])
  746.         # TODO -> Попълваме Ентритата с НС user_ns и user_ns_amo
  747.         for entry_name in self.user_ns:
  748.             self.user_ns[entry_name] = self.acc_rec_dna[entry_name]['ns']
  749.         if self.user_ns['prd'] > 0:
  750.             self.user_prd.insert(0, self.user_ns['prd'])
  751.         if self.user_ns['pp'] > 0:
  752.             self.user_pp.insert(0, self.user_ns['pp'])
  753.         if self.user_ns['tr'] > 0:
  754.             self.user_tr.insert(0, self.user_ns['tr'])
  755.         if self.user_ns['rpna'] > 0:
  756.             self.user_rpna.insert(0, self.user_ns['rpna'])
  757.         if self.user_ns['adv'] > 0:
  758.             self.user_adv.insert(0, self.user_ns['adv'])
  759.         for entry_name in self.user_ns_amo:
  760.             self.user_ns_amo[entry_name] = self.acc_rec_dna[entry_name]['ns_amo']
  761.         if self.user_ns_amo['prd'] > 0:
  762.             self.user_amo_prd.insert(0, self.user_ns_amo['prd'])
  763.         if self.user_ns_amo['pp'] > 0:
  764.             self.user_amo_pp.insert(0, self.user_ns_amo['pp'])
  765.         if self.user_ns_amo['tr'] > 0:
  766.             self.user_amo_tr.insert(0, self.user_ns_amo['tr'])
  767.         # TODO -> Попълваме Ентритата с Преоценките
  768.         for entry in self.assets_re:
  769.             for way in self.assets_re[entry]:
  770.                 self.assets_re[entry][way] = self.acc_rec_dna[entry]['assets_re'][way]
  771.         if self.assets_re['prd']['inc'] > 0:
  772.             print("self.assets_re['prd']['inc']: ", self.assets_re['prd']['inc'])
  773.             self.turn_d_prd.insert(0, self.assets_re['prd']['inc'])
  774.         if self.assets_re['prd']['dec'] > 0:
  775.             self.turn_c_prd.insert(0, self.assets_re['prd']['dec'])
  776.         if self.assets_re['pp']['inc'] > 0:
  777.             self.turn_d_pp.insert(0, self.assets_re['pp']['inc'])
  778.         if self.assets_re['pp']['dec'] > 0:
  779.             self.turn_c_pp.insert(0, self.assets_re['pp']['dec'])
  780.         if self.assets_re['tr']['inc'] > 0:
  781.             self.turn_d_tr.insert(0, self.assets_re['tr']['inc'])
  782.         if self.assets_re['tr']['dec'] > 0:
  783.             self.turn_c_tr.insert(0, self.assets_re['tr']['dec'])
  784.         for entry in self.amort_re:
  785.             for way in self.amort_re[entry]:
  786.                 self.amort_re[entry][way] = self.acc_rec_dna[entry]['amort_re'][way]
  787.         print('self.amort_re след refill: ', self.amort_re)
  788.         if self.amort_re['prd']['inc'] > 0:
  789.             self.turn_d_amo_prd.insert(0, self.amort_re['prd']['inc'])
  790.         if self.amort_re['prd']['dec'] > 0:
  791.             self.turn_c_amo_prd.insert(0, self.amort_re['prd']['dec'])
  792.         if self.amort_re['pp']['inc'] > 0:
  793.             self.turn_d_amo_pp.insert(0, self.amort_re['pp']['inc'])
  794.         if self.amort_re['pp']['dec'] > 0:
  795.             self.turn_c_amo_pp.insert(0, self.amort_re['pp']['dec'])
  796.         if self.amort_re['tr']['inc'] > 0:
  797.             self.turn_d_amo_tr.insert(0, self.amort_re['tr']['inc'])
  798.         if self.amort_re['tr']['dec'] > 0:
  799.             self.turn_c_amo_tr.insert(0, self.amort_re['tr']['dec'])
  800.         print('self.amort_re: ', self.amort_re)
  801.  
  802.     def fill_treeview(self, term=None, term_dc='debit'):
  803.         self.treeview_acc.delete(*self.treeview_acc.get_children())  # Вградена функция за изтриване на Treeview
  804.         # TODO -> Spinboxes
  805.         self.unadded_spin = self.var_spin_1.get()  # Взима стойността на спинбокса за недобавени
  806.         spin_2 = int(self.var_spin_2.get())
  807.         self.all_accounts.extend(self.selected_accs)
  808.         self.all_accounts.extend(self.selected_accs_amo)
  809.         self.list_unadded_accs = self.account_tree.get_unadded_acc(self.all_accounts, self.acc_data_mapped_da)
  810.  
  811.         count_rows = 0
  812.         for acc_code in self.acc_data_bycode:
  813.             if acc_code not in self.acc_data_mapped_da:
  814.                 continue
  815.             if term_dc is not None and term_dc == 'debit':
  816.                 if self.acc_data_bycode[acc_code]['open_c'] > 0 or self.acc_data_bycode[acc_code]['close_c'] > 0:
  817.                     continue
  818.             elif term_dc is not None and term_dc == 'credit':
  819.                 if self.acc_data_bycode[acc_code]['open_d'] > 0 or self.acc_data_bycode[acc_code]['close_d'] > 0:
  820.                     continue
  821.             if term is not None:  # Искаме само сметките дето кода им започва с term
  822.                 term_len = len(term)
  823.                 code_piece = self.acc_data_bycode[acc_code]['code'][0:term_len]
  824.                 # Ако сметката не започва с term
  825.                 if term != code_piece:
  826.                     continue  # прескачаме тая сметка, не отговаря на търсеното
  827.             # TODO -> Ако spin_1 = 'недобавени' -> извежда само недобавените сметки в ентритата
  828.             if self.unadded_spin == 'недобавени':
  829.                 if acc_code not in self.list_unadded_accs:
  830.                     continue
  831.             # TODO -> spin_2 type of spin_2:  <class 'int'>
  832.             groups_in_acc_code = re.findall('[0-9]+', acc_code)  # Връща list със групите на сметката
  833.             top_group = groups_in_acc_code[0]
  834.             depth = self.account_tree.get_depth(acc_code)
  835.             if len(top_group) > spin_2 or depth > spin_2:
  836.                 continue
  837.             count_rows += 1
  838.             row = [self.acc_data_bycode[acc_code]['code'],
  839.                    self.acc_data_bycode[acc_code]['name'],
  840.                    self.acc_data_bycode[acc_code][self.open],
  841.                    self.acc_data_bycode[acc_code]['str_turn_d'],
  842.                    self.acc_data_bycode[acc_code]['str_turn_c'],
  843.                    self.acc_data_bycode[acc_code][self.close]]
  844.             tags = acc_code
  845.             iid = acc_code
  846.             self.treeview_acc.insert('', END, values=row, tags=tags, iid=iid)  # ????
  847.         self.treeview_acc.config(height=count_rows)
  848.         if count_rows > 15:
  849.             self.treeview_acc.configure(height=15)
  850.         for code in self.selected_accs:  # Оцветяване на добавените сметки
  851.             if self.treeview_acc.exists(code):
  852.                 self.treeview_acc.tag_configure(code, background='powderblue')
  853.         for code in self.selected_accs_amo:  # Оцветяване на добавените сметки
  854.             if self.treeview_acc.exists(code):
  855.                 self.treeview_acc.tag_configure(code, background='powderblue')
  856.  
  857.  
  858. if __name__ == '__main__':
  859.     dna = DnaFormImport()
  860.     dna.dna()
  861.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement