diff --git a/src/app/lib/data.ts b/src/app/lib/data.ts index b28fcb0..6326383 100644 --- a/src/app/lib/data.ts +++ b/src/app/lib/data.ts @@ -41,6 +41,7 @@ export async function fetchCardData() { const invoiceCountPromise = sql`SELECT COUNT(*) FROM invoices`; const customerCountPromise = sql`SELECT COUNT(*) FROM customers`; const invoiceStatusPromise = sql`SELECT + id, SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS "paid", SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) AS "pending" FROM invoices`; @@ -53,7 +54,7 @@ export async function fetchCardData() { const invoices = data[0] as postgres.RowList const customres = data[1] as postgres.RowList - const invoiceStatus = data[2] as postgres.RowList<({paid: string, pending: string})[]> + const invoiceStatus = data[2] as postgres.RowList<({id: string; paid: string, pending: string})[]> const numberOfInvoices = Number(invoices.count ?? '0'); const numberOfCustomers = Number(customres.count ?? '0'); const totalPaidInvoices = formatCurrency(Number(invoiceStatus.at(0)?.paid ?? '0')); diff --git a/src/feature/customer-invoice/data/module/customer-invoice-di.ts b/src/feature/customer-invoice/data/module/customer-invoice-di.ts index fa6712e..d1a93f1 100644 --- a/src/feature/customer-invoice/data/module/customer-invoice-di.ts +++ b/src/feature/customer-invoice/data/module/customer-invoice-di.ts @@ -4,7 +4,7 @@ import fetchCustomerInvoicesUsecase from "@/feature/customer-invoice/domain/usec import CustomerDbRepo from "@/feature/customer/data/repo/customer-db-repo"; import { DependencyContainer } from "tsyringe"; -export default function getCustomerInvoiceInvoiceDi(): DependencyContainer { +export default function getCustomerInvoiceDi(): DependencyContainer { const customerInvoiceDi = di.createChildContainer() customerInvoiceDi.register(fetchCustomerInvoicesUsecase.name, { diff --git a/src/feature/invoice/data/module/invoice-di.ts b/src/feature/invoice/data/module/invoice-di.ts index 28ce2e0..c7c133a 100644 --- a/src/feature/invoice/data/module/invoice-di.ts +++ b/src/feature/invoice/data/module/invoice-di.ts @@ -1,16 +1,11 @@ import di from "@/bootstrap/di/init-di"; import invoiceDbRepo from "@/feature/invoice/data/repo/invoice-db-repo"; import { invoiceRepoKey } from "@/feature/invoice/domain/i-repo/invoice-repo"; -import fetchAllInvoicesAmountUsecase from "@/feature/invoice/domain/usecase/fetch-all-invoices-amount-usecase"; import { DependencyContainer } from "tsyringe"; export default function getInvoiceDi(): DependencyContainer { const invoiceDi = di.createChildContainer() - invoiceDi.register(fetchAllInvoicesAmountUsecase.name, { - useValue: fetchAllInvoicesAmountUsecase - }) - invoiceDi.register(invoiceRepoKey, invoiceDbRepo) return invoiceDi } \ No newline at end of file diff --git a/src/feature/invoice/data/repo/invoice-db-repo.ts b/src/feature/invoice/data/repo/invoice-db-repo.ts index 5191d67..bc7c2a8 100644 --- a/src/feature/invoice/data/repo/invoice-db-repo.ts +++ b/src/feature/invoice/data/repo/invoice-db-repo.ts @@ -1,11 +1,31 @@ +import { formatCurrency } from "@/app/lib/utils"; import { sql } from "@/bootstrap/db/db"; import InvoiceRepo from "@/feature/invoice/domain/i-repo/invoice-repo"; +import InvoiceStatusSummary from "@/feature/invoice/domain/value-object/invoice-status"; import postgres from "postgres"; +type InvoiceSummaryDbResponse = {paid: string, pending: string} export default class InvoiceDbRepo implements InvoiceRepo { async fetchAllInvoicesAmount(): Promise { const data = await sql`SELECT COUNT(*) FROM invoices` as postgres.RowList; - + return data.count ?? 0 } + + async fetchInvoicesStatusSummary(): Promise { + const invoiceStatusPromise = await sql`SELECT + SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS "paid", + SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) AS "pending" + FROM invoices` as postgres.RowList; + + return this.invoiceSummaryDto(invoiceStatusPromise.at(0)) + + } + + private invoiceSummaryDto(dbResponse?: InvoiceSummaryDbResponse): InvoiceStatusSummary { + return new InvoiceStatusSummary({ + paid: formatCurrency(Number(dbResponse?.paid ?? '0')), + pending: formatCurrency(Number(dbResponse?.pending ?? '0')) + }) + } } \ No newline at end of file diff --git a/src/feature/invoice/domain/i-repo/invoice-repo.ts b/src/feature/invoice/domain/i-repo/invoice-repo.ts index fb4c8a2..085421c 100644 --- a/src/feature/invoice/domain/i-repo/invoice-repo.ts +++ b/src/feature/invoice/domain/i-repo/invoice-repo.ts @@ -1,6 +1,8 @@ +import InvoiceStatusSummary from "@/feature/invoice/domain/value-object/invoice-status" export default interface InvoiceRepo { fetchAllInvoicesAmount(): Promise + fetchInvoicesStatusSummary(): Promise } export const invoiceRepoKey = "invoiceRepoKey" \ No newline at end of file diff --git a/src/feature/invoice/domain/usecase/fetch-invoices-status-summary.ts b/src/feature/invoice/domain/usecase/fetch-invoices-status-summary.ts new file mode 100644 index 0000000..f35a4dc --- /dev/null +++ b/src/feature/invoice/domain/usecase/fetch-invoices-status-summary.ts @@ -0,0 +1,9 @@ +import serverDi from "@/feature/common/server-di"; +import InvoiceRepo, { invoiceRepoKey } from "@/feature/invoice/domain/i-repo/invoice-repo"; +import InvoiceStatusSummary from "@/feature/invoice/domain/value-object/invoice-status"; +import { invoiceModuleKey } from "@/feature/invoice/invoice-module-key"; + +export default function fetchInvoicesStatusSummary(): Promise { + const repo = serverDi(invoiceModuleKey).resolve(invoiceRepoKey) + return repo.fetchInvoicesStatusSummary() +} \ No newline at end of file diff --git a/src/feature/invoice/domain/value-object/invoice-status.ts b/src/feature/invoice/domain/value-object/invoice-status.ts new file mode 100644 index 0000000..b2c393c --- /dev/null +++ b/src/feature/invoice/domain/value-object/invoice-status.ts @@ -0,0 +1,12 @@ +export default class InvoiceStatusSummary { + paid: string; + pending: string; + + constructor({ + paid, + pending + }: InvoiceStatusSummary) { + this.paid = paid; + this.pending = pending; + } +} \ No newline at end of file