mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-22 06:28:19 +02:00
Generate unique ticket numbers for service requests
Add server-side generation of unique ticket numbers for SAV tickets, omitting `ticketNumber` from client-side schema validation in `insertSavTicketSchema` and including it in the ticket data sent to `storage.createSavTicket`. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 31f9bd88-0285-4787-81b3-31ceeea5a08b Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/31f9bd88-0285-4787-81b3-31ceeea5a08b/kCBjAsQ
This commit is contained in:
1 parent
f81637867b
commit
18ec91e4ff
4 files changed
+216
-1
No files matched your search
+204
@@ -0,0 +1,204 @@
|
|||||||
|
Actions
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Deliveries API called with: {
|
||||||
|
|
||||||
|
startDate: '2025-08-01',
|
||||||
|
|
||||||
|
endDate: '2025-08-31',
|
||||||
|
|
||||||
|
storeId: '2',
|
||||||
|
|
||||||
|
withBL: undefined,
|
||||||
|
|
||||||
|
userRole: 'admin'
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Admin filtering deliveries with groupIds: [ 2 ]
|
||||||
|
|
||||||
|
Fetching deliveries by date range: 2025-08-01 to 2025-08-31
|
||||||
|
|
||||||
|
Orders returned: 8 items
|
||||||
|
|
||||||
|
GET /api/orders 304 in 170ms
|
||||||
|
|
||||||
|
📊 Statistiques calculées: {
|
||||||
|
|
||||||
|
ordersCount: 8,
|
||||||
|
|
||||||
|
deliveriesCount: 21,
|
||||||
|
|
||||||
|
pendingOrdersCount: 4,
|
||||||
|
|
||||||
|
averageDeliveryTime: 0.17647058823529413,
|
||||||
|
|
||||||
|
totalPalettes: 57,
|
||||||
|
|
||||||
|
totalPackages: 17
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
GET /api/stats/monthly 304 in 183ms
|
||||||
|
|
||||||
|
GET /api/publicities 200 in 171ms
|
||||||
|
|
||||||
|
Deliveries returned: 21 items
|
||||||
|
|
||||||
|
GET /api/deliveries 304 in 186ms
|
||||||
|
|
||||||
|
Orders returned: 10 items
|
||||||
|
|
||||||
|
GET /api/orders 304 in 201ms
|
||||||
|
|
||||||
|
GET /api/user 304 in 4ms
|
||||||
|
|
||||||
|
GET /api/groups 304 in 10ms
|
||||||
|
|
||||||
|
GET /api/publicities 200 in 15ms
|
||||||
|
|
||||||
|
HEAD /api/health 200 in 1ms
|
||||||
|
|
||||||
|
HEAD /api/health 200 in 1ms
|
||||||
|
|
||||||
|
GET /api/user 304 in 42ms
|
||||||
|
|
||||||
|
GET /api/groups 304 in 49ms
|
||||||
|
|
||||||
|
Customer Orders API called with: { groupIds: undefined, userRole: 'admin' }
|
||||||
|
|
||||||
|
GET /api/suppliers 304 in 52ms
|
||||||
|
|
||||||
|
Customer Orders returned: 34 items
|
||||||
|
|
||||||
|
GET /api/customer-orders 200 in 56ms
|
||||||
|
|
||||||
|
Customer Orders API called with: { groupIds: [ 2 ], userRole: 'admin' }
|
||||||
|
|
||||||
|
Customer Orders returned: 25 items
|
||||||
|
|
||||||
|
GET /api/customer-orders 200 in 12ms
|
||||||
|
|
||||||
|
HEAD /api/health 200 in 0ms
|
||||||
|
|
||||||
|
HEAD /api/health 200 in 1ms
|
||||||
|
|
||||||
|
GET /api/user 304 in 25ms
|
||||||
|
|
||||||
|
GET /api/groups 304 in 26ms
|
||||||
|
|
||||||
|
DLC Products API called with: { groupIds: [ 2 ], filters: {}, userRole: 'admin' }
|
||||||
|
|
||||||
|
GET /api/suppliers 200 in 61ms
|
||||||
|
|
||||||
|
GET /api/dlc-products/stats 304 in 66ms
|
||||||
|
|
||||||
|
DLC Products returned: 154 items
|
||||||
|
|
||||||
|
GET /api/dlc-products 200 in 81ms
|
||||||
|
|
||||||
|
HEAD /api/health 200 in 1ms
|
||||||
|
|
||||||
|
HEAD /api/health 200 in 1ms
|
||||||
|
|
||||||
|
GET /api/user 304 in 20ms
|
||||||
|
|
||||||
|
Tasks API called with: { groupIds: [ 2 ], userRole: 'admin' }
|
||||||
|
|
||||||
|
Tasks returned: 9 items
|
||||||
|
|
||||||
|
GET /api/tasks 304 in 11ms
|
||||||
|
|
||||||
|
GET /api/users 200 in 137ms
|
||||||
|
|
||||||
|
GET /api/user 304 in 3ms
|
||||||
|
|
||||||
|
GET /api/groups 304 in 8ms
|
||||||
|
|
||||||
|
GET /api/user 304 in 6ms
|
||||||
|
|
||||||
|
GET /api/sav/stats 304 in 25ms
|
||||||
|
|
||||||
|
GET /api/sav/tickets 304 in 30ms
|
||||||
|
|
||||||
|
HEAD /api/health 200 in 1ms
|
||||||
|
|
||||||
|
Error creating SAV ticket: ZodError: [
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
"code": "invalid_type",
|
||||||
|
|
||||||
|
"expected": "string",
|
||||||
|
|
||||||
|
"received": "undefined",
|
||||||
|
|
||||||
|
"path": [
|
||||||
|
|
||||||
|
"ticketNumber"
|
||||||
|
|
||||||
|
],
|
||||||
|
|
||||||
|
"message": "Required"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
at get error [as error] (file:///app/node_modules/zod/v3/types.js:39:31)
|
||||||
|
|
||||||
|
at ZodObject.parse (file:///app/node_modules/zod/v3/types.js:114:22)
|
||||||
|
|
||||||
|
at file:///app/dist/index.js:6137:48
|
||||||
|
|
||||||
|
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
|
||||||
|
|
||||||
|
issues: [
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
code: 'invalid_type',
|
||||||
|
|
||||||
|
expected: 'string',
|
||||||
|
|
||||||
|
received: 'undefined',
|
||||||
|
|
||||||
|
path: [Array],
|
||||||
|
|
||||||
|
message: 'Required'
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
],
|
||||||
|
|
||||||
|
addIssue: [Function (anonymous)],
|
||||||
|
|
||||||
|
addIssues: [Function (anonymous)],
|
||||||
|
|
||||||
|
errors: [
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
code: 'invalid_type',
|
||||||
|
|
||||||
|
expected: 'string',
|
||||||
|
|
||||||
|
received: 'undefined',
|
||||||
|
|
||||||
|
path: [Array],
|
||||||
|
|
||||||
|
message: 'Required'
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
POST /api/sav/tickets 400 in 36ms
|
||||||
|
|
||||||
|
HEAD /api/health 200 in 0ms
|
||||||
|
|
||||||
|
HEAD /api/health 200 in 1ms
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 275 KiB |
+11
-1
@@ -2504,6 +2504,10 @@ RÉSUMÉ DU SCAN
|
|||||||
return res.status(400).json({ message: "No groups available for ticket creation" });
|
return res.status(400).json({ message: "No groups available for ticket creation" });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Generate unique ticket number
|
||||||
|
const now = new Date();
|
||||||
|
const ticketNumber = `SAV-${now.getFullYear()}${(now.getMonth() + 1).toString().padStart(2, '0')}${now.getDate().toString().padStart(2, '0')}-${Date.now().toString().slice(-6)}`;
|
||||||
|
|
||||||
// Parse and validate request body
|
// Parse and validate request body
|
||||||
const ticketData = insertSavTicketSchema.parse({
|
const ticketData = insertSavTicketSchema.parse({
|
||||||
...req.body,
|
...req.body,
|
||||||
@@ -2511,12 +2515,18 @@ RÉSUMÉ DU SCAN
|
|||||||
createdBy: user.id,
|
createdBy: user.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Add the generated ticket number
|
||||||
|
const ticketDataWithNumber = {
|
||||||
|
...ticketData,
|
||||||
|
ticketNumber,
|
||||||
|
};
|
||||||
|
|
||||||
// Validate that the specified group is accessible to the user
|
// Validate that the specified group is accessible to the user
|
||||||
if (!availableGroupIds.includes(ticketData.groupId)) {
|
if (!availableGroupIds.includes(ticketData.groupId)) {
|
||||||
return res.status(403).json({ message: "Access denied to the specified group" });
|
return res.status(403).json({ message: "Access denied to the specified group" });
|
||||||
}
|
}
|
||||||
|
|
||||||
const ticket = await storage.createSavTicket(ticketData);
|
const ticket = await storage.createSavTicket(ticketDataWithNumber);
|
||||||
res.status(201).json(ticket);
|
res.status(201).json(ticket);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error creating SAV ticket:", error);
|
console.error("Error creating SAV ticket:", error);
|
||||||
|
|||||||
@@ -668,6 +668,7 @@ export const savTicketHistoryRelations = relations(savTicketHistory, ({ one }) =
|
|||||||
// SAV Zod Schemas
|
// SAV Zod Schemas
|
||||||
export const insertSavTicketSchema = createInsertSchema(savTickets).omit({
|
export const insertSavTicketSchema = createInsertSchema(savTickets).omit({
|
||||||
id: true,
|
id: true,
|
||||||
|
ticketNumber: true, // Auto-generated server-side
|
||||||
createdAt: true,
|
createdAt: true,
|
||||||
updatedAt: true,
|
updatedAt: true,
|
||||||
resolvedAt: true,
|
resolvedAt: true,
|
||||||
|
|||||||
Reference in new issue
Block a user