ecc/DaysPayableOutstanding.sql (143 lines of code) (raw):
--DaysPayableOutstanding is language independent view.
WITH
AccountsPayableAgg AS (
--## CORTEX-CUSTOMER: Please consider materializing AccountsPayable or this CTE
SELECT
AccountsPayable.Client_MANDT,
AccountsPayable.CompanyCode_BUKRS,
AccountsPayable.CompanyText_BUTXT,
AccountsPayable.TargetCurrency_TCURR,
SUBSTR(AccountsPayable.DocFiscPeriod, 1, 4) AS FiscalYear,
SUBSTR(AccountsPayable.DocFiscPeriod, 5, 3) AS FiscalPeriod,
SUM(AccountsPayable.OverdueAmountInSourceCurrency)
+ SUM(AccountsPayable.PartialPaymentsInSourceCurrency) AS OverdueAmountInSourceCurrency,
SUM(AccountsPayable.OverdueAmountInTargetCurrency)
+ SUM(AccountsPayable.PartialPaymentsInTargetCurrency) AS OverdueAmountInTargetCurrency
FROM
`{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.AccountsPayable` AS AccountsPayable
WHERE
AccountsPayable.Client_MANDT = '{{ mandt }}'
AND AccountsPayable.DocFiscPeriod <= AccountsPayable.KeyFiscPeriod
GROUP BY
AccountsPayable.Client_MANDT,
AccountsPayable.CompanyCode_BUKRS,
AccountsPayable.CompanyText_BUTXT,
AccountsPayable.DocFiscPeriod,
AccountsPayable.TargetCurrency_TCURR
),
InventoryMetricsAgg AS (
--This view is language dependent. However the final view is language indpendent. The where clause
--makes sure that language dependency is handled and the amount is aggregated at correct granularity.
SELECT
InventoryKeyMetrics.Client_MANDT,
InventoryKeyMetrics.CompanyCode_BUKRS,
InventoryKeyMetrics.FiscalYear,
InventoryKeyMetrics.FiscalPeriod,
InventoryKeyMetrics.TargetCurrency_TCURR,
SUM(InventoryKeyMetrics.CostOfGoodsSoldByMonth) AS COGSInSourceCurrency,
SUM(InventoryKeyMetrics.CostofGoodsSoldInTargetCurrency) AS COGSInTargetCurrency
FROM
`{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.InventoryKeyMetrics` AS InventoryKeyMetrics
WHERE
InventoryKeyMetrics.Client_MANDT = '{{ mandt }}'
AND InventoryKeyMetrics.LanguageKey_SPRAS = (
SELECT ANY_VALUE(LanguageKey_SPRAS)
FROM `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.InventoryKeyMetrics`
)
GROUP BY
InventoryKeyMetrics.Client_MANDT,
InventoryKeyMetrics.CompanyCode_BUKRS,
InventoryKeyMetrics.FiscalYear,
InventoryKeyMetrics.FiscalPeriod,
InventoryKeyMetrics.TargetCurrency_TCURR
),
AccountsPayableKPI AS (
SELECT
AccountsPayableAgg.Client_MANDT,
AccountsPayableAgg.CompanyCode_BUKRS,
AccountsPayableAgg.CompanyText_BUTXT,
AccountsPayableAgg.TargetCurrency_TCURR,
AccountsPayableAgg.FiscalYear,
AccountsPayableAgg.FiscalPeriod,
AccountsPayableAgg.OverdueAmountInSourceCurrency,
AccountsPayableAgg.OverdueAmountInTargetCurrency,
Fiscal.StartDate AS FiscalPeriodStart,
Fiscal.EndDate AS FiscalPeriodEnd,
SUM(AccountsPayableAgg.OverdueAmountInSourceCurrency) OVER (
PARTITION BY
AccountsPayableAgg.Client_MANDT,
AccountsPayableAgg.CompanyCode_BUKRS,
AccountsPayableAgg.TargetCurrency_TCURR
ORDER BY
AccountsPayableAgg.FiscalYear,
AccountsPayableAgg.FiscalPeriod
) AS PeriodAPInSourceCurrency,
SUM(AccountsPayableAgg.OverdueAmountInTargetCurrency) OVER (
PARTITION BY
AccountsPayableAgg.Client_MANDT,
AccountsPayableAgg.CompanyCode_BUKRS,
AccountsPayableAgg.TargetCurrency_TCURR
ORDER BY
AccountsPayableAgg.FiscalYear,
AccountsPayableAgg.FiscalPeriod
) AS PeriodAPInTargetCurrency
FROM AccountsPayableAgg AS AccountsPayableAgg
INNER JOIN `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.CompaniesMD` AS Company
ON
AccountsPayableAgg.Client_MANDT = Company.Client_MANDT
AND AccountsPayableAgg.CompanyCode_BUKRS = Company.CompanyCode_BUKRS
INNER JOIN ( --noqa: disable= ST05
SELECT
mandt,
periv,
FiscalPeriod,
FiscalYear,
MIN(Date) AS StartDate,
MAX(Date) AS Enddate
FROM `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.fiscal_date_dim`
WHERE mandt = '{{ mandt }}'
GROUP BY mandt, periv, FiscalPeriod, FiscalYear
) AS Fiscal --noqa: enable=all
ON
AccountsPayableAgg.Client_MANDT = Fiscal.mandt
AND Company.FiscalyearVariant_PERIV = Fiscal.periv
AND AccountsPayableAgg.FiscalYear = Fiscal.FiscalYear
AND AccountsPayableAgg.FiscalPeriod = Fiscal.FiscalPeriod
)
SELECT
AccountsPayableKPI.Client_MANDT,
AccountsPayableKPI.CompanyCode_BUKRS,
AccountsPayableKPI.CompanyText_BUTXT,
AccountsPayableKPI.FiscalYear,
AccountsPayableKPI.FiscalPeriod,
AccountsPayableKPI.TargetCurrency_TCURR,
AccountsPayableKPI.PeriodAPInSourceCurrency,
AccountsPayableKPI.PeriodAPInTargetCurrency,
InventoryMetricsAgg.COGSInSourceCurrency,
InventoryMetricsAgg.COGSInTargetCurrency,
DATE_DIFF(
AccountsPayableKPI.FiscalPeriodEnd,
AccountsPayableKPI.FiscalPeriodStart,
DAY
) + 1 AS NumberOfDays,
SAFE_DIVIDE(
AccountsPayableKPI.PeriodAPInSourceCurrency
* (DATE_DIFF(
AccountsPayableKPI.FiscalPeriodEnd,
AccountsPayableKPI.FiscalPeriodStart,
DAY
) + 1),
InventoryMetricsAgg.COGSInSourceCurrency
) AS DaysPayableOutstandingInSourceCurrency,
SAFE_DIVIDE(
AccountsPayableKPI.PeriodAPInTargetCurrency
* (DATE_DIFF(
AccountsPayableKPI.FiscalPeriodEnd,
AccountsPayableKPI.FiscalPeriodStart,
DAY
) + 1),
InventoryMetricsAgg.COGSInTargetCurrency
) AS DaysPayableOutstandingInTargetCurrency
FROM AccountsPayableKPI AS AccountsPayableKPI
INNER JOIN InventoryMetricsAgg AS InventoryMetricsAgg
ON AccountsPayableKPI.Client_MANDT = InventoryMetricsAgg.Client_MANDT
AND AccountsPayableKPI.CompanyCode_BUKRS = InventoryMetricsAgg.CompanyCode_BUKRS
AND AccountsPayableKPI.FiscalYear = InventoryMetricsAgg.FiscalYear
AND AccountsPayableKPI.FiscalPeriod = InventoryMetricsAgg.FiscalPeriod
AND AccountsPayableKPI.TargetCurrency_TCURR = InventoryMetricsAgg.TargetCurrency_TCURR