order stat
deploy to danak / build_and_deploy (push) Has been cancelled

This commit is contained in:
2026-07-21 14:53:56 +03:30
parent 79952c117f
commit 17a9c08989
4 changed files with 88 additions and 4 deletions
@@ -9,8 +9,11 @@ import { RoleRepository } from 'src/modules/roles/respository/role.repository';
import { PermissionEnum } from 'src/common/enums/permission.enum';
import { Request } from 'src/modules/request/entities/request.entity';
import { Invoice } from 'src/modules/invoice/entities/invoice.entity';
import { InvoiceConfirmStatusEnum } from 'src/modules/invoice/enum/invoice-confirm-status.enum';
import { Order } from 'src/modules/order/entities/order.entity';
import { OrderStatusEnum } from 'src/modules/order/interface/order.interface';
import { Payment } from 'src/modules/payment/entities/payment.entity';
import { User } from 'src/modules/user/entities/user.entity';
@Injectable()
export class AdminService {
@@ -172,4 +175,73 @@ export class AdminService {
paymentsCount,
};
}
async getWeeklyOrders(weeksCount = 8) {
const knex = this.em.getConnection().getKnex();
const startDate = this.getWeekStartMonday(new Date());
startDate.setDate(startDate.getDate() - (weeksCount - 1) * 7);
const rows = (await knex('orders')
.select(knex.raw("date_trunc('week', created_at) as week_start"))
.count('* as count')
.whereNull('deleted_at')
.where('created_at', '>=', startDate)
.groupBy('week_start')
.orderBy('week_start', 'asc')) as unknown as Array<{ week_start: Date; count: string }>;
const countByWeek = new Map<string, number>();
for (const row of rows) {
const weekStart = this.getWeekStartMonday(new Date(row.week_start));
countByWeek.set(weekStart.toISOString(), Number(row.count));
}
const result: Array<{ weekStart: string; count: number }> = [];
const cursor = new Date(startDate);
for (let i = 0; i < weeksCount; i++) {
const weekStart = this.getWeekStartMonday(cursor);
result.push({
weekStart: weekStart.toISOString(),
count: countByWeek.get(weekStart.toISOString()) ?? 0,
});
cursor.setDate(cursor.getDate() + 7);
}
return result;
}
private getWeekStartMonday(date: Date): Date {
const d = new Date(date);
d.setHours(0, 0, 0, 0);
const day = d.getDay();
const diff = day === 0 ? -6 : 1 - day;
d.setDate(d.getDate() + diff);
return d;
}
async getHomeStats() {
const [
requestsCount,
unconfirmedInvoicesCount,
inProgressOrdersCount,
completedOrdersCount,
customersCount,
] = await Promise.all([
this.em.count(Request),
this.em.count(Invoice, { confirmStatus: InvoiceConfirmStatusEnum.PENDING }),
this.em.count(Order, {
status: { $nin: [OrderStatusEnum.FINISHED, OrderStatusEnum.CANCELED] },
}),
this.em.count(Order, { status: OrderStatusEnum.FINISHED }),
this.em.count(User),
]);
return {
requestsCount,
unconfirmedInvoicesCount,
inProgressOrdersCount,
completedOrdersCount,
customersCount,
};
}
}