Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import csv
- import re
- from collections import defaultdict
- from pprint import pprint as pp
- from decimal import Decimal
- DEBUG = False
- DEBUG_READ_ROWS = 20080
- # DEBUG_READ_ROWS = 20
- # DEBUG_READ_ROWS = 40
- # DEBUG_READ_ROWS = 88
- REQUIRED_SERVICE_NUMBERS = [111, 114, 122, 129]
- OPTIONAL_SERVICE_NUMBERS = None
- def make_employee_uniq_key(row):
- return "uniq_key_e" + row['employee_name'].strip()
- def make_recipient_uniq_key(row):
- return "uniq_key_r" + row['recipient_name'].strip()
- def read_input(csv_filename, csv_employee_data):
- employee_data = {}
- recipient_data = {}
- employee_to_recipient = {}
- services_data = {}
- recipient_service_max_data ={}
- with open(csv_filename, newline='') as csvfile:
- csvreader = csv.DictReader(csvfile, delimiter=';')
- count_row = 0
- for row in csvreader:
- # pp(row)
- employee_to_recipient\
- .setdefault(make_employee_uniq_key(row), {})\
- .setdefault(make_recipient_uniq_key(row), {})\
- .setdefault('services', {})[int(row['service_number'])] = {
- 'service_count': int(row['service_count']),
- # 'service_number': int(row['service_number'])
- }
- # employee_data.setdefault( make_employee_uniq_key(row), {
- # 'employee_name': row['employee_name'].strip(),
- # 'service_max_time': Decimal(row['service_max_time'].replace(',', '.')),
- # })
- recipient_data.setdefault(make_recipient_uniq_key(row), {
- 'recipient_name': row['recipient_name'].strip(),
- })
- print("%d -> %s %s" % (count_row, row['one_service_time'], row['max']))
- #SHIT SHIT SHIT
- if not row['one_service_time']:
- row['one_service_time'] = '0'
- if not row['max']:
- row['max'] = '0'
- #SHIT SHIT SHIT
- services_data[int(row['service_number'])] = {
- # 'service_number': int(row['service_number']),
- 'one_service_time': Decimal(row['one_service_time'].replace(',', '.')),
- }
- recipient_service_max_data[(make_recipient_uniq_key(row), int(row['service_number']))]=\
- int(row['max'])
- count_row +=1
- if DEBUG and count_row >= DEBUG_READ_ROWS:
- break
- with open(csv_employee_data, newline='') as csvfile:
- csvreader = csv.DictReader(csvfile, delimiter=';')
- for row in csvreader:
- if row['service_max_time'] == '' and row['employee_name'].strip() == '':
- continue
- pp(row)
- row['service_max_time'] = re.sub('\s+', '', row['service_max_time'])
- if row['service_max_time'] == '-':
- continue
- employee_data.setdefault(make_employee_uniq_key(row), {
- 'employee_name': row['employee_name'].strip(),
- 'service_max_time': Decimal(row['service_max_time'].replace(',', '.')),
- })
- # print(count_row)
- return employee_data, employee_to_recipient, recipient_data, services_data, recipient_service_max_data
- def make_report(fot_filename, analiz_filename, result_filename):
- result = {}
- employee_data, employee_to_recipient, recipient_data, services_data, recipient_service_max_data = read_input(
- fot_filename,
- # './january/ФОТ-Tаблица 1.csv',
- analiz_filename,
- # './january/Анализ ЗП-Tаблица 1.csv',
- )
- # pp(recipient_service_max_data)
- # result_filename = './result_january.csv'
- result_filename = result_filename
- OPTIONAL_SERVICE_NUMBERS = list(set(services_data.keys()) - set(REQUIRED_SERVICE_NUMBERS))
- for employee_key in employee_to_recipient:
- if employee_key not in employee_data:
- print("skip employee_key %s", employee_key)
- continue
- employee = employee_data[employee_key]
- service_number_list = REQUIRED_SERVICE_NUMBERS
- while True:
- # if service_number_list == REQUIRED_SERVICE_NUMBERS:
- # print("REQUIRED_SERVICE_NUMBERS")
- # if service_number_list == OPTIONAL_SERVICE_NUMBERS:
- # print("OPTIONAL_SERVICE_NUMBERS")
- employee_time_before = employee['service_max_time']
- for recipient_key, r2e in employee_to_recipient[employee_key].items():
- recipient = recipient_data[recipient_key]
- for service_number in service_number_list:
- one_service_time = services_data[service_number]['one_service_time']
- if service_number not in r2e['services']:
- continue
- if r2e['services'][service_number]['service_count'] <= 0:
- continue
- if (employee['service_max_time'] - services_data[service_number]['one_service_time']) < 0:
- continue
- recipient_service_max_data.setdefault((recipient_key, service_number), 0)
- if recipient_service_max_data[(recipient_key, service_number)] == 0:
- continue
- # print(
- # ((employee['employee_name'], recipient['recipient_name'], service_number), one_service_time), employee['service_max_time'] - one_service_time
- # )
- result[(employee_key, recipient_key, service_number)] = (result.get((employee_key, recipient_key, service_number)) or 0) + one_service_time
- recipient_service_max_data[(recipient_key, service_number)] -= 1
- r2e['services'][service_number]['service_count'] -= 1
- employee['service_max_time'] -= one_service_time
- employee_time_after = employee['service_max_time']
- if employee_time_before == employee_time_after:
- if service_number_list == REQUIRED_SERVICE_NUMBERS:
- service_number_list = OPTIONAL_SERVICE_NUMBERS
- continue
- if service_number_list == OPTIONAL_SERVICE_NUMBERS:
- break
- # print('-------------------')
- # print(employee)
- # for recipient_key, r2e in employee_to_recipient[employee_key].items():
- # print("REQ:", recipient_data[recipient_key]['recipient_name'], [(service_number, r2e['services'].get(service_number)) for service_number in REQUIRED_SERVICE_NUMBERS])
- # print("OPT:", recipient_data[recipient_key]['recipient_name'], [(service_number, r2e['services'].get(service_number)) for service_number in OPTIONAL_SERVICE_NUMBERS])
- # print('-------------------')
- for key, value in result.items():
- employee_key, recipient_key, service_number = key
- # print((employee_data[employee_key]['employee_name'], recipient_data[recipient_key]['recipient_name'], service_number, value))
- with open(result_filename, 'w') as csvfile:
- fieldnames = ['employee_name', 'recipient_name', 'service_number', 'service_count', 'service_time']
- writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
- writer.writeheader()
- for key, value in result.items():
- employee_key, recipient_key, service_number = key
- # print((employee_data[employee_key]['employee_name'], recipient_data[recipient_key]['recipient_name'], service_number, value))
- writer.writerow({
- 'employee_name': employee_data[employee_key]['employee_name'],
- 'recipient_name': recipient_data[recipient_key]['recipient_name'],
- 'service_number': service_number,
- 'service_time': value,
- 'service_count': value / services_data[service_number]['one_service_time']
- })
- def main():
- # make_report(
- # './january/ФОТ-Tаблица 1.csv',
- # './january/Анализ ЗП-Tаблица 1.csv',
- # './result_january.csv',
- # )
- make_report(
- './january_ver2/ФОТ-Tаблица 1.csv',
- './january_ver2/Анализ ЗП-Tаблица 1.csv',
- './result_january_ver2.csv',
- )
- make_report(
- './februrary_ver2/ФОТ-Tаблица 1.csv',
- './februrary_ver2/Анализ ЗП fin-Tаблица 1.csv',
- './result_fevral_ver2.csv',
- )
- make_report(
- './mart_ver2/ФОТ-Tаблица 1.csv',
- './mart_ver2/Анализ ЗП fin-Tаблица 1.csv',
- './result_mart_ver2.csv' ,
- )
- #
- make_report(
- './aprel_ver2/ФОТ-Tаблица 1.csv',
- './aprel_ver2/Анализ ЗП fin-Tаблица 1.csv',
- './result_aprel_ver2.csv' ,
- )
- return
- if __name__ == "__main__":
- main()
- print("__THE_END__")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement