Merged PR 4423: Logic for Billable Bookings in New Dash Bookings
# Description Changes: * Tags services to be billed (invoiced to host) in the staging models of product_service and protection_plan * Propagates into booking_service_detail master table. This also computes billable dates. * Propagates into booking_summary master table. This has the final determination of a booking being billable or not, and when the first and last billing should occur. # 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: #27619
This commit is contained in:
parent
399feba9af
commit
a3793121af
6 changed files with 160 additions and 6 deletions
|
|
@ -111,7 +111,8 @@ with
|
||||||
psba.last_chargeable_date_utc) as last_chargeable_date_utc,
|
psba.last_chargeable_date_utc) as last_chargeable_date_utc,
|
||||||
bts.is_missing_host_currency_code as is_missing_currency_code,
|
bts.is_missing_host_currency_code as is_missing_currency_code,
|
||||||
bts.is_booking_cancelled,
|
bts.is_booking_cancelled,
|
||||||
(not ps.is_default_service) as is_upgraded_service
|
(not ps.is_default_service) as is_upgraded_service,
|
||||||
|
ps.is_billable_service
|
||||||
from int_core__booking_to_service bts
|
from int_core__booking_to_service bts
|
||||||
inner join
|
inner join
|
||||||
stg_core__product_service ps
|
stg_core__product_service ps
|
||||||
|
|
@ -157,7 +158,8 @@ with
|
||||||
ppba.last_chargeable_date_utc,
|
ppba.last_chargeable_date_utc,
|
||||||
bts.is_missing_host_currency_code as is_missing_currency_code,
|
bts.is_missing_host_currency_code as is_missing_currency_code,
|
||||||
bts.is_booking_cancelled,
|
bts.is_booking_cancelled,
|
||||||
(not pp.is_default_service) as is_upgraded_service
|
(not pp.is_default_service) as is_upgraded_service,
|
||||||
|
pp.is_billable_service
|
||||||
from int_core__booking_to_service bts
|
from int_core__booking_to_service bts
|
||||||
inner join
|
inner join
|
||||||
stg_core__protection_plan pp
|
stg_core__protection_plan pp
|
||||||
|
|
@ -214,7 +216,8 @@ with
|
||||||
when bts.service_name in {{ waiver_or_deposit_offered_but_not_chosen }}
|
when bts.service_name in {{ waiver_or_deposit_offered_but_not_chosen }}
|
||||||
then true
|
then true
|
||||||
else false
|
else false
|
||||||
end as is_upgraded_service
|
end as is_upgraded_service,
|
||||||
|
false as is_billable_service
|
||||||
from int_core__booking_to_service bts
|
from int_core__booking_to_service bts
|
||||||
where bts.id_protection_plan is null and bts.id_product_service is null
|
where bts.id_protection_plan is null and bts.id_product_service is null
|
||||||
),
|
),
|
||||||
|
|
@ -253,12 +256,23 @@ select
|
||||||
service_total_price_in_gbp,
|
service_total_price_in_gbp,
|
||||||
first_chargeable_date_utc as service_first_chargeable_date_utc,
|
first_chargeable_date_utc as service_first_chargeable_date_utc,
|
||||||
last_chargeable_date_utc as service_last_chargeable_date_utc,
|
last_chargeable_date_utc as service_last_chargeable_date_utc,
|
||||||
|
case
|
||||||
|
when coalesce(is_billable_service, false)
|
||||||
|
then first_chargeable_date_utc
|
||||||
|
else null
|
||||||
|
end as service_first_billable_date_utc,
|
||||||
|
case
|
||||||
|
when coalesce(is_billable_service, false)
|
||||||
|
then last_chargeable_date_utc
|
||||||
|
else null
|
||||||
|
end as service_last_billable_date_utc,
|
||||||
is_missing_currency_code,
|
is_missing_currency_code,
|
||||||
is_booking_cancelled,
|
is_booking_cancelled,
|
||||||
case
|
case
|
||||||
when service_unit_price_local_curr > 0 then true else false
|
when service_unit_price_local_curr > 0 then true else false
|
||||||
end as is_paid_service,
|
end as is_paid_service,
|
||||||
coalesce(is_upgraded_service, false) as is_upgraded_service,
|
coalesce(is_upgraded_service, false) as is_upgraded_service,
|
||||||
|
coalesce(is_billable_service, false) as is_billable_service,
|
||||||
case
|
case
|
||||||
when first_chargeable_date_utc is null or last_chargeable_date_utc is null
|
when first_chargeable_date_utc is null or last_chargeable_date_utc is null
|
||||||
then true
|
then true
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,8 @@ select
|
||||||
sum(bsd.service_total_price_in_gbp) as booking_total_price_in_gbp,
|
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,
|
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,
|
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,
|
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_created_at_utc) as service_last_created_at_utc,
|
||||||
max(bsd.service_detail_updated_at_utc) as service_last_updated_at_utc,
|
max(bsd.service_detail_updated_at_utc) as service_last_updated_at_utc,
|
||||||
|
|
@ -47,6 +49,11 @@ select
|
||||||
when bsd.is_upgraded_service then bsd.id_booking_service_detail else null
|
when bsd.is_upgraded_service then bsd.id_booking_service_detail else null
|
||||||
end
|
end
|
||||||
) as number_of_applied_upgraded_services,
|
) 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
|
case
|
||||||
when
|
when
|
||||||
sum(bsd.service_total_price_in_gbp) > 0
|
sum(bsd.service_total_price_in_gbp) > 0
|
||||||
|
|
@ -54,6 +61,20 @@ select
|
||||||
then true
|
then true
|
||||||
else false
|
else false
|
||||||
end as is_booking_chargeable,
|
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
|
case
|
||||||
when sum(case when bsd.is_missing_currency_code then 1 else 0 end) > 0
|
when sum(case when bsd.is_missing_currency_code then 1 else 0 end) > 0
|
||||||
then true
|
then true
|
||||||
|
|
@ -74,6 +95,11 @@ select
|
||||||
then true
|
then true
|
||||||
else false
|
else false
|
||||||
end as has_upgraded_services,
|
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
|
case
|
||||||
when
|
when
|
||||||
sum(case when bsd.service_business_type = 'SCREENING' then 1 else 0 end) > 0
|
sum(case when bsd.service_business_type = 'SCREENING' then 1 else 0 end) > 0
|
||||||
|
|
|
||||||
|
|
@ -3902,17 +3902,39 @@ models:
|
||||||
data_type: date
|
data_type: date
|
||||||
description: |
|
description: |
|
||||||
Identifies the first date in which the billing item for this service
|
Identifies the first date in which the billing item for this service
|
||||||
is supposed to be charged. It can be null if no billing item is
|
is supposed to be charged or when the guest payment happens.
|
||||||
available. If there's only one billing item, this field will contain
|
It can be null if no service supposed to be charged is available.
|
||||||
|
If there's only one chargeable service, this field will contain
|
||||||
the same value as service_last_chargeable_date_utc.
|
the same value as service_last_chargeable_date_utc.
|
||||||
|
|
||||||
- name: service_last_chargeable_date_utc
|
- name: service_last_chargeable_date_utc
|
||||||
data_type: date
|
data_type: date
|
||||||
description: |
|
description: |
|
||||||
Identifies the last date in which the billing item for this service
|
Identifies the last date in which the billing item for this service
|
||||||
|
is supposed to be charged or when the guest payment happens.
|
||||||
|
It can be null if no service supposed to be charged is available.
|
||||||
|
If there's only one chargeable service, this field will contain
|
||||||
|
the same value as service_first_chargeable_date_utc.
|
||||||
|
|
||||||
|
- name: service_first_billable_date_utc
|
||||||
|
data_type: date
|
||||||
|
description: |
|
||||||
|
Identifies the first date in which the billing item for this service
|
||||||
is supposed to be charged. It can be null if no billing item is
|
is supposed to be charged. It can be null if no billing item is
|
||||||
available. If there's only one billing item, this field will contain
|
available. If there's only one billing item, this field will contain
|
||||||
the same value as service_first_chargeable_date_utc.
|
the same value as service_last_billable_date_utc.
|
||||||
|
It's similar to Chargeable Services logic but it only considers
|
||||||
|
Billable Services to the Host (excluding Guest Payments and free services).
|
||||||
|
|
||||||
|
- name: service_last_billable_date_utc
|
||||||
|
data_type: date
|
||||||
|
description: |
|
||||||
|
Identifies the last date in which the billing item for this service
|
||||||
|
is supposed to be charged. It can be null if no billing item is
|
||||||
|
available. If there's only one billing item, this field will contain
|
||||||
|
the same value as service_first_billable_date_utc.
|
||||||
|
It's similar to Chargeable Services logic but it only considers
|
||||||
|
Billable Services to the Host (excluding Guest Payments and free services).
|
||||||
|
|
||||||
- name: is_missing_currency_code
|
- name: is_missing_currency_code
|
||||||
data_type: boolean
|
data_type: boolean
|
||||||
|
|
@ -3946,6 +3968,15 @@ models:
|
||||||
data_tests:
|
data_tests:
|
||||||
- not_null
|
- not_null
|
||||||
|
|
||||||
|
- name: is_billable_service
|
||||||
|
data_type: boolean
|
||||||
|
description: |
|
||||||
|
Flag that determines if the service is billable or not.
|
||||||
|
If the service is billable, it is supposed to be included in the
|
||||||
|
invoice to the host.
|
||||||
|
data_tests:
|
||||||
|
- not_null
|
||||||
|
|
||||||
- name: is_missing_chargeable_date
|
- name: is_missing_chargeable_date
|
||||||
data_type: boolean
|
data_type: boolean
|
||||||
description: |
|
description: |
|
||||||
|
|
@ -4170,6 +4201,22 @@ models:
|
||||||
Identifies the last moment in time in which the last
|
Identifies the last moment in time in which the last
|
||||||
service applied to this booking is supposed to be charged.
|
service applied to this booking is supposed to be charged.
|
||||||
|
|
||||||
|
- name: service_first_billable_date_utc
|
||||||
|
data_type: date
|
||||||
|
description: |
|
||||||
|
Identifies the first moment in time in which the first
|
||||||
|
service applied to this booking is supposed to be billed.
|
||||||
|
This excludes Guest Payments, and only includes services to
|
||||||
|
be invoiced to the Host.
|
||||||
|
|
||||||
|
- name: service_last_billable_date_utc
|
||||||
|
data_type: date
|
||||||
|
description: |
|
||||||
|
Identifies the last moment in time in which the last
|
||||||
|
service applied to this booking is supposed to be billed.
|
||||||
|
This excludes Guest Payments, and only includes services to
|
||||||
|
be invoiced to the Host.
|
||||||
|
|
||||||
- name: service_first_created_at_utc
|
- name: service_first_created_at_utc
|
||||||
data_type: timestamp
|
data_type: timestamp
|
||||||
description: |
|
description: |
|
||||||
|
|
@ -4211,6 +4258,12 @@ models:
|
||||||
Total number of Services different from Basic Screening
|
Total number of Services different from Basic Screening
|
||||||
applied to this Booking.
|
applied to this Booking.
|
||||||
|
|
||||||
|
- name: number_of_applied_billable_services
|
||||||
|
data_type: integer
|
||||||
|
description: |
|
||||||
|
Total number of Services that require an invoice to the Host
|
||||||
|
to the Host, that are applied to this Booking.
|
||||||
|
|
||||||
- name: is_booking_chargeable
|
- name: is_booking_chargeable
|
||||||
data_type: boolean
|
data_type: boolean
|
||||||
description: |
|
description: |
|
||||||
|
|
@ -4226,6 +4279,25 @@ models:
|
||||||
data_tests:
|
data_tests:
|
||||||
- not_null
|
- not_null
|
||||||
|
|
||||||
|
- name: is_booking_billable
|
||||||
|
data_type: boolean
|
||||||
|
description: |
|
||||||
|
Flag to identify it the Booking is billable or not.
|
||||||
|
In essence, it solves the question: are we supposed to invoice
|
||||||
|
a certain amount to the host to get money out of this booking, or not?
|
||||||
|
To be considered as billable, a billable date needs to exist
|
||||||
|
as well as the total price of billable services, converted to GBP,
|
||||||
|
need to be strictly greater than 0.
|
||||||
|
The fact that a booking is not billable does not necessarily mean that
|
||||||
|
it won't be in the future.
|
||||||
|
The fact that a booking is not billable does not necessarily mean that
|
||||||
|
it's not chargeable, since Guest Payments could still apply.
|
||||||
|
Similarly, if the booking is billable it does not necessarily mean that
|
||||||
|
is actually billed.
|
||||||
|
It cannot be null.
|
||||||
|
data_tests:
|
||||||
|
- not_null
|
||||||
|
|
||||||
- name: is_missing_currency_code_in_service_detail
|
- name: is_missing_currency_code_in_service_detail
|
||||||
data_type: boolean
|
data_type: boolean
|
||||||
description: |
|
description: |
|
||||||
|
|
@ -4248,6 +4320,11 @@ models:
|
||||||
Flag to identify if the booking has any service different from
|
Flag to identify if the booking has any service different from
|
||||||
Basic Screening or not.
|
Basic Screening or not.
|
||||||
|
|
||||||
|
- name: has_billable_services
|
||||||
|
data_type: boolean
|
||||||
|
description: |
|
||||||
|
Flag to identify if the booking has any billable service or not.
|
||||||
|
|
||||||
- name: has_screening_service_business_type
|
- name: has_screening_service_business_type
|
||||||
data_type: boolean
|
data_type: boolean
|
||||||
description: |
|
description: |
|
||||||
|
|
|
||||||
|
|
@ -576,6 +576,15 @@ models:
|
||||||
data_tests:
|
data_tests:
|
||||||
- not_null
|
- not_null
|
||||||
|
|
||||||
|
- name: is_billable_service
|
||||||
|
data_type: boolean
|
||||||
|
description: |
|
||||||
|
Flag that determines if the service is billable or not.
|
||||||
|
If the service is billable, it is supposed to be included in the
|
||||||
|
invoice to the host.
|
||||||
|
data_tests:
|
||||||
|
- not_null
|
||||||
|
|
||||||
- name: dwh_extracted_at_utc
|
- name: dwh_extracted_at_utc
|
||||||
data_type: timestamp
|
data_type: timestamp
|
||||||
description: |
|
description: |
|
||||||
|
|
@ -775,6 +784,14 @@ models:
|
||||||
or an upgraded service (False).
|
or an upgraded service (False).
|
||||||
data_tests:
|
data_tests:
|
||||||
- not_null
|
- not_null
|
||||||
|
- name: is_billable_service
|
||||||
|
data_type: boolean
|
||||||
|
description: |
|
||||||
|
Flag that determines if the service is billable or not.
|
||||||
|
If the service is billable, it is supposed to be included in the
|
||||||
|
invoice to the host.
|
||||||
|
data_tests:
|
||||||
|
- not_null
|
||||||
- name: dwh_extracted_at_utc
|
- name: dwh_extracted_at_utc
|
||||||
data_type: timestamp
|
data_type: timestamp
|
||||||
description: |
|
description: |
|
||||||
|
|
|
||||||
|
|
@ -49,5 +49,17 @@ select
|
||||||
then true
|
then true
|
||||||
else false
|
else false
|
||||||
end as is_default_service,
|
end as is_default_service,
|
||||||
|
case
|
||||||
|
when
|
||||||
|
id_product_service not in (
|
||||||
|
1, -- 'BASIC SCREENING'
|
||||||
|
5, -- 'BASIC DAMAGE DEPOSIT'
|
||||||
|
6, -- 'DAMAGE DEPOSIT PLUS'
|
||||||
|
7, -- 'BASIC WAIVER'
|
||||||
|
8 -- 'WAIVER PLUS'
|
||||||
|
)
|
||||||
|
then true
|
||||||
|
else false
|
||||||
|
end as is_billable_service,
|
||||||
dwh_extracted_at_utc
|
dwh_extracted_at_utc
|
||||||
from stg_core__product_service
|
from stg_core__product_service
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,14 @@ select
|
||||||
then true
|
then true
|
||||||
else false
|
else false
|
||||||
end as is_default_service,
|
end as is_default_service,
|
||||||
|
case
|
||||||
|
when
|
||||||
|
id_protection_plan not in (
|
||||||
|
1 -- 'BASIC SCREENING'
|
||||||
|
)
|
||||||
|
then true
|
||||||
|
else false
|
||||||
|
end as is_billable_service,
|
||||||
pp.dwh_extracted_at_utc
|
pp.dwh_extracted_at_utc
|
||||||
from raw_protection_plan pp
|
from raw_protection_plan pp
|
||||||
left join raw_protection p on pp.id_protection = p.id
|
left join raw_protection p on pp.id_protection = p.id
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue