feat: add payment stats by month
All checks were successful
Spell Check / Spell Check with Typos (push) Successful in 7s
All checks were successful
Spell Check / Spell Check with Typos (push) Successful in 7s
This commit is contained in:
parent
5d78166047
commit
5c58953820
1 changed files with 53 additions and 0 deletions
|
|
@ -13,6 +13,7 @@ import { createPermCondition } from "../services/permission";
|
|||
import { RequestWithUser } from "../interfaces/user";
|
||||
import { PaymentStatus } from "../generated/kysely/types";
|
||||
import { precisionRound } from "../utils/arithmetic";
|
||||
import dayjs from "dayjs";
|
||||
|
||||
const permissionCondCompany = createPermCondition((_) => true);
|
||||
|
||||
|
|
@ -411,4 +412,56 @@ export class StatsController extends Controller {
|
|||
{ income: 0, expenses: 0, netProfit: 0 },
|
||||
);
|
||||
}
|
||||
|
||||
@Get("payment")
|
||||
async invoice(
|
||||
@Request() req: RequestWithUser,
|
||||
@Query() startDate?: Date,
|
||||
@Query() endDate?: Date,
|
||||
) {
|
||||
if (!startDate && !endDate) {
|
||||
startDate = dayjs(new Date()).subtract(12, "months").startOf("month").toDate();
|
||||
endDate = dayjs(new Date()).endOf("months").toDate();
|
||||
}
|
||||
|
||||
if (!startDate && endDate) {
|
||||
startDate = dayjs(endDate).subtract(12, "months").startOf("month").toDate();
|
||||
}
|
||||
|
||||
if (startDate && !endDate) {
|
||||
endDate = dayjs(new Date()).endOf("month").toDate();
|
||||
}
|
||||
|
||||
const data = await prisma.$transaction(async (tx) => {
|
||||
const months: Date[] = [];
|
||||
|
||||
while (startDate! < endDate!) {
|
||||
months.push(startDate!);
|
||||
startDate = dayjs(startDate).startOf("month").add(1, "month").toDate();
|
||||
}
|
||||
|
||||
return await Promise.all(
|
||||
months.map(async (v) => {
|
||||
const date = dayjs(v);
|
||||
return {
|
||||
month: date.format("MM"),
|
||||
year: date.format("YYYY"),
|
||||
data: await tx.payment
|
||||
.groupBy({
|
||||
_sum: { amount: true },
|
||||
where: { createdAt: { gte: v, lte: date.endOf("month").toDate() } },
|
||||
by: "paymentStatus",
|
||||
})
|
||||
.then((v) =>
|
||||
v.reduce<Partial<Record<(typeof v)[number]["paymentStatus"], number>>>((a, c) => {
|
||||
a[c.paymentStatus] = c._sum.amount || 0;
|
||||
return a;
|
||||
}, {}),
|
||||
),
|
||||
};
|
||||
}),
|
||||
);
|
||||
});
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue