with
    int_xero__bank_transactions as (
        select * from {{ ref("int_xero__bank_transactions") }}
    ),
    stg_xero__accounts as (select * from {{ ref("stg_xero__accounts") }})

select
    bt.id_bank_transaction,
    j.id_line_item,
    j.line_description,
    j.id_account,
    j.account_code,
    a.account_name,
    j.item_code,
    j.quantity::numeric,
    j.unit_amount::numeric,
    bt.transaction_sign * j.line_amount_local_curr::numeric as line_amount_local_curr,
    (
        bt.transaction_sign
        * j.line_amount_local_curr::numeric
        * bt.exchange_rate_to_gbp
    )::numeric(18, 4) as line_amount_in_gbp,
    (
        case
            when bt.line_amount_tax_inclusiveness = 'Inclusive'
            then j.line_amount_local_curr::numeric - j.tax_amount_local_curr::numeric
            when bt.line_amount_tax_inclusiveness = 'Exclusive'
            then j.line_amount_local_curr::numeric
            when bt.line_amount_tax_inclusiveness = 'NoTax'
            then j.line_amount_local_curr::numeric
            else null
        end
    )
    * bt.transaction_sign as line_amount_wo_taxes_local_curr,
    (
        case
            when bt.line_amount_tax_inclusiveness = 'Inclusive'
            then
                (
                    (
                        j.line_amount_local_curr::numeric
                        - j.tax_amount_local_curr::numeric
                    )
                    * bt.exchange_rate_to_gbp
                )::numeric(18, 4)
            when bt.line_amount_tax_inclusiveness = 'Exclusive'
            then
                (j.line_amount_local_curr::numeric * bt.exchange_rate_to_gbp)::numeric(
                    18, 4
                )
            when bt.line_amount_tax_inclusiveness = 'NoTax'
            then
                (j.line_amount_local_curr::numeric * bt.exchange_rate_to_gbp)::numeric(
                    18, 4
                )
            else null
        end
    )
    * bt.transaction_sign as line_amount_wo_taxes_in_gbp,
    bt.transaction_sign * j.tax_amount_local_curr::numeric as tax_amount_local_curr,
    (
        bt.transaction_sign * j.tax_amount_local_curr::numeric * bt.exchange_rate_to_gbp
    )::numeric(18, 4) as tax_amount_in_gbp,
    j.tax_type,
    bt.transaction_currency_iso_4217
from int_xero__bank_transactions bt
cross join
    lateral(
        select
            (jsonb_array_elements(bt.line_items) ->> 'LineItemID') as id_line_item,
            (jsonb_array_elements(bt.line_items) ->> 'AccountID') as id_account,

            (jsonb_array_elements(bt.line_items) ->> 'Quantity') as quantity,
            (jsonb_array_elements(bt.line_items) ->> 'UnitAmount') as unit_amount,
            (
                jsonb_array_elements(bt.line_items) ->> 'LineAmount'
            ) as line_amount_local_curr,
            (
                jsonb_array_elements(bt.line_items) ->> 'TaxAmount'
            ) as tax_amount_local_curr,
            (jsonb_array_elements(bt.line_items) ->> 'TaxType') as tax_type,
            (jsonb_array_elements(bt.line_items) ->> 'Description') as line_description,

            (jsonb_array_elements(bt.line_items) ->> 'AccountCode') as account_code,
            (jsonb_array_elements(bt.line_items) ->> 'ItemCode') as item_code
    ) j
left join stg_xero__accounts a on j.account_code = a.account_code
