# Description This PR moves the categorisation of Bookings with Incidents from the flagging specific model to Booking Summary, effectively keeping this at Booking ID level. This also handles the direct dependency with the flagging categorisation model. I also improved the documentation and test coverage on the Booking Summary as it's becoming more and more central to many areas. # Checklist - [X] The edited models and dependants run properly with production data. - [X] The edited models are sufficiently documented. - [X] The edited models contain PK tests, and I've ran and passed them. - [X] I have checked for DRY opportunities with other models and docs. - [X] I've picked the right materialization for the affected models. # Other - [ ] Check if a full-refresh is required after this PR is merged. Related work items: #30676
279 lines
11 KiB
SQL
279 lines
11 KiB
SQL
{% set risk_booking_status = ("NOTAPPROVED", "FLAGGED") %}
|
|
{% set no_risk_booking_status = ("APPROVED", "NOFLAGS") %}
|
|
{% set incident_duplicated_status = "CLOSED - DUPLICATE" %}
|
|
{% set incident_finished_status = (
|
|
"RESOLVED",
|
|
"RESOLVED EXCEPTION",
|
|
"CLOSED - NO REPLY",
|
|
"CLOSED - OTHER",
|
|
"CLOSED - WAIVER CR",
|
|
"CLOSED - LATE REPORT",
|
|
"CLOSED - NOT COVERED",
|
|
"CLOSED - NOT LIABLE",
|
|
"CLOSED HOST REQUEST",
|
|
"CLOSED - NOT APPROVED",
|
|
"CLOSED - THIRD PARTY",
|
|
) %}
|
|
{% set days_from_checkout_to_completion = 14 %}
|
|
|
|
{{ config(materialized="table", unique_key=["id_booking"]) }}
|
|
with
|
|
int_core__booking_to_service as (
|
|
select * from {{ ref("int_core__booking_to_service") }}
|
|
),
|
|
int_core__booking_service_detail as (
|
|
select * from {{ ref("int_core__booking_service_detail") }}
|
|
),
|
|
int_resolutions__incidents as (
|
|
select * from {{ ref("int_resolutions__incidents") }}
|
|
),
|
|
-- This CTE handles the core backend booking information and aggregates service
|
|
-- details.
|
|
core_backend_booking_modelling as (
|
|
select
|
|
bts.id_booking,
|
|
bts.id_verification_request,
|
|
bts.id_accommodation,
|
|
bts.id_user_product_bundle,
|
|
bts.id_deal,
|
|
bts.id_user_host,
|
|
bts.id_user_guest,
|
|
bts.booking_status,
|
|
bts.program_name,
|
|
bts.booking_created_at_utc,
|
|
bts.booking_created_date_utc,
|
|
bts.booking_updated_at_utc,
|
|
bts.booking_updated_date_utc,
|
|
bts.booking_check_in_at_utc,
|
|
bts.booking_check_in_date_utc,
|
|
bts.booking_check_out_at_utc,
|
|
bts.booking_check_out_date_utc,
|
|
bts.booking_check_out_date_utc
|
|
+ {{ days_from_checkout_to_completion }} as booking_completed_date_utc,
|
|
bts.booking_number_of_nights,
|
|
bts.host_currency_code,
|
|
bts.is_user_in_new_dash,
|
|
bts.new_dash_version,
|
|
bts.user_in_new_dash_since_timestamp_at_utc,
|
|
sum(bsd.service_total_price_in_gbp) as booking_total_price_in_gbp,
|
|
min(
|
|
bsd.service_first_chargeable_date_utc
|
|
) as service_first_chargeable_date_utc,
|
|
max(
|
|
bsd.service_last_chargeable_date_utc
|
|
) as service_last_chargeable_date_utc,
|
|
min(bsd.service_first_billable_date_utc) as service_first_billable_date_utc,
|
|
max(bsd.service_last_billable_date_utc) as service_last_billable_date_utc,
|
|
min(bsd.service_detail_created_at_utc) as service_first_created_at_utc,
|
|
max(bsd.service_detail_created_at_utc) as service_last_created_at_utc,
|
|
max(bsd.service_detail_updated_at_utc) as service_last_updated_at_utc,
|
|
count(distinct bsd.id_booking_service_detail) as number_of_applied_services,
|
|
count(
|
|
distinct case
|
|
when bsd.is_paid_service
|
|
then bsd.id_booking_service_detail
|
|
else null
|
|
end
|
|
) as number_of_applied_paid_services,
|
|
count(
|
|
distinct case
|
|
when bsd.is_upgraded_service
|
|
then bsd.id_booking_service_detail
|
|
else null
|
|
end
|
|
) as number_of_applied_upgraded_services,
|
|
count(
|
|
distinct case
|
|
when bsd.is_billable_service
|
|
then bsd.id_booking_service_detail
|
|
else null
|
|
end
|
|
) as number_of_applied_billable_services,
|
|
case
|
|
when
|
|
sum(bsd.service_total_price_in_gbp) > 0
|
|
and min(bsd.service_first_chargeable_date_utc) is not null
|
|
then true
|
|
else false
|
|
end as is_booking_chargeable,
|
|
case
|
|
when
|
|
sum(
|
|
case
|
|
when bsd.is_billable_service
|
|
then bsd.service_total_price_in_gbp
|
|
else 0
|
|
end
|
|
)
|
|
> 0
|
|
and min(bsd.service_first_billable_date_utc) is not null
|
|
then true
|
|
else false
|
|
end as is_booking_billable,
|
|
case
|
|
when sum(case when bsd.is_missing_currency_code then 1 else 0 end) > 0
|
|
then true
|
|
else false
|
|
end as is_missing_currency_code_in_service_detail,
|
|
case
|
|
when sum(case when bsd.is_booking_cancelled then 1 else 0 end) > 0
|
|
then true
|
|
else false
|
|
end as is_booking_cancelled,
|
|
case
|
|
when bts.id_verification_request is null then false else true
|
|
end as has_verification_request,
|
|
case
|
|
when sum(case when bsd.is_paid_service then 1 else 0 end) > 0
|
|
then true
|
|
else false
|
|
end as has_paid_services,
|
|
case
|
|
when sum(case when bsd.is_upgraded_service then 1 else 0 end) > 0
|
|
then true
|
|
else false
|
|
end as has_upgraded_services,
|
|
case
|
|
when sum(case when bsd.is_billable_service then 1 else 0 end) > 0
|
|
then true
|
|
else false
|
|
end as has_billable_services,
|
|
case
|
|
when
|
|
sum(
|
|
case
|
|
when bsd.service_business_type = 'SCREENING' then 1 else 0
|
|
end
|
|
)
|
|
> 0
|
|
then true
|
|
else false
|
|
end as has_screening_service_business_type,
|
|
case
|
|
when
|
|
sum(
|
|
case
|
|
when
|
|
bsd.service_business_type = 'SCREENING'
|
|
and bsd.service_name <> {{ var("default_service") }}
|
|
then 1
|
|
else 0
|
|
end
|
|
)
|
|
> 0
|
|
then true
|
|
else false
|
|
end as has_upgraded_screening_service_business_type,
|
|
case
|
|
when
|
|
sum(
|
|
case
|
|
when bsd.service_business_type = 'DEPOSIT_MANAGEMENT'
|
|
then 1
|
|
else 0
|
|
end
|
|
)
|
|
> 0
|
|
then true
|
|
else false
|
|
end as has_deposit_management_service_business_type,
|
|
case
|
|
when
|
|
sum(
|
|
case
|
|
when bsd.service_business_type = 'PROTECTION' then 1 else 0
|
|
end
|
|
)
|
|
> 0
|
|
then true
|
|
else false
|
|
end as has_protection_service_business_type,
|
|
bts.is_missing_id_deal,
|
|
case
|
|
when bts.host_currency_code is null then true else false
|
|
end as is_missing_host_currency_code,
|
|
case
|
|
when
|
|
(current_date - booking_check_out_date_utc)
|
|
> {{ days_from_checkout_to_completion }}
|
|
then true
|
|
else false
|
|
end as is_booking_past_completion_date,
|
|
case
|
|
when upper(bts.booking_status) in {{ risk_booking_status }}
|
|
then true
|
|
when upper(bts.booking_status) in {{ no_risk_booking_status }}
|
|
then false
|
|
else null
|
|
end as is_booking_flagged_as_risk
|
|
from int_core__booking_to_service bts
|
|
inner join
|
|
int_core__booking_service_detail bsd
|
|
on bts.id_booking_service_detail = bsd.id_booking_service_detail
|
|
group by
|
|
bts.id_booking,
|
|
bts.id_verification_request,
|
|
bts.id_accommodation,
|
|
bts.id_user_product_bundle,
|
|
bts.id_deal,
|
|
bts.id_user_host,
|
|
bts.id_user_guest,
|
|
bts.booking_status,
|
|
bts.program_name,
|
|
bts.booking_created_at_utc,
|
|
bts.booking_created_date_utc,
|
|
bts.booking_updated_at_utc,
|
|
bts.booking_updated_date_utc,
|
|
bts.booking_check_in_at_utc,
|
|
bts.booking_check_in_date_utc,
|
|
bts.booking_check_out_at_utc,
|
|
bts.booking_check_out_date_utc,
|
|
bts.booking_number_of_nights,
|
|
bts.host_currency_code,
|
|
bts.is_missing_id_deal,
|
|
bts.is_user_in_new_dash,
|
|
bts.new_dash_version,
|
|
bts.user_in_new_dash_since_timestamp_at_utc
|
|
),
|
|
-- This CTE deduplicates resolution incidents by booking ID and aggregates payout
|
|
-- amounts.
|
|
deduplicated_incidents as (
|
|
select
|
|
id_booking,
|
|
sum(submitted_payout_amount_in_gbp) as submitted_payout_amount_in_gbp,
|
|
case
|
|
when sum(submitted_payout_amount_in_gbp) > 0 then true else false
|
|
end as has_submitted_payout,
|
|
case
|
|
when
|
|
sum(
|
|
case
|
|
when
|
|
upper(current_status_name)
|
|
in {{ incident_finished_status }}
|
|
then 1
|
|
else 0
|
|
end
|
|
)
|
|
> 0
|
|
then true
|
|
else false
|
|
end as is_incident_finished
|
|
from int_resolutions__incidents
|
|
where upper(current_status_name) != '{{ incident_duplicated_status }}'
|
|
group by 1
|
|
)
|
|
-- This CTE combines the core backend booking information with the deduplicated
|
|
-- incidents to provide a comprehensive booking summary.
|
|
select
|
|
-- Retrieve all previous backend booking modelling fields.
|
|
cbbm.*,
|
|
-- Retrieve incident resolution fields.
|
|
case
|
|
when di.id_booking is not null then true else false
|
|
end as has_resolution_incident,
|
|
coalesce(di.is_incident_finished, false) as has_resolution_incident_finished,
|
|
coalesce(di.has_submitted_payout, false) as has_resolution_submitted_payout,
|
|
submitted_payout_amount_in_gbp as resolution_submitted_payout_amount_in_gbp
|
|
from core_backend_booking_modelling cbbm
|
|
left join deduplicated_incidents di on cbbm.id_booking = di.id_booking
|