diff --git a/backend/gestion/db/db_init.go b/backend/gestion/db/db_init.go index fae4ec59..538d0998 100644 --- a/backend/gestion/db/db_init.go +++ b/backend/gestion/db/db_init.go @@ -152,7 +152,7 @@ func (db *Database) createTables() error { `CREATE TABLE IF NOT EXISTS product_prices ( id SERIAL PRIMARY KEY, product_id INTEGER NOT NULL REFERENCES products(id) ON DELETE CASCADE, - quantity INTEGER NOT NULL, + quantity NUMERIC(10,3) NOT NULL, price NUMERIC(10,2) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(product_id, quantity) @@ -211,7 +211,7 @@ func (db *Database) createTables() error { id SERIAL PRIMARY KEY, username VARCHAR(255) NOT NULL, product_id INTEGER NOT NULL REFERENCES products(id) ON DELETE CASCADE, - quantity INTEGER NOT NULL, + quantity NUMERIC(10,3) NOT NULL, price NUMERIC(10,2) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );`, diff --git a/backend/gestion/db/db_product.go b/backend/gestion/db/db_product.go index 07c261eb..f6512e32 100644 --- a/backend/gestion/db/db_product.go +++ b/backend/gestion/db/db_product.go @@ -77,7 +77,7 @@ func (db *Database) CreateProduct(product interface{}) error { log.Printf("❌ [DB CreateProduct] Erreur insertion prix[%d]: %v", i, err) return fmt.Errorf("erreur insertion prix: %v", err) } - log.Printf("✅ [DB CreateProduct] Prix[%d] inséré: quantity=%d, price=%.2f", + log.Printf("✅ [DB CreateProduct] Prix[%d] inséré: quantity=%g, price=%.2f", i, price.Quantity, price.Price) } diff --git a/backend/gestion/db/db_product_price.go b/backend/gestion/db/db_product_price.go index 3b88f7cc..69ee0fdd 100644 --- a/backend/gestion/db/db_product_price.go +++ b/backend/gestion/db/db_product_price.go @@ -38,7 +38,7 @@ func (db *Database) GetProductPrices(productID int) ([]models.ProductPrice, erro } // CreateProductPrice ajoute un nouveau prix pour un produit -func (db *Database) CreateProductPrice(productID, quantity int, price float64) error { +func (db *Database) CreateProductPrice(productID int, quantity float64, price float64) error { query := `INSERT INTO product_prices (product_id, quantity, price) VALUES ($1, $2, $3)` _, err := db.Exec(query, productID, quantity, price) @@ -49,7 +49,7 @@ func (db *Database) CreateProductPrice(productID, quantity int, price float64) e } // UpdateProductPrice met à jour un prix -func (db *Database) UpdateProductPrice(priceID, quantity int, price float64) error { +func (db *Database) UpdateProductPrice(priceID int, quantity float64, price float64) error { query := `UPDATE product_prices SET quantity = $1, price = $2 WHERE id = $3` result, err := db.Exec(query, quantity, price, priceID) if err != nil { diff --git a/backend/gestion/handlers/product.go b/backend/gestion/handlers/product.go index a564e3bb..8a046a7b 100644 --- a/backend/gestion/handlers/product.go +++ b/backend/gestion/handlers/product.go @@ -98,7 +98,7 @@ func validateStock(stock float64) error { return nil } -func validatePrice(quantity int, price float64) error { +func validatePrice(quantity float64, price float64) error { if quantity <= 0 { return fmt.Errorf("quantité doit être > 0") } @@ -258,7 +258,7 @@ func CreateProduct(c *gin.Context) { break } - quantity, err := strconv.Atoi(quantityStr) + quantity, err := strconv.ParseFloat(quantityStr, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Quantité invalide"}) return diff --git a/backend/gestion/models/product.go b/backend/gestion/models/product.go index 6c0c28de..95e2f477 100644 --- a/backend/gestion/models/product.go +++ b/backend/gestion/models/product.go @@ -17,19 +17,19 @@ type Product struct { type ProductPrice struct { ID int `json:"id"` ProductID int `json:"product_id"` - Quantity int `json:"quantity" binding:"required"` + Quantity float64 `json:"quantity" binding:"required"` Price float64 `json:"price" binding:"required"` CreatedAt time.Time `json:"created_at"` } type StockInfo struct { - ProductID int `json:"product_id"` - ProductName string `json:"product_name"` - Category string `json:"category"` - Quantity int `json:"quantity"` - Reserved int `json:"reserved"` - Available int `json:"available"` - LastUpdated string `json:"last_updated"` + ProductID int `json:"product_id"` + ProductName string `json:"product_name"` + Category string `json:"category"` + Quantity float64 `json:"quantity"` + Reserved float64 `json:"reserved"` + Available float64 `json:"available"` + LastUpdated string `json:"last_updated"` } // ============================================ diff --git a/frontend-admin/src/api/api_delivery.ts b/frontend-admin/src/api/api_delivery.ts index 7d775388..3d88bd1c 100644 --- a/frontend-admin/src/api/api_delivery.ts +++ b/frontend-admin/src/api/api_delivery.ts @@ -76,7 +76,11 @@ export const getMyDeliveries = async (): Promise<{ }> => { try { const { data } = await apiClient.get(`${API}/deliveries`); - return { success: true, deliveries: data.deliveries || [] }; + // Le backend inclut déjà items et client_info dans chaque livraison + const deliveries: DeliveryItem[] = (data.deliveries || []).map( + (d: any) => ({ ...d, items: d.items || [] }), + ); + return { success: true, deliveries }; } catch (error: any) { return { success: false, @@ -94,11 +98,17 @@ export const getDeliveryDetails = async ( }> => { try { const { data } = await apiClient.get(`${API}/deliveries/${deliveryId}`); + // Le backend retourne { delivery: { id, status, adresse, items, ... }, success: true } + // Les items sont dans data.delivery.items, pas dans data.client_info + const deliveryObj = data.delivery || {}; return { success: true, delivery: { - delivery: data.delivery, - client_info: data.client_info, + delivery: { + ...deliveryObj, + items: deliveryObj.items || [], + }, + client_info: deliveryObj.client_info || data.client_info || {}, }, }; } catch (error: any) { diff --git a/frontend-admin/src/api/types.ts b/frontend-admin/src/api/types.ts index 24e48a3b..15181ce3 100644 --- a/frontend-admin/src/api/types.ts +++ b/frontend-admin/src/api/types.ts @@ -112,6 +112,12 @@ export interface QueueInfo { commands: any[]; } +export interface DeliveryItemProduct { + produit: string; + quantite: number; + prix: number; +} + export interface DeliveryItem { id: number; status: string; @@ -120,6 +126,8 @@ export interface DeliveryItem { created_at: string; updated_at: string; eta?: string; + items?: DeliveryItemProduct[]; + items_count?: number; } export interface ClientInfo { diff --git a/frontend-admin/src/screens/admin/ProductsScreen.tsx b/frontend-admin/src/screens/admin/ProductsScreen.tsx index 16fd6dbe..6dc622ee 100644 --- a/frontend-admin/src/screens/admin/ProductsScreen.tsx +++ b/frontend-admin/src/screens/admin/ProductsScreen.tsx @@ -970,7 +970,7 @@ export default function ProductsScreen() { v, ) } - keyboardType="numeric" + keyboardType="decimal-pad" placeholderTextColor={ colors.textMuted } diff --git a/frontend-admin/src/screens/delivery/DashboardScreen.tsx b/frontend-admin/src/screens/delivery/DashboardScreen.tsx index c0565348..b1e3182f 100644 --- a/frontend-admin/src/screens/delivery/DashboardScreen.tsx +++ b/frontend-admin/src/screens/delivery/DashboardScreen.tsx @@ -228,7 +228,7 @@ export default function DashboardScreen() { : client?.username || undefined, clientPhone: client?.telephone || undefined, items: - (detail.delivery as any)?.items || + detail.delivery?.items || (d as any).items || [], };