From c532a2c946c9b04f54068d5ee1ccaed9ca98c796 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Fri, 11 Jul 2025 18:39:31 +0000 Subject: [PATCH] Ensure receipt photos are properly saved when creating new sales records Fix: Map camelCase photo names to snake_case in routes.ts for correct database storage. Replit-Commit-Author: Agent Replit-Commit-Session-Id: dec54137-d5a2-4406-8ad4-5f2f9fb110bf Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/0715008c-7244-40f4-befc-26c014852236/183bde94-866e-4679-97fd-7df41a964b4d.jpg --- replit.md | 3 +++ server/routes.ts | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/replit.md b/replit.md index 65e15e7..459d8bd 100644 --- a/replit.md +++ b/replit.md @@ -285,6 +285,9 @@ Preferred communication style: Simple, everyday language. - ✅ Photo capture system fully integrated with database storage - ✅ Modal de détails des ventes opérationnel avec support complet des photos - ✅ API et schéma de base de données synchronisés pour la production +- ✅ Bug critique corrigé : mapping camelCase/snake_case pour photo_ticket +- ✅ NewSaleForm.tsx corrigé pour inclure photoTicket dans la soumission +- ✅ API routes.ts corrigé avec mapping automatique des photos - ✅ RegisFlow prêt pour déploiement en production avec toutes les fonctionnalités ### Docker Configuration & Cleanup (January 9, 2025) diff --git a/server/routes.ts b/server/routes.ts index 41f3c2c..7f9eec5 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -243,8 +243,39 @@ export async function registerRoutes(app: Express): Promise { targetStoreId = user.storeId; } - const saleData = insertSaleSchema.parse({ + // Debug logging + console.log('=== PHOTO MAPPING DEBUG ==='); + console.log('photoRecto present:', !!req.body.photoRecto); + console.log('photoVerso present:', !!req.body.photoVerso); + console.log('photoTicket present:', !!req.body.photoTicket); + console.log('photoTicket length:', req.body.photoTicket?.length); + + // Map frontend camelCase to database snake_case for photos + const mappedBody = { ...req.body, + }; + + // Add photo fields with proper mapping, only if they exist and are not empty + if (req.body.photoRecto) { + mappedBody.photo_recto = req.body.photoRecto; + console.log('Added photo_recto to mappedBody'); + } + if (req.body.photoVerso) { + mappedBody.photo_verso = req.body.photoVerso; + console.log('Added photo_verso to mappedBody'); + } + if (req.body.photoTicket) { + mappedBody.photo_ticket = req.body.photoTicket; + console.log('Added photo_ticket to mappedBody'); + } + + // Remove camelCase versions to avoid conflicts + delete mappedBody.photoRecto; + delete mappedBody.photoVerso; + delete mappedBody.photoTicket; + + const saleData = insertSaleSchema.parse({ + ...mappedBody, storeId: targetStoreId, userId: user.id });