from fast_excel_to_bill.bill_doc.docx_builder import DOCFileBuilder from fast_excel_to_bill import config_for_custom_bills from fast_excel_to_bill.config_for_custom_bills import OUTPUT_MONTH, OUTPUT_YEAR from tool_lib import datetime_functions from datetime import datetime from fast_excel_to_bill.transform_excel_data_to_bill_data.time_recorder_format_main import main_data_collection, \ round_worktime_for_week, add_sum_to_dict, get_task_out_of_tree PAYMENT_REQUEST_RANGE = config_for_custom_bills.payment_request_range CURRENT_YEAR = int(datetime_functions.datetime_to_str(datetime_functions.get_current_date(), '%Y')) CURRENT_MONTH_YEAR = datetime_functions.datetime_to_str('current', '%m_%Y') DOCX_OUTPUT_PATH = config_for_custom_bills.docx_output_dir_path / 'bill_{}.docx'.format(CURRENT_MONTH_YEAR) def get_excel_data(): # Get Data which is necessary for the docx bill_data_dict = main_data_collection(config_for_custom_bills.employee_worktime_table_pathes, config_for_custom_bills.LIST_OF_KEYS) # transform data to format bill_data_dict = round_worktime_for_week(bill_data_dict, config_for_custom_bills.SAVE_OVERTIME_IN_TABLE, config_for_custom_bills.ROUND_TIME) bill_data_dict = add_sum_to_dict(bill_data_dict, config_for_custom_bills.income_per_hour) bill_data_dict = get_task_out_of_tree(bill_data_dict) return bill_data_dict def set_current_dates(builder_obj): current_date = datetime_functions.datetime_to_str(datetime_functions.get_current_date(), '%d.%m.%Y') builder_obj.replace_dates_string_in_standard_text(current_date) builder_obj.replace_dates_string_in_all_tables(current_date) return builder_obj def set_Leistungszeitraum(builder_obj, month: int, year: int): if not 0 < month <= 12: last_month = datetime_functions.get_current_month_number() - 1 else: last_month = month if year < 0: year = CURRENT_YEAR month_range = datetime_functions.get_count_of_days_for_specific_month(year=year, month_number=last_month) if last_month > 9: start_date = '01.' + str(last_month) + '.' + str(year) else: start_date = '01.' + '0' + str(last_month) + '.' + str(year) end_date = datetime_functions.add_days_to_date(datetime.strptime(start_date, '%d.%m.%Y'), month_range - 1) end_date = datetime_functions.datetime_to_str(end_date, '%d.%m.%Y') builder_obj.replace_Leistungszeitraum(start_date, end_date) return builder_obj def set_rechnungsnummer(): pass def fill_table(builder_obj, key_list, data_list): table = builder_obj.search_table_with_key_columns(key_list) builder_obj.replace_rows(table, data_list) builder_obj.delete_empty_rows_in_table(table, config_for_custom_bills.NUMBER_OF_COLUMNS_FIRST_TABLE) return builder_obj def main(): # Get Data bill_data_dict = get_excel_data() # Create a doc file which is based on a docx template builder_obj = DOCFileBuilder(config_for_custom_bills.DOCX_INPUT_PATH, DOCX_OUTPUT_PATH) # Set Date of Template builder_obj = set_current_dates(builder_obj) # Set Leistungszeitraum builder_obj = set_Leistungszeitraum(builder_obj, OUTPUT_MONTH, OUTPUT_YEAR) # Table KW/Time/ sum data_list = [] for key in bill_data_dict.keys(): data_list += [(key, bill_data_dict[key][config_for_custom_bills.LIST_OF_KEYS[0]], bill_data_dict[key]['Betrag'])] builder_obj = fill_table(builder_obj, config_for_custom_bills.FIRST_TABLE_KEYS, data_list) # Table KW and Task data_list = [] for key in bill_data_dict.keys(): data_list += [(key, bill_data_dict[key][config_for_custom_bills.LIST_OF_KEYS[1]])] builder_obj = fill_table(builder_obj, config_for_custom_bills.SECOND_TABLE_KEYS, data_list) # Replace Placeholders netto = sum([bill_data_dict[key]['Betrag'] for key in bill_data_dict.keys()]) tax = round(netto * 0.19, 2) abs_amount = netto + tax payment_request_date = datetime_functions.add_days_to_date(datetime_functions.get_current_date(), PAYMENT_REQUEST_RANGE) payment_request_date = datetime_functions.datetime_to_str(payment_request_date, '%d.%m.%Y') place_holder_replacement_list = [netto, tax, abs_amount, payment_request_date] place_holders = config_for_custom_bills.list_of_place_holders for count, place_holder in enumerate(place_holders): builder_obj.replace_custom_placeholder_in_doc(place_holder, str(place_holder_replacement_list[count])) builder_obj.save_docx() if __name__ == '__main__': main()