Files
dbt_cloud/models/marts/reporting/rep_exchange__frozen_accounts.sql
T
CIEF ACC1 b6b7663bc2 build
2024-01-12 01:25:25 +00:00

261 lines
8.5 KiB
SQL

-- IMPORT
WITH frozen_account_incidents AS (
SELECT * FROM {{ ref('fct_exchange__frozen_account_incidents') }}
),
orders AS (
SELECT * FROM {{ ref('fct_exchange__transaction_orders') }}
),
costs AS (
SELECT * FROM {{ ref('fct_exchange__transaction_costs') }}
),
companies AS (
SELECT * FROM {{ ref('dim_exchange__companies') }}
),
-- LOGIC
affected_companies_order_history AS (
SELECT
*
FROM
orders,
LATERAL
(
SELECT
frozen_account_case_id,
ticket_created_datetime,
ticket_updated_datetime,
ticket_closed_datetime
FROM
frozen_account_incidents
WHERE
orders.company_id = frozen_account_incidents.company_id
)
WHERE transaction_status IN ('UPLOADED_BANK_SLIP')
),
order_associated_with_each_incident AS (
-- Some booking_marking_id may have 2 or more orders
-- This CTE select the order closest to the incident_ticket_created_datetime as the affected order
SELECT
frozen_account_incidents.* EXCLUDE _dbt_ran_datetime,
orders.order_id,
orders.base_currency_id,
orders.quote_currency_id,
orders.transaction_status,
orders.order_base_value,
orders.order_base_service_charge,
orders.order_base_tax,
orders.order_quote_value,
orders.total_order_value_rm,
orders.order_base_to_quote_currency_exchange_rate,
orders.order_created_datetime,
orders.customer_made_booking_datetime,
orders.customer_placed_order_datetime,
orders.customer_made_payment_datetime,
orders.account_verified_payment_datetime,
orders.first_white_form_generated_datetime,
orders.last_white_form_generated_datetime,
orders.operation_uploaded_bank_slip_datetime,
orders.next_order_created_datetime,
ABS(DATEDIFF(minute, ticket_created_datetime, operation_uploaded_bank_slip_datetime)) AS time_diff,
ROW_NUMBER() OVER (PARTITION BY frozen_account_case_id ORDER BY time_diff) AS row_num_idx
FROM frozen_account_incidents
LEFT JOIN orders
ON (frozen_account_incidents.booking_marking_id = orders.booking_marking_id)
QUALIFY
row_num_idx = 1
),
aggregated_metrics AS (
SELECT
frozen_account_case_id,
SUM(total_order_value_rm) AS total_lifetime_value_rm,
SUM(CASE
WHEN
ticket_created_datetime >= customer_placed_order_datetime
AND
transaction_status = 'UPLOADED_BANK_SLIP'
THEN total_order_value_rm
ELSE 0
END) AS before_frozen_lifetime_value_rm,
SUM(CASE
WHEN
customer_placed_order_datetime > ticket_created_datetime
AND
transaction_status = 'UPLOADED_BANK_SLIP'
THEN total_order_value_rm
ELSE 0
END) AS after_unfreeze_lifetime_value_rm,
MIN(CASE
WHEN
customer_made_booking_datetime > ticket_created_datetime
AND booking_status = 'COMPLETED'
THEN customer_made_booking_datetime
END) AS after_unfreeze_first_booking_datetime,
MIN(CASE
WHEN customer_placed_order_datetime > ticket_created_datetime
AND order_status = 'COMPLETED'
THEN customer_placed_order_datetime
END) AS after_unfreeze_first_order_datetime,
SUM(CASE
WHEN ticket_created_datetime > customer_placed_order_datetime
AND transaction_status = 'UPLOADED_BANK_SLIP'
THEN 1
ELSE 0
END) AS count_order_before_frozen,
SUM(CASE
WHEN customer_placed_order_datetime > ticket_created_datetime
AND transaction_status = 'UPLOADED_BANK_SLIP'
THEN 1
ELSE 0
END) AS count_order_after_unfreeze,
MAX(customer_placed_order_datetime) AS latest_order_placed_datetime,
ROUND(DIV0(before_frozen_lifetime_value_rm, count_order_before_frozen), 2) AS before_frozen_average_lifetime_value_rm,
ROUND(DIV0(after_unfreeze_lifetime_value_rm,count_order_after_unfreeze), 2) AS after_unfreeze_average_lifetime_value_rm
FROM affected_companies_order_history
GROUP BY frozen_account_case_id
),
history_and_metric_join AS (
SELECT
order_associated_with_each_incident.*,
costs.supplier_company_id,
companies.company_marking_id,
companies.company_type,
companies.business_type,
companies.company_created_datetime AS company_register_datetime,
aggregated_metrics.total_lifetime_value_rm,
aggregated_metrics.before_frozen_lifetime_value_rm,
aggregated_metrics.after_unfreeze_lifetime_value_rm,
aggregated_metrics.before_frozen_average_lifetime_value_rm,
aggregated_metrics.after_unfreeze_average_lifetime_value_rm,
aggregated_metrics.after_unfreeze_first_booking_datetime,
aggregated_metrics.after_unfreeze_first_order_datetime,
aggregated_metrics.count_order_before_frozen,
aggregated_metrics.count_order_after_unfreeze,
aggregated_metrics.latest_order_placed_datetime,
COUNT(DISTINCT order_id)
OVER
(PARTITION BY order_associated_with_each_incident.company_id) AS count_company_frozen_cases,
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
FROM order_associated_with_each_incident
LEFT JOIN aggregated_metrics
ON (order_associated_with_each_incident.frozen_account_case_id = aggregated_metrics.frozen_account_case_id)
LEFT JOIN companies
ON (order_associated_with_each_incident.company_id = companies.company_id)
LEFT JOIN costs
ON (order_associated_with_each_incident.order_id = costs.transaction_order_id)
),
-- FINAL
final_rep_exchange__frozen_accounts AS (
SELECT
-- id
frozen_account_case_id,
crm_ticket_id,
booking_id,
booking_marking_id,
company_id,
company_marking_id,
order_id,
base_currency_id,
quote_currency_id,
supplier_company_id,
recipient_bank_id,
recipient_bank_country_id,
-- dimensions
transaction_status,
account_freeze_reason,
incident_ticket_status,
agent_reply_status,
company_type,
business_type,
service_type,
recipient_bank_type,
recipient_bank_name,
recipient_bank_branch,
affected_order_currency,
-- measures
count_company_frozen_cases,
affected_order_amount,
order_base_to_quote_currency_exchange_rate,
order_base_value,
order_base_tax,
order_base_service_charge,
order_quote_value,
total_order_value_rm,
total_lifetime_value_rm,
before_frozen_lifetime_value_rm,
after_unfreeze_lifetime_value_rm,
count_order_before_frozen,
count_order_after_unfreeze,
before_frozen_average_lifetime_value_rm,
after_unfreeze_average_lifetime_value_rm,
-- date/time
company_register_datetime,
ticket_created_datetime,
ticket_updated_datetime,
ticket_closed_datetime,
after_unfreeze_first_booking_datetime,
after_unfreeze_first_order_datetime,
latest_order_placed_datetime,
order_created_datetime,
customer_made_booking_datetime,
customer_placed_order_datetime,
customer_made_payment_datetime,
account_verified_payment_datetime,
first_white_form_generated_datetime,
last_white_form_generated_datetime,
operation_uploaded_bank_slip_datetime,
next_order_created_datetime,
-- metadata
_dbt_ran_datetime
FROM history_and_metric_join
)
SELECT * FROM final_rep_exchange__frozen_accounts