Improve ticket statistics calculation and data retrieval

Refactors the database storage logic to separately query for ticket counts by status, priority, and total. This change enhances data retrieval efficiency and accuracy for displaying ticket statistics.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: dc17873f-d870-4f45-9108-207794b849f7
Replit-Commit-Checkpoint-Type: intermediate_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/dc17873f-d870-4f45-9108-207794b849f7/FxJjNBe
This commit is contained in:
michaelschal committed 2025-09-07 07:37:32 +00:00
1 parent f6323ce5b4
commit 15e9d13e6a
1 file changed
+38 -10
+38 -10
View File
@@ -2276,37 +2276,65 @@ export class DatabaseStorage implements IStorage {
resolvedTickets: number; resolvedTickets: number;
criticalTickets: number; criticalTickets: number;
}> { }> {
let query = db.select({ count: sql<number>`count(*)`, status: savTickets.status, priority: savTickets.priority }) let baseQuery = db.select().from(savTickets);
.from(savTickets);
if (groupIds?.length) { if (groupIds?.length) {
query = query.where(inArray(savTickets.groupId, groupIds)); baseQuery = baseQuery.where(inArray(savTickets.groupId, groupIds));
} }
const results = await query.groupBy(savTickets.status, savTickets.priority); // Get status counts
const statusResults = await db
.select({
count: sql<number>`count(*)`,
status: savTickets.status
})
.from(savTickets)
.where(groupIds?.length ? inArray(savTickets.groupId, groupIds) : undefined)
.groupBy(savTickets.status);
// Get priority counts
const priorityResults = await db
.select({
count: sql<number>`count(*)`,
priority: savTickets.priority
})
.from(savTickets)
.where(groupIds?.length ? inArray(savTickets.groupId, groupIds) : undefined)
.groupBy(savTickets.priority);
// Get total count
const totalResult = await db
.select({ count: sql<number>`count(*)` })
.from(savTickets)
.where(groupIds?.length ? inArray(savTickets.groupId, groupIds) : undefined);
const stats = { const stats = {
totalTickets: 0, totalTickets: Number(totalResult[0]?.count || 0),
newTickets: 0, newTickets: 0,
inProgressTickets: 0, inProgressTickets: 0,
resolvedTickets: 0, resolvedTickets: 0,
criticalTickets: 0, criticalTickets: 0,
}; };
results.forEach(result => { // Process status results
const count = result.count || 0; statusResults.forEach(result => {
stats.totalTickets += count; const count = Number(result.count || 0);
if (result.status === 'nouveau') { if (result.status === 'nouveau') {
stats.newTickets += count; stats.newTickets = count;
} else if (['en_cours', 'attente_pieces', 'attente_echange'].includes(result.status)) { } else if (['en_cours', 'attente_pieces', 'attente_echange'].includes(result.status)) {
stats.inProgressTickets += count; stats.inProgressTickets += count;
} else if (['resolu', 'ferme'].includes(result.status)) { } else if (['resolu', 'ferme'].includes(result.status)) {
stats.resolvedTickets += count; stats.resolvedTickets += count;
} }
});
// Process priority results for critical tickets
priorityResults.forEach(result => {
const count = Number(result.count || 0);
if (result.priority === 'critique') { if (result.priority === 'critique') {
stats.criticalTickets += count; stats.criticalTickets = count;
} }
}); });