From 1bbef4adb0ec93f0dcd9d2e1f0cf54c2d7e8976e Mon Sep 17 00:00:00 2001 From: spanyala <31629295+spanyala@users.noreply.github.com> Date: Mon, 1 Jun 2020 21:09:23 -0400 Subject: [PATCH 01/17] Fne all satheesh sprint30 (#172) * SF Memo text changes * fixed loan due date issue * fixed memoDescription for SH transactions * SL child print fix * fixed refund without election code --- routes/src/form3x.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index 399356b..4a0c323 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -4074,7 +4074,7 @@ def build_contributor_name_date_dict(index, key, sa_schedule_dict, sa_schedule_p sa_schedule_page_dict["contributorName_" + str(index)] = sa_schedule_dict['contributorOrgName'] del sa_schedule_dict['contributorOrgName'] - if 'electionCode' in sa_schedule_dict: + if 'electionCode' in sa_schedule_dict and sa_schedule_dict['electionCode']: key = 'electionCode' if sa_schedule_dict[key][0] in ['P', 'G']: sa_schedule_dict['electionType'] = sa_schedule_dict[key][0:1] From 7d7f02942cb7cece39c7d903e19ee8b0bf71929e Mon Sep 17 00:00:00 2001 From: spanyala <31629295+spanyala@users.noreply.github.com> Date: Tue, 2 Jun 2020 16:13:34 -0400 Subject: [PATCH 02/17] Fne all satheesh sprint30 (#174) * SF Memo text changes * fixed loan due date issue * fixed memoDescription for SH transactions * SL child print fix * fixed refund without election code * SA Memo Text changes --- routes/src/form3x.py | 85 +++++++++++++++++++++++++++++++++----------- 1 file changed, 64 insertions(+), 21 deletions(-) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index 4a0c323..a296cf7 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -1116,72 +1116,72 @@ def process_schedules(f3x_data, md5_directory, total_no_of_pages): process_sa_line(f3x_data, md5_directory, '11AI', sa_11a, sa_11a_page_cnt, sa_11a_start_page, sa_11a_last_page_cnt, total_no_of_pages) sa_11a_memo_start_page = sa_11a_start_page + sa_11a_page_cnt - process_sa_memo(f3x_data, md5_directory, '11AI', sa_11a_memo, sa_11a_memo_page_cnt, sa_11a_memo_start_page, - sa_11a_memo_last_page_cnt, total_no_of_pages) + # process_sa_memo(f3x_data, md5_directory, '11AI', sa_11a_memo, sa_11a_memo_page_cnt, sa_11a_memo_start_page, + # sa_11a_memo_last_page_cnt, total_no_of_pages) # process Schedule 11B sa_11b_start_page = sa_11a_memo_start_page + sa_11a_memo_page_cnt process_sa_line(f3x_data, md5_directory, '11B', sa_11b, sa_11b_page_cnt, sa_11b_start_page, sa_11b_last_page_cnt, total_no_of_pages) sa_11b_memo_start_page = sa_11b_start_page + sa_11b_page_cnt - process_sa_memo(f3x_data, md5_directory, '11B', sa_11b_memo, sa_11b_memo_page_cnt, sa_11b_memo_start_page, - sa_11b_memo_last_page_cnt, total_no_of_pages) + # process_sa_memo(f3x_data, md5_directory, '11B', sa_11b_memo, sa_11b_memo_page_cnt, sa_11b_memo_start_page, + # sa_11b_memo_last_page_cnt, total_no_of_pages) # process Schedule 11C sa_11c_start_page = sa_11b_memo_start_page + sa_11b_memo_page_cnt process_sa_line(f3x_data, md5_directory, '11C', sa_11c, sa_11c_page_cnt, sa_11c_start_page, sa_11c_last_page_cnt, total_no_of_pages) sa_11c_memo_start_page = sa_11c_start_page + sa_11c_page_cnt - process_sa_memo(f3x_data, md5_directory, '11C', sa_11c_memo, sa_11c_memo_page_cnt, sa_11c_memo_start_page, - sa_11c_memo_last_page_cnt, total_no_of_pages) + # process_sa_memo(f3x_data, md5_directory, '11C', sa_11c_memo, sa_11c_memo_page_cnt, sa_11c_memo_start_page, + # sa_11c_memo_last_page_cnt, total_no_of_pages) # process Schedule 12 sa_12_start_page = sa_11c_start_page + sa_11c_page_cnt process_sa_line(f3x_data, md5_directory, '12', sa_12, sa_12_page_cnt, sa_12_start_page, sa_12_last_page_cnt, total_no_of_pages) sa_12_memo_start_page = sa_12_start_page + sa_12_page_cnt - process_sa_memo(f3x_data, md5_directory, '12', sa_12_memo, sa_12_memo_page_cnt, sa_12_memo_start_page, - sa_12_memo_last_page_cnt, total_no_of_pages) + # process_sa_memo(f3x_data, md5_directory, '12', sa_12_memo, sa_12_memo_page_cnt, sa_12_memo_start_page, + # sa_12_memo_last_page_cnt, total_no_of_pages) # process Schedule 13 sa_13_start_page = sa_12_start_page + sa_12_page_cnt process_sa_line(f3x_data, md5_directory, '13', sa_13, sa_13_page_cnt, sa_13_start_page, sa_13_last_page_cnt, total_no_of_pages) sa_13_memo_start_page = sa_13_start_page + sa_13_page_cnt - process_sa_memo(f3x_data, md5_directory, '13', sa_13_memo, sa_13_memo_page_cnt, sa_13_memo_start_page, - sa_13_memo_last_page_cnt, total_no_of_pages) + # process_sa_memo(f3x_data, md5_directory, '13', sa_13_memo, sa_13_memo_page_cnt, sa_13_memo_start_page, + # sa_13_memo_last_page_cnt, total_no_of_pages) # process Schedule 14 sa_14_start_page = sa_13_start_page + sa_13_page_cnt process_sa_line(f3x_data, md5_directory, '14', sa_14, sa_14_page_cnt, sa_14_start_page, sa_14_last_page_cnt, total_no_of_pages) sa_14_memo_start_page = sa_14_start_page + sa_14_page_cnt - process_sa_memo(f3x_data, md5_directory, '14', sa_14_memo, sa_14_memo_page_cnt, sa_14_memo_start_page, - sa_14_memo_last_page_cnt, total_no_of_pages) + # process_sa_memo(f3x_data, md5_directory, '14', sa_14_memo, sa_14_memo_page_cnt, sa_14_memo_start_page, + # sa_14_memo_last_page_cnt, total_no_of_pages) # process Schedule 15 sa_15_start_page = sa_14_start_page + sa_14_page_cnt process_sa_line(f3x_data, md5_directory, '15', sa_15, sa_15_page_cnt, sa_15_start_page, sa_15_last_page_cnt, total_no_of_pages) sa_15_memo_start_page = sa_15_start_page + sa_15_page_cnt - process_sa_memo(f3x_data, md5_directory, '15', sa_15_memo, sa_15_memo_page_cnt, sa_15_memo_start_page, - sa_15_memo_last_page_cnt, total_no_of_pages) + # process_sa_memo(f3x_data, md5_directory, '15', sa_15_memo, sa_15_memo_page_cnt, sa_15_memo_start_page, + # sa_15_memo_last_page_cnt, total_no_of_pages) # process Schedule 16 sa_16_start_page = sa_15_start_page + sa_15_page_cnt process_sa_line(f3x_data, md5_directory, '16', sa_16, sa_16_page_cnt, sa_16_start_page, sa_16_last_page_cnt, total_no_of_pages) sa_16_memo_start_page = sa_16_start_page + sa_16_page_cnt - process_sa_memo(f3x_data, md5_directory, '16', sa_16_memo, sa_16_memo_page_cnt, sa_16_memo_start_page, - sa_16_memo_last_page_cnt, total_no_of_pages) + # process_sa_memo(f3x_data, md5_directory, '16', sa_16_memo, sa_16_memo_page_cnt, sa_16_memo_start_page, + # sa_16_memo_last_page_cnt, total_no_of_pages) # process Schedule 17 sa_17_start_page = sa_16_start_page + sa_16_page_cnt process_sa_line(f3x_data, md5_directory, '17', sa_17, sa_17_page_cnt, sa_17_start_page, sa_17_last_page_cnt, total_no_of_pages) sa_17_memo_start_page = sa_17_start_page + sa_17_page_cnt - process_sa_memo(f3x_data, md5_directory, '17', sa_17_memo, sa_17_memo_page_cnt, sa_17_memo_start_page, - sa_17_memo_last_page_cnt, total_no_of_pages) + # process_sa_memo(f3x_data, md5_directory, '17', sa_17_memo, sa_17_memo_page_cnt, sa_17_memo_start_page, + # sa_17_memo_last_page_cnt, total_no_of_pages) @@ -1940,12 +1940,13 @@ def process_sa_line(f3x_data, md5_directory, line_number, sa_line, sa_line_page_ os.makedirs(md5_directory + 'SA/' + line_number, exist_ok=True) sa_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('SA') if sa_line_page_cnt > 0: - sa_memo = [] for sa_page_no in range(sa_line_page_cnt): + # if sa_schedule_page_dict['memoDescription']: # sa_memo_obj = {'memoDescripton':sa_schedule_page_dict['memoDescription'], 'transactionId': sa_schedule_page_dict['transactionId']} # sa_memo.append(sa_memo_obj) page_subtotal = 0.00 + memo_array = [] last_page = False sa_schedule_page_dict = {} sa_schedule_page_dict['lineNumber'] = line_number @@ -1955,9 +1956,10 @@ def process_sa_line(f3x_data, md5_directory, line_number, sa_line, sa_line_page_ if ((sa_page_no + 1) == sa_line_page_cnt): last_page = True # This call prepares data to render on PDF + sa_schedule_dict = build_sa_per_page_schedule_dict(last_page, sa_line_last_page_cnt, page_start_index, sa_schedule_page_dict, - sa_line) + sa_line, memo_array) page_subtotal = float(sa_schedule_page_dict['pageSubtotal']) schedule_total += page_subtotal @@ -1966,6 +1968,35 @@ def process_sa_line(f3x_data, md5_directory, line_number, sa_line, sa_line_page_ sa_schedule_page_dict['committeeName'] = f3x_data['committeeName'] sa_outfile = md5_directory + 'SA/' + line_number + '/page_' + str(sa_page_no) + '.pdf' pypdftk.fill_form(sa_infile, sa_schedule_page_dict, sa_outfile) + # Memo text changes + memo_dict = {} + if len(memo_array) > 1: + sa_temp_memo_outfile = md5_directory + 'SA/' + line_number + '/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + sa_memo_outfile = md5_directory + 'SA/' + line_number + '/page_memo_' + str(sa_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + if len(memo_array) >= 2: + memo_dict['scheduleName_2'] = memo_array[1]['scheduleName'] + memo_dict['memoDescription_2'] = memo_array[1]['memoDescription'] + memo_dict['transactionId_2'] = memo_array[1]['transactionId'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, sa_memo_outfile) + pypdftk.concat([sa_outfile, sa_memo_outfile], sa_temp_memo_outfile) + os.remove(sa_memo_outfile) + os.rename(sa_temp_memo_outfile, sa_outfile) + + if len(memo_array) >= 3: + memo_dict = {} + sa_memo_outfile = md5_directory + 'SA/' + line_number + '/page_memo_' + str(sa_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + pypdftk.fill_form(memo_infile, memo_dict, sa_memo_outfile) + pypdftk.concat([sa_outfile, sa_memo_outfile], sa_temp_memo_outfile) + os.remove(sa_memo_outfile) + os.rename(sa_temp_memo_outfile, sa_outfile) pypdftk.concat(directory_files(md5_directory + 'SA/' + line_number + '/'), md5_directory + 'SA/' + line_number + '/all_pages.pdf') # if len(sa_memo) > 0: @@ -3375,10 +3406,16 @@ def process_sh_line_numbers(sh_30a, sh_21a,sh_18b, sh_18a, sh_h1, sh_h2, sh_h2.append(sh_obj) +def process_memo_text(schedule_dict, memo_array): + if 'memoDescription' in schedule_dict and schedule_dict['memoDescription']: + memo_array.append( + {'scheduleName': 'SA' + schedule_dict['lineNumber'], + 'memoDescription': schedule_dict['memoDescription'], + 'transactionId': schedule_dict['transactionId']}) # This method builds data for individual SA page def build_sa_per_page_schedule_dict(last_page, transactions_in_page, page_start_index, sa_schedule_page_dict, - sa_schedules): + sa_schedules, sa_memo): page_subtotal = 0.00 if not last_page: transactions_in_page = 3 @@ -3386,33 +3423,39 @@ def build_sa_per_page_schedule_dict(last_page, transactions_in_page, page_start_ if transactions_in_page == 1: index = 1 sa_schedule_dict = sa_schedules[page_start_index + 0] + process_memo_text(sa_schedule_dict, sa_memo) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) elif transactions_in_page == 2: index = 1 sa_schedule_dict = sa_schedules[page_start_index + 0] + process_memo_text(sa_schedule_dict, sa_memo) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) index = 2 sa_schedule_dict = sa_schedules[page_start_index + 1] + process_memo_text(sa_schedule_dict, sa_memo) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) elif transactions_in_page == 3: index = 1 sa_schedule_dict = sa_schedules[page_start_index + 0] + process_memo_text(sa_schedule_dict, sa_memo) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) index = 2 sa_schedule_dict = sa_schedules[page_start_index + 1] + process_memo_text(sa_schedule_dict, sa_memo) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) index = 3 sa_schedule_dict = sa_schedules[page_start_index + 2] + process_memo_text(sa_schedule_dict, sa_memo) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) From 278a0c84d54f68d94ffb9907989f618af538cdbb Mon Sep 17 00:00:00 2001 From: spanyala <31629295+spanyala@users.noreply.github.com> Date: Tue, 2 Jun 2020 16:33:55 -0400 Subject: [PATCH 03/17] Fne all satheesh sprint30 (#175) * SF Memo text changes * fixed loan due date issue * fixed memoDescription for SH transactions * SL child print fix * fixed refund without election code * SA Memo Text changes * SA Memo Text changes --- routes/src/form3x.py | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index a296cf7..3efe059 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -1116,40 +1116,30 @@ def process_schedules(f3x_data, md5_directory, total_no_of_pages): process_sa_line(f3x_data, md5_directory, '11AI', sa_11a, sa_11a_page_cnt, sa_11a_start_page, sa_11a_last_page_cnt, total_no_of_pages) sa_11a_memo_start_page = sa_11a_start_page + sa_11a_page_cnt - # process_sa_memo(f3x_data, md5_directory, '11AI', sa_11a_memo, sa_11a_memo_page_cnt, sa_11a_memo_start_page, - # sa_11a_memo_last_page_cnt, total_no_of_pages) # process Schedule 11B - sa_11b_start_page = sa_11a_memo_start_page + sa_11a_memo_page_cnt + sa_11b_start_page = sa_11a_start_page + sa_11a_memo_page_cnt process_sa_line(f3x_data, md5_directory, '11B', sa_11b, sa_11b_page_cnt, sa_11b_start_page, sa_11b_last_page_cnt, total_no_of_pages) sa_11b_memo_start_page = sa_11b_start_page + sa_11b_page_cnt - # process_sa_memo(f3x_data, md5_directory, '11B', sa_11b_memo, sa_11b_memo_page_cnt, sa_11b_memo_start_page, - # sa_11b_memo_last_page_cnt, total_no_of_pages) # process Schedule 11C sa_11c_start_page = sa_11b_memo_start_page + sa_11b_memo_page_cnt process_sa_line(f3x_data, md5_directory, '11C', sa_11c, sa_11c_page_cnt, sa_11c_start_page, sa_11c_last_page_cnt, total_no_of_pages) sa_11c_memo_start_page = sa_11c_start_page + sa_11c_page_cnt - # process_sa_memo(f3x_data, md5_directory, '11C', sa_11c_memo, sa_11c_memo_page_cnt, sa_11c_memo_start_page, - # sa_11c_memo_last_page_cnt, total_no_of_pages) # process Schedule 12 - sa_12_start_page = sa_11c_start_page + sa_11c_page_cnt + sa_12_start_page = sa_11c_memo_start_page + sa_11c_page_cnt process_sa_line(f3x_data, md5_directory, '12', sa_12, sa_12_page_cnt, sa_12_start_page, sa_12_last_page_cnt, total_no_of_pages) sa_12_memo_start_page = sa_12_start_page + sa_12_page_cnt - # process_sa_memo(f3x_data, md5_directory, '12', sa_12_memo, sa_12_memo_page_cnt, sa_12_memo_start_page, - # sa_12_memo_last_page_cnt, total_no_of_pages) # process Schedule 13 - sa_13_start_page = sa_12_start_page + sa_12_page_cnt + sa_13_start_page = sa_12_memo_start_page + sa_12_page_cnt process_sa_line(f3x_data, md5_directory, '13', sa_13, sa_13_page_cnt, sa_13_start_page, sa_13_last_page_cnt, total_no_of_pages) sa_13_memo_start_page = sa_13_start_page + sa_13_page_cnt - # process_sa_memo(f3x_data, md5_directory, '13', sa_13_memo, sa_13_memo_page_cnt, sa_13_memo_start_page, - # sa_13_memo_last_page_cnt, total_no_of_pages) # process Schedule 14 sa_14_start_page = sa_13_start_page + sa_13_page_cnt @@ -1970,7 +1960,7 @@ def process_sa_line(f3x_data, md5_directory, line_number, sa_line, sa_line_page_ pypdftk.fill_form(sa_infile, sa_schedule_page_dict, sa_outfile) # Memo text changes memo_dict = {} - if len(memo_array) > 1: + if len(memo_array) >= 1: sa_temp_memo_outfile = md5_directory + 'SA/' + line_number + '/page_memo_temp.pdf' memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') sa_memo_outfile = md5_directory + 'SA/' + line_number + '/page_memo_' + str(sa_page_no) + '.pdf' From ad31f88c93312156f362184306597cbbb249dea8 Mon Sep 17 00:00:00 2001 From: spanyala <31629295+spanyala@users.noreply.github.com> Date: Wed, 3 Jun 2020 09:07:03 -0400 Subject: [PATCH 04/17] Fne all satheesh sprint31 (#176) * SF Memo text changes * fixed loan due date issue * fixed memoDescription for SH transactions * SL child print fix * fixed refund without election code * SA Memo Text changes * SA Memo Text changes * Memo text changes for all schedules * Memo text changes for all schedules * SC memo text removed from template --- routes/src/form3x.py | 1276 +++++++++++++++++++++++++--------------- templates/forms/SC.pdf | Bin 50742 -> 46086 bytes 2 files changed, 815 insertions(+), 461 deletions(-) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index 3efe059..65f1ce9 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -59,7 +59,8 @@ def print_pdftk(stamp_print): json_file.stream.seek(0) md5_directory = current_app.config['OUTPUT_DIR_LOCATION'].format(json_file_md5) - if os.path.isdir(md5_directory): + # checking if server has already generated pdf for same json file + if os.path.isdir(md5_directory) and path.isfile(md5_directory + 'all_pages.pdf'): # push output file to AWS s3 = boto3.client('s3') s3.upload_file(md5_directory + 'all_pages.pdf', @@ -1181,86 +1182,84 @@ def process_schedules(f3x_data, md5_directory, total_no_of_pages): sb_21b_start_page = sb_start_page process_sb_line(f3x_data, md5_directory, '21B', sb_21b, sb_21b_page_cnt, sb_21b_start_page, sb_21b_last_page_cnt, total_no_of_pages) - sb_21b_memo_start_page = sb_21b_start_page + sb_21b_page_cnt - process_sb_memo(f3x_data, md5_directory, '21B', sb_21b_memo, sb_21b_memo_page_cnt, sb_21b_memo_start_page, - sb_21b_memo_last_page_cnt, total_no_of_pages) + # sb_21b_memo_start_page = sb_21b_start_page + sb_21b_page_cnt + # process_sb_memo(f3x_data, md5_directory, '21B', sb_21b_memo, sb_21b_memo_page_cnt, sb_21b_memo_start_page, + # sb_21b_memo_last_page_cnt, total_no_of_pages) # process Schedule 22 sb_22_start_page = sb_21b_start_page + sb_21b_page_cnt process_sb_line(f3x_data, md5_directory, '22', sb_22, sb_22_page_cnt, sb_22_start_page, sb_22_last_page_cnt, total_no_of_pages) - sb_22_memo_start_page = sb_22_start_page + sb_22_page_cnt - process_sb_memo(f3x_data, md5_directory, '22', sb_22_memo, sb_22_memo_page_cnt, sb_22_memo_start_page, - sb_22_memo_last_page_cnt, total_no_of_pages) + # sb_22_memo_start_page = sb_22_start_page + sb_22_page_cnt + # process_sb_memo(f3x_data, md5_directory, '22', sb_22_memo, sb_22_memo_page_cnt, sb_22_memo_start_page, + # sb_22_memo_last_page_cnt, total_no_of_pages) # process Schedule 23 sb_23_start_page = sb_22_start_page + sb_22_page_cnt process_sb_line(f3x_data, md5_directory, '23', sb_23, sb_23_page_cnt, sb_23_start_page, sb_23_last_page_cnt, total_no_of_pages) - sb_23_memo_start_page = sb_23_start_page + sb_23_page_cnt - process_sb_memo(f3x_data, md5_directory, '23', sb_23_memo, sb_23_memo_page_cnt, sb_23_memo_start_page, - sb_23_memo_last_page_cnt, total_no_of_pages) + # sb_23_memo_start_page = sb_23_start_page + sb_23_page_cnt + # process_sb_memo(f3x_data, md5_directory, '23', sb_23_memo, sb_23_memo_page_cnt, sb_23_memo_start_page, + # sb_23_memo_last_page_cnt, total_no_of_pages) # process Schedule 26 sb_26_start_page = sb_23_start_page + sb_23_page_cnt process_sb_line(f3x_data, md5_directory, '26', sb_26, sb_26_page_cnt, sb_26_start_page, sb_26_last_page_cnt, total_no_of_pages) - sb_26_memo_start_page = sb_26_start_page + sb_26_page_cnt - process_sb_memo(f3x_data, md5_directory, '26', sb_26_memo, sb_26_memo_page_cnt, sb_26_memo_start_page, - sb_26_memo_last_page_cnt, total_no_of_pages) + # sb_26_memo_start_page = sb_26_start_page + sb_26_page_cnt + # process_sb_memo(f3x_data, md5_directory, '26', sb_26_memo, sb_26_memo_page_cnt, sb_26_memo_start_page, + # sb_26_memo_last_page_cnt, total_no_of_pages) # process Schedule 27 sb_27_start_page = sb_26_start_page + sb_26_page_cnt process_sb_line(f3x_data, md5_directory, '27', sb_27, sb_27_page_cnt, sb_27_start_page, sb_27_last_page_cnt, total_no_of_pages) - sb_27_memo_start_page = sb_27_start_page + sb_27_page_cnt - process_sb_memo(f3x_data, md5_directory, '27', sb_27_memo, sb_27_memo_page_cnt, sb_27_memo_start_page, - sb_27_memo_last_page_cnt, total_no_of_pages) + # sb_27_memo_start_page = sb_27_start_page + sb_27_page_cnt + # process_sb_memo(f3x_data, md5_directory, '27', sb_27_memo, sb_27_memo_page_cnt, sb_27_memo_start_page, + # sb_27_memo_last_page_cnt, total_no_of_pages) # process Schedule 28A sb_28a_start_page = sb_27_start_page + sb_27_page_cnt process_sb_line(f3x_data, md5_directory, '28A', sb_28a, sb_28a_page_cnt, sb_28a_start_page, sb_28a_last_page_cnt, total_no_of_pages) - sb_28a_memo_start_page = sb_28a_start_page + sb_28a_page_cnt - process_sb_memo(f3x_data, md5_directory, '28A', sb_28a_memo, sb_28a_memo_page_cnt, sb_28a_memo_start_page, - sb_28a_memo_last_page_cnt, total_no_of_pages) + # sb_28a_memo_start_page = sb_28a_start_page + sb_28a_page_cnt + # process_sb_memo(f3x_data, md5_directory, '28A', sb_28a_memo, sb_28a_memo_page_cnt, sb_28a_memo_start_page, + # sb_28a_memo_last_page_cnt, total_no_of_pages) # process Schedule 28B sb_28b_start_page = sb_28a_start_page + sb_28a_page_cnt process_sb_line(f3x_data, md5_directory, '28B', sb_28b, sb_28b_page_cnt, sb_28b_start_page, sb_28b_last_page_cnt, total_no_of_pages) - sb_28b_memo_start_page = sb_28b_start_page + sb_28b_page_cnt - process_sb_memo(f3x_data, md5_directory, '28B', sb_28b_memo, sb_28b_memo_page_cnt, sb_28b_memo_start_page, - sb_28b_memo_last_page_cnt, total_no_of_pages) + # sb_28b_memo_start_page = sb_28b_start_page + sb_28b_page_cnt + # process_sb_memo(f3x_data, md5_directory, '28B', sb_28b_memo, sb_28b_memo_page_cnt, sb_28b_memo_start_page, + # sb_28b_memo_last_page_cnt, total_no_of_pages) # process Schedule 28C sb_28c_start_page = sb_28b_start_page + sb_28b_page_cnt process_sb_line(f3x_data, md5_directory, '28C', sb_28c, sb_28c_page_cnt, sb_28c_start_page, sb_28c_last_page_cnt, total_no_of_pages) - sb_28c_memo_start_page = sb_28c_start_page + sb_28c_page_cnt - process_sb_memo(f3x_data, md5_directory, '28C', sb_28c_memo, sb_28c_memo_page_cnt, sb_28c_memo_start_page, - sb_28c_memo_last_page_cnt, total_no_of_pages) + # sb_28c_memo_start_page = sb_28c_start_page + sb_28c_page_cnt + # process_sb_memo(f3x_data, md5_directory, '28C', sb_28c_memo, sb_28c_memo_page_cnt, sb_28c_memo_start_page, + # sb_28c_memo_last_page_cnt, total_no_of_pages) # process Schedule 29 sb_29_start_page = sb_28c_start_page + sb_28c_page_cnt process_sb_line(f3x_data, md5_directory, '29', sb_29, sb_29_page_cnt, sb_29_start_page, sb_29_last_page_cnt, total_no_of_pages) - sb_29_memo_start_page = sb_29_start_page + sb_29_page_cnt - process_sb_memo(f3x_data, md5_directory, '29', sb_29_memo, sb_29_memo_page_cnt, sb_29_memo_start_page, - sb_29_memo_last_page_cnt, total_no_of_pages) + # sb_29_memo_start_page = sb_29_start_page + sb_29_page_cnt + # process_sb_memo(f3x_data, md5_directory, '29', sb_29_memo, sb_29_memo_page_cnt, sb_29_memo_start_page, + # sb_29_memo_last_page_cnt, total_no_of_pages) # process Schedule 30B sb_30b_start_page = sb_29_start_page + sb_29_page_cnt process_sb_line(f3x_data, md5_directory, '30B', sb_30b, sb_30b_page_cnt, sb_30b_start_page, sb_30b_last_page_cnt, total_no_of_pages) - sb_30b_memo_start_page = sb_30b_start_page + sb_30b_page_cnt - process_sb_memo(f3x_data, md5_directory, '30B', sb_30b_memo, sb_30b_memo_page_cnt, sb_30b_memo_start_page, - sb_30b_memo_last_page_cnt, total_no_of_pages) + # sb_30b_memo_start_page = sb_30b_start_page + sb_30b_page_cnt + # process_sb_memo(f3x_data, md5_directory, '30B', sb_30b_memo, sb_30b_memo_page_cnt, sb_30b_memo_start_page, + # sb_30b_memo_last_page_cnt, total_no_of_pages) if 'SC' in schedules and sc_schedules_cnt > 0: sc1_list, sc1_start_page, totalOutstandingLoans = process_sc_line(f3x_data, md5_directory, sc_schedules, sc_start_page, total_no_of_pages) - # sc_memo_start_page = sc_start_page + 1 - # process_sc_memo(f3x_data, md5_directory, sc_schedules, sc_memo_start_page, total_no_of_pages) else: sc1_list = [] @@ -1276,17 +1275,17 @@ def process_schedules(f3x_data, md5_directory, total_no_of_pages): se_24_start_page = se_start_page process_se_line(f3x_data, md5_directory, '24', se_24, se_24_page_cnt, se_24_start_page, se_24_last_page_cnt, total_no_of_pages) - se_24_memo_start_page = se_24_start_page + se_24_page_cnt - process_se_memo(f3x_data, md5_directory, '24', se_24_memo, se_24_memo_page_cnt, se_24_memo_start_page, - se_24_memo_last_page_cnt, total_no_of_pages) + # se_24_memo_start_page = se_24_start_page + se_24_page_cnt + # process_se_memo(f3x_data, md5_directory, '24', se_24_memo, se_24_memo_page_cnt, se_24_memo_start_page, + # se_24_memo_last_page_cnt, total_no_of_pages) if la_schedules_cnt > 0: la_1a_start_page = la_start_page process_la_line(f3x_data, md5_directory, '1A', la_1a, la_1a_page_cnt, la_1a_start_page, la_1a_last_page_cnt, total_no_of_pages) la_1a_memo_start_page = la_1a_start_page + la_1a_page_cnt - process_la_memo(f3x_data, md5_directory, '1A', la_1a_memo, la_1a_memo_page_cnt, la_1a_memo_start_page, - la_1a_memo_last_page_cnt, total_no_of_pages) + # process_la_memo(f3x_data, md5_directory, '1A', la_1a_memo, la_1a_memo_page_cnt, la_1a_memo_start_page, + # la_1a_memo_last_page_cnt, total_no_of_pages) # process Schedule 11B @@ -1294,8 +1293,8 @@ def process_schedules(f3x_data, md5_directory, total_no_of_pages): process_la_line(f3x_data, md5_directory, '2', la_2, la_2_page_cnt, la_2_start_page, la_2_last_page_cnt, total_no_of_pages) la_2_memo_start_page = la_2_start_page + la_2_page_cnt - process_la_memo(f3x_data, md5_directory, '2', la_2_memo, la_2_memo_page_cnt, la_2_memo_start_page, - la_2_memo_last_page_cnt, total_no_of_pages) + # process_la_memo(f3x_data, md5_directory, '2', la_2_memo, la_2_memo_page_cnt, la_2_memo_start_page, + # la_2_memo_last_page_cnt, total_no_of_pages) if sf_schedules_cnt > 0: count = 0 @@ -1373,8 +1372,8 @@ def process_schedules(f3x_data, md5_directory, total_no_of_pages): sf_memo_start_page = sf_crd_start_page + sf_crd_page_cnt - process_sf_memo(f3x_data, md5_directory, '25', sf_memo, sf_memo_page_cnt, - sf_memo_start_page, sf_memo_last_page_cnt, total_no_of_pages, cord_name) + # process_sf_memo(f3x_data, md5_directory, '25', sf_memo, sf_memo_page_cnt, + # sf_memo_start_page, sf_memo_last_page_cnt, total_no_of_pages, cord_name) if slb_schedules_cnt > 0: @@ -1382,72 +1381,72 @@ def process_schedules(f3x_data, md5_directory, total_no_of_pages): process_slb_line(f3x_data, md5_directory, '4A', slb_4a, slb_4a_page_cnt, slb_4a_start_page, slb_4a_last_page_cnt, total_no_of_pages) slb_4a_memo_start_page = slb_4a_start_page + slb_4a_memo_page_cnt - process_slb_memo(f3x_data, md5_directory, '4A', slb_4a_memo, slb_4a_memo_page_cnt, slb_4a_memo_start_page, - slb_4a_memo_last_page_cnt, total_no_of_pages) + # process_slb_memo(f3x_data, md5_directory, '4A', slb_4a_memo, slb_4a_memo_page_cnt, slb_4a_memo_start_page, + # slb_4a_memo_last_page_cnt, total_no_of_pages) # process Schedule 4b slb_4b_start_page = slb_4a_start_page + slb_4a_page_cnt process_slb_line(f3x_data, md5_directory, '4B', slb_4b, slb_4b_page_cnt, slb_4b_start_page, slb_4b_last_page_cnt, total_no_of_pages) slb_4b_memo_start_page = slb_4b_start_page + slb_4b_page_cnt - process_slb_memo(f3x_data, md5_directory, '4B', slb_4b_memo, slb_4b_memo_page_cnt, slb_4b_memo_start_page, - slb_4b_memo_last_page_cnt, total_no_of_pages) + # process_slb_memo(f3x_data, md5_directory, '4B', slb_4b_memo, slb_4b_memo_page_cnt, slb_4b_memo_start_page, + # slb_4b_memo_last_page_cnt, total_no_of_pages) # process Schedule 4c slb_4c_start_page = slb_4b_start_page + slb_4b_page_cnt process_slb_line(f3x_data, md5_directory, '4C', slb_4c, slb_4c_page_cnt, slb_4c_start_page, slb_4c_last_page_cnt, total_no_of_pages) slb_4c_memo_start_page = slb_4c_start_page + slb_4c_page_cnt - process_slb_memo(f3x_data, md5_directory, '4C', slb_4c_memo, slb_4c_memo_page_cnt, slb_4c_memo_start_page, - slb_4c_memo_last_page_cnt, total_no_of_pages) + # process_slb_memo(f3x_data, md5_directory, '4C', slb_4c_memo, slb_4c_memo_page_cnt, slb_4c_memo_start_page, + # slb_4c_memo_last_page_cnt, total_no_of_pages) # process Schedule 4d slb_4d_start_page = slb_4c_start_page + slb_4c_page_cnt process_slb_line(f3x_data, md5_directory, '4D', slb_4d, slb_4d_page_cnt, slb_4d_start_page, slb_4d_last_page_cnt, total_no_of_pages) slb_4d_memo_start_page = slb_4d_start_page + slb_4d_page_cnt - process_slb_memo(f3x_data, md5_directory, '4D', slb_4d_memo, slb_4d_memo_page_cnt, slb_4d_memo_start_page, - slb_4d_memo_last_page_cnt, total_no_of_pages) + # process_slb_memo(f3x_data, md5_directory, '4D', slb_4d_memo, slb_4d_memo_page_cnt, slb_4d_memo_start_page, + # slb_4d_memo_last_page_cnt, total_no_of_pages) # process Schedule 5 slb_5_start_page = slb_4d_start_page + slb_4d_page_cnt process_slb_line(f3x_data, md5_directory, '5', slb_5, slb_5_page_cnt, slb_5_start_page, slb_5_last_page_cnt, total_no_of_pages) slb_5_memo_start_page = slb_5_start_page + slb_5_page_cnt - process_slb_memo(f3x_data, md5_directory, '5', slb_5_memo, slb_5_memo_page_cnt, slb_5_memo_start_page, - slb_5_memo_last_page_cnt, total_no_of_pages) + # process_slb_memo(f3x_data, md5_directory, '5', slb_5_memo, slb_5_memo_page_cnt, slb_5_memo_start_page, + # slb_5_memo_last_page_cnt, total_no_of_pages) if sh6_schedules_cnt > 0: sh_30a_start_page = total_no_of_pages process_sh6_line(f3x_data, md5_directory, '30A', sh_30a, sh_30a_page_cnt, sh_30a_start_page, sh_30a_last_page_cnt, total_no_of_pages) sh_30a_memo_start_page = sh_30a_start_page + sh_30a_page_cnt - process_sh_memo(f3x_data, md5_directory, 'SH6/', '30A', sh_30a_memo, sh_30a_memo_page_cnt, sh_30a_memo_start_page, - sh_30a_memo_last_page_cnt, total_no_of_pages) + # process_sh_memo(f3x_data, md5_directory, 'SH6/', '30A', sh_30a_memo, sh_30a_memo_page_cnt, sh_30a_memo_start_page, + # sh_30a_memo_last_page_cnt, total_no_of_pages) if sh4_schedules_cnt > 0: sh_21a_start_page = total_no_of_pages process_sh4_line(f3x_data, md5_directory, '21A', sh_21a, sh_21a_page_cnt, sh_21a_start_page, sh_21a_last_page_cnt, total_no_of_pages) sh_21a_memo_start_page = sh_21a_start_page + sh_21a_page_cnt - process_sh_memo(f3x_data, md5_directory, 'SH4/', '21A', sh_21a_memo, sh_21a_memo_page_cnt, sh_21a_memo_start_page, - sh_21a_memo_last_page_cnt, total_no_of_pages) + # process_sh_memo(f3x_data, md5_directory, 'SH4/', '21A', sh_21a_memo, sh_21a_memo_page_cnt, sh_21a_memo_start_page, + # sh_21a_memo_last_page_cnt, total_no_of_pages) if sh5_schedules_cnt > 0: sh_18b_start_page = total_no_of_pages process_sh5_line(f3x_data, md5_directory, '18B', sh_18b, sh_18b_page_cnt, sh_18b_start_page, sh_18b_last_page_cnt, total_no_of_pages) sh_18b_memo_start_page = sh_18b_start_page + sh_18b_page_cnt - process_sh_memo(f3x_data, md5_directory, 'SH5/', '18B', sh_18b_memo, sh_18b_memo_page_cnt, sh_18b_memo_start_page, - sh_18b_memo_last_page_cnt, total_no_of_pages) + # process_sh_memo(f3x_data, md5_directory, 'SH5/', '18B', sh_18b_memo, sh_18b_memo_page_cnt, sh_18b_memo_start_page, + # sh_18b_memo_last_page_cnt, total_no_of_pages) if sh3_schedules_cnt > 0: sh_18a_start_page = total_no_of_pages process_sh3_line(f3x_data, md5_directory, '18A', sh_18a, sh_18a_page_cnt, sh_18a_start_page, sh_18a_last_page_cnt, total_no_of_pages) sh_18a_memo_start_page = sh_18a_start_page + sh_18a_page_cnt - process_sh_memo(f3x_data, md5_directory, 'SH3/', '18A', sh_18a_memo, sh_18a_memo_page_cnt, sh_18a_memo_start_page, - sh_18a_memo_last_page_cnt, total_no_of_pages) + # process_sh_memo(f3x_data, md5_directory, 'SH3/', '18A', sh_18a_memo, sh_18a_memo_page_cnt, sh_18a_memo_start_page, + # sh_18a_memo_last_page_cnt, total_no_of_pages) if sh1_schedules_cnt > 0: tran_type_ident = sh_h1[0]['transactionTypeIdentifier'] @@ -1608,6 +1607,7 @@ def process_sc_line(f3x_data, md5_directory, sc_schedules, sc_start_page, total_ totalOutstandingLoans = '0.00' for sc in sc_schedules: page_subtotal = '{0:.2f}'.format(float(sc.get('loanBalance'))) + memo_array = [] sc_schedule_total += float(page_subtotal) sc_schedule_page_dict = {} sc_schedule_page_dict['TRANSACTION_ID'] = sc.get('transactionId') @@ -1683,6 +1683,21 @@ def process_sc_line(f3x_data, md5_directory, sc_schedules, sc_start_page, total_ totalOutstandingLoans = sc_schedule_single_page_dict['scheduleTotal'] = '{0:.2f}'.format(sc_schedule_total) sc_outfile = md5_directory + 'SC' + '/page_' + str(sc_start_page) + '.pdf' pypdftk.fill_form(sc_infile, sc_schedule_single_page_dict, sc_outfile) + # Memo text changes + if 'memoDescription' in sc_schedule_page_dict and sc_schedule_page_dict['memoDescription']: + memo_dict = {} + temp_memo_outfile = md5_directory + 'SC/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SC/page_memo_' + str(sc_start_page) + '.pdf' + memo_dict['scheduleName_1'] = 'SC13' + memo_dict['memoDescription_1'] = sc_schedule_page_dict['memoDescription'] + if 'TRANSACTION_ID' in sc_schedule_page_dict and sc_schedule_page_dict['TRANSACTION_ID']: + memo_dict['transactionId_1'] = sc_schedule_page_dict['TRANSACTION_ID'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sc_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sc_outfile) for j in range(len(sc2_list_list[i])): del sc_schedule_single_page_dict['name{}'.format(j+1)] del sc_schedule_single_page_dict['street1_{}'.format(j+1)] @@ -1706,6 +1721,21 @@ def process_sc_line(f3x_data, md5_directory, sc_schedules, sc_start_page, total_ totalOutstandingLoans = sc_schedule_page_dict['scheduleTotal'] = '{0:.2f}'.format(sc_schedule_total) sc_outfile = md5_directory + 'SC' + '/page_' + str(sc_start_page) + '.pdf' pypdftk.fill_form(sc_infile, sc_schedule_page_dict, sc_outfile) + # Memo text changes + if 'memoDescription' in sc_schedule_page_dict and sc_schedule_page_dict['memoDescription']: + memo_dict = {} + temp_memo_outfile = md5_directory + 'SC/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SC/page_memo_' + str(sc_start_page) + '.pdf' + memo_dict['scheduleName_1'] = 'SC13' + memo_dict['memoDescription_1'] = sc_schedule_page_dict['memoDescription'] + if 'TRANSACTION_ID' in sc_schedule_page_dict and sc_schedule_page_dict['TRANSACTION_ID']: + memo_dict['transactionId_1'] = sc_schedule_page_dict['TRANSACTION_ID'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sc_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sc_outfile) if path.isfile(md5_directory + 'SC/all_pages.pdf'): pypdftk.concat([md5_directory + 'SC/all_pages.pdf', md5_directory + 'SC' + '/page_' + str(sc_start_page) + '.pdf'], md5_directory + 'SC/temp_all_pages.pdf') @@ -1719,6 +1749,22 @@ def process_sc_line(f3x_data, md5_directory, sc_schedules, sc_start_page, total_ totalOutstandingLoans = sc_schedule_page_dict['scheduleTotal'] = '{0:.2f}'.format(sc_schedule_total) sc_outfile = md5_directory + 'SC' + '/page_' + str(sc_start_page) + '.pdf' pypdftk.fill_form(sc_infile, sc_schedule_page_dict, sc_outfile) + # Memo text changes + if 'memoDescription' in sc_schedule_page_dict and sc_schedule_page_dict['memoDescription']: + memo_dict = {} + temp_memo_outfile = md5_directory + 'SC/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SC/page_memo_' + str(sc_start_page) + '.pdf' + memo_dict['scheduleName_1'] = 'SC13' + memo_dict['memoDescription_1'] = sc_schedule_page_dict['memoDescription'] + if 'TRANSACTION_ID' in sc_schedule_page_dict and sc_schedule_page_dict['TRANSACTION_ID']: + memo_dict['transactionId_1'] = sc_schedule_page_dict['TRANSACTION_ID'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sc_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sc_outfile) + if path.isfile(md5_directory + 'SC/all_pages.pdf'): pypdftk.concat([md5_directory + 'SC/all_pages.pdf', md5_directory + 'SC' + '/page_' + str(sc_start_page) + '.pdf'], md5_directory + 'SC/temp_all_pages.pdf') @@ -1729,111 +1775,111 @@ def process_sc_line(f3x_data, md5_directory, sc_schedules, sc_start_page, total_ return sc1_list, sc_start_page, totalOutstandingLoans -def process_sc_memo(f3x_data, md5_directory, sc_schedules, sc_memo_start_page, total_no_of_pages): - os.makedirs(md5_directory + 'SC/memo/', exist_ok=True) - sc_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') - # sc1_list = [] - sc_memo = [] - sc1_memo = [] - sc2_memo = [] - for sc in sc_schedules: - # sc_memo_schedule_page_dict = {} - # sc_schedule_page_dict['TRANSACTION_ID'] = sc.get('transactionId') - # sc_schedule_page_dict['totalPages'] = total_no_of_pages - # sc_schedule_page_dict['committeeName'] = f3x_data.get('committeeName') - if 'child' in sc and sc.get('child'): - # sc2 = [] - # sc2_memo = [] - for sc_child in sc.get('child'): - if sc_child.get('transactionTypeIdentifier') == 'SC2': - # sc2.append(sc_child) - if sc_child['memoDescription']: - sc2_memo.append( - {'scheduleName': 'SC2' + sc_child['lineNumber'], 'memoDescription': sc_child['memoDescription'], - 'transactionId': sc_child['transactionId']}) - elif sc_child.get('transactionTypeIdentifier') == 'SC1': - # sc_child['SCPageNo'] = sc_start_page - # sc1_list.append(sc_child) - if sc_child['memoDescription']: - sc1_memo.append( - {'scheduleName': 'SC1' + sc_child['lineNumber'], 'memoDescription': sc_child['memoDescription'], - 'transactionId': sc_child['transactionId']}) - else: - if sc['memoDescription']: - sc_memo.append( - {'scheduleName': 'SC2' + sc_child['lineNumber'], 'memoDescription': sc_child['memoDescription'], - 'transactionId': sc_child['transactionId']}) - - if len(sc_memo) > 0: - sc_memo_page_cnt, sc_memo_last_page_cnt = calculate_memo_page_count(sc_memo) - for sc_memo_page_no in range(sc_memo_page_cnt): - last_page = False - sc_memo_schedule_page_dict = {} - sc_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sc_memo_page_no + 1) + " / " + str(total_no_of_pages) - page_start_index = sc_memo_page_no * 2 - if ((sc_memo_page_no + 1) == sc_memo_page_cnt): - last_page = True - # This call prepares data to render on PDF - sc_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sc_memo_last_page_cnt, - page_start_index, sc_memo_schedule_page_dict, - sc_memo) - - sc_memo_outfile = md5_directory + 'SC/memo/page_' + str(sc_memo_page_no) + '.pdf' - pypdftk.fill_form(sc_memo_infile, sc_memo_schedule_page_dict, sc_memo_outfile) - pypdftk.concat(directory_files(md5_directory + 'SC/memo/'), - md5_directory + 'SC/memo/all_pages.pdf') - if path.isfile(md5_directory + 'SC/all_pages.pdf'): - pypdftk.concat( - [md5_directory + 'SC/all_pages.pdf', md5_directory + 'SC/memo/all_pages.pdf'], - md5_directory + 'SC/temp_all_pages.pdf') - os.rename(md5_directory + 'SC/temp_all_pages.pdf', md5_directory + 'SC/all_pages.pdf') - if len(sc1_memo) > 0: - sc1_memo_page_cnt, sc1_memo_last_page_cnt = calculate_memo_page_count(sc1_memo) - for sc1_memo_page_no in range(sc1_memo_page_cnt): - last_page = False - sc1_memo_schedule_page_dict = {} - sc1_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sc1_memo_page_no + 1) + " / " + str(total_no_of_pages) - page_start_index = sc1_memo_page_no * 2 - if ((sc1_memo_page_no + 1) == sc1_memo_page_cnt): - last_page = True - # This call prepares data to render on PDF - sc1_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sc1_memo_last_page_cnt, - page_start_index, sc1_memo_schedule_page_dict, - sc1_memo) - - sc1_memo_outfile = md5_directory + 'SC/memo/page_' + str(sc1_memo_page_no) + '.pdf' - pypdftk.fill_form(sc_memo_infile, sc1_memo_schedule_page_dict, sc1_memo_outfile) - pypdftk.concat(directory_files(md5_directory + 'SC/memo/'), - md5_directory + 'SC/memo/all_pages.pdf') - if path.isfile(md5_directory + 'SC/all_pages.pdf'): - pypdftk.concat( - [md5_directory + 'SC/all_pages.pdf', md5_directory + 'SC/memo/all_pages.pdf'], - md5_directory + 'SC/temp_all_pages.pdf') - os.rename(md5_directory + 'SC/temp_all_pages.pdf', md5_directory + 'SC/all_pages.pdf') - if len(sc2_memo) > 0: - sc2_memo_page_cnt, sc2_memo_last_page_cnt = calculate_memo_page_count(sc2_memo) - for sc2_memo_page_no in range(sc2_memo_page_cnt): - last_page = False - sc2_memo_schedule_page_dict = {} - sc2_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sc2_memo_page_no + 1) + " / " + str(total_no_of_pages) - page_start_index = sc2_memo_page_no * 2 - if ((sc2_memo_page_no + 1) == sc2_memo_page_cnt): - last_page = True - # This call prepares data to render on PDF - sc2_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sc2_memo_last_page_cnt, - page_start_index, sc2_memo_schedule_page_dict, - sc2_memo) - - sc2_memo_outfile = md5_directory + 'SC/memo/page_' + str(sc2_memo_page_no) + '.pdf' - pypdftk.fill_form(sc_memo_infile, sc2_memo_schedule_page_dict, sc2_memo_outfile) - pypdftk.concat(directory_files(md5_directory + 'SC/memo/'), - md5_directory + 'SC/memo/all_pages.pdf') - if path.isfile(md5_directory + 'SC/all_pages.pdf'): - pypdftk.concat( - [md5_directory + 'SC/all_pages.pdf', md5_directory + 'SC/memo/all_pages.pdf'], - md5_directory + 'SC/temp_all_pages.pdf') - os.rename(md5_directory + 'SC/temp_all_pages.pdf', md5_directory + 'SC/all_pages.pdf') - return sc_memo, sc_memo_start_page +# def process_sc_memo(f3x_data, md5_directory, sc_schedules, sc_memo_start_page, total_no_of_pages): +# os.makedirs(md5_directory + 'SC/memo/', exist_ok=True) +# sc_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') +# # sc1_list = [] +# sc_memo = [] +# sc1_memo = [] +# sc2_memo = [] +# for sc in sc_schedules: +# # sc_memo_schedule_page_dict = {} +# # sc_schedule_page_dict['TRANSACTION_ID'] = sc.get('transactionId') +# # sc_schedule_page_dict['totalPages'] = total_no_of_pages +# # sc_schedule_page_dict['committeeName'] = f3x_data.get('committeeName') +# if 'child' in sc and sc.get('child'): +# # sc2 = [] +# # sc2_memo = [] +# for sc_child in sc.get('child'): +# if sc_child.get('transactionTypeIdentifier') == 'SC2': +# # sc2.append(sc_child) +# if sc_child['memoDescription']: +# sc2_memo.append( +# {'scheduleName': 'SC2' + sc_child['lineNumber'], 'memoDescription': sc_child['memoDescription'], +# 'transactionId': sc_child['transactionId']}) +# elif sc_child.get('transactionTypeIdentifier') == 'SC1': +# # sc_child['SCPageNo'] = sc_start_page +# # sc1_list.append(sc_child) +# if sc_child['memoDescription']: +# sc1_memo.append( +# {'scheduleName': 'SC1' + sc_child['lineNumber'], 'memoDescription': sc_child['memoDescription'], +# 'transactionId': sc_child['transactionId']}) +# else: +# if sc['memoDescription']: +# sc_memo.append( +# {'scheduleName': 'SC2' + sc_child['lineNumber'], 'memoDescription': sc_child['memoDescription'], +# 'transactionId': sc_child['transactionId']}) +# +# if len(sc_memo) > 0: +# sc_memo_page_cnt, sc_memo_last_page_cnt = calculate_memo_page_count(sc_memo) +# for sc_memo_page_no in range(sc_memo_page_cnt): +# last_page = False +# sc_memo_schedule_page_dict = {} +# sc_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sc_memo_page_no + 1) + " / " + str(total_no_of_pages) +# page_start_index = sc_memo_page_no * 2 +# if ((sc_memo_page_no + 1) == sc_memo_page_cnt): +# last_page = True +# # This call prepares data to render on PDF +# sc_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sc_memo_last_page_cnt, +# page_start_index, sc_memo_schedule_page_dict, +# sc_memo) +# +# sc_memo_outfile = md5_directory + 'SC/memo/page_' + str(sc_memo_page_no) + '.pdf' +# pypdftk.fill_form(sc_memo_infile, sc_memo_schedule_page_dict, sc_memo_outfile) +# pypdftk.concat(directory_files(md5_directory + 'SC/memo/'), +# md5_directory + 'SC/memo/all_pages.pdf') +# if path.isfile(md5_directory + 'SC/all_pages.pdf'): +# pypdftk.concat( +# [md5_directory + 'SC/all_pages.pdf', md5_directory + 'SC/memo/all_pages.pdf'], +# md5_directory + 'SC/temp_all_pages.pdf') +# os.rename(md5_directory + 'SC/temp_all_pages.pdf', md5_directory + 'SC/all_pages.pdf') +# if len(sc1_memo) > 0: +# sc1_memo_page_cnt, sc1_memo_last_page_cnt = calculate_memo_page_count(sc1_memo) +# for sc1_memo_page_no in range(sc1_memo_page_cnt): +# last_page = False +# sc1_memo_schedule_page_dict = {} +# sc1_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sc1_memo_page_no + 1) + " / " + str(total_no_of_pages) +# page_start_index = sc1_memo_page_no * 2 +# if ((sc1_memo_page_no + 1) == sc1_memo_page_cnt): +# last_page = True +# # This call prepares data to render on PDF +# sc1_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sc1_memo_last_page_cnt, +# page_start_index, sc1_memo_schedule_page_dict, +# sc1_memo) +# +# sc1_memo_outfile = md5_directory + 'SC/memo/page_' + str(sc1_memo_page_no) + '.pdf' +# pypdftk.fill_form(sc_memo_infile, sc1_memo_schedule_page_dict, sc1_memo_outfile) +# pypdftk.concat(directory_files(md5_directory + 'SC/memo/'), +# md5_directory + 'SC/memo/all_pages.pdf') +# if path.isfile(md5_directory + 'SC/all_pages.pdf'): +# pypdftk.concat( +# [md5_directory + 'SC/all_pages.pdf', md5_directory + 'SC/memo/all_pages.pdf'], +# md5_directory + 'SC/temp_all_pages.pdf') +# os.rename(md5_directory + 'SC/temp_all_pages.pdf', md5_directory + 'SC/all_pages.pdf') +# if len(sc2_memo) > 0: +# sc2_memo_page_cnt, sc2_memo_last_page_cnt = calculate_memo_page_count(sc2_memo) +# for sc2_memo_page_no in range(sc2_memo_page_cnt): +# last_page = False +# sc2_memo_schedule_page_dict = {} +# sc2_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sc2_memo_page_no + 1) + " / " + str(total_no_of_pages) +# page_start_index = sc2_memo_page_no * 2 +# if ((sc2_memo_page_no + 1) == sc2_memo_page_cnt): +# last_page = True +# # This call prepares data to render on PDF +# sc2_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sc2_memo_last_page_cnt, +# page_start_index, sc2_memo_schedule_page_dict, +# sc2_memo) +# +# sc2_memo_outfile = md5_directory + 'SC/memo/page_' + str(sc2_memo_page_no) + '.pdf' +# pypdftk.fill_form(sc_memo_infile, sc2_memo_schedule_page_dict, sc2_memo_outfile) +# pypdftk.concat(directory_files(md5_directory + 'SC/memo/'), +# md5_directory + 'SC/memo/all_pages.pdf') +# if path.isfile(md5_directory + 'SC/all_pages.pdf'): +# pypdftk.concat( +# [md5_directory + 'SC/all_pages.pdf', md5_directory + 'SC/memo/all_pages.pdf'], +# md5_directory + 'SC/temp_all_pages.pdf') +# os.rename(md5_directory + 'SC/temp_all_pages.pdf', md5_directory + 'SC/all_pages.pdf') +# return sc_memo, sc_memo_start_page def process_sc1_line(f3x_data, md5_directory, sc1, sc1_start_page, total_no_of_pages): @@ -1911,6 +1957,21 @@ def process_sc1_line(f3x_data, md5_directory, sc1, sc1_start_page, total_no_of_p sc1_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('SC1') sc1_outfile = md5_directory + 'SC' + '/page_' + str(sc1_start_page) + '.pdf' pypdftk.fill_form(sc1_infile, sc1_schedule_page_dict, sc1_outfile) + # Memo text changes + if 'memoDescription' in sc1_schedule_page_dict and sc1_schedule_page_dict['memoDescription']: + memo_dict = {} + temp_memo_outfile = md5_directory + 'SC/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SC/page_memo_' + str(sc1_start_page) + '.pdf' + memo_dict['scheduleName_1'] = 'SC1' + memo_dict['memoDescription_1'] = sc1_schedule_page_dict['memoDescription'] + if 'transactionId' in sc1_schedule_page_dict and sc1_schedule_page_dict['transactionId']: + memo_dict['transactionId_1'] = sc1_schedule_page_dict['transactionId'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sc1_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sc1_outfile) if path.isfile(md5_directory + 'SC/all_pages.pdf'): pypdftk.concat([md5_directory + 'SC/all_pages.pdf', md5_directory + 'SC' + '/page_' + str(sc1_start_page) + '.pdf'], md5_directory + 'SC/temp_all_pages.pdf') @@ -1961,9 +2022,9 @@ def process_sa_line(f3x_data, md5_directory, line_number, sa_line, sa_line_page_ # Memo text changes memo_dict = {} if len(memo_array) >= 1: - sa_temp_memo_outfile = md5_directory + 'SA/' + line_number + '/page_memo_temp.pdf' + temp_memo_outfile = md5_directory + 'SA/' + line_number + '/page_memo_temp.pdf' memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') - sa_memo_outfile = md5_directory + 'SA/' + line_number + '/page_memo_' + str(sa_page_no) + '.pdf' + memo_outfile = md5_directory + 'SA/' + line_number + '/page_memo_' + str(sa_page_no) + '.pdf' memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] memo_dict['transactionId_1'] = memo_array[0]['transactionId'] @@ -1972,21 +2033,21 @@ def process_sa_line(f3x_data, md5_directory, line_number, sa_line, sa_line_page_ memo_dict['memoDescription_2'] = memo_array[1]['memoDescription'] memo_dict['transactionId_2'] = memo_array[1]['transactionId'] # build page - pypdftk.fill_form(memo_infile, memo_dict, sa_memo_outfile) - pypdftk.concat([sa_outfile, sa_memo_outfile], sa_temp_memo_outfile) - os.remove(sa_memo_outfile) - os.rename(sa_temp_memo_outfile, sa_outfile) + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sa_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sa_outfile) if len(memo_array) >= 3: memo_dict = {} - sa_memo_outfile = md5_directory + 'SA/' + line_number + '/page_memo_' + str(sa_page_no) + '.pdf' - memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] - memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] - memo_dict['transactionId_1'] = memo_array[0]['transactionId'] - pypdftk.fill_form(memo_infile, memo_dict, sa_memo_outfile) - pypdftk.concat([sa_outfile, sa_memo_outfile], sa_temp_memo_outfile) - os.remove(sa_memo_outfile) - os.rename(sa_temp_memo_outfile, sa_outfile) + memo_outfile = md5_directory + 'SA/' + line_number + '/page_memo_' + str(sa_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[2]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[2]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[2]['transactionId'] + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sa_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sa_outfile) pypdftk.concat(directory_files(md5_directory + 'SA/' + line_number + '/'), md5_directory + 'SA/' + line_number + '/all_pages.pdf') # if len(sa_memo) > 0: @@ -2005,40 +2066,40 @@ def process_sa_line(f3x_data, md5_directory, line_number, sa_line, sa_line_page_ # This method is invoked for each SA line number memo, it builds PDF for memo line numbers -def process_sa_memo(f3x_data, md5_directory, line_number, sa_memo_line, sa_memo_line_page_cnt, sa_memo_line_start_page, - sa_memo_line_last_page_cnt, total_no_of_pages): - has_sa_memo_schedules = False - if len(sa_memo_line) > 0: - sa_memo_line_start_page += 1 - has_sa_memo_schedules = True - os.makedirs(md5_directory + 'SA/' + line_number + '/memo/', exist_ok=True) - sa_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') - if sa_memo_line_page_cnt > 0: - for sa_memo_page_no in range(sa_memo_line_page_cnt): - last_page = False - sa_memo_schedule_page_dict = {} - sa_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sa_memo_page_no + 1) + " / " + str(total_no_of_pages) - page_start_index = sa_memo_page_no * 2 - if ((sa_memo_page_no + 1) == sa_memo_line_page_cnt): - last_page = True - # This call prepares data to render on PDF - sa_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sa_memo_line_last_page_cnt, - page_start_index, sa_memo_schedule_page_dict, - sa_memo_line) - - sa_memo_outfile = md5_directory + 'SA/' + line_number + '/memo/page_' + str(sa_memo_page_no) + '.pdf' - pypdftk.fill_form(sa_memo_infile, sa_memo_schedule_page_dict, sa_memo_outfile) - pypdftk.concat(directory_files(md5_directory + 'SA/' + line_number + '/memo/'), md5_directory + 'SA/' + line_number - + '/memo/all_pages.pdf') - - # if all_pages.pdf exists in SA folder, concatenate line number pdf to all_pages.pdf - if path.isfile(md5_directory + 'SA/'+line_number+'/memo/all_pages.pdf'): - pypdftk.concat([md5_directory + 'SA/all_pages.pdf', md5_directory + 'SA/' + line_number + '/memo/all_pages.pdf'], - md5_directory + 'SA/temp_all_pages.pdf') - os.rename(md5_directory + 'SA/temp_all_pages.pdf', md5_directory + 'SA/all_pages.pdf') - # else: - # os.rename(md5_directory + 'SA/' + line_number + '/all_pages.pdf', md5_directory + 'SA/all_pages.pdf') - return has_sa_memo_schedules +# def process_sa_memo(f3x_data, md5_directory, line_number, sa_memo_line, sa_memo_line_page_cnt, sa_memo_line_start_page, +# sa_memo_line_last_page_cnt, total_no_of_pages): +# has_sa_memo_schedules = False +# if len(sa_memo_line) > 0: +# sa_memo_line_start_page += 1 +# has_sa_memo_schedules = True +# os.makedirs(md5_directory + 'SA/' + line_number + '/memo/', exist_ok=True) +# sa_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') +# if sa_memo_line_page_cnt > 0: +# for sa_memo_page_no in range(sa_memo_line_page_cnt): +# last_page = False +# sa_memo_schedule_page_dict = {} +# sa_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sa_memo_page_no + 1) + " / " + str(total_no_of_pages) +# page_start_index = sa_memo_page_no * 2 +# if ((sa_memo_page_no + 1) == sa_memo_line_page_cnt): +# last_page = True +# # This call prepares data to render on PDF +# sa_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sa_memo_line_last_page_cnt, +# page_start_index, sa_memo_schedule_page_dict, +# sa_memo_line) +# +# sa_memo_outfile = md5_directory + 'SA/' + line_number + '/memo/page_' + str(sa_memo_page_no) + '.pdf' +# pypdftk.fill_form(sa_memo_infile, sa_memo_schedule_page_dict, sa_memo_outfile) +# pypdftk.concat(directory_files(md5_directory + 'SA/' + line_number + '/memo/'), md5_directory + 'SA/' + line_number +# + '/memo/all_pages.pdf') +# +# # if all_pages.pdf exists in SA folder, concatenate line number pdf to all_pages.pdf +# if path.isfile(md5_directory + 'SA/'+line_number+'/memo/all_pages.pdf'): +# pypdftk.concat([md5_directory + 'SA/all_pages.pdf', md5_directory + 'SA/' + line_number + '/memo/all_pages.pdf'], +# md5_directory + 'SA/temp_all_pages.pdf') +# os.rename(md5_directory + 'SA/temp_all_pages.pdf', md5_directory + 'SA/all_pages.pdf') +# # else: +# # os.rename(md5_directory + 'SA/' + line_number + '/all_pages.pdf', md5_directory + 'SA/all_pages.pdf') +# return has_sa_memo_schedules @@ -2054,6 +2115,7 @@ def process_sb_line(f3x_data, md5_directory, line_number, sb_line, sb_line_page_ sb_line_start_page += 1 for sb_page_no in range(sb_line_page_cnt): page_subtotal = 0.00 + memo_array = [] last_page = False sb_schedule_page_dict = {} sb_schedule_page_dict['lineNumber'] = line_number @@ -2065,7 +2127,7 @@ def process_sb_line(f3x_data, md5_directory, line_number, sb_line, sb_line_page_ # This call prepares data to render on PDF sb_schedule_dict = build_sb_per_page_schedule_dict(last_page, sb_line_last_page_cnt, page_start_index, sb_schedule_page_dict, - sb_line) + sb_line, memo_array) page_subtotal = float(sb_schedule_page_dict['pageSubtotal']) schedule_total += page_subtotal @@ -2074,6 +2136,35 @@ def process_sb_line(f3x_data, md5_directory, line_number, sb_line, sb_line_page_ sb_schedule_page_dict['committeeName'] = f3x_data['committeeName'] sb_outfile = md5_directory + 'SB/' + line_number + '/page_' + str(sb_page_no) + '.pdf' pypdftk.fill_form(sb_infile, sb_schedule_page_dict, sb_outfile) + # Memo text changes + memo_dict = {} + if len(memo_array) >= 1: + temp_memo_outfile = md5_directory + 'SB/' + line_number + '/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SB/' + line_number + '/page_memo_' + str(sb_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + if len(memo_array) >= 2: + memo_dict['scheduleName_2'] = memo_array[1]['scheduleName'] + memo_dict['memoDescription_2'] = memo_array[1]['memoDescription'] + memo_dict['transactionId_2'] = memo_array[1]['transactionId'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sb_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sb_outfile) + + if len(memo_array) >= 3: + memo_dict = {} + memo_outfile = md5_directory + 'SB/' + line_number + '/page_memo_' + str(sb_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[2]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[2]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[2]['transactionId'] + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sb_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sb_outfile) pypdftk.concat(directory_files(md5_directory + 'SB/' + line_number + '/'), md5_directory + 'SB/' + line_number + '/all_pages.pdf') if path.isfile(md5_directory + 'SB/all_pages.pdf'): @@ -2086,38 +2177,38 @@ def process_sb_line(f3x_data, md5_directory, line_number, sb_line, sb_line_page_ # This method is invoked for each SB line number memo, it builds PDF for memo line numbers -def process_sb_memo(f3x_data, md5_directory, line_number, sb_memo_line, sb_memo_line_page_cnt, sb_memo_line_start_page, - sb_memo_line_last_page_cnt, total_no_of_pages): - has_sb_memo_schedules = False - if len(sb_memo_line) > 0: - sb_memo_line_start_page += 1 - has_sb_memo_schedules = True - os.makedirs(md5_directory + 'SB/' + line_number + '/memo', exist_ok=True) - sb_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') - if sb_memo_line_page_cnt > 0: - for sb_memo_page_no in range(sb_memo_line_page_cnt): - last_page = False - sb_memo_schedule_page_dict = {} - sb_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sb_memo_page_no + 1) + " / " + str(total_no_of_pages) - page_start_index = sb_memo_page_no * 2 - if ((sb_memo_page_no + 1) == sb_memo_line_page_cnt): - last_page = True - # This call prepares data to render on PDF - sb_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sb_memo_line_last_page_cnt, - page_start_index, sb_memo_schedule_page_dict, - sb_memo_line) - - sb_memo_outfile = md5_directory + 'SB/' + line_number + '/memo/page_' + str(sb_memo_page_no) + '.pdf' - pypdftk.fill_form(sb_memo_infile, sb_memo_schedule_page_dict, sb_memo_outfile) - pypdftk.concat(directory_files(md5_directory + 'SB/' + line_number + '/memo/'), md5_directory + 'SB/' + line_number - + '/memo/all_pages.pdf') - - # if all_pages.pdf exists in SB folder, concatenate line number pdf to all_pages.pdf - if path.isfile(md5_directory + 'SB/'+line_number+'/memo/all_pages.pdf'): - pypdftk.concat([md5_directory + 'SB/all_pages.pdf', md5_directory + 'SB/' + line_number + '/memo/all_pages.pdf'], - md5_directory + 'SB/temp_all_pages.pdf') - os.rename(md5_directory + 'SB/temp_all_pages.pdf', md5_directory + 'SB/all_pages.pdf') - return has_sb_memo_schedules +# def process_sb_memo(f3x_data, md5_directory, line_number, sb_memo_line, sb_memo_line_page_cnt, sb_memo_line_start_page, +# sb_memo_line_last_page_cnt, total_no_of_pages): +# has_sb_memo_schedules = False +# if len(sb_memo_line) > 0: +# sb_memo_line_start_page += 1 +# has_sb_memo_schedules = True +# os.makedirs(md5_directory + 'SB/' + line_number + '/memo', exist_ok=True) +# sb_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') +# if sb_memo_line_page_cnt > 0: +# for sb_memo_page_no in range(sb_memo_line_page_cnt): +# last_page = False +# sb_memo_schedule_page_dict = {} +# sb_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sb_memo_page_no + 1) + " / " + str(total_no_of_pages) +# page_start_index = sb_memo_page_no * 2 +# if ((sb_memo_page_no + 1) == sb_memo_line_page_cnt): +# last_page = True +# # This call prepares data to render on PDF +# sb_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sb_memo_line_last_page_cnt, +# page_start_index, sb_memo_schedule_page_dict, +# sb_memo_line) +# +# sb_memo_outfile = md5_directory + 'SB/' + line_number + '/memo/page_' + str(sb_memo_page_no) + '.pdf' +# pypdftk.fill_form(sb_memo_infile, sb_memo_schedule_page_dict, sb_memo_outfile) +# pypdftk.concat(directory_files(md5_directory + 'SB/' + line_number + '/memo/'), md5_directory + 'SB/' + line_number +# + '/memo/all_pages.pdf') +# +# # if all_pages.pdf exists in SB folder, concatenate line number pdf to all_pages.pdf +# if path.isfile(md5_directory + 'SB/'+line_number+'/memo/all_pages.pdf'): +# pypdftk.concat([md5_directory + 'SB/all_pages.pdf', md5_directory + 'SB/' + line_number + '/memo/all_pages.pdf'], +# md5_directory + 'SB/temp_all_pages.pdf') +# os.rename(md5_directory + 'SB/temp_all_pages.pdf', md5_directory + 'SB/all_pages.pdf') +# return has_sb_memo_schedules def process_se_line(f3x_data, md5_directory, line_number, se_line, se_line_page_cnt, se_line_start_page, @@ -2131,6 +2222,7 @@ def process_se_line(f3x_data, md5_directory, line_number, se_line, se_line_page_ se_line_start_page += 1 for se_page_no in range(se_line_page_cnt): page_subtotal = 0.00 + memo_array = [] last_page = False se_schedule_page_dict = {} se_schedule_page_dict['lineNumber'] = line_number @@ -2142,7 +2234,7 @@ def process_se_line(f3x_data, md5_directory, line_number, se_line, se_line_page_ # This call prepares data to render on PDF se_schedule_dict = build_se_per_page_schedule_dict(last_page, se_line_last_page_cnt, page_start_index, se_schedule_page_dict, - se_line) + se_line, memo_array) page_subtotal = float(se_schedule_page_dict['pageSubtotal']) schedule_total += page_subtotal @@ -2152,6 +2244,24 @@ def process_se_line(f3x_data, md5_directory, line_number, se_line, se_line_page_ se_schedule_page_dict['committeeId'] = f3x_data['committeeId'] se_outfile = md5_directory + 'SE/' + line_number + '/page_' + str(se_page_no) + '.pdf' pypdftk.fill_form(se_infile, se_schedule_page_dict, se_outfile) + # Memo text changes + memo_dict = {} + if len(memo_array) >= 1: + temp_memo_outfile = md5_directory + 'SE/' + line_number + '/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SE/' + line_number + '/page_memo_' + str(se_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + if len(memo_array) >= 2: + memo_dict['scheduleName_2'] = memo_array[1]['scheduleName'] + memo_dict['memoDescription_2'] = memo_array[1]['memoDescription'] + memo_dict['transactionId_2'] = memo_array[1]['transactionId'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([se_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, se_outfile) pypdftk.concat(directory_files(md5_directory + 'SE/' + line_number + '/'), md5_directory + 'SE/' + line_number + '/all_pages.pdf') if path.isfile(md5_directory + 'SE/all_pages.pdf'): @@ -2164,38 +2274,38 @@ def process_se_line(f3x_data, md5_directory, line_number, se_line, se_line_page_ # This method is invoked for each SE line number memo, it builds PDF for memo line numbers -def process_se_memo(f3x_data, md5_directory, line_number, se_memo_line, se_memo_line_page_cnt, se_memo_line_start_page, - se_memo_line_last_page_cnt, total_no_of_pages): - has_se_memo_schedules = False - if len(se_memo_line) > 0: - se_memo_line_start_page += 1 - has_se_memo_schedules = True - os.makedirs(md5_directory + 'SE/' + line_number + '/memo', exist_ok=True) - se_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') - if se_memo_line_page_cnt > 0: - for se_memo_page_no in range(se_memo_line_page_cnt): - last_page = False - se_memo_schedule_page_dict = {} - se_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(se_memo_page_no + 1) + " / " + str(total_no_of_pages) - page_start_index = se_memo_page_no * 2 - if ((se_memo_page_no + 1) == se_memo_line_page_cnt): - last_page = True - # This call prepares data to render on PDF - se_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, se_memo_line_last_page_cnt, - page_start_index, se_memo_schedule_page_dict, - se_memo_line) - - se_memo_outfile = md5_directory + 'SE/' + line_number + '/memo/page_' + str(se_memo_page_no) + '.pdf' - pypdftk.fill_form(se_memo_infile, se_memo_schedule_page_dict, se_memo_outfile) - pypdftk.concat(directory_files(md5_directory + 'SE/' + line_number + '/memo/'), md5_directory + 'SE/' + line_number - + '/memo/all_pages.pdf') - - # if all_pages.pdf exists in SB folder, concatenate line number pdf to all_pages.pdf - if path.isfile(md5_directory + 'SE/'+line_number+'/memo/all_pages.pdf'): - pypdftk.concat([md5_directory + 'SE/all_pages.pdf', md5_directory + 'SE/' + line_number + '/memo/all_pages.pdf'], - md5_directory + 'SE/temp_all_pages.pdf') - os.rename(md5_directory + 'SE/temp_all_pages.pdf', md5_directory + 'SE/all_pages.pdf') - return has_se_memo_schedules +# def process_se_memo(f3x_data, md5_directory, line_number, se_memo_line, se_memo_line_page_cnt, se_memo_line_start_page, +# se_memo_line_last_page_cnt, total_no_of_pages): +# has_se_memo_schedules = False +# if len(se_memo_line) > 0: +# se_memo_line_start_page += 1 +# has_se_memo_schedules = True +# os.makedirs(md5_directory + 'SE/' + line_number + '/memo', exist_ok=True) +# se_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') +# if se_memo_line_page_cnt > 0: +# for se_memo_page_no in range(se_memo_line_page_cnt): +# last_page = False +# se_memo_schedule_page_dict = {} +# se_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(se_memo_page_no + 1) + " / " + str(total_no_of_pages) +# page_start_index = se_memo_page_no * 2 +# if ((se_memo_page_no + 1) == se_memo_line_page_cnt): +# last_page = True +# # This call prepares data to render on PDF +# se_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, se_memo_line_last_page_cnt, +# page_start_index, se_memo_schedule_page_dict, +# se_memo_line) +# +# se_memo_outfile = md5_directory + 'SE/' + line_number + '/memo/page_' + str(se_memo_page_no) + '.pdf' +# pypdftk.fill_form(se_memo_infile, se_memo_schedule_page_dict, se_memo_outfile) +# pypdftk.concat(directory_files(md5_directory + 'SE/' + line_number + '/memo/'), md5_directory + 'SE/' + line_number +# + '/memo/all_pages.pdf') +# +# # if all_pages.pdf exists in SB folder, concatenate line number pdf to all_pages.pdf +# if path.isfile(md5_directory + 'SE/'+line_number+'/memo/all_pages.pdf'): +# pypdftk.concat([md5_directory + 'SE/all_pages.pdf', md5_directory + 'SE/' + line_number + '/memo/all_pages.pdf'], +# md5_directory + 'SE/temp_all_pages.pdf') +# os.rename(md5_directory + 'SE/temp_all_pages.pdf', md5_directory + 'SE/all_pages.pdf') +# return has_se_memo_schedules def process_sf_line(f3x_data, md5_directory, line_number, sf_line, sf_line_page_cnt, sf_line_start_page, @@ -2210,6 +2320,7 @@ def process_sf_line(f3x_data, md5_directory, line_number, sf_line, sf_line_page_ sf_line_start_page += 1 for sf_page_no in range(sf_line_page_cnt): page_subtotal = 0.00 + memo_array = [] last_page = False sf_schedule_page_dict = {} sf_schedule_page_dict['lineNumber'] = line_number @@ -2223,7 +2334,7 @@ def process_sf_line(f3x_data, md5_directory, line_number, sf_line, sf_line_page_ # This call prepares data to render on PDF sf_schedule_dict = build_sf_per_page_schedule_dict(last_page, sf_line_last_page_cnt, page_start_index, sf_schedule_page_dict, - sf_line) + sf_line, memo_array) page_subtotal = float(sf_schedule_page_dict['pageSubtotal']) sf_schedule_page_dict['pageSubTotal'] = '{0:.2f}'.format(page_subtotal) @@ -2233,6 +2344,35 @@ def process_sf_line(f3x_data, md5_directory, line_number, sf_line, sf_line_page_ sf_schedule_page_dict['committeeName'] = f3x_data['committeeName'] sf_outfile = md5_directory + 'SF/' + cord_name + '/page_' + str(sf_page_no) + '.pdf' pypdftk.fill_form(sf_infile, sf_schedule_page_dict, sf_outfile) + # Memo text changes + memo_dict = {} + if len(memo_array) >= 1: + temp_memo_outfile = md5_directory + 'SF/' + cord_name + '/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SF/' + cord_name + '/page_memo_' + str(sf_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + if len(memo_array) >= 2: + memo_dict['scheduleName_2'] = memo_array[1]['scheduleName'] + memo_dict['memoDescription_2'] = memo_array[1]['memoDescription'] + memo_dict['transactionId_2'] = memo_array[1]['transactionId'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sf_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sf_outfile) + + if len(memo_array) >= 3: + memo_dict = {} + memo_outfile = md5_directory + 'SF/' + cord_name + '/page_memo_' + str(sf_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[2]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[2]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[2]['transactionId'] + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sf_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sf_outfile) pypdftk.concat(directory_files(md5_directory + 'SF/' + cord_name + '/'), md5_directory + 'SF/' + cord_name + '/all_pages.pdf') if path.isfile(md5_directory + 'SF/all_pages.pdf'): @@ -2245,38 +2385,38 @@ def process_sf_line(f3x_data, md5_directory, line_number, sf_line, sf_line_page_ # This method is invoked for each SF line number memo, it builds PDF for memo line numbers -def process_sf_memo(f3x_data, md5_directory, line_number, sf_memo_line, sf_memo_line_page_cnt, sf_memo_line_start_page, - sf_memo_line_last_page_cnt, total_no_of_pages, cord_name=None): - has_sf_memo_schedules = False - if len(sf_memo_line) > 0: - sf_memo_line_start_page += 1 - has_sf_memo_schedules = True - os.makedirs(md5_directory + 'SF/' + line_number + '/memo', exist_ok=True) - sf_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') - if sf_memo_line_page_cnt > 0: - for sf_memo_page_no in range(sf_memo_line_page_cnt): - last_page = False - sf_memo_schedule_page_dict = {} - sf_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sf_memo_page_no + 1) + " / " + str(total_no_of_pages) - page_start_index = sf_memo_page_no * 2 - if ((sf_memo_page_no + 1) == sf_memo_line_page_cnt): - last_page = True - # This call prepares data to render on PDF - sf_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sf_memo_line_last_page_cnt, - page_start_index, sf_memo_schedule_page_dict, - sf_memo_line) - - sf_memo_outfile = md5_directory + 'SF/' + line_number + '/memo/page_' + str(sf_memo_page_no) + '.pdf' - pypdftk.fill_form(sf_memo_infile, sf_memo_schedule_page_dict, sf_memo_outfile) - pypdftk.concat(directory_files(md5_directory + 'SF/' + line_number + '/memo/'), md5_directory + 'SF/' + line_number - + '/memo/all_pages.pdf') - - # if all_pages.pdf exists in SB folder, concatenate line number pdf to all_pages.pdf - if path.isfile(md5_directory + 'SF/'+line_number+'/memo/all_pages.pdf'): - pypdftk.concat([md5_directory + 'SF/all_pages.pdf', md5_directory + 'SF/' + line_number + '/memo/all_pages.pdf'], - md5_directory + 'SF/temp_all_pages.pdf') - os.rename(md5_directory + 'SF/temp_all_pages.pdf', md5_directory + 'SF/all_pages.pdf') - return has_sf_memo_schedules +# def process_sf_memo(f3x_data, md5_directory, line_number, sf_memo_line, sf_memo_line_page_cnt, sf_memo_line_start_page, +# sf_memo_line_last_page_cnt, total_no_of_pages, cord_name=None): +# has_sf_memo_schedules = False +# if len(sf_memo_line) > 0: +# sf_memo_line_start_page += 1 +# has_sf_memo_schedules = True +# os.makedirs(md5_directory + 'SF/' + line_number + '/memo', exist_ok=True) +# sf_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') +# if sf_memo_line_page_cnt > 0: +# for sf_memo_page_no in range(sf_memo_line_page_cnt): +# last_page = False +# sf_memo_schedule_page_dict = {} +# sf_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sf_memo_page_no + 1) + " / " + str(total_no_of_pages) +# page_start_index = sf_memo_page_no * 2 +# if ((sf_memo_page_no + 1) == sf_memo_line_page_cnt): +# last_page = True +# # This call prepares data to render on PDF +# sf_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sf_memo_line_last_page_cnt, +# page_start_index, sf_memo_schedule_page_dict, +# sf_memo_line) +# +# sf_memo_outfile = md5_directory + 'SF/' + line_number + '/memo/page_' + str(sf_memo_page_no) + '.pdf' +# pypdftk.fill_form(sf_memo_infile, sf_memo_schedule_page_dict, sf_memo_outfile) +# pypdftk.concat(directory_files(md5_directory + 'SF/' + line_number + '/memo/'), md5_directory + 'SF/' + line_number +# + '/memo/all_pages.pdf') +# +# # if all_pages.pdf exists in SB folder, concatenate line number pdf to all_pages.pdf +# if path.isfile(md5_directory + 'SF/'+line_number+'/memo/all_pages.pdf'): +# pypdftk.concat([md5_directory + 'SF/all_pages.pdf', md5_directory + 'SF/' + line_number + '/memo/all_pages.pdf'], +# md5_directory + 'SF/temp_all_pages.pdf') +# os.rename(md5_directory + 'SF/temp_all_pages.pdf', md5_directory + 'SF/all_pages.pdf') +# return has_sf_memo_schedules def process_la_line(f3x_data, md5_directory, line_number, la_line, la_line_page_cnt, la_line_start_page, @@ -2292,6 +2432,7 @@ def process_la_line(f3x_data, md5_directory, line_number, la_line, la_line_page_ if la_line_page_cnt > 0: for la_page_no in range(la_line_page_cnt): page_subtotal = 0.00 + memo_array = [] last_page = False la_schedule_page_dict = {} la_schedule_page_dict['lineNumber'] = line_number @@ -2304,7 +2445,7 @@ def process_la_line(f3x_data, md5_directory, line_number, la_line, la_line_page_ la_schedule_dict = build_la_per_page_schedule_dict(last_page, la_line_last_page_cnt, page_start_index, la_schedule_page_dict, - la_line) + la_line, memo_array) page_subtotal = float(la_schedule_page_dict['pageSubtotal']) schedule_total += page_subtotal @@ -2313,6 +2454,40 @@ def process_la_line(f3x_data, md5_directory, line_number, la_line, la_line_page_ la_schedule_page_dict['committeeName'] = f3x_data['committeeName'] la_outfile = md5_directory + 'SL-A/' + line_number + '/page_' + str(la_page_no) + '.pdf' pypdftk.fill_form(la_infile, la_schedule_page_dict, la_outfile) + # Memo text changes + memo_dict = {} + if len(memo_array) >= 1: + temp_memo_outfile = md5_directory + 'SL-A/' + line_number + '/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SL-A/' + line_number + '/page_memo_' + str(la_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + if len(memo_array) >= 2: + memo_dict['scheduleName_2'] = memo_array[1]['scheduleName'] + memo_dict['memoDescription_2'] = memo_array[1]['memoDescription'] + memo_dict['transactionId_2'] = memo_array[1]['transactionId'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([la_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, la_outfile) + + if len(memo_array) >= 3: + memo_dict = {} + memo_outfile = md5_directory + 'SL-A/' + line_number + '/page_memo_' + str( + la_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[2]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[2]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[2]['transactionId'] + if len(memo_array) >= 4: + memo_dict['scheduleName_2'] = memo_array[3]['scheduleName'] + memo_dict['memoDescription_2'] = memo_array[3]['memoDescription'] + memo_dict['transactionId_2'] = memo_array[3]['transactionId'] + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([la_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, la_outfile) pypdftk.concat(directory_files(md5_directory + 'SL-A/' + line_number + '/'), md5_directory + 'SL-A/' + line_number + '/all_pages.pdf') if path.isfile(md5_directory + 'SL-A/all_pages.pdf'): @@ -2328,50 +2503,50 @@ def process_la_line(f3x_data, md5_directory, line_number, la_line, la_line_page_ return has_la_schedules -def process_la_memo(f3x_data, md5_directory, line_number, la_memo, la_memo_page_cnt, la_memo_start_page, - la_memo_last_page_cnt, total_no_of_pages): - has_la_memo_schedules = False - try: - if len(la_memo) > 0: - la_memo_start_page += 1 - has_la_memo_schedules = True - os.makedirs(md5_directory + 'SL-A/' + line_number + '/memo', exist_ok=True) - la_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') - if la_memo_page_cnt > 0: - for la_memo_page_no in range(la_memo_page_cnt): - last_page = False - - la_memo_schedule_page_dict = {} - la_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(la_memo_page_no + 1) + " / " + str( - total_no_of_pages) - - page_start_index = la_memo_page_no * 2 - if ((la_memo_page_no + 1) == la_memo_page_cnt): - last_page = True - # This call prepares data to render on PDF - la_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, - la_memo_last_page_cnt, - page_start_index, - la_memo_schedule_page_dict, - la_memo) - la_memo_outfile = md5_directory + 'SL-A/' + line_number + '/memo/page_' + str( - la_memo_page_no) + '.pdf' - pypdftk.fill_form(la_memo_infile, la_memo_schedule_page_dict, la_memo_outfile) - pypdftk.concat(directory_files(md5_directory + 'SL-A/' + line_number + '/memo/'), - md5_directory + 'SL-A/' + line_number - + '/memo/all_pages.pdf') - - # if all_pages.pdf exists in SA folder, concatenate line number pdf to all_pages.pdf - if path.isfile(md5_directory + 'SL-A/' + line_number + '/memo/all_pages.pdf'): - pypdftk.concat([md5_directory + 'SL-A/all_pages.pdf', - md5_directory + 'SL-A/' + line_number + '/memo/all_pages.pdf'], - md5_directory + 'SL-A/temp_all_pages.pdf') - os.rename(md5_directory + 'SL-A/temp_all_pages.pdf', md5_directory + 'SL-A/all_pages.pdf') - # else: - # os.rename(md5_directory + 'SA/' + line_number + '/all_pages.pdf', md5_directory + 'SA/all_pages.pdf') - except Exception as e: - raise e - return has_la_memo_schedules +# def process_la_memo(f3x_data, md5_directory, line_number, la_memo, la_memo_page_cnt, la_memo_start_page, +# la_memo_last_page_cnt, total_no_of_pages): +# has_la_memo_schedules = False +# try: +# if len(la_memo) > 0: +# la_memo_start_page += 1 +# has_la_memo_schedules = True +# os.makedirs(md5_directory + 'SL-A/' + line_number + '/memo', exist_ok=True) +# la_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') +# if la_memo_page_cnt > 0: +# for la_memo_page_no in range(la_memo_page_cnt): +# last_page = False +# +# la_memo_schedule_page_dict = {} +# la_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(la_memo_page_no + 1) + " / " + str( +# total_no_of_pages) +# +# page_start_index = la_memo_page_no * 2 +# if ((la_memo_page_no + 1) == la_memo_page_cnt): +# last_page = True +# # This call prepares data to render on PDF +# la_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, +# la_memo_last_page_cnt, +# page_start_index, +# la_memo_schedule_page_dict, +# la_memo) +# la_memo_outfile = md5_directory + 'SL-A/' + line_number + '/memo/page_' + str( +# la_memo_page_no) + '.pdf' +# pypdftk.fill_form(la_memo_infile, la_memo_schedule_page_dict, la_memo_outfile) +# pypdftk.concat(directory_files(md5_directory + 'SL-A/' + line_number + '/memo/'), +# md5_directory + 'SL-A/' + line_number +# + '/memo/all_pages.pdf') +# +# # if all_pages.pdf exists in SA folder, concatenate line number pdf to all_pages.pdf +# if path.isfile(md5_directory + 'SL-A/' + line_number + '/memo/all_pages.pdf'): +# pypdftk.concat([md5_directory + 'SL-A/all_pages.pdf', +# md5_directory + 'SL-A/' + line_number + '/memo/all_pages.pdf'], +# md5_directory + 'SL-A/temp_all_pages.pdf') +# os.rename(md5_directory + 'SL-A/temp_all_pages.pdf', md5_directory + 'SL-A/all_pages.pdf') +# # else: +# # os.rename(md5_directory + 'SA/' + line_number + '/all_pages.pdf', md5_directory + 'SA/all_pages.pdf') +# except Exception as e: +# raise e +# return has_la_memo_schedules def process_slb_line(f3x_data, md5_directory, line_number, slb_line, slb_line_page_cnt, slb_line_start_page, @@ -2385,6 +2560,7 @@ def process_slb_line(f3x_data, md5_directory, line_number, slb_line, slb_line_pa slb_line_start_page += 1 for slb_page_no in range(slb_line_page_cnt): page_subtotal = 0.00 + memo_array = [] last_page = False slb_schedule_page_dict = {} slb_schedule_page_dict['lineNumber'] = line_number @@ -2396,7 +2572,7 @@ def process_slb_line(f3x_data, md5_directory, line_number, slb_line, slb_line_pa # This call prepares data to render on PDF slb_schedule_dict = build_slb_per_page_schedule_dict(last_page, slb_line_last_page_cnt, page_start_index, slb_schedule_page_dict, - slb_line) + slb_line, memo_array) @@ -2408,6 +2584,52 @@ def process_slb_line(f3x_data, md5_directory, line_number, slb_line, slb_line_pa slb_schedule_page_dict['committeeName'] = f3x_data['committeeName'] slb_outfile = md5_directory + 'SL-B/' + line_number + '/page_' + str(slb_page_no) + '.pdf' pypdftk.fill_form(slb_infile, slb_schedule_page_dict, slb_outfile) + # Memo text changes + memo_dict = {} + if len(memo_array) >= 1: + temp_memo_outfile = md5_directory + 'SL-B/' + line_number + '/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SL-B/' + line_number + '/page_memo_' + str(slb_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + if len(memo_array) >= 2: + memo_dict['scheduleName_2'] = memo_array[1]['scheduleName'] + memo_dict['memoDescription_2'] = memo_array[1]['memoDescription'] + memo_dict['transactionId_2'] = memo_array[1]['transactionId'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([slb_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, slb_outfile) + + if len(memo_array) >= 3: + memo_dict = {} + memo_outfile = md5_directory + 'SL-B/' + line_number + '/page_memo_' + str(slb_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[2]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[2]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[2]['transactionId'] + if len(memo_array) >= 4: + memo_dict['scheduleName_2'] = memo_array[3]['scheduleName'] + memo_dict['memoDescription_2'] = memo_array[3]['memoDescription'] + memo_dict['transactionId_2'] = memo_array[3]['transactionId'] + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([slb_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, slb_outfile) + + if len(memo_array) >= 5: + temp_memo_outfile = md5_directory + 'SL-B/' + line_number + '/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SB/' + line_number + '/page_memo_' + str(slb_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[4]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[4]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[4]['transactionId'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([slb_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, slb_outfile) pypdftk.concat(directory_files(md5_directory + 'SL-B/' + line_number + '/'), md5_directory + 'SL-B/' + line_number + '/all_pages.pdf') if path.isfile(md5_directory + 'SL-B/all_pages.pdf'): @@ -2522,50 +2744,50 @@ def process_sl_levin(f3x_data, md5_directory, levin_name, sl_line, sl_line_page_ return has_sl_summary -def process_sl_memo(f3x_data, md5_directory, line_number, sl_memo, sl_memo_page_cnt, sl_memo_start_page, - sl_memo_last_page_cnt, total_no_of_pages): - has_sl_memo_schedules = False - try: - if len(sl_memo) > 0: - sl_memo_start_page += 1 - has_sl_memo_schedules = True - os.makedirs(md5_directory + 'SL/' + line_number + '/memo', exist_ok=True) - sl_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') - if sl_memo_page_cnt > 0: - for sl_memo_page_no in range(sl_memo_page_cnt): - last_page = False - - sl_memo_schedule_page_dict = {} - sl_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sl_memo_page_no + 1) + " / " + str( - total_no_of_pages) - - page_start_index = sl_memo_page_no * 2 - if ((sl_memo_page_no + 1) == sl_memo_page_cnt): - last_page = True - # This call prepares data to render on PDF - sl_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, - sl_memo_last_page_cnt, - page_start_index, - sl_memo_schedule_page_dict, - sl_memo) - sl_memo_outfile = md5_directory + 'SL/' + line_number + '/memo/page_' + str( - sl_memo_page_no) + '.pdf' - pypdftk.fill_form(sl_memo_infile, sl_memo_schedule_page_dict, sl_memo_outfile) - pypdftk.concat(directory_files(md5_directory + 'SL/' + line_number + '/memo/'), - md5_directory + 'SL/' + line_number - + '/memo/all_pages.pdf') - - # if all_pages.pdf exists in SA folder, concatenate line number pdf to all_pages.pdf - if path.isfile(md5_directory + 'SL/' + line_number + '/memo/all_pages.pdf'): - pypdftk.concat([md5_directory + 'SL/all_pages.pdf', - md5_directory + 'SL/' + line_number + '/memo/all_pages.pdf'], - md5_directory + 'SL/temp_all_pages.pdf') - os.rename(md5_directory + 'SL/temp_all_pages.pdf', md5_directory + 'SL/all_pages.pdf') - # else: - # os.rename(md5_directory + 'SA/' + line_number + '/all_pages.pdf', md5_directory + 'SA/all_pages.pdf') - except Exception as e: - raise e - return has_sl_memo_schedules +# def process_sl_memo(f3x_data, md5_directory, line_number, sl_memo, sl_memo_page_cnt, sl_memo_start_page, +# sl_memo_last_page_cnt, total_no_of_pages): +# has_sl_memo_schedules = False +# try: +# if len(sl_memo) > 0: +# sl_memo_start_page += 1 +# has_sl_memo_schedules = True +# os.makedirs(md5_directory + 'SL/' + line_number + '/memo', exist_ok=True) +# sl_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') +# if sl_memo_page_cnt > 0: +# for sl_memo_page_no in range(sl_memo_page_cnt): +# last_page = False +# +# sl_memo_schedule_page_dict = {} +# sl_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sl_memo_page_no + 1) + " / " + str( +# total_no_of_pages) +# +# page_start_index = sl_memo_page_no * 2 +# if ((sl_memo_page_no + 1) == sl_memo_page_cnt): +# last_page = True +# # This call prepares data to render on PDF +# sl_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, +# sl_memo_last_page_cnt, +# page_start_index, +# sl_memo_schedule_page_dict, +# sl_memo) +# sl_memo_outfile = md5_directory + 'SL/' + line_number + '/memo/page_' + str( +# sl_memo_page_no) + '.pdf' +# pypdftk.fill_form(sl_memo_infile, sl_memo_schedule_page_dict, sl_memo_outfile) +# pypdftk.concat(directory_files(md5_directory + 'SL/' + line_number + '/memo/'), +# md5_directory + 'SL/' + line_number +# + '/memo/all_pages.pdf') +# +# # if all_pages.pdf exists in SA folder, concatenate line number pdf to all_pages.pdf +# if path.isfile(md5_directory + 'SL/' + line_number + '/memo/all_pages.pdf'): +# pypdftk.concat([md5_directory + 'SL/all_pages.pdf', +# md5_directory + 'SL/' + line_number + '/memo/all_pages.pdf'], +# md5_directory + 'SL/temp_all_pages.pdf') +# os.rename(md5_directory + 'SL/temp_all_pages.pdf', md5_directory + 'SL/all_pages.pdf') +# # else: +# # os.rename(md5_directory + 'SA/' + line_number + '/all_pages.pdf', md5_directory + 'SA/all_pages.pdf') +# except Exception as e: +# raise e +# return has_sl_memo_schedules def process_sh1_line(f3x_data, md5_directory, tran_type_ident, sh_h1, sh1_page_cnt, sh1_start_page, @@ -2881,6 +3103,7 @@ def process_sh6_line(f3x_data, md5_directory, line_number, sh6_line, sh6_line_pa sh6_line_start_page += 1 for sh6_page_no in range(sh6_line_page_cnt): page_subtotal = 0.00 + memo_array = [] last_page = False sh6_schedule_page_dict = {} sh6_schedule_page_dict['lineNumber'] = line_number @@ -2892,7 +3115,7 @@ def process_sh6_line(f3x_data, md5_directory, line_number, sh6_line, sh6_line_pa # This call prepares data to render on PDF sh6_schedule_dict = build_sh6_line_per_page_schedule_dict(last_page, sh6_line_last_page_cnt, page_start_index, sh6_schedule_page_dict, - sh6_line) + sh6_line, memo_array) page_fed_subtotal = float(sh6_schedule_page_dict['subTotalFederalShare']) page_levin_subtotal = float(sh6_schedule_page_dict['subTotalLevinShare']) @@ -2908,6 +3131,35 @@ def process_sh6_line(f3x_data, md5_directory, line_number, sh6_line, sh6_line_pa sh6_schedule_page_dict['committeeName'] = f3x_data['committeeName'] sh6_outfile = md5_directory + 'SH6/' + line_number + '/page_' + str(sh6_page_no) + '.pdf' pypdftk.fill_form(sh6_infile, sh6_schedule_page_dict, sh6_outfile) + # Memo text changes + memo_dict = {} + if len(memo_array) >= 1: + temp_memo_outfile = md5_directory + 'SH6/' + line_number + '/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SH6/' + line_number + '/page_memo_' + str(sh6_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + if len(memo_array) >= 2: + memo_dict['scheduleName_2'] = memo_array[1]['scheduleName'] + memo_dict['memoDescription_2'] = memo_array[1]['memoDescription'] + memo_dict['transactionId_2'] = memo_array[1]['transactionId'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sh6_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sh6_outfile) + + if len(memo_array) >= 3: + memo_dict = {} + memo_outfile = md5_directory + 'SH6/' + line_number + '/page_memo_' + str(sh6_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sh6_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sh6_outfile) pypdftk.concat(directory_files(md5_directory + 'SH6/' + line_number + '/'), md5_directory + 'SH6/' + line_number + '/all_pages.pdf') if path.isfile(md5_directory + 'SH6/all_pages.pdf'): @@ -2935,6 +3187,7 @@ def process_sh4_line(f3x_data, md5_directory, line_number, sh4_line, sh4_line_pa sh4_line_start_page += 1 for sh4_page_no in range(sh4_line_page_cnt): page_subtotal = 0.00 + memo_array = [] last_page = False has_sh4_schedules = True sh4_schedule_page_dict = {} @@ -2947,7 +3200,7 @@ def process_sh4_line(f3x_data, md5_directory, line_number, sh4_line, sh4_line_pa # This call prepares data to render on PDF sh4_schedule_dict = build_sh4_per_page_schedule_dict(last_page, sh4_line_last_page_cnt, page_start_index, sh4_schedule_page_dict, - sh4_line) + sh4_line, memo_array) page_fed_subtotal = float(sh4_schedule_page_dict['subFedShare']) page_nonfed_subtotal = float(sh4_schedule_page_dict['subNonFedShare']) @@ -2963,6 +3216,35 @@ def process_sh4_line(f3x_data, md5_directory, line_number, sh4_line, sh4_line_pa sh4_schedule_page_dict['committeeName'] = f3x_data['committeeName'] sh4_outfile = md5_directory + 'SH4/' + line_number + '/page_' + str(sh4_page_no) + '.pdf' pypdftk.fill_form(sh4_infile, sh4_schedule_page_dict, sh4_outfile) + # Memo text changes + memo_dict = {} + if len(memo_array) >= 1: + temp_memo_outfile = md5_directory + 'SH4/' + line_number + '/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SH4/' + line_number + '/page_memo_' + str(sh4_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + if len(memo_array) >= 2: + memo_dict['scheduleName_2'] = memo_array[1]['scheduleName'] + memo_dict['memoDescription_2'] = memo_array[1]['memoDescription'] + memo_dict['transactionId_2'] = memo_array[1]['transactionId'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sh4_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sh4_outfile) + + if len(memo_array) >= 3: + memo_dict = {} + memo_outfile = md5_directory + 'SH4/' + line_number + '/page_memo_' + str(sh4_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sh4_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sh4_outfile) pypdftk.concat(directory_files(md5_directory + 'SH4/' + line_number + '/'), md5_directory + 'SH4/' + line_number + '/all_pages.pdf') if path.isfile(md5_directory + 'SH4/all_pages.pdf'): @@ -2975,42 +3257,42 @@ def process_sh4_line(f3x_data, md5_directory, line_number, sh4_line, sh4_line_pa return has_sh4_schedules -def process_sh_memo(f3x_data, md5_directory, sh_schedule_type, line_number, sh_memo, sh_memo_page_cnt, sh_memo_start_page, - sh_memo_last_page_cnt, total_no_of_pages): - has_sh_memo_schedules = False - if len(sh_memo) > 0: - has_sh_memo_schedules = True - os.makedirs(md5_directory + sh_schedule_type + line_number + '/memo', exist_ok=True) - sh_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') - if sh_memo_page_cnt > 0: - sh_memo_start_page += 1 - for sh_memo_page_no in range(sh_memo_page_cnt): - - last_page = False - sh_memo_schedule_page_dict = {} - sh_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sh_memo_page_no + 1) + " / " + str( - total_no_of_pages) - page_start_index = sh_memo_page_no * 2 - if ((sh_memo_page_no + 1) == sh_memo_page_cnt): - last_page = True - # This call prepares data to render on PDF - sh_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sh_memo_last_page_cnt, - page_start_index, - sh_memo_schedule_page_dict, - sh_memo) - - sh_memo_outfile = md5_directory + sh_schedule_type + line_number + '/memo/page_' + str(sh_memo_page_no) + '.pdf' - pypdftk.fill_form(sh_memo_infile, sh_memo_schedule_page_dict, sh_memo_outfile) - pypdftk.concat(directory_files(md5_directory + sh_schedule_type + line_number + '/memo/'), md5_directory + sh_schedule_type + line_number - + '/memo/all_pages.pdf') - # if all_pages.pdf exists in SH folder, concatenate line number pdf to all_pages.pdf - if path.isfile(md5_directory + sh_schedule_type + line_number + '/memo/all_pages.pdf'): - pypdftk.concat( - [md5_directory + sh_schedule_type + 'all_pages.pdf', md5_directory + sh_schedule_type + line_number + '/memo/all_pages.pdf'], - md5_directory + sh_schedule_type + 'temp_all_pages.pdf') - os.rename(md5_directory + sh_schedule_type + 'temp_all_pages.pdf', md5_directory + sh_schedule_type + 'all_pages.pdf') - - return has_sh_memo_schedules +# def process_sh_memo(f3x_data, md5_directory, sh_schedule_type, line_number, sh_memo, sh_memo_page_cnt, sh_memo_start_page, +# sh_memo_last_page_cnt, total_no_of_pages): +# has_sh_memo_schedules = False +# if len(sh_memo) > 0: +# has_sh_memo_schedules = True +# os.makedirs(md5_directory + sh_schedule_type + line_number + '/memo', exist_ok=True) +# sh_memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') +# if sh_memo_page_cnt > 0: +# sh_memo_start_page += 1 +# for sh_memo_page_no in range(sh_memo_page_cnt): +# +# last_page = False +# sh_memo_schedule_page_dict = {} +# sh_memo_schedule_page_dict['PAGESTR'] = "PAGE " + str(sh_memo_page_no + 1) + " / " + str( +# total_no_of_pages) +# page_start_index = sh_memo_page_no * 2 +# if ((sh_memo_page_no + 1) == sh_memo_page_cnt): +# last_page = True +# # This call prepares data to render on PDF +# sh_memo_schedule_page_dict = build_memo_per_page_schedule_dict(last_page, sh_memo_last_page_cnt, +# page_start_index, +# sh_memo_schedule_page_dict, +# sh_memo) +# +# sh_memo_outfile = md5_directory + sh_schedule_type + line_number + '/memo/page_' + str(sh_memo_page_no) + '.pdf' +# pypdftk.fill_form(sh_memo_infile, sh_memo_schedule_page_dict, sh_memo_outfile) +# pypdftk.concat(directory_files(md5_directory + sh_schedule_type + line_number + '/memo/'), md5_directory + sh_schedule_type + line_number +# + '/memo/all_pages.pdf') +# # if all_pages.pdf exists in SH folder, concatenate line number pdf to all_pages.pdf +# if path.isfile(md5_directory + sh_schedule_type + line_number + '/memo/all_pages.pdf'): +# pypdftk.concat( +# [md5_directory + sh_schedule_type + 'all_pages.pdf', md5_directory + sh_schedule_type + line_number + '/memo/all_pages.pdf'], +# md5_directory + sh_schedule_type + 'temp_all_pages.pdf') +# os.rename(md5_directory + sh_schedule_type + 'temp_all_pages.pdf', md5_directory + sh_schedule_type + 'all_pages.pdf') +# +# return has_sh_memo_schedules def process_sh5_line(f3x_data, md5_directory, line_number, sh5_line, sh5_line_page_cnt, sh5_line_start_page, @@ -3030,6 +3312,7 @@ def process_sh5_line(f3x_data, md5_directory, line_number, sh5_line, sh5_line_pa sh5_line_start_page += 1 for sh5_page_no in range(sh5_line_page_cnt): page_subtotal = 0.00 + memo_array = [] last_page = False sh5_schedule_page_dict = {} sh5_schedule_page_dict['lineNumber'] = line_number @@ -3041,7 +3324,7 @@ def process_sh5_line(f3x_data, md5_directory, line_number, sh5_line, sh5_line_pa # This call prepares data to render on PDF sh5_schedule_dict = build_sh5_per_page_schedule_dict(last_page, sh5_line_last_page_cnt, page_start_index, sh5_schedule_page_dict, - sh5_line) + sh5_line, memo_array) transferred_amt_subtotal = float(sh5_schedule_page_dict['subtotalAmountTransferred']) voter_reg_amt_subtotal = float(sh5_schedule_page_dict['subvoterRegistrationAmount']) @@ -3068,6 +3351,24 @@ def process_sh5_line(f3x_data, md5_directory, line_number, sh5_line, sh5_line_pa sh5_schedule_page_dict['committeeName'] = f3x_data['committeeName'] sh5_outfile = md5_directory + 'SH5/' + line_number + '/page_' + str(sh5_page_no) + '.pdf' pypdftk.fill_form(sh5_infile, sh5_schedule_page_dict, sh5_outfile) + # Memo text changes + memo_dict = {} + if len(memo_array) >= 1: + temp_memo_outfile = md5_directory + 'SH5/' + line_number + '/page_memo_temp.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_outfile = md5_directory + 'SH5/' + line_number + '/page_memo_' + str(sh5_page_no) + '.pdf' + memo_dict['scheduleName_1'] = memo_array[0]['scheduleName'] + memo_dict['memoDescription_1'] = memo_array[0]['memoDescription'] + memo_dict['transactionId_1'] = memo_array[0]['transactionId'] + if len(memo_array) >= 2: + memo_dict['scheduleName_2'] = memo_array[1]['scheduleName'] + memo_dict['memoDescription_2'] = memo_array[1]['memoDescription'] + memo_dict['transactionId_2'] = memo_array[1]['transactionId'] + # build page + pypdftk.fill_form(memo_infile, memo_dict, memo_outfile) + pypdftk.concat([sh5_outfile, memo_outfile], temp_memo_outfile) + os.remove(memo_outfile) + os.rename(temp_memo_outfile, sh5_outfile) pypdftk.concat(directory_files(md5_directory + 'SH5/' + line_number + '/'), md5_directory + 'SH5/' + line_number + '/all_pages.pdf') if path.isfile(md5_directory + 'SH5/all_pages.pdf'): @@ -3396,16 +3697,17 @@ def process_sh_line_numbers(sh_30a, sh_21a,sh_18b, sh_18a, sh_h1, sh_h2, sh_h2.append(sh_obj) -def process_memo_text(schedule_dict, memo_array): +def process_memo_text(schedule_dict, schedule, memo_array): if 'memoDescription' in schedule_dict and schedule_dict['memoDescription']: memo_array.append( - {'scheduleName': 'SA' + schedule_dict['lineNumber'], + {'scheduleName': schedule + schedule_dict['lineNumber'], 'memoDescription': schedule_dict['memoDescription'], 'transactionId': schedule_dict['transactionId']}) + # This method builds data for individual SA page def build_sa_per_page_schedule_dict(last_page, transactions_in_page, page_start_index, sa_schedule_page_dict, - sa_schedules, sa_memo): + sa_schedules, memo_array): page_subtotal = 0.00 if not last_page: transactions_in_page = 3 @@ -3413,39 +3715,39 @@ def build_sa_per_page_schedule_dict(last_page, transactions_in_page, page_start_ if transactions_in_page == 1: index = 1 sa_schedule_dict = sa_schedules[page_start_index + 0] - process_memo_text(sa_schedule_dict, sa_memo) + process_memo_text(sa_schedule_dict, 'SA', memo_array) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) elif transactions_in_page == 2: index = 1 sa_schedule_dict = sa_schedules[page_start_index + 0] - process_memo_text(sa_schedule_dict, sa_memo) + process_memo_text(sa_schedule_dict, 'SA', memo_array) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) index = 2 sa_schedule_dict = sa_schedules[page_start_index + 1] - process_memo_text(sa_schedule_dict, sa_memo) + process_memo_text(sa_schedule_dict, 'SA', memo_array) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) elif transactions_in_page == 3: index = 1 sa_schedule_dict = sa_schedules[page_start_index + 0] - process_memo_text(sa_schedule_dict, sa_memo) + process_memo_text(sa_schedule_dict, 'SA', memo_array) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) index = 2 sa_schedule_dict = sa_schedules[page_start_index + 1] - process_memo_text(sa_schedule_dict, sa_memo) + process_memo_text(sa_schedule_dict, 'SA', memo_array) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) index = 3 sa_schedule_dict = sa_schedules[page_start_index + 2] - process_memo_text(sa_schedule_dict, sa_memo) + process_memo_text(sa_schedule_dict, 'SA', memo_array) if sa_schedule_dict['memoCode'] != 'X': page_subtotal += sa_schedule_dict['contributionAmount'] build_contributor_name_date_dict(index, page_start_index, sa_schedule_dict, sa_schedule_page_dict) @@ -3474,7 +3776,7 @@ def build_memo_per_page_schedule_dict(last_page, transactions_in_page, page_star def build_sh4_per_page_schedule_dict(last_page, transactions_in_page, page_start_index, sh4_schedule_page_dict, - sh4_schedules): + sh4_schedules, memo_array): page_fed_subtotal = 0.00 page_nonfed_subtotal = 0.00 if not last_page: @@ -3483,6 +3785,7 @@ def build_sh4_per_page_schedule_dict(last_page, transactions_in_page, page_start if transactions_in_page == 1: index = 1 sh4_schedule_dict = sh4_schedules[page_start_index + 0] + process_memo_text(sh4_schedule_dict, 'H4', memo_array) if sh4_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh4_schedule_dict['federalShare'] page_nonfed_subtotal += sh4_schedule_dict['nonfederalShare'] @@ -3491,12 +3794,14 @@ def build_sh4_per_page_schedule_dict(last_page, transactions_in_page, page_start elif transactions_in_page == 2: index = 1 sh4_schedule_dict = sh4_schedules[page_start_index + 0] + process_memo_text(sh4_schedule_dict, 'H4', memo_array) if sh4_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh4_schedule_dict['federalShare'] page_nonfed_subtotal += sh4_schedule_dict['nonfederalShare'] build_sh_name_date_dict(index, page_start_index, sh4_schedule_dict, sh4_schedule_page_dict) index = 2 sh4_schedule_dict = sh4_schedules[page_start_index + 1] + process_memo_text(sh4_schedule_dict, 'H4', memo_array) if sh4_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh4_schedule_dict['federalShare'] page_nonfed_subtotal += sh4_schedule_dict['nonfederalShare'] @@ -3505,18 +3810,21 @@ def build_sh4_per_page_schedule_dict(last_page, transactions_in_page, page_start elif transactions_in_page == 3: index = 1 sh4_schedule_dict = sh4_schedules[page_start_index + 0] + process_memo_text(sh4_schedule_dict, 'H4', memo_array) if sh4_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh4_schedule_dict['federalShare'] page_nonfed_subtotal += sh4_schedule_dict['nonfederalShare'] build_sh_name_date_dict(index, page_start_index, sh4_schedule_dict, sh4_schedule_page_dict) index = 2 sh4_schedule_dict = sh4_schedules[page_start_index + 1] + process_memo_text(sh4_schedule_dict, 'H4', memo_array) if sh4_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh4_schedule_dict['federalShare'] page_nonfed_subtotal += sh4_schedule_dict['nonfederalShare'] build_sh_name_date_dict(index, page_start_index, sh4_schedule_dict, sh4_schedule_page_dict) index = 3 sh4_schedule_dict = sh4_schedules[page_start_index + 2] + process_memo_text(sh4_schedule_dict, 'H4', memo_array) if sh4_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh4_schedule_dict['federalShare'] page_nonfed_subtotal += sh4_schedule_dict['nonfederalShare'] @@ -3648,7 +3956,7 @@ def build_sh2_per_page_schedule_dict(last_page, transactions_in_page, page_start return sh2_schedule_dict def build_sh5_per_page_schedule_dict(last_page, transactions_in_page, page_start_index, sh5_schedule_page_dict, - sh5_schedules): + sh5_schedules, memo_array): transferred_amt_subtotal = 0.00 voter_reg_amt_subtotal = 0.00 voter_id_amt_subtotal = 0.00 @@ -3661,6 +3969,7 @@ def build_sh5_per_page_schedule_dict(last_page, transactions_in_page, page_start if transactions_in_page == 1: index = 1 sh5_schedule_dict = sh5_schedules[page_start_index + 0] + process_memo_text(sh5_schedule_dict, 'H5', memo_array) transferred_amt_subtotal += sh5_schedule_dict['totalAmountTransferred'] voter_reg_amt_subtotal += sh5_schedule_dict['voterRegistrationAmount'] voter_id_amt_subtotal += sh5_schedule_dict['voterIdAmount'] @@ -3671,6 +3980,7 @@ def build_sh5_per_page_schedule_dict(last_page, transactions_in_page, page_start elif transactions_in_page == 2: index = 1 sh5_schedule_dict = sh5_schedules[page_start_index + 0] + process_memo_text(sh5_schedule_dict, 'H5', memo_array) transferred_amt_subtotal += sh5_schedule_dict['totalAmountTransferred'] voter_reg_amt_subtotal += sh5_schedule_dict['voterRegistrationAmount'] voter_id_amt_subtotal += sh5_schedule_dict['voterIdAmount'] @@ -3679,6 +3989,7 @@ def build_sh5_per_page_schedule_dict(last_page, transactions_in_page, page_start build_sh_name_date_dict(index, page_start_index, sh5_schedule_dict, sh5_schedule_page_dict) index = 2 sh5_schedule_dict = sh5_schedules[page_start_index + 1] + process_memo_text(sh5_schedule_dict, 'H5', memo_array) transferred_amt_subtotal += sh5_schedule_dict['totalAmountTransferred'] voter_reg_amt_subtotal += sh5_schedule_dict['voterRegistrationAmount'] voter_id_amt_subtotal += sh5_schedule_dict['voterIdAmount'] @@ -3700,7 +4011,7 @@ def build_sh5_per_page_schedule_dict(last_page, transactions_in_page, page_start def build_sh6_line_per_page_schedule_dict(last_page, transactions_in_page, page_start_index, sh6_schedule_page_dict, - sh6_schedules): + sh6_schedules, memo_array): page_fed_subtotal = 0.00 page_levin_subtotal = 0.00 if not last_page: @@ -3709,6 +4020,7 @@ def build_sh6_line_per_page_schedule_dict(last_page, transactions_in_page, page_ if transactions_in_page == 1: index = 1 sh6_schedule_dict = sh6_schedules[page_start_index + 0] + process_memo_text(sh6_schedule_dict, 'H6', memo_array) if sh6_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh6_schedule_dict['federalShare'] page_levin_subtotal += sh6_schedule_dict['levinShare'] @@ -3717,12 +4029,14 @@ def build_sh6_line_per_page_schedule_dict(last_page, transactions_in_page, page_ elif transactions_in_page == 2: index = 1 sh6_schedule_dict = sh6_schedules[page_start_index + 0] + process_memo_text(sh6_schedule_dict, 'H6', memo_array) if sh6_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh6_schedule_dict['federalShare'] page_levin_subtotal += sh6_schedule_dict['levinShare'] build_sh_name_date_dict(index, page_start_index, sh6_schedule_dict, sh6_schedule_page_dict) index = 2 sh6_schedule_dict = sh6_schedules[page_start_index + 1] + process_memo_text(sh6_schedule_dict, 'H6', memo_array) if sh6_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh6_schedule_dict['federalShare'] page_levin_subtotal += sh6_schedule_dict['levinShare'] @@ -3731,18 +4045,21 @@ def build_sh6_line_per_page_schedule_dict(last_page, transactions_in_page, page_ elif transactions_in_page == 3: index = 1 sh6_schedule_dict = sh6_schedules[page_start_index + 0] + process_memo_text(sh6_schedule_dict, 'H6', memo_array) if sh6_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh6_schedule_dict['federalShare'] page_levin_subtotal += sh6_schedule_dict['levinShare'] build_sh_name_date_dict(index, page_start_index, sh6_schedule_dict, sh6_schedule_page_dict) index = 2 sh6_schedule_dict = sh6_schedules[page_start_index + 1] + process_memo_text(sh6_schedule_dict, 'H6', memo_array) if sh6_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh6_schedule_dict['federalShare'] page_levin_subtotal += sh6_schedule_dict['levinShare'] build_sh_name_date_dict(index, page_start_index, sh6_schedule_dict, sh6_schedule_page_dict) index = 3 sh6_schedule_dict = sh6_schedules[page_start_index + 2] + process_memo_text(sh6_schedule_dict, 'H6', memo_array) if sh6_schedule_dict['memoCode'] != 'X': page_fed_subtotal += sh6_schedule_dict['federalShare'] page_levin_subtotal += sh6_schedule_dict['levinShare'] @@ -3755,13 +4072,14 @@ def build_sh6_line_per_page_schedule_dict(last_page, transactions_in_page, page_ # This method builds data for individual SB page def build_sb_per_page_schedule_dict(last_page, transactions_in_page, page_start_index, sb_schedule_page_dict, - sb_schedules): + sb_schedules, memo_array): page_subtotal = 0.00 if not last_page: transactions_in_page = 3 if transactions_in_page == 1: index = 1 sb_schedule_dict = sb_schedules[page_start_index + 0] + process_memo_text(sb_schedule_dict, 'SB', memo_array) if sb_schedule_dict['memoCode'] != 'X': page_subtotal += sb_schedule_dict['expenditureAmount'] for key in sb_schedules[page_start_index]: @@ -3769,12 +4087,14 @@ def build_sb_per_page_schedule_dict(last_page, transactions_in_page, page_start_ elif transactions_in_page == 2: index = 1 sb_schedule_dict = sb_schedules[page_start_index + 0] + process_memo_text(sb_schedule_dict, 'SB', memo_array) if sb_schedule_dict['memoCode'] != 'X': page_subtotal += sb_schedule_dict['expenditureAmount'] for key in sb_schedules[page_start_index]: build_payee_name_date_dict(index, key, sb_schedule_dict, sb_schedule_page_dict) index = 2 sb_schedule_dict = sb_schedules[page_start_index + 1] + process_memo_text(sb_schedule_dict, 'SB', memo_array) if sb_schedule_dict['memoCode'] != 'X': page_subtotal += sb_schedule_dict['expenditureAmount'] for key in sb_schedules[page_start_index]: @@ -3782,18 +4102,21 @@ def build_sb_per_page_schedule_dict(last_page, transactions_in_page, page_start_ elif transactions_in_page == 3: index = 1 sb_schedule_dict = sb_schedules[page_start_index + 0] + process_memo_text(sb_schedule_dict, 'SB', memo_array) if sb_schedule_dict['memoCode'] != 'X': page_subtotal += sb_schedule_dict['expenditureAmount'] for key in sb_schedules[page_start_index]: build_payee_name_date_dict(index, key, sb_schedule_dict, sb_schedule_page_dict) index = 2 sb_schedule_dict = sb_schedules[page_start_index + 1] + process_memo_text(sb_schedule_dict, 'SB', memo_array) if sb_schedule_dict['memoCode'] != 'X': page_subtotal += sb_schedule_dict['expenditureAmount'] for key in sb_schedules[page_start_index]: build_payee_name_date_dict(index, key, sb_schedule_dict, sb_schedule_page_dict) index = 3 sb_schedule_dict = sb_schedules[page_start_index + 2] + process_memo_text(sb_schedule_dict, 'SB', memo_array) if sb_schedule_dict['memoCode'] != 'X': page_subtotal += sb_schedule_dict['expenditureAmount'] for key in sb_schedules[page_start_index]: @@ -3802,13 +4125,14 @@ def build_sb_per_page_schedule_dict(last_page, transactions_in_page, page_start_ return sb_schedule_dict def build_se_per_page_schedule_dict(last_page, transactions_in_page, page_start_index, se_schedule_page_dict, - se_schedules): + se_schedules, memo_array): page_subtotal = 0.00 if not last_page: transactions_in_page = 2 if transactions_in_page == 1: index = 1 se_schedule_dict = se_schedules[page_start_index + 0] + process_memo_text(se_schedule_dict, 'SE', memo_array) if se_schedule_dict['memoCode'] != 'X': page_subtotal += se_schedule_dict['expenditureAmount'] for key in se_schedules[page_start_index]: @@ -3816,12 +4140,14 @@ def build_se_per_page_schedule_dict(last_page, transactions_in_page, page_start_ elif transactions_in_page == 2: index = 1 se_schedule_dict = se_schedules[page_start_index + 0] + process_memo_text(se_schedule_dict, 'SE', memo_array) if se_schedule_dict['memoCode'] != 'X': page_subtotal += se_schedule_dict['expenditureAmount'] for key in se_schedules[page_start_index]: build_se_name_date_dict(index, key, se_schedule_dict, se_schedule_page_dict) index = 2 se_schedule_dict = se_schedules[page_start_index + 1] + process_memo_text(se_schedule_dict, 'SE', memo_array) if se_schedule_dict['memoCode'] != 'X': page_subtotal += se_schedule_dict['expenditureAmount'] for key in se_schedules[page_start_index]: @@ -3830,13 +4156,14 @@ def build_se_per_page_schedule_dict(last_page, transactions_in_page, page_start_ return se_schedule_dict def build_sf_per_page_schedule_dict(last_page, transactions_in_page, page_start_index, sf_schedule_page_dict, - sf_schedules): + sf_schedules, memo_array): page_subtotal = 0.00 if not last_page: transactions_in_page = 3 if transactions_in_page == 1: index = 1 sf_schedule_dict = sf_schedules[page_start_index + 0] + process_memo_text(sf_schedule_dict, 'SF', memo_array) if sf_schedule_dict['memoCode'] != 'X': page_subtotal += sf_schedule_dict['expenditureAmount'] for key in sf_schedules[page_start_index]: @@ -3844,12 +4171,14 @@ def build_sf_per_page_schedule_dict(last_page, transactions_in_page, page_start_ elif transactions_in_page == 2: index = 1 sf_schedule_dict = sf_schedules[page_start_index + 0] + process_memo_text(sf_schedule_dict, 'SF', memo_array) if sf_schedule_dict['memoCode'] != 'X': page_subtotal += sf_schedule_dict['expenditureAmount'] for key in sf_schedules[page_start_index]: build_payee_sf_name_date_dict(index, key, sf_schedule_dict, sf_schedule_page_dict) index = 2 sf_schedule_dict = sf_schedules[page_start_index + 1] + process_memo_text(sf_schedule_dict, 'SF', memo_array) if sf_schedule_dict['memoCode'] != 'X': page_subtotal += sf_schedule_dict['expenditureAmount'] for key in sf_schedules[page_start_index]: @@ -3857,18 +4186,21 @@ def build_sf_per_page_schedule_dict(last_page, transactions_in_page, page_start_ elif transactions_in_page == 3: index = 1 sf_schedule_dict = sf_schedules[page_start_index + 0] + process_memo_text(sf_schedule_dict, 'SF', memo_array) if sf_schedule_dict['memoCode'] != 'X': page_subtotal += sf_schedule_dict['expenditureAmount'] for key in sf_schedules[page_start_index]: build_payee_sf_name_date_dict(index, key, sf_schedule_dict, sf_schedule_page_dict) index = 2 sf_schedule_dict = sf_schedules[page_start_index + 1] + process_memo_text(sf_schedule_dict, 'SF', memo_array) if sf_schedule_dict['memoCode'] != 'X': page_subtotal += sf_schedule_dict['expenditureAmount'] for key in sf_schedules[page_start_index]: build_payee_sf_name_date_dict(index, key, sf_schedule_dict, sf_schedule_page_dict) index = 3 sf_schedule_dict = sf_schedules[page_start_index + 2] + process_memo_text(sf_schedule_dict, 'SF', memo_array) if sf_schedule_dict['memoCode'] != 'X': page_subtotal += sf_schedule_dict['expenditureAmount'] for key in sf_schedules[page_start_index]: @@ -3877,10 +4209,8 @@ def build_sf_per_page_schedule_dict(last_page, transactions_in_page, page_start_ return sf_schedule_dict - - def build_la_per_page_schedule_dict(last_page, tranlactions_in_page, page_start_index, la_schedule_page_dict, - la_schedules): + la_schedules, memo_array): page_subtotal = 0.00 try: @@ -3890,6 +4220,7 @@ def build_la_per_page_schedule_dict(last_page, tranlactions_in_page, page_start_ if tranlactions_in_page == 1: index = 1 la_schedule_dict = la_schedules[page_start_index + 0] + process_memo_text(la_schedule_dict, 'SL', memo_array) if la_schedule_dict['memoCode'] != 'X': page_subtotal += la_schedule_dict['contributionAmount'] build_contributor_la_name_date_dict(index, page_start_index, la_schedule_dict, la_schedule_page_dict) @@ -3897,11 +4228,13 @@ def build_la_per_page_schedule_dict(last_page, tranlactions_in_page, page_start_ index = 1 la_schedule_dict = la_schedules[page_start_index + 0] + process_memo_text(la_schedule_dict, 'SL', memo_array) if la_schedule_dict['memoCode'] != 'X': page_subtotal += la_schedule_dict['contributionAmount'] build_contributor_la_name_date_dict(index, page_start_index, la_schedule_dict, la_schedule_page_dict) index = 2 la_schedule_dict = la_schedules[page_start_index + 1] + process_memo_text(la_schedule_dict, 'SL', memo_array) if la_schedule_dict['memoCode'] != 'X': page_subtotal += la_schedule_dict['contributionAmount'] build_contributor_la_name_date_dict(index, page_start_index, la_schedule_dict, la_schedule_page_dict) @@ -3910,18 +4243,20 @@ def build_la_per_page_schedule_dict(last_page, tranlactions_in_page, page_start_ index = 1 la_schedule_dict = la_schedules[page_start_index + 0] - + process_memo_text(la_schedule_dict, 'SL', memo_array) if la_schedule_dict['memoCode'] != 'X': page_subtotal += la_schedule_dict['contributionAmount'] build_contributor_la_name_date_dict(index, page_start_index, la_schedule_dict, la_schedule_page_dict) index = 2 la_schedule_dict = la_schedules[page_start_index + 1] + process_memo_text(la_schedule_dict, 'SL', memo_array) if la_schedule_dict['memoCode'] != 'X': page_subtotal += la_schedule_dict['contributionAmount'] build_contributor_la_name_date_dict(index, page_start_index, la_schedule_dict, la_schedule_page_dict) index = 3 la_schedule_dict = la_schedules[page_start_index + 2] + process_memo_text(la_schedule_dict, 'SL', memo_array) if la_schedule_dict['memoCode'] != 'X': page_subtotal += la_schedule_dict['contributionAmount'] build_contributor_la_name_date_dict(index, page_start_index, la_schedule_dict, la_schedule_page_dict) @@ -3932,21 +4267,25 @@ def build_la_per_page_schedule_dict(last_page, tranlactions_in_page, page_start_ elif tranlactions_in_page == 4: index = 1 la_schedule_dict = la_schedules[page_start_index + 0] + process_memo_text(la_schedule_dict, 'SL', memo_array) if la_schedule_dict['memoCode'] != 'X': page_subtotal += la_schedule_dict['contributionAmount'] build_contributor_la_name_date_dict(index, page_start_index, la_schedule_dict, la_schedule_page_dict) index = 2 la_schedule_dict = la_schedules[page_start_index + 1] + process_memo_text(la_schedule_dict, 'SL', memo_array) if la_schedule_dict['memoCode'] != 'X': page_subtotal += la_schedule_dict['contributionAmount'] build_contributor_la_name_date_dict(index, page_start_index, la_schedule_dict, la_schedule_page_dict) index = 3 la_schedule_dict = la_schedules[page_start_index + 2] + process_memo_text(la_schedule_dict, 'SL', memo_array) if la_schedule_dict['memoCode'] != 'X': page_subtotal += la_schedule_dict['contributionAmount'] build_contributor_la_name_date_dict(index, page_start_index, la_schedule_dict, la_schedule_page_dict) index = 4 la_schedule_dict = la_schedules[page_start_index + 3] + process_memo_text(la_schedule_dict, 'SL', memo_array) if la_schedule_dict['memoCode'] != 'X': page_subtotal += la_schedule_dict['contributionAmount'] build_contributor_la_name_date_dict(index, page_start_index, la_schedule_dict, la_schedule_page_dict) @@ -3960,7 +4299,7 @@ def build_la_per_page_schedule_dict(last_page, tranlactions_in_page, page_start_ return la_schedule_dict def build_slb_per_page_schedule_dict(last_page, transactions_in_page, page_start_index, slb_schedule_page_dict, - slb_schedules): + slb_schedules, memo_array): page_subtotal = 0.00 if not last_page: @@ -3968,6 +4307,7 @@ def build_slb_per_page_schedule_dict(last_page, transactions_in_page, page_start if transactions_in_page == 1: index = 1 slb_schedule_dict = slb_schedules[page_start_index + 0] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: @@ -3975,12 +4315,14 @@ def build_slb_per_page_schedule_dict(last_page, transactions_in_page, page_start elif transactions_in_page == 2: index = 1 slb_schedule_dict = slb_schedules[page_start_index + 0] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: build_slb_name_date_dict(index, key, slb_schedule_dict, slb_schedule_page_dict) index = 2 slb_schedule_dict = slb_schedules[page_start_index + 1] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: @@ -3988,18 +4330,21 @@ def build_slb_per_page_schedule_dict(last_page, transactions_in_page, page_start elif transactions_in_page == 3: index = 1 slb_schedule_dict = slb_schedules[page_start_index + 0] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: build_slb_name_date_dict(index, key, slb_schedule_dict, slb_schedule_page_dict) index = 2 slb_schedule_dict = slb_schedules[page_start_index + 1] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: build_slb_name_date_dict(index, key, slb_schedule_dict, slb_schedule_page_dict) index = 3 slb_schedule_dict = slb_schedules[page_start_index + 2] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: @@ -4008,24 +4353,28 @@ def build_slb_per_page_schedule_dict(last_page, transactions_in_page, page_start elif transactions_in_page == 4: index = 1 slb_schedule_dict = slb_schedules[page_start_index + 0] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: build_slb_name_date_dict(index, key, slb_schedule_dict, slb_schedule_page_dict) index = 2 slb_schedule_dict = slb_schedules[page_start_index + 1] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: build_slb_name_date_dict(index, key, slb_schedule_dict, slb_schedule_page_dict) index = 3 slb_schedule_dict = slb_schedules[page_start_index + 2] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: build_slb_name_date_dict(index, key, slb_schedule_dict, slb_schedule_page_dict) index = 4 slb_schedule_dict = slb_schedules[page_start_index + 3] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: @@ -4033,30 +4382,35 @@ def build_slb_per_page_schedule_dict(last_page, transactions_in_page, page_start elif transactions_in_page == 5: index = 1 slb_schedule_dict = slb_schedules[page_start_index + 0] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: build_slb_name_date_dict(index, key, slb_schedule_dict, slb_schedule_page_dict) index = 2 slb_schedule_dict = slb_schedules[page_start_index + 1] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: build_slb_name_date_dict(index, key, slb_schedule_dict, slb_schedule_page_dict) index = 3 slb_schedule_dict = slb_schedules[page_start_index + 2] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: build_slb_name_date_dict(index, key, slb_schedule_dict, slb_schedule_page_dict) index = 4 slb_schedule_dict = slb_schedules[page_start_index + 3] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: build_slb_name_date_dict(index, key, slb_schedule_dict, slb_schedule_page_dict) index = 5 slb_schedule_dict = slb_schedules[page_start_index + 4] + process_memo_text(slb_schedule_dict, 'SL', memo_array) if slb_schedule_dict['memoCode'] != 'X': page_subtotal += slb_schedule_dict['expenditureAmount'] for key in slb_schedules[page_start_index]: diff --git a/templates/forms/SC.pdf b/templates/forms/SC.pdf index cd0fea7266c92e3b051d3d1557c018e038aae067..8f373155119aa0692c04dde1b2851fb32310e858 100644 GIT binary patch delta 7086 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 Date: Wed, 3 Jun 2020 09:58:09 -0400 Subject: [PATCH 05/17] Fne all satheesh sprint31 (#177) * SF Memo text changes * fixed loan due date issue * fixed memoDescription for SH transactions * SL child print fix * fixed refund without election code * SA Memo Text changes * SA Memo Text changes * Memo text changes for all schedules * Memo text changes for all schedules * SC memo text removed from template * fixed laon due date issue --- routes/src/form3x.py | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index 65f1ce9..17d4498 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -1637,14 +1637,16 @@ def process_sc_line(f3x_data, md5_directory, sc_schedules, sc_start_page, total_ if 'loanDueDate' in sc and sc.get('loanDueDate'): if "-" in sc.get('loanDueDate'): date_array = sc.get('loanDueDate').split("-") - sc_schedule_page_dict['loanDueDateMonth'] = date_array[1] - sc_schedule_page_dict['loanDueDateDay'] = date_array[2] - sc_schedule_page_dict['loanDueDateYear'] = date_array[0] - else: + if len(date_array) == 3: + sc_schedule_page_dict['loanDueDateMonth'] = date_array[1] + sc_schedule_page_dict['loanDueDateDay'] = date_array[2] + sc_schedule_page_dict['loanDueDateYear'] = date_array[0] + elif "/" in sc.get('loanDueDate'): date_array = sc.get('loanDueDate').split("/") - sc_schedule_page_dict['loanDueDateMonth'] = date_array[0] - sc_schedule_page_dict['loanDueDateDay'] = date_array[1] - sc_schedule_page_dict['loanDueDateYear'] = date_array[2] + if len(date_array) == 3: + sc_schedule_page_dict['loanDueDateMonth'] = date_array[0] + sc_schedule_page_dict['loanDueDateDay'] = date_array[1] + sc_schedule_page_dict['loanDueDateYear'] = date_array[2] if 'child' in sc and sc.get('child'): sc2 = [] for sc_child in sc.get('child'): @@ -1898,17 +1900,20 @@ def process_sc1_line(f3x_data, md5_directory, sc1, sc1_start_page, total_no_of_p sc1_schedule_page_dict['loanIncurredDateMonth'] = date_array[0] sc1_schedule_page_dict['loanIncurredDateDay'] = date_array[1] sc1_schedule_page_dict['loanIncurredDateYear'] = date_array[2] + if sc1.get('loanDueDate') != "": if "-" in sc1.get('loanDueDate'): date_array = sc1.get('loanDueDate').split("-") - sc1_schedule_page_dict['loanDueDateMonth'] = date_array[1] - sc1_schedule_page_dict['loanDueDateDay'] = date_array[2] - sc1_schedule_page_dict['loanDueDateYear'] = date_array[0] - else: + if len(date_array) == 3: + sc1_schedule_page_dict['loanDueDateMonth'] = date_array[1] + sc1_schedule_page_dict['loanDueDateDay'] = date_array[2] + sc1_schedule_page_dict['loanDueDateYear'] = date_array[0] + elif "/" in sc1.get('loanDueDate'): date_array = sc1.get('loanDueDate').split("/") - sc1_schedule_page_dict['loanDueDateMonth'] = date_array[0] - sc1_schedule_page_dict['loanDueDateDay'] = date_array[1] - sc1_schedule_page_dict['loanDueDateYear'] = date_array[2] + if len(date_array) == 3: + sc1_schedule_page_dict['loanDueDateMonth'] = date_array[0] + sc1_schedule_page_dict['loanDueDateDay'] = date_array[1] + sc1_schedule_page_dict['loanDueDateYear'] = date_array[2] if sc1.get('originalLoanDate') != "": date_array = sc1.get('originalLoanDate').split("/") sc1_schedule_page_dict['originalLoanDateMonth'] = date_array[0] From 383c6252241ba93a7270e4597cf11ff0607a187f Mon Sep 17 00:00:00 2001 From: spanyala <31629295+spanyala@users.noreply.github.com> Date: Wed, 3 Jun 2020 18:21:28 -0400 Subject: [PATCH 06/17] Fne 2439 satheesh sprint31 (#179) * SF Memo text changes * fixed loan due date issue * fixed memoDescription for SH transactions * SL child print fix * fixed refund without election code * SA Memo Text changes * SA Memo Text changes * Memo text changes for all schedules * Memo text changes for all schedules * SC memo text removed from template * fixed laon due date issue * fixed alpha characters in loan due date --- routes/src/form3x.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index 17d4498..1a3aa38 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -1641,12 +1641,18 @@ def process_sc_line(f3x_data, md5_directory, sc_schedules, sc_start_page, total_ sc_schedule_page_dict['loanDueDateMonth'] = date_array[1] sc_schedule_page_dict['loanDueDateDay'] = date_array[2] sc_schedule_page_dict['loanDueDateYear'] = date_array[0] + else: + sc_schedule_page_dict['loanDueDateYear'] = sc.get('loanDueDate') elif "/" in sc.get('loanDueDate'): date_array = sc.get('loanDueDate').split("/") if len(date_array) == 3: sc_schedule_page_dict['loanDueDateMonth'] = date_array[0] sc_schedule_page_dict['loanDueDateDay'] = date_array[1] sc_schedule_page_dict['loanDueDateYear'] = date_array[2] + else: + sc_schedule_page_dict['loanDueDateYear'] = sc.get('loanDueDate') + else: + sc_schedule_page_dict['loanDueDateYear'] = sc.get('loanDueDate') if 'child' in sc and sc.get('child'): sc2 = [] for sc_child in sc.get('child'): @@ -1908,12 +1914,18 @@ def process_sc1_line(f3x_data, md5_directory, sc1, sc1_start_page, total_no_of_p sc1_schedule_page_dict['loanDueDateMonth'] = date_array[1] sc1_schedule_page_dict['loanDueDateDay'] = date_array[2] sc1_schedule_page_dict['loanDueDateYear'] = date_array[0] + else: + sc1_schedule_page_dict['loanDueDateYear'] = sc1.get('loanDueDate') elif "/" in sc1.get('loanDueDate'): date_array = sc1.get('loanDueDate').split("/") if len(date_array) == 3: sc1_schedule_page_dict['loanDueDateMonth'] = date_array[0] sc1_schedule_page_dict['loanDueDateDay'] = date_array[1] sc1_schedule_page_dict['loanDueDateYear'] = date_array[2] + else: + sc1_schedule_page_dict['loanDueDateYear'] = sc1.get('loanDueDate') + else: + sc1_schedule_page_dict['loanDueDateYear'] = sc1.get('loanDueDate') if sc1.get('originalLoanDate') != "": date_array = sc1.get('originalLoanDate').split("/") sc1_schedule_page_dict['originalLoanDateMonth'] = date_array[0] From e26a66eb4be8c967af87a9ee89c66f41c0d73f94 Mon Sep 17 00:00:00 2001 From: spanyala <31629295+spanyala@users.noreply.github.com> Date: Thu, 4 Jun 2020 15:36:17 -0400 Subject: [PATCH 07/17] Fne 2438 satheesh sprint31 (#181) * SF Memo text changes * fixed loan due date issue * fixed memoDescription for SH transactions * SL child print fix * fixed refund without election code * SA Memo Text changes * SA Memo Text changes * Memo text changes for all schedules * Memo text changes for all schedules * SC memo text removed from template * fixed laon due date issue * fixed alpha characters in loan due date * fixed org name for SF memo transaction --- routes/src/form3x.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index 1a3aa38..87879a6 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -4652,8 +4652,10 @@ def build_payee_sf_name_date_dict(index, key, sf_schedule_dict, sf_schedule_page + sf_schedule_dict['payeeMiddleName'] + ',' + sf_schedule_dict['payeePrefix'] + ',' + sf_schedule_dict['payeeSuffix']) - elif 'payeeOrganizationName' in sf_schedule_dict: + elif 'payeeOrganizationName' in sf_schedule_dict and sf_schedule_dict['payeeOrganizationName']: sf_schedule_page_dict["payeeName_" + str(index)] = sf_schedule_dict['payeeOrganizationName'] + elif 'designatingCommitteeName' in sf_schedule_dict and sf_schedule_dict['designatingCommitteeName']: + sf_schedule_page_dict["payeeName_" + str(index)] = sf_schedule_dict['designatingCommitteeName'] if 'payeeCandidateLastName' in sf_schedule_dict: sf_schedule_page_dict['payeeCandidateName_' + str(index)] = (sf_schedule_dict['payeeCandidateLastName'] + ',' From 68ecc96faac385b3efd6230a01690881cee745ad Mon Sep 17 00:00:00 2001 From: jpraveenkmrSalient <41488234+jpraveenkmrSalient@users.noreply.github.com> Date: Thu, 18 Jun 2020 13:08:19 -0400 Subject: [PATCH 08/17] fixing F3X print issues (#183) --- templates/forms/F3X.pdf | Bin 108835 -> 190624 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/templates/forms/F3X.pdf b/templates/forms/F3X.pdf index bbba62ef9dcdc5fd78f3d9026e25d536b4815e9a..5c570194486f1b4f39858d96c66b9a9f136199e8 100644 GIT binary patch literal 190624 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%0DeKIyh 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 NP@p9%)<96;{{y`v*Wv&G delta 11 ScmZ2*k$dqawuUW?$}0gNv;_G8 From da0b01b4ce7debd4c3cbfa6530c8d5ca53fa84dc Mon Sep 17 00:00:00 2001 From: spanyala <31629295+spanyala@users.noreply.github.com> Date: Wed, 24 Jun 2020 11:19:34 -0400 Subject: [PATCH 09/17] Fne uat bugs satheesh sprint33 (#185) * SF Memo text changes * fixed loan due date issue * fixed memoDescription for SH transactions * SL child print fix * fixed refund without election code * SA Memo Text changes * SA Memo Text changes * Memo text changes for all schedules * Memo text changes for all schedules * SC memo text removed from template * fixed laon due date issue * fixed alpha characters in loan due date * fixed org name for SF memo transaction * showing memo text in seperate page --- routes/src/form3x.py | 262 ++++++++++++++++++++++------------------- templates/forms/SB.pdf | Bin 61932 -> 62107 bytes 2 files changed, 138 insertions(+), 124 deletions(-) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index 87879a6..7320d25 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -60,25 +60,25 @@ def print_pdftk(stamp_print): md5_directory = current_app.config['OUTPUT_DIR_LOCATION'].format(json_file_md5) # checking if server has already generated pdf for same json file - if os.path.isdir(md5_directory) and path.isfile(md5_directory + 'all_pages.pdf'): - # push output file to AWS - s3 = boto3.client('s3') - s3.upload_file(md5_directory + 'all_pages.pdf', - current_app.config['AWS_FECFILE_COMPONENTS_BUCKET_NAME'], - md5_directory + 'all_pages.pdf', - ExtraArgs={'ContentType': "application/pdf", 'ACL': "public-read"}) - response = { - 'pdf_url': current_app.config['PRINT_OUTPUT_FILE_URL'].format(json_file_md5) + 'all_pages.pdf' - } - - # return response - if flask.request.method == "POST": - envelope = common.get_return_envelope( - data=response - ) - status_code = status.HTTP_201_CREATED - return flask.jsonify(**envelope), status_code - + # if os.path.isdir(md5_directory) and path.isfile(md5_directory + 'all_pages.pdf'): + # # push output file to AWS + # s3 = boto3.client('s3') + # s3.upload_file(md5_directory + 'all_pages.pdf', + # current_app.config['AWS_FECFILE_COMPONENTS_BUCKET_NAME'], + # md5_directory + 'all_pages.pdf', + # ExtraArgs={'ContentType': "application/pdf", 'ACL': "public-read"}) + # response = { + # 'pdf_url': current_app.config['PRINT_OUTPUT_FILE_URL'].format(json_file_md5) + 'all_pages.pdf' + # } + # + # # return response + # if flask.request.method == "POST": + # envelope = common.get_return_envelope( + # data=response + # ) + # status_code = status.HTTP_201_CREATED + # return flask.jsonify(**envelope), status_code + # os.makedirs(md5_directory, exist_ok=True) infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('F3X') # save json file as md5 file name @@ -140,6 +140,8 @@ def print_pdftk(stamp_print): if len(f3x_summary) > 0: total_no_of_pages = 5 f3x_data_summary_array = [f3x_data, f3x_summary] + if 'memoText' in f3x_data and f3x_data['memoText']: + total_no_of_pages += 1 else: f3x_data_summary_array = [f3x_data] f3x_data_summary = {i: j for x in f3x_data_summary_array for i, j in x.items()} @@ -170,6 +172,19 @@ def print_pdftk(stamp_print): pypdftk.fill_form(infile, f3x_data_summary, outfile) shutil.copy(outfile, md5_directory + 'F3X_Summary.pdf') os.remove(md5_directory + json_file_md5 + '_temp.pdf') + # Memo text changes + if 'memoText' in f3x_data_summary and f3x_data_summary['memoText']: + memo_dict = {} + temp_memo_outfile = md5_directory + 'F3X_Summary_memo.pdf' + memo_infile = current_app.config['FORM_TEMPLATES_LOCATION'].format('TEXT') + memo_dict['scheduleName_1'] = 'F3X' + f3x_data_summary['amendmentIndicator'] + memo_dict['memoDescription_1'] = f3x_data_summary['memoText'] + memo_dict['PAGESTR'] = "PAGE " + str(6) + " / " + str(total_no_of_pages) + pypdftk.fill_form(memo_infile, memo_dict, temp_memo_outfile) + pypdftk.concat([md5_directory + 'F3X_Summary.pdf', temp_memo_outfile], md5_directory + + json_file_md5 + '_temp.pdf') + shutil.copy(md5_directory + json_file_md5 + '_temp.pdf', md5_directory + 'F3X_Summary.pdf') + os.remove(md5_directory + json_file_md5 + '_temp.pdf') # checking for sa transactions if has_sa_schedules: @@ -879,105 +894,104 @@ def process_schedules(f3x_data, md5_directory, total_no_of_pages): sh_schedules.extend(schedules.get('SH')) sh_schedules_cnt = len(sh_schedules) sh_line_numbers = ['30A', '21A', '18B', '18A'] - - sh_30a = [] - sh_21a = [] - sh_18b = [] - sh_18a = [] - sh_h1 = [] - sh_h2 = [] - sh_30a_memo = [] - sh_21a_memo = [] - sh_18b_memo = [] - sh_18a_memo = [] - - sh_30a_last_page_cnt = sh_21a_last_page_cnt = 3 - sh_18b_last_page_cnt = 2 - sh_30a_memo_last_page_cnt = sh_21a_memo_last_page_cnt = sh_18b_memo_last_page_cnt = 2 - sh_30a_page_cnt = sh_21a_page_cnt = sh_18b_page_cnt = sh_30a_memo_page_cnt = 0 - sh_21a_memo_page_cnt = sh_18b_memo_page_cnt = 0 - - for sh_count in range(sh_schedules_cnt): - process_sh_line_numbers(sh_30a, sh_21a,sh_18b, sh_18a, sh_h1, sh_h2, - sh_30a_memo, sh_21a_memo, sh_18b_memo, sh_18a_memo, - sh_schedules[sh_count]) - if 'child' in sh_schedules[sh_count]: - sh_child_schedules = sh_schedules[sh_count]['child'] - - sh_child_schedules_count = len(sh_child_schedules) - for sh_child_count in range(sh_child_schedules_count): - if sh_schedules[sh_count]['child'][sh_child_count]['lineNumber'] in sh_line_numbers: - process_sh_line_numbers(sh_30a, sh_21a,sh_18b, sh_18a, sh_h1, sh_h2, - sh_30a_memo, sh_21a_memo,sh_18b_memo, sh_18a_memo, - sh_schedules[sh_count]['child'][sh_child_count]) - - - if len(sh_30a) != 0: - sh6_start_page = total_no_of_pages - sh6_schedules_cnt = len(sh_30a) - if sh6_schedules_cnt > 0: - has_sh6_schedules = True - os.makedirs(md5_directory + 'SH6', exist_ok=True) - - if len(sh_21a) != 0: - sh4_start_page = total_no_of_pages - sh4_schedules_cnt = len(sh_21a) - if sh4_schedules_cnt > 0: - has_sh4_schedules = True - os.makedirs(md5_directory + 'SH4', exist_ok=True) - - if len(sh_18b) != 0: - sh5_start_page = total_no_of_pages - sh5_schedules_cnt = len(sh_18b) - if sh5_schedules_cnt > 0: - has_sh5_schedules = True - os.makedirs(md5_directory + 'SH5', exist_ok=True) - - if len(sh_18a) != 0: - sh3_start_page = total_no_of_pages - sh3_schedules_cnt = len(sh_18a) - if sh3_schedules_cnt > 0: - has_sh3_schedules = True - os.makedirs(md5_directory + 'SH3', exist_ok=True) - - if len(sh_h1) != 0: - sh1_start_page = total_no_of_pages - sh1_schedules_cnt = len(sh_h1) - if sh1_schedules_cnt > 0: - has_sh1_schedules = True - os.makedirs(md5_directory + 'SH1', exist_ok=True) - - - if len(sh_h2) != 0: - sh2_start_page = total_no_of_pages - sh2_schedules_cnt = len(sh_h2) - if sh2_schedules_cnt > 0: - has_sh2_schedules = True - os.makedirs(md5_directory + 'SH2', exist_ok=True) - - - - sh_30a_page_cnt, sh_30a_last_page_cnt = calculate_page_count(sh_30a) - total_no_of_pages = (total_no_of_pages + sh_30a_page_cnt) - sh_30a_memo_page_cnt, sh_30a_memo_last_page_cnt = calculate_memo_page_count(sh_30a_memo) - - sh_21a_page_cnt, sh_21a_last_page_cnt = calculate_page_count(sh_21a) - total_no_of_pages = (total_no_of_pages + sh_21a_page_cnt) - sh_21a_memo_page_cnt, sh_21a_memo_last_page_cnt = calculate_memo_page_count(sh_21a_memo) - - sh_18b_page_cnt, sh_18b_last_page_cnt = calculate_sh5page_count(sh_18b) - total_no_of_pages = (total_no_of_pages + sh_18b_page_cnt) - sh_18b_memo_page_cnt, sh_18b_memo_last_page_cnt = calculate_memo_page_count(sh_18b_memo) - - sh_18a_page_cnt, sh_18a_last_page_cnt = calculate_page_count(sh_18a) - total_no_of_pages = (total_no_of_pages + sh_18a_page_cnt) - sh_18a_memo_page_cnt, sh_18a_memo_last_page_cnt = calculate_memo_page_count(sh_18a_memo) - - sh2_page_cnt, sh2_last_page_cnt = calculate_sh2_page_count(sh_h2) - total_no_of_pages = (total_no_of_pages + sh2_page_cnt) - - - if 'SL' in schedules or len(sl_summary) > 0: + if sh_schedules_cnt > 0: + sh_30a = [] + sh_21a = [] + sh_18b = [] + sh_18a = [] + sh_h1 = [] + sh_h2 = [] + sh_30a_memo = [] + sh_21a_memo = [] + sh_18b_memo = [] + sh_18a_memo = [] + + sh_30a_last_page_cnt = sh_21a_last_page_cnt = 3 + sh_18b_last_page_cnt = 2 + sh_30a_memo_last_page_cnt = sh_21a_memo_last_page_cnt = sh_18b_memo_last_page_cnt = 2 + sh_30a_page_cnt = sh_21a_page_cnt = sh_18b_page_cnt = sh_30a_memo_page_cnt = 0 + sh_21a_memo_page_cnt = sh_18b_memo_page_cnt = 0 + + for sh_count in range(sh_schedules_cnt): + process_sh_line_numbers(sh_30a, sh_21a,sh_18b, sh_18a, sh_h1, sh_h2, + sh_30a_memo, sh_21a_memo, sh_18b_memo, sh_18a_memo, + sh_schedules[sh_count]) + if 'child' in sh_schedules[sh_count]: + sh_child_schedules = sh_schedules[sh_count]['child'] + + sh_child_schedules_count = len(sh_child_schedules) + for sh_child_count in range(sh_child_schedules_count): + if sh_schedules[sh_count]['child'][sh_child_count]['lineNumber'] in sh_line_numbers: + process_sh_line_numbers(sh_30a, sh_21a,sh_18b, sh_18a, sh_h1, sh_h2, + sh_30a_memo, sh_21a_memo,sh_18b_memo, sh_18a_memo, + sh_schedules[sh_count]['child'][sh_child_count]) + + + if len(sh_30a) != 0: + sh6_start_page = total_no_of_pages + sh6_schedules_cnt = len(sh_30a) + if sh6_schedules_cnt > 0: + has_sh6_schedules = True + os.makedirs(md5_directory + 'SH6', exist_ok=True) + + if len(sh_21a) != 0: + sh4_start_page = total_no_of_pages + sh4_schedules_cnt = len(sh_21a) + if sh4_schedules_cnt > 0: + has_sh4_schedules = True + os.makedirs(md5_directory + 'SH4', exist_ok=True) + + if len(sh_18b) != 0: + sh5_start_page = total_no_of_pages + sh5_schedules_cnt = len(sh_18b) + if sh5_schedules_cnt > 0: + has_sh5_schedules = True + os.makedirs(md5_directory + 'SH5', exist_ok=True) + + if len(sh_18a) != 0: + sh3_start_page = total_no_of_pages + sh3_schedules_cnt = len(sh_18a) + if sh3_schedules_cnt > 0: + has_sh3_schedules = True + os.makedirs(md5_directory + 'SH3', exist_ok=True) + + if len(sh_h1) != 0: + sh1_start_page = total_no_of_pages + sh1_schedules_cnt = len(sh_h1) + if sh1_schedules_cnt > 0: + has_sh1_schedules = True + os.makedirs(md5_directory + 'SH1', exist_ok=True) + + + if len(sh_h2) != 0: + sh2_start_page = total_no_of_pages + sh2_schedules_cnt = len(sh_h2) + if sh2_schedules_cnt > 0: + has_sh2_schedules = True + os.makedirs(md5_directory + 'SH2', exist_ok=True) + + + + sh_30a_page_cnt, sh_30a_last_page_cnt = calculate_page_count(sh_30a) + total_no_of_pages = (total_no_of_pages + sh_30a_page_cnt) + sh_30a_memo_page_cnt, sh_30a_memo_last_page_cnt = calculate_memo_page_count(sh_30a_memo) + + sh_21a_page_cnt, sh_21a_last_page_cnt = calculate_page_count(sh_21a) + total_no_of_pages = (total_no_of_pages + sh_21a_page_cnt) + sh_21a_memo_page_cnt, sh_21a_memo_last_page_cnt = calculate_memo_page_count(sh_21a_memo) + + sh_18b_page_cnt, sh_18b_last_page_cnt = calculate_sh5page_count(sh_18b) + total_no_of_pages = (total_no_of_pages + sh_18b_page_cnt) + sh_18b_memo_page_cnt, sh_18b_memo_last_page_cnt = calculate_memo_page_count(sh_18b_memo) + + sh_18a_page_cnt, sh_18a_last_page_cnt = calculate_page_count(sh_18a) + total_no_of_pages = (total_no_of_pages + sh_18a_page_cnt) + sh_18a_memo_page_cnt, sh_18a_memo_last_page_cnt = calculate_memo_page_count(sh_18a_memo) + + sh2_page_cnt, sh2_last_page_cnt = calculate_sh2_page_count(sh_h2) + total_no_of_pages = (total_no_of_pages + sh2_page_cnt) + + if ('SL' in schedules and schedules['SL']) or len(sl_summary) > 0: sl_start_page = 0 sl_start_page = total_no_of_pages total_sl_pages = total_no_of_pages+1 @@ -1104,12 +1118,12 @@ def process_schedules(f3x_data, md5_directory, total_no_of_pages): total_no_of_pages = (total_no_of_pages + slb_4a_page_cnt + slb_4b_page_cnt + slb_4c_page_cnt + slb_4d_page_cnt + slb_5_page_cnt + slb_4a_memo_page_cnt + slb_4b_memo_page_cnt + slb_4c_memo_page_cnt + slb_4d_memo_page_cnt + slb_5_memo_page_cnt) - - sc_start_page = total_no_of_pages + 1 - total_no_of_pages += total_sc_pages - - sd_start_page = total_no_of_pages + 1 - total_no_of_pages += total_sd_pages + if total_sc_pages > 0: + sc_start_page = total_no_of_pages + 1 + total_no_of_pages += total_sc_pages + if total_sd_pages > 0: + sd_start_page = total_no_of_pages + 1 + total_no_of_pages += total_sd_pages if sa_schedules_cnt > 0: # process Schedule 11AI diff --git a/templates/forms/SB.pdf b/templates/forms/SB.pdf index e3773c65222a3cfdde8a6094f5c3c9f7fe706e71..3cea76b1ff754edf20bebd5be1cdbf35c0ca290c 100644 GIT binary patch delta 11433 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 From 8cbd50b58da7912f64a878daaf3a83127fd8c0d0 Mon Sep 17 00:00:00 2001 From: jpraveenkmrSalient <41488234+jpraveenkmrSalient@users.noreply.github.com> Date: Wed, 24 Jun 2020 14:48:33 -0400 Subject: [PATCH 10/17] alignment fixes SH2.pdf (#186) --- templates/forms/SH2.pdf | Bin 244360 -> 259036 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/templates/forms/SH2.pdf b/templates/forms/SH2.pdf index 453eb04afd170da6b40e4fcba4ca2cb10363d8f9..d3669ddb67d63c5e45f29033d9a2527f26973d65 100644 GIT binary patch delta 12464 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 delta 15 WcmccfoWJ8MUqcIH3)2?nj$HseHwNMW From 31b4d32cb7f9a839ee5b31266718598d9bbd8582 Mon Sep 17 00:00:00 2001 From: Roberto Sanchez Date: Tue, 30 Jun 2020 15:11:53 -0400 Subject: [PATCH 11/17] Update to new env deployment --- Jenkinsfile | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 813950b..82c36da 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -25,14 +25,14 @@ pipeline{ stage('Deploy Dev'){ when { branch 'develop' } steps { - deployImage("${VERSION}", "dev") + deployImage16("${VERSION}", "dev") code_quality("${BUILD_ID}", "${VERSION}") } } stage('Deploy QA'){ when { branch 'release' } steps { - deployImage("${VERSION}", "qa") + deployImage16("${VERSION}", "qa") } } stage('Deploy UAT'){ @@ -61,6 +61,16 @@ def deployImage(String version, String toEnv) { """ } +def deployImage16(String version, String toEnv) { + sh """ + kubectl16 \ + --context=arn:aws:eks:us-east-1:813218302951:cluster/fecnxg-dev1 \ + --namespace=${toEnv} \ + set image deployment/fecfile-imagegenerator \ + fecfile-imagegenerator=813218302951.dkr.ecr.us-east-1.amazonaws.com/fecfile-imagegenerator:${version} + """ +} + def code_quality(String id, String hash) { sh(""" sh successful_test.sh "${id}" ${hash} """) junit '**/reports/*.xml' From 9d9f2d341a5264446233c483c122734f24a511ad Mon Sep 17 00:00:00 2001 From: jpraveenkmrSalient <41488234+jpraveenkmrSalient@users.noreply.github.com> Date: Tue, 30 Jun 2020 15:15:01 -0400 Subject: [PATCH 12/17] FNE-2524 (#188) --- routes/src/form3x.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index 7320d25..38fe5ee 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -2845,8 +2845,8 @@ def process_sh1_line(f3x_data, md5_directory, tran_type_ident, sh_h1, sh1_page_c sh1_schedule_page_dict['senateOnly'] = str(sh1_line['senateOnly']) sh1_schedule_page_dict['nonPresidentialAndNonSenate'] = str(sh1_line['nonPresidentialAndNonSenate']) else: - sh1_schedule_page_dict['federalPercent'] = (float(sh1_line['federalPercent']) * 100) - sh1_schedule_page_dict['nonFederalPercent'] = (float(sh1_line['nonFederalPercent']) * 100) + sh1_schedule_page_dict['federalPercent'] = '{0:.2f}'.format(float(sh1_line['federalPercent'])) + sh1_schedule_page_dict['nonFederalPercent'] = '{0:.2f}'.format(float(sh1_line['nonFederalPercent'])) sh1_schedule_page_dict['administrative'] = str(sh1_line['administrative']) sh1_schedule_page_dict['genericVoterDrive'] = str(sh1_line['genericVoterDrive']) sh1_schedule_page_dict['publicCommunications'] = str(sh1_line['publicCommunications']) @@ -4775,10 +4775,23 @@ def build_slb_name_date_dict(index, key, slb_schedule_dict, slb_schedule_page_di def build_contributor_sl_levin_name_date_dict(index, key, sl_schedule_dict, sl_schedule_page_dict): try: + list_SL_convert_2_decimals = ['itemizedReceiptsFromPersons', 'unitemizedReceiptsFromPersons', + 'totalReceiptsFromPersons','otherReceipts','totalReceipts','voterRegistrationDisbursements', + 'voterIdDisbursements','gotvDisbursements','genericCampaignDisbursements','totalSubDisbursements', + 'otherDisbursements','totalDisbursements','beginningCashOnHand','receipts','subtotal', + 'disbursements','endingCashOnHand','itemizedReceiptsFromPersonsYTD', + 'unitemizedReceiptsFromPersonsYTD','totalReceiptsFromPersonsYTD','otherReceiptsYTD', + 'totalReceiptsYTD','voterRegistrationDisbursementsYTD','voterIdDisbursementsYTD', + 'gotvDisbursementsYTD','genericCampaignDisbursementsYTD','totalSubDisbursementsYTD', + 'otherDisbursementsYTD','totalDisbursementsYTD','beginningCashOnHandYTD','receiptsYTD', + 'subtotalYTD','disbursementsYTD','endingCashOnHandYTD'] for key in sl_schedule_dict: if key != 'accountName': sl_schedule_page_dict[key] = sl_schedule_dict[key] + if key in list_SL_convert_2_decimals: + sl_schedule_page_dict[key] = '{0:.2f}'.format(sl_schedule_page_dict[key]) + except Exception as e: print('Error at key: ' + key + ' in Schedule SL tranlaction: ' + str(sl_schedule_dict)) @@ -4839,6 +4852,8 @@ def build_sh2_name_date_dict(index, key, sh2_schedule_dict, sh2_schedule_page_di for key in sh2_schedule_dict: if key in ['fundraising','directCandidateSupport']: sh2_schedule_dict[key] = str(sh2_schedule_dict[key]) + if key in ['federalPercent', 'nonFederalPercent']: + sh2_schedule_dict[key] = '{:.2f}'.format(float(sh2_schedule_dict[key])) sh2_schedule_page_dict[key + '_' + str(index)] = sh2_schedule_dict[key] From 98f891e8488909134a9fca10c373daebad4f2f3c Mon Sep 17 00:00:00 2001 From: jpraveenkmrSalient <41488234+jpraveenkmrSalient@users.noreply.github.com> Date: Wed, 1 Jul 2020 14:41:29 -0400 Subject: [PATCH 13/17] Fne 2662 praveen sprint34 (#190) * FNE-2524 * FNE-2662 F1M modification --- templates/forms/F1M.pdf | Bin 178337 -> 197905 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/templates/forms/F1M.pdf b/templates/forms/F1M.pdf index 5c87817b2e626fdb2b5d46ada5e009e6c1002a6c..3e3de6d971c135fc3339dd8828712837a099ac8c 100644 GIT binary patch delta 2232 zcmcJQZEO@p7{_nsfVM|payjT#QhJNpN~p9uZ#%n}Alcp9t4a+JNYo}IS5T^Lu|-8q z`5;$FFh&gZ5~jfzEyb1#h!9AQl!$jqA{w<4tC$9&{b;`^8jUg0IJ?jTxz;oJ@;FBQ2SdG_^EkXw;ISjU9`IBvq;RfgdmeB>Jt7A+b0 zMqS*o49kq`mKEdi7(<%;VuUdp#R;*+Kp3tTYc9ZTkYZt$gB&!t$YRhal%udA6?`p} z`LPY$RZ_v%s%WcW2wH;K5&Jh@ha8*Hy?hc4jZ`9>TF;cJ` zsQ{z!4#0$YFIXYo^@G(52`)&nRuO34^z`G;DTs5!K&h)|L(P+C4=0lY$tOn}2Pbz0 zMt-eHrr*Pf&NpiYC!3d!R9@~+?{^Z@$M5v}eVva6!eU@6T(wxoOaf}}hU+2b#h?kI z1<((V2gL^#e5YJ3Aj4GV{d5;V|6Z=b9ou$@Mj0X0jyVS5md&t(9L>~q!fdg-2Q>Ug zf^Qyy)l%g-Gfj)&ktm`bJXy`UnCgTPk6aZ}xkrk5Blk!_!bQ-5=7PgEW;uC@b~!0g zmUKCNf4*!mdJ>L&{_+0w&-IDvF)YEn`u>uG1uz<-JP(GTVlW2fa}ESl^zH!-qG}0f zsH3;K5Tk+#7@sx4?dY^Pu^1+X$r+^%j>V-zxUM4&b57%NYX;9h(&_R5(qd}?N-1w2 zUaYG!SW#CA9`aLyJWS=Y9y6j+Y8&W=l%&k5B8yde7L)8;N6A#VjuJx|Xe$d0o{%|6 zZqi*ycaLrUG@HGWeRfN2>y4cyTb_R;JF%@%-7_9(UH8XFS)Xt0rP8PeYLRXjOeDHx z(<^U23;VOIwykevdz7)UL>x8`qbCM_X*__ zP*QsdMpDiB~FQ{JH$2(ZaJ3iSd2IpwOFi!v{%99;>;nieG%7XU-3I|78`RD zCtDKJhv;Bmmv7|K^^Szkx3oWSG4D3ncbMV2t=gj~1sJa99`G=h=2$bCe2ti)Y9^;PqL!w|%o%w9hh`U@ z`0fCBL6+o(z2J4X9Fxbu^7*`2R6c?3!{(<{Eh@YP#!k^JuY7{%7aq|(UWS+{yx(_v vz)tt4BQ3d!aXT@6ty%r$U?hgf4?85Wiot;C5vw#f)8s2yU+-*;R|Nh7gHekO delta 13 UcmbQ(#k24uS3?Wq7N&(e04U}K*Z=?k From 7d5d59b86afb2205a33fc906c65a4aaa4f592dd7 Mon Sep 17 00:00:00 2001 From: MeghaA05 Date: Mon, 6 Jul 2020 23:56:21 -0400 Subject: [PATCH 14/17] FNE-2529 H3 changes --- routes/src/form3x.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index 38fe5ee..153407b 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -3063,7 +3063,7 @@ def process_sh3_line(f3x_data, md5_directory, line_number, sh3_line, sh3_line_pa # sh3_schedule_page_dict['adtransactionId'] = sh3_page['transactionId'] #sh3_schedule_page_dict['adtransferredAmount'] = t_transfered[sh3_page_no] sh3_schedule_page_dict['accountName'] = acc_name - sh3_schedule_page_dict['totalAmountTransferred'] = t_transfered[sh3_page_no] + sh3_schedule_page_dict['totalAmountTransferred'] = '{0:.2f}'.format(float(t_transfered[sh3_page_no])) if 'receiptDate' in sh3_page: @@ -3076,16 +3076,16 @@ def process_sh3_line(f3x_data, md5_directory, line_number, sh3_line, sh3_line_pa for sub_sh3 in sh3_page.get('subs', []): s_ = sub_sh3['activityEventType'].lower() sh3_schedule_page_dict[s_+'transactionId'] = sub_sh3['transactionId'] - sh3_schedule_page_dict[s_+'transferredAmount'] = sub_sh3['transferredAmount'] + sh3_schedule_page_dict[s_+'transferredAmount'] = '{0:.2f}'.format(float(sub_sh3['transferredAmount'])) df_inc = '' for sub_sh3 in sh3_page.get('dfsubs', []): s_ = sub_sh3['activityEventType'].lower() sh3_schedule_page_dict[s_+'transactionId'+df_inc] = sub_sh3['transactionId'] - sh3_schedule_page_dict[s_+'transferredAmount'+df_inc] = sub_sh3['transferredAmount'] + sh3_schedule_page_dict[s_+'transferredAmount'+df_inc] = '{0:.2f}'.format(float(sub_sh3['transferredAmount'])) sh3_schedule_page_dict[s_+'activityEventName'+df_inc] = sub_sh3['activityEventName'] - sh3_schedule_page_dict[s_+'subtransferredAmount'] = sh3_page.get(s_+'total', '') + sh3_schedule_page_dict[s_+'subtransferredAmount'] = '{0:.2f}'.format(float(sh3_page.get(s_+'total', ''))) df_inc = '_1' dc_inc = '' @@ -3093,17 +3093,17 @@ def process_sh3_line(f3x_data, md5_directory, line_number, sh3_line, sh3_line_pa for sub_sh3 in sh3_page.get('dcsubs', []): s_ = sub_sh3['activityEventType'].lower() sh3_schedule_page_dict[s_+'transactionId'+dc_inc] = sub_sh3['transactionId'] - sh3_schedule_page_dict[s_+'transferredAmount'+dc_inc] = sub_sh3['transferredAmount'] + sh3_schedule_page_dict[s_+'transferredAmount'+dc_inc] = '{0:.2f}'.format(float(sub_sh3['transferredAmount'])) sh3_schedule_page_dict[s_+'activityEventName'+dc_inc] = sub_sh3['activityEventName'] - sh3_schedule_page_dict[s_+'subtransferredAmount'] = sh3_page.get(s_+'total', '') + sh3_schedule_page_dict[s_+'subtransferredAmount'] = '{0:.2f}'.format(float(sh3_page.get(s_+'total', ''))) dc_inc = '_1' sh3_schedule_page_dict['committeeName'] = f3x_data['committeeName'] if last_page: total_dict[acc_name]['lastpage'] = 0 - sh3_schedule_page_dict['totalAmountPeriod'] = sum(total_dict[acc_name].values()) + sh3_schedule_page_dict['totalAmountPeriod'] = '{0:.2f}'.format(float(sum(total_dict[acc_name].values()))) for total_key in total_dict[acc_name]: - sh3_schedule_page_dict[total_key.lower()+'total'] = total_dict[acc_name][total_key] + sh3_schedule_page_dict[total_key.lower()+'total'] = '{0:.2f}'.format(float(total_dict[acc_name][total_key])) sh3_outfile = md5_directory + 'SH3/' + line_number + '/page_' + str(sh3_page_no) + '.pdf' pypdftk.fill_form(sh3_infile, sh3_schedule_page_dict, sh3_outfile) From 31c5e95a8e6a236bddefa24da460f23848320a34 Mon Sep 17 00:00:00 2001 From: MeghaA05 Date: Tue, 7 Jul 2020 11:29:43 -0400 Subject: [PATCH 15/17] FNE-2618 L summary --- routes/src/form3x.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index 38fe5ee..d7b40e0 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -4785,10 +4785,25 @@ def build_contributor_sl_levin_name_date_dict(index, key, sl_schedule_dict, sl_s 'gotvDisbursementsYTD','genericCampaignDisbursementsYTD','totalSubDisbursementsYTD', 'otherDisbursementsYTD','totalDisbursementsYTD','beginningCashOnHandYTD','receiptsYTD', 'subtotalYTD','disbursementsYTD','endingCashOnHandYTD'] + list_skip = ['accountName', 'receipts','disbursements', 'subtotal', 'receiptsYTD','disbursementsYTD','subtotalYTD'] for key in sl_schedule_dict: - if key != 'accountName': + if key == 'receipts': + sl_schedule_page_dict[key] = sl_schedule_dict['totalReceipts'] + if key == 'disbursements': + sl_schedule_page_dict[key] = sl_schedule_dict['totalDisbursements'] + if key == 'subtotal': + sl_schedule_page_dict[key] = sl_schedule_dict['totalReceipts'] + sl_schedule_dict['beginningCashOnHand'] + if key == 'receiptsYTD': + sl_schedule_page_dict[key] = sl_schedule_dict['totalReceiptsYTD'] + if key == 'disbursementsYTD': + sl_schedule_page_dict[key] = sl_schedule_dict['totalDisbursementsYTD'] + if key == 'subtotalYTD': + sl_schedule_page_dict[key] = sl_schedule_dict['totalReceiptsYTD'] + sl_schedule_dict['beginningCashOnHandYTD'] + + if key not in list_skip: sl_schedule_page_dict[key] = sl_schedule_dict[key] + if key in list_SL_convert_2_decimals: sl_schedule_page_dict[key] = '{0:.2f}'.format(sl_schedule_page_dict[key]) From 5598eca3a0a4671472b1a64bdb23667eae42aa7c Mon Sep 17 00:00:00 2001 From: MeghaA05 Date: Thu, 9 Jul 2020 09:30:23 -0400 Subject: [PATCH 16/17] FNE-2618 L summary --- routes/src/form3x.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/src/form3x.py b/routes/src/form3x.py index 38fe5ee..3549ffe 100644 --- a/routes/src/form3x.py +++ b/routes/src/form3x.py @@ -4678,7 +4678,7 @@ def build_payee_sf_name_date_dict(index, key, sf_schedule_dict, sf_schedule_page + sf_schedule_dict['payeeCandidatePrefix'] + ',' + sf_schedule_dict['payeeCandidateSuffix']) - if key == 'expenditureDate': + if key == 'expenditureDate' and sf_schedule_dict['expenditureDate'] not in ["none", "null", " ", ""]: date_array = sf_schedule_dict[key].split("/") sf_schedule_page_dict['expenditureDateMonth_' + str(index)] = date_array[0] sf_schedule_page_dict['expenditureDateDay_' + str(index)] = date_array[1] From d12ebb54f97dd251a001f61b188e26389ee9905a Mon Sep 17 00:00:00 2001 From: Roberto Sanchez Date: Mon, 13 Jul 2020 09:37:55 -0400 Subject: [PATCH 17/17] changed k8s instance --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 82c36da..1aceeff 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -38,7 +38,7 @@ pipeline{ stage('Deploy UAT'){ when { branch 'master' } steps { - deployImage("${VERSION}", "uat") + deployImage16("${VERSION}", "uat") } } }