Files
dbt_cloud/models/marts/warehouse/fct_shipping__orders.sql
T

366 lines
14 KiB
SQL

-- IMPORT
WITH first_mile_transport_arrangements AS (
SELECT * FROM {{ ref('int_shipping__first_mile_transport_arrangements') }}
),
mid_mile_transport_arrangements AS (
SELECT * FROM {{ ref('int_shipping__mid_mile_transport_arrangements') }}
),
bookings AS (
SELECT * FROM {{ ref('stg_shipping__bookings') }}
),
packages AS (
SELECT * FROM {{ ref('stg_shipping__packages') }}
),
package_extra_charges AS (
SELECT * FROM {{ ref('stg_shipping__package_extra_charges') }}
),
packing_list_invoice_payments AS (
SELECT * FROM {{ ref('stg_shipping__packing_list_invoice_payments') }}
),
-- LOGIC
-- Packages by packing_list
packages_group_by_packing_list_id AS (
SELECT
packing_list_id,
COUNT(DISTINCT(package_id)) AS number_of_package_record,
ARRAY_AGG(DISTINCT(package_description)) AS package_descriptions,
SUM(width_cm) AS total_package_width_cm,
SUM(height_cm) AS total_package_height_cm,
SUM(length_cm) AS total_package_length_cm,
sum(weight_kg) AS total_package_weight_kg,
SUM(quantity) AS total_package_item,
SUM(cbm) AS total_package_cbm
FROM
packages
GROUP BY
packing_list_id
),
package_extra_charges_group_by_packing_list_id AS (
SELECT
packing_list_id,
COUNT(DISTINCT(
IFF(package_type = 'OVER_WEIGHT',
package_id,
null)
)) AS number_of_over_weight_charge_record,
SUM(
IFF(package_type = 'OVER_WEIGHT',
extra_charge_cbm,
0)
) AS over_weight_cbm,
SUM(
IFF(package_type = 'OVER_WEIGHT',
over_weight_kg,
0)
) AS over_weight_kg,
COUNT(DISTINCT(
IFF(package_type = 'PALLET',
package_id,
null)
)) AS number_of_pallet_charge_record,
SUM(
IFF(package_type = 'PALLET',
extra_charge_cbm,
0)
) AS pallet_charge_cbm
FROM package_extra_charges
GROUP BY
packing_list_id
),
total_package_charges AS (
SELECT
packages_group_by_packing_list_id.packing_list_id,
packages_group_by_packing_list_id.number_of_package_record,
packages_group_by_packing_list_id.package_descriptions,
packages_group_by_packing_list_id.total_package_width_cm,
packages_group_by_packing_list_id.total_package_height_cm,
packages_group_by_packing_list_id.total_package_length_cm,
packages_group_by_packing_list_id.total_package_weight_kg,
packages_group_by_packing_list_id.total_package_item,
packages_group_by_packing_list_id.total_package_cbm,
package_extra_charges_group_by_packing_list_id.number_of_over_weight_charge_record,
package_extra_charges_group_by_packing_list_id.over_weight_cbm,
package_extra_charges_group_by_packing_list_id.over_weight_kg,
package_extra_charges_group_by_packing_list_id.number_of_pallet_charge_record,
package_extra_charges_group_by_packing_list_id.pallet_charge_cbm
FROM packages_group_by_packing_list_id
LEFT JOIN package_extra_charges_group_by_packing_list_id
ON (packages_group_by_packing_list_id.packing_list_id = package_extra_charges_group_by_packing_list_id.packing_list_id)
),
-- Invoices
remove_expired_invoice_payments AS (
SELECT
*
FROM packing_list_invoice_payments
WHERE
invoice_status != 'EXPIRED'
AND
payment_status NOT IN ('SUSPENDED','REJECTED')
),
invoice_group_by_packing_list_ids AS (
SELECT
old_warehouse_shipping_packing_list_id,
invoice_sub_company_id,
payment_sub_company_id,
COUNT(DISTINCT(packing_list_invoice_id)) AS number_of_invoice,
COUNT(DISTINCT(packing_list_payment_id)) AS number_of_payment,
SUM(invoice_number_of_shipping_fee) AS invoice_number_of_shipping_fee,
SUM(invoice_average_shipping_fee_price_per_quantity)/SUM(invoice_number_of_shipping_fee) AS invoice_average_shipping_fee_price_per_quantity,
SUM(invoice_total_shipping_fee_quantity) AS invoice_total_shipping_fee_quantity,
SUM(invoice_total_shipping_fee_value_rm) AS invoice_total_shipping_fee_value_rm,
SUM(invoice_number_of_min_cbm_charge) AS invoice_number_of_min_cbm_charge,
SUM(invoice_average_min_cbm_charge_price_per_quantity)/SUM(invoice_number_of_min_cbm_charge) AS invoice_average_min_cbm_charge_price_per_quantity,
SUM(invoice_total_min_cbm_charge_quantity) AS invoice_total_min_cbm_charge_quantity,
SUM(invoice_total_min_cbm_charge_value_rm) AS invoice_total_min_cbm_charge_value_rm,
SUM(invoice_number_of_over_weight_charge) AS invoice_number_of_over_weight_charge,
SUM(invoice_average_over_weight_charge_price_per_quantity)/SUM(invoice_number_of_over_weight_charge) AS invoice_average_over_weight_charge_price_per_quantity,
SUM(invoice_total_over_weight_charge_quantity) AS invoice_total_over_weight_charge_quantity,
SUM(invoice_total_over_weight_charge_value_rm) AS invoice_total_over_weight_charge_value_rm,
SUM(invoice_number_of_custom_charge) AS invoice_number_of_custom_charge,
SUM(invoice_average_custom_charge_price_per_quantity)/SUM(invoice_number_of_custom_charge) AS invoice_average_custom_charge_price_per_quantity,
SUM(invoice_total_custom_charge_quantity) AS invoice_total_custom_charge_quantity,
SUM(invoice_total_custom_charge_value_rm) AS invoice_total_custom_charge_value_rm,
SUM(invoice_value_rm) AS invoice_value_rm,
SUM(invoice_tax_rm) AS invoice_tax_rm,
SUM(invoice_service_charge) AS invoice_service_charge,
SUM(payment_value_rm) AS payment_value_rm,
SUM(payment_tax_rm) AS payment_tax_rm,
SUM(payment_service_charge_rm) AS payment_service_charge_rm,
MAX(invoice_created_datetime) AS last_invoice_created_datetime,
MAX(payment_created_datetime) AS last_payment_created_datetime
FROM remove_expired_invoice_payments
GROUP BY
old_warehouse_shipping_packing_list_id,
invoice_sub_company_id,
payment_sub_company_id
),
-- Joined orders
booking_join_package_charges_join_invoice_payments AS (
SELECT
bookings.sub_company_id,
bookings.service_type,
bookings.status AS booking_status,
bookings.created_datetime AS booking_created_datetime,
bookings.updated_datetime AS booking_updated_datetime,
first_mile_transport_arrangements.new_first_mile_packing_list_id,
first_mile_transport_arrangements.old_first_mile_packing_list_id,
first_mile_transport_arrangements.first_mile_receive_status,
first_mile_transport_arrangements.first_mile_received_datetime AS order_created_datetime,
mid_mile_transport_arrangements.new_mid_mile_packing_list_id,
mid_mile_transport_arrangements.old_mid_mile_packing_list_id,
mid_mile_transport_arrangements.mid_mile_booking_id AS booking_id,
mid_mile_transport_arrangements.mid_mile_warehouse_order_number AS warehouse_order_number,
total_package_charges.number_of_package_record,
total_package_charges.package_descriptions,
total_package_charges.total_package_item,
total_package_charges.total_package_width_cm,
total_package_charges.total_package_height_cm,
total_package_charges.total_package_length_cm,
total_package_charges.total_package_Weight_kg,
total_package_charges.total_package_cbm,
total_package_charges.number_of_over_weight_charge_record,
total_package_charges.over_weight_cbm,
total_package_charges.over_weight_kg,
total_package_charges.number_of_pallet_charge_record,
total_package_charges.pallet_charge_cbm,
invoice_group_by_packing_list_ids.invoice_sub_company_id,
invoice_group_by_packing_list_ids.payment_sub_company_id,
invoice_group_by_packing_list_ids.number_of_invoice,
invoice_group_by_packing_list_ids.number_of_payment,
invoice_group_by_packing_list_ids.invoice_number_of_shipping_fee,
invoice_group_by_packing_list_ids.invoice_average_shipping_fee_price_per_quantity,
invoice_group_by_packing_list_ids.invoice_total_shipping_fee_quantity,
invoice_group_by_packing_list_ids.invoice_total_shipping_fee_value_rm,
invoice_group_by_packing_list_ids.invoice_number_of_min_cbm_charge,
invoice_group_by_packing_list_ids.invoice_average_min_cbm_charge_price_per_quantity,
invoice_group_by_packing_list_ids.invoice_total_min_cbm_charge_quantity,
invoice_group_by_packing_list_ids.invoice_total_min_cbm_charge_value_rm,
invoice_group_by_packing_list_ids.invoice_number_of_over_weight_charge,
invoice_group_by_packing_list_ids.invoice_average_over_weight_charge_price_per_quantity,
invoice_group_by_packing_list_ids.invoice_total_over_weight_charge_quantity,
invoice_group_by_packing_list_ids.invoice_total_over_weight_charge_value_rm,
invoice_group_by_packing_list_ids.invoice_number_of_custom_charge,
invoice_group_by_packing_list_ids.invoice_average_custom_charge_price_per_quantity,
invoice_group_by_packing_list_ids.invoice_total_custom_charge_quantity,
invoice_group_by_packing_list_ids.invoice_total_custom_charge_value_rm,
invoice_group_by_packing_list_ids.invoice_value_rm,
invoice_group_by_packing_list_ids.invoice_tax_rm,
invoice_group_by_packing_list_ids.invoice_service_charge,
invoice_group_by_packing_list_ids.payment_value_rm,
invoice_group_by_packing_list_ids.payment_tax_rm,
invoice_group_by_packing_list_ids.payment_service_charge_rm,
invoice_group_by_packing_list_ids.last_invoice_created_datetime,
invoice_group_by_packing_list_ids.last_payment_created_datetime
FROM mid_mile_transport_arrangements
LEFT JOIN first_mile_transport_arrangements
ON (mid_mile_transport_arrangements.mid_mile_warehouse_order_number = first_mile_transport_arrangements.first_mile_warehouse_order_number)
LEFT JOIN total_package_charges
ON (mid_mile_transport_arrangements.new_mid_mile_packing_list_id = total_package_charges.packing_list_id)
LEFT JOIN invoice_group_by_packing_list_ids
ON (mid_mile_transport_arrangements.old_mid_mile_packing_list_id = invoice_group_by_packing_list_ids.old_warehouse_shipping_packing_list_id)
LEFT JOIN bookings
ON (mid_mile_transport_arrangements.mid_mile_booking_id = bookings.booking_id)
),
create_new_column AS (
SELECT
*,
(ZEROIFNULL(total_package_cbm) +
ZEROIFNULL(over_weight_cbm) +
ZEROIFNULL(pallet_charge_cbm)) AS total_order_cbm,
CASE
WHEN ROW_NUMBER() OVER (PARTITION BY sub_company_id ORDER BY order_created_datetime) = 1 THEN 1
ELSE 0
END AS is_first_time_sub_company,
CASE
WHEN first_mile_receive_status IN ('COMPLETED', 'APPROVED')
AND
MIN(IFF(first_mile_receive_status IN ('COMPLETED', 'APPROVED'), order_created_datetime, NULL))
OVER (PARTITION BY sub_company_id)
= order_created_datetime
THEN 1
ELSE 0
END AS is_first_time_sub_company_completed,
LEAD(order_created_datetime) OVER (
PARTITION BY sub_company_id ORDER BY (order_created_datetime, CAST(new_first_mile_packing_list_id AS INT))
) AS next_order_created_datetime,
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
FROM booking_join_package_charges_join_invoice_payments
),
-- FINAL
final__fct_shipping__orders AS (
SELECT
--ids
new_first_mile_packing_list_id,
old_first_mile_packing_list_id,
new_mid_mile_packing_list_id,
old_mid_mile_packing_list_id,
booking_id,
sub_company_id,
invoice_sub_company_id,
payment_sub_company_id,
warehouse_order_number,
--dimensions
service_type,
booking_status,
first_mile_receive_status,
package_descriptions,
is_first_time_sub_company,
is_first_time_sub_company_completed,
--measures
number_of_package_record,
total_package_item,
total_package_width_cm,
total_package_height_cm,
total_package_length_cm,
total_package_cbm,
total_package_weight_kg,
total_order_cbm,
number_of_over_weight_charge_record,
over_weight_cbm,
over_weight_kg,
number_of_pallet_charge_record,
pallet_charge_cbm,
number_of_invoice,
number_of_payment,
invoice_number_of_shipping_fee,
invoice_average_shipping_fee_price_per_quantity,
invoice_total_shipping_fee_quantity,
invoice_total_shipping_fee_value_rm,
invoice_number_of_min_cbm_charge,
invoice_average_min_cbm_charge_price_per_quantity,
invoice_total_min_cbm_charge_quantity,
invoice_total_min_cbm_charge_value_rm,
invoice_number_of_over_weight_charge,
invoice_average_over_weight_charge_price_per_quantity,
invoice_total_over_weight_charge_quantity,
invoice_total_over_weight_charge_value_rm,
invoice_number_of_custom_charge,
invoice_average_custom_charge_price_per_quantity,
invoice_total_custom_charge_quantity,
invoice_total_custom_charge_value_rm,
invoice_value_rm,
invoice_tax_rm,
invoice_service_charge,
payment_value_rm,
payment_tax_rm,
payment_service_charge_rm,
--date/times
booking_created_datetime,
booking_updated_datetime,
order_created_datetime,
next_order_created_datetime,
last_invoice_created_datetime,
last_payment_created_datetime,
--metadata
_dbt_ran_datetime
FROM create_new_column
)
SELECT * FROM final__fct_shipping__orders