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 { RequestWithUser } from "../interfaces/user";
|
||||||
import { PaymentStatus } from "../generated/kysely/types";
|
import { PaymentStatus } from "../generated/kysely/types";
|
||||||
import { precisionRound } from "../utils/arithmetic";
|
import { precisionRound } from "../utils/arithmetic";
|
||||||
|
import dayjs from "dayjs";
|
||||||
|
|
||||||
const permissionCondCompany = createPermCondition((_) => true);
|
const permissionCondCompany = createPermCondition((_) => true);
|
||||||
|
|
||||||
|
|
@ -411,4 +412,56 @@ export class StatsController extends Controller {
|
||||||
{ income: 0, expenses: 0, netProfit: 0 },
|
{ 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