Refactorization and splitting of schema files

This commit is contained in:
Florian "flowdy" Heß
2017-01-19 21:44:22 +01:00
parent 53ef8ff175
commit 336185aee1
23 changed files with 475 additions and 455 deletions

View File

@@ -0,0 +1,7 @@
DROP VIEW IF EXISTS AvailableCredits;
CREATE VIEW AvailableCredits AS
SELECT credId, account, purpose, date,
value - spent AS difference
FROM Credit
WHERE value != spent
;

View File

@@ -0,0 +1,11 @@
DROP VIEW IF EXISTS CurrentArrears;
CREATE VIEW CurrentArrears AS
SELECT billId,
debtor,
targetCredit,
purpose,
date,
value - paid AS difference
FROM Debit
WHERE value != paid
;

View File

@@ -0,0 +1,31 @@
-- Log of internal transfers
DROP VIEW IF EXISTS History;
CREATE VIEW History AS
-- internal transfers with account as source
SELECT DATE(timestamp) AS date,
d.purpose AS purpose,
d.debtor AS account,
t.credId AS credId,
t.amount AS debit,
NULL AS credit,
d.targetCredit AS contra,
d.billId AS billId,
t.note AS note
FROM Transfer t
LEFT JOIN Debit AS d ON d.billId = t.billId
-- internal transfers with account as target
UNION
SELECT DATE(timestamp) AS date,
d.purpose AS purpose,
c.account AS account,
d.targetCredit AS credId,
NULL AS debit,
t.amount AS credit,
t.credId AS contra,
d.billId AS billId,
t.note AS note
FROM Transfer t
LEFT JOIN Debit AS d ON d.billId = t.billId
LEFT JOIN Credit AS c ON c.credId = d.targetCredit
ORDER BY date ASC
;

View File

@@ -0,0 +1,47 @@
DROP VIEW IF EXISTS Balance;
CREATE VIEW Balance AS
SELECT Account.ID AS ID,
IFNULL(ac.allCredits,0) AS available,
IFNULL(hi.credit,0) AS earned,
IFNULL(hi.debit,0) AS spent,
IFNULL(pr.allPromises, 0) AS promised,
IFNULL(ca.allArrears, 0) AS arrears,
even.until AS even_until
FROM Account
LEFT OUTER JOIN (
SELECT debtor, sum(difference) AS allArrears
FROM CurrentArrears
GROUP BY debtor
) AS ca ON Account.ID=ca.debtor
LEFT OUTER JOIN (
SELECT account, sum(difference) AS allCredits
FROM AvailableCredits
GROUP BY account
) AS ac ON Account.ID=ac.account
LEFT OUTER JOIN (
SELECT a.ID AS ID, sum(difference) AS allPromises
FROM CurrentArrears ca
JOIN Credit c ON ca.targetCredit = c.credId
JOIN Account a ON a.ID = c.account
GROUP BY a.ID
) AS pr ON Account.ID=pr.ID
LEFT OUTER JOIN (
SELECT account,
sum(credit) AS credit,
sum(debit) AS debit
FROM History
GROUP BY account
) AS hi ON Account.ID=hi.account
LEFT OUTER JOIN (
SELECT d.debtor AS account,
max(d.date) AS until
FROM Debit d
LEFT OUTER JOIN CurrentArrears ca ON d.debtor = ca.debtor
GROUP BY d.debtor, ca.debtor
HAVING COUNT(
-- Restricts the counting to the settled debts:
CASE d.value WHEN d.paid THEN 1 ELSE NULL END
) -- Considers that there might be no current arrears:
AND d.date <= IFNULL( min(ca.date), '9999-99-99' )
) AS even ON Account.ID=even.account
;

View File

@@ -0,0 +1,21 @@
DROP VIEW IF EXISTS ReconstructedBankStatement;
CREATE VIEW ReconstructedBankStatement AS
SELECT c.date AS date,
c.purpose AS purpose,
account,
c.value AS credit,
NULL AS debit
FROM Credit AS c
LEFT OUTER JOIN Debit AS d ON c.credId = d.targetCredit
GROUP BY c.credId
HAVING count(d.billId) == 0 -- exclude internal transfers
UNION
SELECT date,
purpose,
debtor AS account,
NULL AS credit,
value AS debit
FROM Debit
WHERE targetCredit IS NULL -- exclude internal transfers
ORDER BY date ASC
;

View File

@@ -0,0 +1,54 @@
DROP VIEW IF EXISTS CreditsInFocus;
CREATE VIEW CreditsInFocus AS
SELECT account, date, credId, value, purpose
FROM Credit
WHERE value > spent
UNION
SELECT c.account, date, credId, value, purpose
FROM Credit c
JOIN Balance b ON b.ID = c.account
WHERE c.date >= b.even_until
GROUP BY c.credId
;
-- Report view may be of use in communication with club members who are due
-- of outstanding fees, listing what they have paid and what is yet to pay.
DROP VIEW IF EXISTS Report;
CREATE VIEW Report AS
SELECT *
FROM (
SELECT account, date, credId, value, purpose -- relevant incomes
FROM CreditsInFocus
UNION
SELECT debtor AS account, -- partial payments
DATE(t.timestamp)
AS date,
t.credId AS credId,
t.amount * -1 AS value,
d.purpose || ' [' || d.billId || ']'
|| CASE WHEN t.note IS NULL
THEN ''
ELSE ( x'0a' || '(' || t.note || ')' )
END
AS purpose
FROM Debit d
JOIN Transfer t ON t.billId = d.billId
JOIN CreditsInFocus fc ON fc.credId=t.credId
UNION
SELECT debtor AS account, -- current arrears
date,
NULL AS credId,
difference * -1 AS value,
purpose || ' [' || billId || ']'
|| x'0a' || '(YET TO PAY)'
FROM CurrentArrears
)
ORDER BY account, credId IS NULL, credId,
value < 0, date ASC
;