Advertisement
ALEXANDAR_GEORGIEV

dfa_import_form

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