Merge pull request #460 from R0m1k3/1.1

1.1
This commit is contained in:
LogiFlow authored and GitHub committed 2025-09-22 17:46:08 +02:00
commit 39bba88601
4 files changed
+78 -74

No files matched your search

+4 -4
View File
@@ -15,6 +15,10 @@ run = ["npm", "run", "start"]
localPort = 5000 localPort = 5000
externalPort = 80 externalPort = 80
[[ports]]
localPort = 33873
externalPort = 3003
[[ports]] [[ports]]
localPort = 38343 localPort = 38343
externalPort = 3000 externalPort = 3000
@@ -27,10 +31,6 @@ externalPort = 3002
localPort = 41343 localPort = 41343
externalPort = 3001 externalPort = 3001
[[ports]]
localPort = 43431
externalPort = 3003
[workflows] [workflows]
runButton = "Project" runButton = "Project"
Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

+4 -4
View File
@@ -5040,7 +5040,7 @@ RÉSUMÉ DU SCAN
// Apply role-based filtering // Apply role-based filtering
if (user.role !== 'admin' && user.role !== 'directeur') { if (user.role !== 'admin' && user.role !== 'directeur') {
const userGroupIds = user.groups.map((g: any) => g.groupId); const userGroupIds = user.userGroups?.map((ug: any) => ug.groupId) || [];
filters.groupIds = filters.groupIds filters.groupIds = filters.groupIds
? filters.groupIds.filter(id => userGroupIds.includes(id)) ? filters.groupIds.filter(id => userGroupIds.includes(id))
: userGroupIds; : userGroupIds;
@@ -5071,7 +5071,7 @@ RÉSUMÉ DU SCAN
// Apply role-based filtering // Apply role-based filtering
if (user.role !== 'admin' && user.role !== 'directeur') { if (user.role !== 'admin' && user.role !== 'directeur') {
const userGroupIds = user.groups.map((g: any) => g.groupId); const userGroupIds = user.userGroups?.map((ug: any) => ug.groupId) || [];
filters.groupIds = filters.groupIds filters.groupIds = filters.groupIds
? filters.groupIds.filter(id => userGroupIds.includes(id)) ? filters.groupIds.filter(id => userGroupIds.includes(id))
: userGroupIds; : userGroupIds;
@@ -5100,7 +5100,7 @@ RÉSUMÉ DU SCAN
// Apply role-based filtering // Apply role-based filtering
if (user.role !== 'admin' && user.role !== 'directeur') { if (user.role !== 'admin' && user.role !== 'directeur') {
const userGroupIds = user.groups.map((g: any) => g.groupId); const userGroupIds = user.userGroups?.map((ug: any) => ug.groupId) || [];
filters.groupIds = filters.groupIds filters.groupIds = filters.groupIds
? filters.groupIds.filter(id => userGroupIds.includes(id)) ? filters.groupIds.filter(id => userGroupIds.includes(id))
: userGroupIds; : userGroupIds;
@@ -5153,7 +5153,7 @@ RÉSUMÉ DU SCAN
// Apply role-based filtering // Apply role-based filtering
if (user.role !== 'admin' && user.role !== 'directeur') { if (user.role !== 'admin' && user.role !== 'directeur') {
const userGroupIds = user.groups.map((g: any) => g.groupId); const userGroupIds = user.userGroups?.map((ug: any) => ug.groupId) || [];
filters.groupIds = filters.groupIds filters.groupIds = filters.groupIds
? filters.groupIds.filter(id => userGroupIds.includes(id)) ? filters.groupIds.filter(id => userGroupIds.includes(id))
: userGroupIds; : userGroupIds;
+70 -66
View File
@@ -2982,33 +2982,29 @@ export class DatabaseStorage implements IStorage {
const dateFormat = granularity === 'day' ? 'YYYY-MM-DD' : const dateFormat = granularity === 'day' ? 'YYYY-MM-DD' :
granularity === 'week' ? 'YYYY-IW' : 'YYYY-MM'; granularity === 'week' ? 'YYYY-IW' : 'YYYY-MM';
// Build WHERE clauses // Build WHERE clauses with direct value substitution
const orderConditions: string[] = []; const orderConditions: string[] = [];
const deliveryConditions: string[] = []; const deliveryConditions: string[] = [];
const params: any[] = [];
if (filters.startDate) { if (filters.startDate) {
orderConditions.push(`planned_date >= $${params.length + 1}`); const startDate = filters.startDate.toISOString().split('T')[0];
deliveryConditions.push(`scheduled_date >= $${params.length + 1}`); orderConditions.push(`planned_date >= '${startDate}'`);
params.push(filters.startDate.toISOString()); deliveryConditions.push(`scheduled_date >= '${startDate}'`);
} }
if (filters.endDate) { if (filters.endDate) {
const endParamIndex = params.length + 1; const endDate = filters.endDate.toISOString().split('T')[0];
orderConditions.push(`planned_date <= $${endParamIndex}`); orderConditions.push(`planned_date <= '${endDate}'`);
deliveryConditions.push(`scheduled_date <= $${endParamIndex}`); deliveryConditions.push(`scheduled_date <= '${endDate}'`);
params.push(filters.endDate.toISOString());
} }
if (filters.supplierIds?.length) { if (filters.supplierIds?.length) {
const supplierParamIndex = params.length + 1; const supplierIds = filters.supplierIds.join(',');
orderConditions.push(`supplier_id = ANY($${supplierParamIndex})`); orderConditions.push(`supplier_id IN (${supplierIds})`);
deliveryConditions.push(`supplier_id = ANY($${supplierParamIndex})`); deliveryConditions.push(`supplier_id IN (${supplierIds})`);
params.push(filters.supplierIds);
} }
if (filters.groupIds?.length) { if (filters.groupIds?.length) {
const groupParamIndex = params.length + 1; const groupIds = filters.groupIds.join(',');
orderConditions.push(`group_id = ANY($${groupParamIndex})`); orderConditions.push(`group_id IN (${groupIds})`);
deliveryConditions.push(`group_id = ANY($${groupParamIndex})`); deliveryConditions.push(`group_id IN (${groupIds})`);
params.push(filters.groupIds);
} }
const orderWhere = orderConditions.length > 0 ? `WHERE ${orderConditions.join(' AND ')}` : ''; const orderWhere = orderConditions.length > 0 ? `WHERE ${orderConditions.join(' AND ')}` : '';
@@ -3023,9 +3019,7 @@ export class DatabaseStorage implements IStorage {
ORDER BY TO_CHAR(planned_date, '${dateFormat}') ORDER BY TO_CHAR(planned_date, '${dateFormat}')
`; `;
const ordersData = params.length > 0 const ordersData = await db.execute(sql.raw(ordersSql));
? await db.execute(sql.raw(ordersSql).values(params))
: await db.execute(sql.raw(ordersSql));
// Get deliveries by date using raw SQL // Get deliveries by date using raw SQL
const deliveriesSql = ` const deliveriesSql = `
@@ -3036,9 +3030,7 @@ export class DatabaseStorage implements IStorage {
ORDER BY TO_CHAR(scheduled_date, '${dateFormat}') ORDER BY TO_CHAR(scheduled_date, '${dateFormat}')
`; `;
const deliveriesData = params.length > 0 const deliveriesData = await db.execute(sql.raw(deliveriesSql));
? await db.execute(sql.raw(deliveriesSql).values(params))
: await db.execute(sql.raw(deliveriesSql));
// Merge data // Merge data
const dataMap = new Map<string, { orders: number; deliveries: number }>(); const dataMap = new Map<string, { orders: number; deliveries: number }>();
@@ -3093,52 +3085,64 @@ export class DatabaseStorage implements IStorage {
endDate?: Date; endDate?: Date;
supplierIds?: number[]; supplierIds?: number[];
}): Promise<Array<{ groupId: number; storeName: string; orders: number; deliveries: number }>> { }): Promise<Array<{ groupId: number; storeName: string; orders: number; deliveries: number }>> {
const orderConditions: any[] = [];
const deliveryConditions: any[] = [];
if (filters.startDate) { try {
const startDateStr = filters.startDate.toISOString(); // Build date filter conditions as strings for raw SQL
orderConditions.push(sql`${orders.plannedDate} >= ${startDateStr}`); let orderDateFilter = '1=1';
deliveryConditions.push(sql`${deliveries.scheduledDate} >= ${startDateStr}`); let deliveryDateFilter = '1=1';
} let supplierFilter = '1=1';
if (filters.endDate) {
const endDateStr = filters.endDate.toISOString();
orderConditions.push(sql`${orders.plannedDate} <= ${endDateStr}`);
deliveryConditions.push(sql`${deliveries.scheduledDate} <= ${endDateStr}`);
}
if (filters.supplierIds?.length) {
orderConditions.push(inArray(orders.supplierId, filters.supplierIds));
deliveryConditions.push(inArray(deliveries.supplierId, filters.supplierIds));
}
const result = await db.execute(sql` if (filters.startDate) {
SELECT const startDate = filters.startDate.toISOString().split('T')[0];
g.id as "groupId", orderDateFilter += ` AND planned_date >= '${startDate}'`;
g.name as "storeName", deliveryDateFilter += ` AND scheduled_date >= '${startDate}'`;
COALESCE(o.count, 0) as orders, }
COALESCE(d.count, 0) as deliveries if (filters.endDate) {
FROM groups g const endDate = filters.endDate.toISOString().split('T')[0];
LEFT JOIN ( orderDateFilter += ` AND planned_date <= '${endDate}'`;
SELECT group_id, COUNT(*) as count deliveryDateFilter += ` AND scheduled_date <= '${endDate}'`;
FROM orders }
WHERE ${orderConditions.length ? sql.join(orderConditions, sql` AND `) : sql`1=1`} if (filters.supplierIds?.length) {
GROUP BY group_id const supplierIds = filters.supplierIds.join(',');
) o ON g.id = o.group_id orderDateFilter += ` AND supplier_id IN (${supplierIds})`;
LEFT JOIN ( deliveryDateFilter += ` AND supplier_id IN (${supplierIds})`;
SELECT group_id, COUNT(*) as count }
FROM deliveries
WHERE ${deliveryConditions.length ? sql.join(deliveryConditions, sql` AND `) : sql`1=1`}
GROUP BY group_id
) d ON g.id = d.group_id
ORDER BY (COALESCE(o.count, 0) + COALESCE(d.count, 0)) DESC
`);
return result.rows.map((row: any) => ({ const result = await db.execute(sql`
groupId: row.groupId, SELECT
storeName: row.storeName, g.id as "groupId",
orders: Number(row.orders), g.name as "storeName",
deliveries: Number(row.deliveries) COALESCE(o.count, 0) as orders,
})); COALESCE(d.count, 0) as deliveries
FROM groups g
LEFT JOIN (
SELECT group_id, COUNT(*) as count
FROM orders
WHERE ${sql.raw(orderDateFilter)}
GROUP BY group_id
) o ON g.id = o.group_id
LEFT JOIN (
SELECT group_id, COUNT(*) as count
FROM deliveries
WHERE ${sql.raw(deliveryDateFilter)}
GROUP BY group_id
) d ON g.id = d.group_id
ORDER BY (COALESCE(o.count, 0) + COALESCE(d.count, 0)) DESC
`);
const mappedResult = result.rows.map((row: any) => ({
groupId: row.groupId,
storeName: row.storeName,
orders: Number(row.orders),
deliveries: Number(row.deliveries)
}));
return mappedResult;
} catch (error) {
console.error('Error in getAnalyticsByStore:', error);
return [];
}
} }
} }