group InvoiceDao;
getInvoicesByAccount() ::= <<
SELECT i.id, i.account_id, i.invoice_date, i.target_date, i.currency,
SUM(ip.amount) AS amount_paid, MAX(ip.payment_date) AS last_payment_attempt
FROM invoices i
LEFT JOIN invoice_payments ip ON ip.invoice_id = i.id
WHERE i.account_id = :accountId
GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency
ORDER BY i.invoice_date ASC;
>>
getInvoicesBySubscription() ::= <<
SELECT i.id, i.account_id, i.invoice_date, i.target_date, i.currency,
SUM(ip.amount) AS amount_paid, MAX(ip.payment_date) AS last_payment_attempt
FROM invoices i
INNER JOIN invoice_items ii ON i.id = ii.invoice_id
LEFT JOIN invoice_payments ip ON ip.invoice_id = i.id
WHERE ii.subscription_id = :subscriptionId
GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency;
>>
getInvoicesForPayment() ::= <<
SELECT i.id
FROM invoices i
GROUP BY i.id;
>>
getById() ::= <<
SELECT i.id, i.account_id, i.invoice_date, i.target_date, SUM(ii.amount) AS amount, i.currency
FROM invoices i
INNER JOIN invoice_items ii ON i.id = ii.invoice_id
WHERE i.id = :id
GROUP BY i.id, i.account_id, i.invoice_date, i.target_date, i.currency;
>>
save() ::= <<
INSERT INTO invoices(id, account_id, invoice_date, target_date, currency)
VALUES (:id, :accountId, :invoiceDate, :targetDate, :currency)
ON DUPLICATE KEY UPDATE
invoice_date = :invoiceDate, target_date = :targetDate, currency = :currency;
>>
notifySuccessfulPayment() ::= <<
INSERT INTO invoice_payments(invoice_id, payment_id, payment_date, amount, currency)
VALUES(:invoiceId, :paymentId, :paymentDate, :amount, :currency);
>>
notifyFailedPayment() ::= <<
INSERT INTO invoice_payments(invoice_id, payment_id, payment_date)
VALUES(:invoiceId, :paymentId, :paymentAttemptDate);
>>
test() ::= <<
SELECT 1
FROM invoices;
>>
;