From 8012fa44338e078282bebecfb3c3e439730631f7 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Thu, 6 Mar 2025 07:17:30 +0000 Subject: [PATCH] preparing for hubspot upload --- asset_list/AssetList.py | 85 ++++++++++++++++++++++++++++++++++++--- asset_list/app.py | 32 +++++++-------- backend/app/plan/utils.py | 4 -- 3 files changed, 95 insertions(+), 26 deletions(-) diff --git a/asset_list/AssetList.py b/asset_list/AssetList.py index 25a40f99..ed1cdf2c 100644 --- a/asset_list/AssetList.py +++ b/asset_list/AssetList.py @@ -347,6 +347,8 @@ class AssetList: self.work_type_breakdowns = {} self.flat_data = None self.duplicated_addresses = None + self.contact_details = None + self.contact_detail_fields = None # We detect the presence of the non-intrusive columns self.non_intrusives_present = True if "CIGA Check Required" in self.raw_asset_list.columns else False @@ -1528,7 +1530,70 @@ class AssetList: self.flat_data = flat_data - def prepare_for_crm(self, contact_details, company_domain, crm_pipeline_name, first_dealstage, assigned_surveyors): + @staticmethod + def split_full_name(x): + if pd.isnull(x): + return None, None, None + x = x.lower() + titles = ["mr", "mrs", "ms", "miss", "dr", "prof"] + # Remove titles + detected_title = [title for title in titles if x.startswith(title)] + if detected_title: + for title in detected_title: + x = x.replace(title, "") + x = x.strip() + first_name, last_name = x.split(" ")[0], x.split(" ")[-1] + title = detected_title[0].title() if detected_title else None + return title, first_name.title(), last_name.title() + + def load_contact_details( + self, + local_filepath, + sheet_name, + landlord_property_id, + phone_number_column=None, + email_column=None, + fullname_column=None, + firstname_column=None, + lastname_column=None + ): + + self.contact_detail_fields = { + "landlord_property_id": landlord_property_id, + "phone_number": phone_number_column, + "email": email_column, + "fullname": fullname_column, + "firstname": firstname_column, + "lastname": lastname_column + } + + details_colnames = [ + phone_number_column, email_column, fullname_column, firstname_column, lastname_column + ] + # We'll fill them + none_details = [x for x in details_colnames if x is None] + details_colnames = [x for x in details_colnames if x is not None] + + contact_details = pd.read_excel( + local_filepath, sheet_name=sheet_name + )[[self.contact_detail_fields["landlord_property_id"]] + details_colnames] + contact_details = contact_details[ + ~pd.isnull(contact_details[self.contact_detail_fields["landlord_property_id"]]) + ] + # Fill anything we don't have + for detail in none_details: + contact_details[detail] = None + + if fullname_column and not (firstname_column and lastname_column): + contact_details["title"], contact_details["first_name"], contact_details["last_name"] = zip( + *contact_details[fullname_column].apply(self.split_full_name) + ) + else: + raise NotImplementedError("Implement me") + + self.contact_details = contact_details + + def prepare_for_crm(self, company_domain, crm_pipeline_name, first_dealstage, assigned_surveyors): """ This function prepares the data for upload into Hubspot :return: @@ -1589,7 +1654,7 @@ class AssetList: # Merge on the contact details programme_data = programme_data.merge( - contact_details, + self.contact_details, how="left", left_on=self.STANDARD_LANDLORD_PROPERTY_ID, right_on=self.landlord_property_id, @@ -1655,10 +1720,18 @@ class AssetList: schema_mappings = { 'Name ': self.DOMNA_PROPERTY_ID, # TODO: Maybe change this? 'Company Domain Name ': 'Company Domain Name ', - 'Email ': 'email', # TODO: Review - 'First Name ': 'first name', # TODO: Review - 'Last Name ': 'last name', # TODO: Review - 'Phone ': 'phone', # TODO: Review + 'Email ': ( + self.contact_detail_fields["email"] if self.contact_detail_fields["email"] else None + ), # TODO: Review + 'First Name ': ( + self.contact_detail_fields["firstname"] if self.contact_detail_fields["firstname"] else None + ), # TODO: Review + 'Last Name ': ( + self.contact_detail_fields["lastname"] if self.contact_detail_fields["lastname"] else None + ), # TODO: Review + 'Phone ': ( + self.contact_detail_fields["phone_number"] if self.contact_detail_fields["phone_number"] else None + ), # TODO: Review 'Full Address ': self.STANDARD_FULL_ADDRESS, 'Address 1 ': self.STANDARD_ADDRESS_1, 'Address 2 ': None, # TODO: Don't have this for the moment diff --git a/asset_list/app.py b/asset_list/app.py index 475bd7b3..ba3a1b82 100644 --- a/asset_list/app.py +++ b/asset_list/app.py @@ -472,23 +472,23 @@ def app(): asset_list.flat_analysis() - # Convert to a format suitable for CRM - contact_details = pd.DataFrame( - [ - { - asset_list.landlord_property_id: "EXETEMORH0100010", - "first name": "Khalim", - "last name": "Conn-Kowlessar", - "email": "kconnkowlessar@gmail.com", - "phone": "075399248" - } - ] + asset_list.load_contact_details( + local_filepath=os.path.join(data_folder, "Full property list wth D&V report V look up 12.2.25.xlsx"), + sheet_name="Report 1", + landlord_property_id=asset_list.landlord_property_id, + phone_number_column='Property Current Tel. Number', + fullname_column='Proeprty Current Occupant', + firstname_column=None, + lastname_column=None, + email_column=None, # TODO - we need this ) + # Convert to a format suitable for CRM + # TODO: TEMP assigned_surveyors = pd.DataFrame( [ { - asset_list.landlord_property_id: "EXETEMORH0100010", + asset_list.landlord_property_id: "02610001", "surveyor_name": "Khalim Conn-Kowlessar", "surveyor_email": "khalim@domna.homes", } @@ -501,17 +501,14 @@ def app(): crm_pipeline_name = "Survey Management" first_dealstage = "READY TO BEGIN SCHEDULING" # TODO - temp, upload to either SharePoint or AWS - hubspot_template = pd.read_csv("~/Downloads/Hubspot Upload Template - Demo V2(Template).csv") - hubspot_schema = hubspot_template.columns.tolist() asset_list.prepare_for_crm( - contact_details=contact_details, assigned_surveyors=assigned_surveyors, company_domain=company_domain, crm_pipeline_name=crm_pipeline_name, first_dealstage=first_dealstage ) - hubspt_data = asset_list.hubspot_data + hubspot_data = asset_list.hubspot_data # Store as an excel filename = os.path.join(data_folder, ".".join(data_filename.split(".")[:-1])) + " - Standardised.xlsx" @@ -520,3 +517,6 @@ def app(): with pd.ExcelWriter(filename) as writer: asset_list.standardised_asset_list.to_excel(writer, sheet_name="Standardised Asset List", index=False) asset_list.flat_data.to_excel(writer, sheet_name="Flat Data", index=False) + + # Store the Hubspot export as a csv + hubspot_data.to_csv(os.path.join(data_folder, "Hubspot Export.csv"), index=False) diff --git a/backend/app/plan/utils.py b/backend/app/plan/utils.py index 07d4642d..34fb02e7 100644 --- a/backend/app/plan/utils.py +++ b/backend/app/plan/utils.py @@ -1,9 +1,5 @@ -import pandas as pd -from backend.Property import Property from utils.s3 import read_from_s3 -from recommendations.recommendation_utils import get_wall_u_value, get_floor_u_value, get_roof_u_value - from backend.app.config import get_settings import msgpack