From 1e38b44a9a5f87bbd7f2163d1f106bf2ab7be2b7 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Mon, 20 Jul 2026 08:37:33 +0000 Subject: [PATCH] =?UTF-8?q?A=20blank=20stored=20surveyor=20also=20counts?= =?UTF-8?q?=20as=20unset=20in=20the=20amendment=20check=20=F0=9F=9F=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- etl/hubspot/hubspot_deal_differ.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/etl/hubspot/hubspot_deal_differ.py b/etl/hubspot/hubspot_deal_differ.py index 60aece16c..bb1e58674 100644 --- a/etl/hubspot/hubspot_deal_differ.py +++ b/etl/hubspot/hubspot_deal_differ.py @@ -320,11 +320,11 @@ class HubspotDealDiffer: new_survey_date = parse_hs_date(new_deal.get("confirmed_survey_date")) new_survey_time = new_deal.get("confirmed_survey_time") - # HubSpot sends "" for an unset property; the DB stores None. Treat - # them as the same so a booked deal doesn't amend on every scrape. - raw_surveyor = new_deal.get("third_party_surveyor_identifier") - new_surveyor = ( - raw_surveyor if raw_surveyor is not None and raw_surveyor.strip() else None + new_surveyor = HubspotDealDiffer._normalised_surveyor( + new_deal.get("third_party_surveyor_identifier") + ) + old_surveyor = HubspotDealDiffer._normalised_surveyor( + old_deal.third_party_surveyor_identifier ) logger.info( "Abri job-amendment check: " @@ -336,7 +336,7 @@ class HubspotDealDiffer: new_survey_date, old_deal.confirmed_survey_time, new_survey_time, - old_deal.third_party_surveyor_identifier, + old_surveyor, new_surveyor, ) @@ -354,7 +354,7 @@ class HubspotDealDiffer: if old_deal.confirmed_survey_time != new_survey_time: return True - return old_deal.third_party_surveyor_identifier != new_surveyor + return old_surveyor != new_surveyor @staticmethod def check_for_abri_tenant_data_fetch( @@ -420,6 +420,14 @@ class HubspotDealDiffer: old_outcome = (old_deal.outcome or "").lower() return new_outcome == "surveyed" and old_outcome != "surveyed" + @staticmethod + def _normalised_surveyor(value: Optional[str]) -> Optional[str]: + # HubSpot sends "" for an unset property and the DB stores whatever + # the scrape wrote, so blank and missing must compare as equal. + if value is None or not value.strip(): + return None + return value + @staticmethod def _is_abandoned( number_of_attempts: Optional[str], outcome: Optional[str]