diff --git a/models/marts/warehouse/fct_exchange__transaction_orders.sql b/models/marts/warehouse/fct_exchange__transaction_orders.sql index 9fa1162..2e59b19 100644 --- a/models/marts/warehouse/fct_exchange__transaction_orders.sql +++ b/models/marts/warehouse/fct_exchange__transaction_orders.sql @@ -9,6 +9,7 @@ column='status') %} + -- IMPORTS WITH transaction_orders AS ( SELECT * FROM {{ ref('int_exchange__transaction_orders_get_user_ids') }} @@ -19,11 +20,7 @@ transaction_order_logs AS ( ), transaction_costs AS ( - SELECT * FROM {{ ref('stg_exchange__transaction_costs') }} -), - -transaction_cost_logs AS ( - SELECT * FROM {{ ref('stg_exchange__transaction_cost_logs') }} + SELECT * FROM {{ ref('int_exchange__transaction_cost_with_latest_cost_ids') }} ), bookings AS ( @@ -34,13 +31,24 @@ booking_logs AS ( SELECT * FROM {{ ref('stg_exchange__booking_logs') }} ), +purchase_orders AS ( + SELECT * FROM {{ ref('stg_exchange__transaction_purchase_orders') }} +), + +invoices AS ( + SELECT * FROM {{ ref('stg_exchange__transaction_invoices') }} +), + + -- LOGIC order_logs_join_bookings AS ( + SELECT transaction_order_logs.*, bookings.service_type, ROW_NUMBER() OVER (PARTITION BY transaction_order_id - ORDER BY transaction_order_logs.updated_datetime DESC, + ORDER BY + transaction_order_logs.updated_datetime DESC, transaction_order_logs.transaction_order_id DESC, transaction_order_logs.transaction_order_log_id DESC) AS rank_index @@ -177,22 +185,7 @@ transaction_order_datetime_imputation AS ( END AS new_order_completed_datetime FROM transaction_order_order_status_datetime -), -transaction_cost_status_datetime AS ( - - SELECT - transaction_cost_id, - MIN(created_datetime) AS cost_created_datetime, - - {%- for status in order_status %} - MAX(CASE WHEN status = '{{status}}' THEN updated_datetime END) AS cost_{{status.lower()}}_datetime {%- if not loop.last %},{% endif -%} - {% endfor %} - - FROM transaction_cost_logs - - GROUP BY - transaction_cost_id ), booking_status_datetime AS ( @@ -209,6 +202,7 @@ booking_status_datetime AS ( GROUP BY booking_id + ), transaction_orders_lists AS ( @@ -284,63 +278,65 @@ transaction_orders_lists AS ( LEFT JOIN transaction_order_datetime_imputation ON (transaction_orders.transaction_order_id = transaction_order_datetime_imputation.transaction_order_id) + ), transaction_costs_lists AS ( SELECT - transaction_costs.transaction_cost_id, - transaction_costs.transaction_order_id, - transaction_costs.supplier_company_id, - transaction_costs.bank_id, - transaction_costs.base_currency_id, - transaction_costs.quote_currency_id, - transaction_costs.transaction_type, - transaction_costs.payment_method, - transaction_costs.status, - transaction_costs.payment_reference, - transaction_costs.bill_number, - transaction_costs.base_value, - transaction_costs.quote_value, - transaction_costs.base_to_quote_currency_exchange_rate, - transaction_costs.base_tax, - transaction_costs.base_service_charge, + transaction_cost_id, + transaction_order_id, + supplier_company_id, + bank_id, + base_currency_id, + quote_currency_id, + transaction_type, + payment_method, + status, + payment_reference, + bill_number, + base_value, + quote_value, + base_to_quote_currency_exchange_rate, + base_tax, + base_service_charge, -- use for future if base currency id other from '1' - IFF(transaction_costs.base_currency_id = '1', - transaction_costs.base_value, + IFF(base_currency_id = '1', + base_value, -9999999999) AS value_rm, -- use for future if base currency id other from '1' - IFF(transaction_costs.base_currency_id = '1', - transaction_costs.base_tax, + IFF(base_currency_id = '1', + base_tax, -9999999999) AS tax_rm, -- use for future if base currency id other from '1' - IFF(transaction_costs.base_currency_id = '1', - transaction_costs.base_service_charge, + IFF(base_currency_id = '1', + base_service_charge, -9999999999) AS service_charge_rm, (value_rm + service_charge_rm + tax_rm) AS total_value_rm, - transaction_costs.expired_datetime, - transaction_costs.deleted_datetime, - transaction_costs.created_datetime, - transaction_costs.updated_datetime, - - {%- for status in order_status %} - transaction_cost_status_datetime.cost_{{status.lower()}}_datetime, - {% endfor %} - transaction_cost_status_datetime.cost_created_datetime + expired_datetime, + deleted_datetime, + created_datetime, + updated_datetime, + cost_created_datetime, + cost_completed_datetime, + cost_pending_submission_datetime, + cost_approved_datetime, + cost_pending_verification_datetime, + cost_rejected_datetime, + cost_suspended_datetime, + cost_expired_datetime FROM transaction_costs - LEFT JOIN transaction_cost_status_datetime - ON (transaction_costs.transaction_cost_id = transaction_cost_status_datetime.transaction_cost_id) - ), bookings_lists AS ( + SELECT bookings.*, @@ -370,6 +366,7 @@ bookings_lists AS ( LEFT JOIN booking_status_datetime ON (bookings.booking_id = booking_status_datetime.booking_id) + ), bookings_orders_costs_join AS ( @@ -452,9 +449,7 @@ bookings_orders_costs_join AS ( transaction_costs_lists.cost_pending_verification_datetime, transaction_costs_lists.cost_approved_datetime, transaction_costs_lists.cost_completed_datetime, - transaction_costs_lists.cost_rejected_datetime, - - '{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime + transaction_costs_lists.cost_rejected_datetime FROM transaction_orders_lists @@ -466,6 +461,112 @@ bookings_orders_costs_join AS ( ), +purchase_orders_invoices_join AS ( + + SELECT + bookings_orders_costs_join.*, + invoices.created_datetime AS invoice_created_datetime, + purchase_orders.created_datetime AS purchase_order_created_datetime, + purchase_orders.updated_datetime AS purchase_order_updated_datetime, + + CASE + WHEN order_status NOT IN ('REJECTED', 'SUSPENDED', 'EXPIRED') THEN purchase_orders.purchase_order_number + END AS purchase_order_number, + CASE + WHEN order_status NOT IN ('REJECTED', 'SUSPENDED', 'EXPIRED') THEN purchase_orders.status + END AS purchase_order_status, + + CASE + WHEN cost_status IN ('APPROVED') THEN invoices.invoice_number + END AS invoice_number, + CASE + WHEN cost_status IN ('APPROVED') THEN invoices.status + END AS invoice_status + + FROM bookings_orders_costs_join + + LEFT JOIN purchase_orders + ON (bookings_orders_costs_join.booking_id = purchase_orders.booking_id) + + LEFT JOIN invoices + ON (bookings_orders_costs_join.booking_id = invoices.booking_id) + +), + +purchase_order_invoice_status_redefined AS ( + + SELECT + *, + + COALESCE( 'COST_' ||cost_status, 'ORDER_' || order_status ) AS transaction_temp_status, + + -- Transaction status tracks the orders and costs + CASE + + WHEN order_status IN ('COMPLETED', 'APPROVED') AND cost_status IS NULL + THEN 'PENDING_GENERATE_WHITE_FORM' + WHEN order_status IN ('COMPLETED', 'APPROVED') AND cost_status IN ('PENDING_VERIFICATION') + THEN 'GENERATED_WHITE_FORM' + WHEN transaction_temp_status IN ('COST_APPROVED', 'COST_COMPLETED') + THEN 'UPLOADED_BANK_SLIP' + WHEN transaction_temp_status IN ('ORDER_APPROVED') + THEN 'VERIFIED_PAYMENT_STATEMENT' + WHEN transaction_temp_status IN ('ORDER_PENDING_VERIFICATION') + THEN 'PENDING_VERIFICATION_PAYMENT_STATEMENT' + WHEN transaction_temp_status IN ('ORDER_PENDING_SUBMISSION') + THEN 'PENDING_SUBMISSION_PAYMENT_STATEMENT' + + END AS transaction_temp_status_2, + + -- Document status tracks the purchase orders and invoices + CASE + + WHEN order_status IN ('REJECTED', 'SUSPENDED', 'EXPIRED') + THEN null + WHEN ( purchase_order_status IS NULL OR purchase_order_status IN ('PENDING_SUBMISSION') ) AND purchase_order_number IS NULL + THEN 'PENDING_SUBMISSION_PURCHASE_ORDER' + WHEN purchase_order_status IN ('PENDING_VERIFICATION') + THEN 'PENDING_VERIFICATION_PURCHASE_ORDER' + WHEN purchase_order_number IS NOT NULL AND purchase_order_status IN ( 'PENDING_VERIFICATION', 'PENDING_SUBMISSION' ) AND purchase_order_number IS NOT NULL + THEN 'PENDING_RESUBMISSION_PURCHASE_ORDER' + WHEN purchase_order_status IN ('APPROVED') AND invoice_number IS NULL AND cost_status IN ('APPROVED', 'COMPLETED') + THEN 'PENDING_GENERATE_INVOICE' + WHEN purchase_order_status IN ('APPROVED') AND invoice_status IS NULL + THEN 'APPROVED_PURCHASE_ORDER' + WHEN invoice_status IN ('APPROVED') AND cost_status IN ('COMPLETED', 'APPROVED') + THEN 'GENERATED_INVOICE' + + END AS document_status, + + COALESCE(transaction_temp_status_2, transaction_temp_status ) AS transaction_status + + FROM purchase_orders_invoices_join + +), + +renaming_datetime_columns AS ( + + SELECT + *, + booking_created_datetime AS customer_made_booking_datetime, + order_created_datetime AS customer_placed_order_datetime, + order_pending_verification_datetime AS customer_made_payment_datetime, + order_approved_datetime AS account_verified_payment_datetime, + order_completed_datetime AS first_white_form_generated_datetime, + cost_pending_verification_datetime AS last_white_form_generated_datetime, + COALESCE(cost_approved_datetime, cost_completed_datetime) AS operation_uploaded_bank_slip_datetime, + purchase_order_created_datetime AS first_purchase_order_uploaded_datetime, + purchase_order_updated_datetime AS last_purchase_order_uploaded_datetime, + invoice_created_datetime AS operation_generated_invoice_datetime, + order_rejected_datetime AS account_rejected_payment_datetime, + + '{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime + + FROM purchase_order_invoice_status_redefined + +), + + -- FINAL final_fct_exchange__new_orders AS ( @@ -485,6 +586,8 @@ final_fct_exchange__new_orders AS ( base_currency_id, -- dimensions + transaction_status, + document_status, service_type, booking_status, is_first_time_booking_company, @@ -505,6 +608,10 @@ final_fct_exchange__new_orders AS ( cost_status, cost_payment_reference, cost_bill_number, + purchase_order_status, + purchase_order_number, + invoice_status, + invoice_number, -- measures estimate_booking_base_to_quote_currency_exchange_rate, @@ -520,6 +627,7 @@ final_fct_exchange__new_orders AS ( order_service_charge_rm, order_tax_rm, total_order_value_rm, + cost_base_value, cost_quote_value, cost_base_to_quote_currency_exchange_rate, @@ -548,18 +656,31 @@ final_fct_exchange__new_orders AS ( order_suspended_datetime, order_expired_datetime, - next_order_created_datetime, cost_created_datetime, cost_pending_submission_datetime, cost_pending_verification_datetime, cost_approved_datetime, cost_completed_datetime, - cost_rejected_datetime, + cost_rejected_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, + first_purchase_order_uploaded_datetime, + last_purchase_order_uploaded_datetime, + operation_generated_invoice_datetime, + account_rejected_payment_datetime, + next_order_created_datetime, -- metadata _dbt_ran_datetime - FROM bookings_orders_costs_join + FROM renaming_datetime_columns + ) SELECT * FROM final_fct_exchange__new_orders \ No newline at end of file