from pathlib import Path from typing import TypedDict from PyPDFForm import PdfWrapper from utils.date_utils import get_today_date_as_dd_mm_yyyy from utils.parsing_utils import find_and_parse_date, find_and_parse_phone_number def build_form_data_from_answers(answers: dict[int, str], categories: list[str], signature: str | None = None): form_data = {} for category in categories: form_data[form_fields_map[category]] = True form_data[form_fields_map["minor_work"]] = True form_data[form_fields_map["signed_by"]] = answers[0] form_data[form_fields_map["community"]] = answers[2] form_data[form_fields_map["building_name"]] = answers[3] form_data[form_fields_map["unit_no"]] = answers[4] form_data[form_fields_map["owner" if "owner" in answers[5].lower() else "tenant"]] = True form_data[form_fields_map["start_date"]] = find_and_parse_date(answers[6]) form_data[form_fields_map["end_date"]] = find_and_parse_date(answers[7]) form_data[form_fields_map["contact_number"]] = find_and_parse_phone_number(answers[8]) form_data[form_fields_map["contractor_name"]] = answers[9] form_data[form_fields_map["contractor_contact_number"]] = answers[10] form_data[form_fields_map["contractor_email"]] = answers[11] form_data[form_fields_map["email"]] = answers[12] form_data[form_fields_map["occupant_name"]] = answers[0] form_data[form_fields_map["signature_date"]] = get_today_date_as_dd_mm_yyyy() if signature: form_data[form_fields_map["signature"]] = signature return form_data def write_pdf_form(form_data: dict[str, str | bool | int], output_path:Path): base_form_path = Path(__file__).parent base_form_path = base_form_path.joinpath("form.pdf") with open(base_form_path, "rb") as blank_form: filled_form = PdfWrapper(blank_form).fill(form_data) with open(output_path, "wb+") as filled_form_file: filled_form_file.write(filled_form.read()) class FormFields(TypedDict, total=True): start_date: str end_date: str signed_by: str signature_date: str community: str email: str unit_no: str contact_number: str building_name: str contractor_name: str contractor_email: str contractor_contact_number: str occupant_name: str civil: str electrical_AC: str furniture_delivery: str handyman: str pest_control: str sail_shade: str wardrobes: str wooden_flooring: str plumbing_sanitary: str safety_systems: str soft_landscaping: str balcony_tiles: str bathroom_toilet_refurbish: str staircase_railing: str storage_box: str tiling_works: str doors_door_frames: str gypsum_ceiling: str kitchen_refurbish: str lights_and_sockets: str painting_wallpapering: str seating_area_barbecuing_fountain: str other_work_checkbox: str owner: str tenant: str signature: str minor_work: str form_fields_map: FormFields = {"start_date": "From", "end_date": "to", "signed_by": "name-10", "signature_date": "From--1", "community": "Name-2", "email": "Name-3", "unit_no": "Name-4", "contact_number": "Name-5", "building_name": "Name-6", "contractor_name": "Name-7", "contractor_email": "name-8", "contractor_contact_number": "name-9", "occupant_name": "name-1", "other_work": "name-19", "civil": "3", "electrical_AC": "10", "furniture_delivery": "14", "handyman": "18", "pest_control": "21", "sail_shade": "12", "wardrobes": "16", "wooden_flooring": "24", "plumbing_sanitary": "4", "safety_systems": "4", "soft_landscaping": "9", "balcony_tiles": "13", "bathroom_toilet_refurbish": "20", "staircase_railing": "17", "storage_box": "11", "tiling_works": "15", "doors_door_frames": "6", "gypsum_ceiling": "22", "kitchen_refurbish": "7", "lights_and_sockets": "23", "painting_wallpapering": "19", "seating_area_barbecuing_fountain": "8", "other_work_checkbox": "69", "owner": "Check Box4", "tenant": "Check Box3", "signature": "Signature2", "minor_work": "2"} work_categories = {"other_work": "other work", "civil": "Civil work, masonry", "electrical_AC": "electrical / AC / air conditioning", "furniture_delivery": "furniture delivery", "handyman": "handyman work, repairs, furniture assembly, furniture installation", "pest_control": "pest control", "sail_shade": "sail shade, curtains", "wardrobes": "wardrobes", "wooden_flooring": "wooden flooring", "plumbing_sanitary": "plumbing / sanitary / bathroom works such as repairing a sink, tap, toilet, shower or bathtub", "safety_systems": "safety systems, surveillance systems installation", "soft_landscaping": "soft landscaping", "balcony_tiles": "installation and fixing of balcony tiles", "bathroom_toilet_refurbish": "bathroom or toilet refurbishment or renovation", "staircase_railing": "staircase rails, handrails", "storage_box": "storage box", "tiling_works": "tiles installation or repair", "doors_door_frames": "work related to doors and door frames", "gypsum_ceiling": "gypsum ceiling installation or maintenance", "kitchen_refurbish": "kitchen renovation or refurbishment", "lights_and_sockets": "installation of lights, ceiling lights, power sockets", "painting_wallpapering": "painting, wallpaper installation", "seating_area_barbecuing_fountain": "installation or renovation of outdoor structures such as seating area, barbecuing area or fountains"}