Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.88 KB | None | 0 0
  1. import csv
  2. import re
  3. from collections import defaultdict
  4. from pprint import pprint as pp
  5. from decimal import Decimal
  6.  
  7. DEBUG = False
  8. DEBUG_READ_ROWS = 20080
  9. # DEBUG_READ_ROWS = 20
  10. # DEBUG_READ_ROWS = 40
  11. # DEBUG_READ_ROWS = 88
  12.  
  13. REQUIRED_SERVICE_NUMBERS = [111, 114, 122, 129]
  14. OPTIONAL_SERVICE_NUMBERS = None
  15.  
  16.  
  17.  
  18. def make_employee_uniq_key(row):
  19.     return "uniq_key_e" + row['employee_name'].strip()
  20.  
  21.  
  22. def make_recipient_uniq_key(row):
  23.     return "uniq_key_r" + row['recipient_name'].strip()
  24.  
  25.  
  26. def read_input(csv_filename, csv_employee_data):
  27.     employee_data = {}
  28.     recipient_data = {}
  29.     employee_to_recipient = {}
  30.     services_data = {}
  31.     recipient_service_max_data ={}
  32.  
  33.     with open(csv_filename, newline='') as csvfile:
  34.         csvreader = csv.DictReader(csvfile, delimiter=';')
  35.  
  36.         count_row = 0
  37.         for row in csvreader:
  38.             # pp(row)
  39.             employee_to_recipient\
  40.                 .setdefault(make_employee_uniq_key(row), {})\
  41.                 .setdefault(make_recipient_uniq_key(row), {})\
  42.                 .setdefault('services', {})[int(row['service_number'])] = {
  43.                 'service_count': int(row['service_count']),
  44.                 # 'service_number': int(row['service_number'])
  45.             }
  46.  
  47.             # employee_data.setdefault( make_employee_uniq_key(row), {
  48.             #     'employee_name': row['employee_name'].strip(),
  49.             #     'service_max_time': Decimal(row['service_max_time'].replace(',', '.')),
  50.             # })
  51.  
  52.             recipient_data.setdefault(make_recipient_uniq_key(row), {
  53.                 'recipient_name': row['recipient_name'].strip(),
  54.             })
  55.  
  56.             print("%d -> %s %s" % (count_row, row['one_service_time'], row['max']))
  57.             #SHIT SHIT SHIT
  58.             if not row['one_service_time']:
  59.                 row['one_service_time'] = '0'
  60.  
  61.             if not row['max']:
  62.                 row['max'] = '0'
  63.             #SHIT SHIT SHIT
  64.  
  65.             services_data[int(row['service_number'])] = {
  66.                 # 'service_number': int(row['service_number']),
  67.                 'one_service_time': Decimal(row['one_service_time'].replace(',', '.')),
  68.             }
  69.  
  70.             recipient_service_max_data[(make_recipient_uniq_key(row), int(row['service_number']))]=\
  71.                 int(row['max'])
  72.  
  73.             count_row +=1
  74.             if DEBUG and count_row >= DEBUG_READ_ROWS:
  75.                 break
  76.  
  77.     with open(csv_employee_data, newline='') as csvfile:
  78.         csvreader = csv.DictReader(csvfile, delimiter=';')
  79.         for row in csvreader:
  80.             if row['service_max_time'] == '' and row['employee_name'].strip() == '':
  81.                 continue
  82.  
  83.             pp(row)
  84.             row['service_max_time'] = re.sub('\s+', '', row['service_max_time'])
  85.             if row['service_max_time'] == '-':
  86.                 continue
  87.             employee_data.setdefault(make_employee_uniq_key(row), {
  88.                 'employee_name': row['employee_name'].strip(),
  89.                 'service_max_time': Decimal(row['service_max_time'].replace(',', '.')),
  90.             })
  91.  
  92.     # print(count_row)
  93.  
  94.     return employee_data, employee_to_recipient, recipient_data, services_data, recipient_service_max_data
  95.  
  96. def make_report(fot_filename, analiz_filename, result_filename):
  97.  
  98.     result = {}
  99.     employee_data, employee_to_recipient, recipient_data, services_data, recipient_service_max_data = read_input(
  100.         fot_filename,
  101.         # './january/ФОТ-Tаблица 1.csv',
  102.         analiz_filename,
  103.         # './january/Анализ ЗП-Tаблица 1.csv',
  104.     )
  105.  
  106.     # pp(recipient_service_max_data)
  107.     # result_filename = './result_january.csv'
  108.     result_filename = result_filename
  109.  
  110.  
  111.     OPTIONAL_SERVICE_NUMBERS = list(set(services_data.keys()) - set(REQUIRED_SERVICE_NUMBERS))
  112.  
  113.     for employee_key in employee_to_recipient:
  114.         if employee_key not in employee_data:
  115.             print("skip employee_key %s", employee_key)
  116.             continue
  117.  
  118.         employee = employee_data[employee_key]
  119.  
  120.         service_number_list = REQUIRED_SERVICE_NUMBERS
  121.         while True:
  122.             # if service_number_list == REQUIRED_SERVICE_NUMBERS:
  123.             #     print("REQUIRED_SERVICE_NUMBERS")
  124.             # if service_number_list == OPTIONAL_SERVICE_NUMBERS:
  125.             #     print("OPTIONAL_SERVICE_NUMBERS")
  126.  
  127.             employee_time_before = employee['service_max_time']
  128.  
  129.             for recipient_key, r2e in employee_to_recipient[employee_key].items():
  130.                 recipient = recipient_data[recipient_key]
  131.                 for service_number in service_number_list:
  132.                     one_service_time = services_data[service_number]['one_service_time']
  133.  
  134.                     if service_number not in r2e['services']:
  135.                         continue
  136.                     if r2e['services'][service_number]['service_count'] <= 0:
  137.                         continue
  138.                     if (employee['service_max_time'] - services_data[service_number]['one_service_time']) < 0:
  139.                         continue
  140.  
  141.                     recipient_service_max_data.setdefault((recipient_key, service_number), 0)
  142.                     if recipient_service_max_data[(recipient_key, service_number)] == 0:
  143.                         continue
  144.  
  145.                     # print(
  146.                     #     ((employee['employee_name'], recipient['recipient_name'], service_number), one_service_time), employee['service_max_time'] - one_service_time
  147.                     # )
  148.                     result[(employee_key, recipient_key, service_number)] = (result.get((employee_key, recipient_key, service_number)) or 0) + one_service_time
  149.  
  150.                     recipient_service_max_data[(recipient_key, service_number)] -= 1
  151.                     r2e['services'][service_number]['service_count'] -= 1
  152.                     employee['service_max_time'] -= one_service_time
  153.  
  154.             employee_time_after = employee['service_max_time']
  155.  
  156.             if employee_time_before == employee_time_after:
  157.                 if service_number_list == REQUIRED_SERVICE_NUMBERS:
  158.                     service_number_list = OPTIONAL_SERVICE_NUMBERS
  159.                     continue
  160.                 if service_number_list == OPTIONAL_SERVICE_NUMBERS:
  161.                     break
  162.  
  163.         # print('-------------------')
  164.         # print(employee)
  165.         # for recipient_key, r2e in employee_to_recipient[employee_key].items():
  166.         #     print("REQ:", recipient_data[recipient_key]['recipient_name'], [(service_number, r2e['services'].get(service_number)) for service_number in REQUIRED_SERVICE_NUMBERS])
  167.         #     print("OPT:", recipient_data[recipient_key]['recipient_name'], [(service_number, r2e['services'].get(service_number)) for service_number in OPTIONAL_SERVICE_NUMBERS])
  168.         # print('-------------------')
  169.  
  170.     for key, value in result.items():
  171.         employee_key, recipient_key, service_number = key
  172.         # print((employee_data[employee_key]['employee_name'], recipient_data[recipient_key]['recipient_name'], service_number, value))
  173.  
  174.  
  175.     with open(result_filename, 'w') as csvfile:
  176.         fieldnames = ['employee_name', 'recipient_name', 'service_number', 'service_count', 'service_time']
  177.         writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
  178.         writer.writeheader()
  179.  
  180.         for key, value in result.items():
  181.             employee_key, recipient_key, service_number = key
  182.             # print((employee_data[employee_key]['employee_name'], recipient_data[recipient_key]['recipient_name'], service_number, value))
  183.             writer.writerow({
  184.                 'employee_name': employee_data[employee_key]['employee_name'],
  185.                 'recipient_name':  recipient_data[recipient_key]['recipient_name'],
  186.                 'service_number': service_number,
  187.                 'service_time': value,
  188.                 'service_count': value / services_data[service_number]['one_service_time']
  189.             })
  190.  
  191.  
  192. def main():
  193.     # make_report(
  194.     #     './january/ФОТ-Tаблица 1.csv',
  195.     #     './january/Анализ ЗП-Tаблица 1.csv',
  196.     #     './result_january.csv',
  197.     # )
  198.  
  199.     make_report(
  200.         './january_ver2/ФОТ-Tаблица 1.csv',
  201.         './january_ver2/Анализ ЗП-Tаблица 1.csv',
  202.         './result_january_ver2.csv',
  203.     )
  204.  
  205.     make_report(
  206.         './februrary_ver2/ФОТ-Tаблица 1.csv',
  207.         './februrary_ver2/Анализ ЗП fin-Tаблица 1.csv',
  208.         './result_fevral_ver2.csv',
  209.     )
  210.  
  211.  
  212.     make_report(
  213.         './mart_ver2/ФОТ-Tаблица 1.csv',
  214.         './mart_ver2/Анализ ЗП fin-Tаблица 1.csv',
  215.         './result_mart_ver2.csv' ,
  216.     )
  217.     #
  218.  
  219.     make_report(
  220.         './aprel_ver2/ФОТ-Tаблица 1.csv',
  221.         './aprel_ver2/Анализ ЗП fin-Tаблица 1.csv',
  222.         './result_aprel_ver2.csv' ,
  223.     )
  224.     return
  225.  
  226.  
  227. if __name__ == "__main__":
  228.     main()
  229.     print("__THE_END__")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement