Files
AWatch-rus/clickhouse-1c/clickhouse/init/05_financial_reporting.sql
T

168 lines
6.1 KiB
SQL

CREATE OR REPLACE VIEW analytics_1c.v_financial_reporting_readiness AS
SELECT
max(be.ts) AS last_event_at,
if(
countIf(be.event_kind = 'posting' OR be.debit_account != '' OR be.credit_account != '') > 0,
maxIf(be.ts, be.event_kind = 'posting' OR be.debit_account != '' OR be.credit_account != ''),
CAST(NULL, 'Nullable(DateTime)')
) AS last_ledger_event_at,
count() AS business_events_total,
countIf(be.document_type = 'CompanyActivitySnapshot' AND be.event_kind = 'document_snapshot') AS proxy_events_total,
countIf(be.event_kind = 'posting' OR be.debit_account != '' OR be.credit_account != '') AS ledger_events_total,
countIf(be.debit_account != '' OR be.credit_account != '') AS account_lines_total,
(SELECT count() FROM analytics_1c.postings) AS postings_table_rows,
(SELECT if(count() > 0, max(ts), CAST(NULL, 'Nullable(DateTime)')) FROM analytics_1c.postings) AS postings_table_last_ts,
multiIf(
countIf(be.event_kind = 'posting' OR be.debit_account != '' OR be.credit_account != '') > 0 OR (SELECT count() FROM analytics_1c.postings) > 0,
'ledger_ready',
countIf(be.document_type = 'CompanyActivitySnapshot' AND be.event_kind = 'document_snapshot') > 0,
'proxy_only',
'empty'
) AS readiness_status
FROM analytics_1c.business_events AS be;
CREATE OR REPLACE VIEW analytics_1c.v_financial_daily AS
SELECT
d,
infobase,
organization_name AS organization,
source_kind,
events_total,
documents_total,
amount_total
FROM
(
SELECT
toDate(ts) AS d,
infobase,
if(organization != '', organization, infobase) AS organization_name,
'ledger' AS source_kind,
count() AS events_total,
uniqExact(document_id) AS documents_total,
sum(amount) AS amount_total
FROM analytics_1c.business_events
WHERE event_kind = 'posting' OR debit_account != '' OR credit_account != ''
GROUP BY d, infobase, organization_name
UNION ALL
SELECT
toDate(ts) AS d,
infobase,
if(organization != '', organization, infobase) AS organization_name,
'proxy' AS source_kind,
count() AS events_total,
uniqExact(document_id) AS documents_total,
sum(amount) AS amount_total
FROM analytics_1c.business_events
WHERE event_kind = 'document_snapshot'
AND document_type = 'CompanyActivitySnapshot'
GROUP BY d, infobase, organization_name
);
CREATE OR REPLACE VIEW analytics_1c.v_financial_company_current AS
SELECT
daily.infobase AS infobase,
argMax(ifNull(nullIf(companies.company_name, ''), daily.infobase), daily.d) AS company_name,
argMax(ifNull(nullIf(companies.organization, ''), daily.organization), daily.d) AS organization,
argMax(ifNull(nullIf(companies.owner_user, ''), ''), daily.d) AS owner_user,
sumIf(daily.amount_total, daily.source_kind = 'ledger' AND daily.d >= today() - 30) AS ledger_amount_30d,
sumIf(daily.events_total, daily.source_kind = 'ledger' AND daily.d >= today() - 30) AS ledger_events_30d,
sumIf(daily.documents_total, daily.source_kind = 'ledger' AND daily.d >= today() - 30) AS ledger_documents_30d,
sumIf(daily.amount_total, daily.source_kind = 'proxy' AND daily.d >= today() - 30) AS proxy_amount_30d,
sumIf(daily.events_total, daily.source_kind = 'proxy' AND daily.d >= today() - 30) AS proxy_events_30d,
sumIf(daily.documents_total, daily.source_kind = 'proxy' AND daily.d >= today() - 30) AS proxy_documents_30d,
if(
countIf(daily.source_kind = 'ledger' AND daily.d >= today() - 30) > 0,
maxIf(daily.d, daily.source_kind = 'ledger' AND daily.d >= today() - 30),
maxIf(daily.d, daily.source_kind = 'proxy' AND daily.d >= today() - 30)
) AS last_financial_day,
multiIf(
countIf(daily.source_kind = 'ledger' AND daily.d >= today() - 30) > 0, 'ledger_ready',
countIf(daily.source_kind = 'proxy' AND daily.d >= today() - 30) > 0, 'proxy_only',
'empty'
) AS readiness_status,
ifNull(changes.changes_30d, 0) AS changes_30d,
ifNull(changes.risky_changes_30d, 0) AS risky_changes_30d
FROM analytics_1c.v_financial_daily AS daily
LEFT JOIN analytics_1c.v_companies_current AS companies ON companies.infobase = daily.infobase
LEFT JOIN
(
SELECT
infobase,
count() AS changes_30d,
countIf(risk_tag != '') AS risky_changes_30d
FROM analytics_1c.document_change_events
WHERE ts >= now() - INTERVAL 30 DAY
GROUP BY infobase
) AS changes ON changes.infobase = daily.infobase
GROUP BY daily.infobase, ifNull(changes.changes_30d, 0), ifNull(changes.risky_changes_30d, 0);
CREATE OR REPLACE VIEW analytics_1c.v_financial_document_types_30d AS
SELECT
source_kind,
document_type,
operation_type,
count() AS events_total,
uniqExact(infobase) AS infobases_total,
sum(amount) AS amount_total
FROM
(
SELECT
ts,
infobase,
document_type,
operation_type,
amount,
'ledger' AS source_kind
FROM analytics_1c.business_events
WHERE ts >= now() - INTERVAL 30 DAY
AND (event_kind = 'posting' OR debit_account != '' OR credit_account != '')
UNION ALL
SELECT
ts,
infobase,
document_type,
operation_type,
amount,
'proxy' AS source_kind
FROM analytics_1c.business_events
WHERE ts >= now() - INTERVAL 30 DAY
AND event_kind = 'document_snapshot'
AND document_type = 'CompanyActivitySnapshot'
)
GROUP BY source_kind, document_type, operation_type;
CREATE OR REPLACE VIEW analytics_1c.v_financial_accounts_30d AS
SELECT
side,
account,
count() AS entries_total,
uniqExact(infobase) AS infobases_total,
sum(amount) AS amount_total
FROM
(
SELECT
infobase,
amount,
'debit' AS side,
debit_account AS account
FROM analytics_1c.business_events
WHERE ts >= now() - INTERVAL 30 DAY
AND debit_account != ''
UNION ALL
SELECT
infobase,
amount,
'credit' AS side,
credit_account AS account
FROM analytics_1c.business_events
WHERE ts >= now() - INTERVAL 30 DAY
AND credit_account != ''
)
GROUP BY side, account;