mirror of
https://github.com/R0m1k3/Regisflow.git
synced 2026-10-21 22:28:19 +02:00
Show all purchased products in the sales details and fixes missing sales
Implements `getAllSales` with grouped products and updates `SaleDetailsModal` to display multiple products. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e80fed01-7137-4997-b9af-dad57132d430 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/0715008c-7244-40f4-befc-26c014852236/e80fed01-7137-4997-b9af-dad57132d430/MCw6J3V
This commit is contained in:
1 parent
2256a342ea
commit
e3cd2f890c
3 files changed
+101
-7
No files matched your search
Binary file not shown.
|
After Width: | Height: | Size: 93 KiB |
@@ -43,13 +43,24 @@ export default function SaleDetailsModal({ isOpen, sale, onClose }: SaleDetailsM
|
|||||||
|
|
||||||
{/* Product Information */}
|
{/* Product Information */}
|
||||||
<div className="border border-gray-200 p-4 bg-white">
|
<div className="border border-gray-200 p-4 bg-white">
|
||||||
<h4 className="font-medium text-gray-900 mb-3">Informations Produit</h4>
|
<h4 className="font-medium text-gray-900 mb-3">Informations Produits</h4>
|
||||||
<div className="text-sm space-y-1">
|
{sale.products && sale.products.length > 0 ? (
|
||||||
<div><span className="font-medium">Type d'article:</span> {sale.typeArticle}</div>
|
<div className="space-y-3">
|
||||||
<div><span className="font-medium">Catégorie:</span> {sale.categorie}</div>
|
{sale.products.map((product: any, index: number) => (
|
||||||
<div><span className="font-medium">Quantité:</span> {sale.quantite}</div>
|
<div key={product.id || index} className="border-l-4 border-blue-500 pl-3 bg-gray-50 p-2">
|
||||||
<div><span className="font-medium">Code produit:</span> {sale.gencode || 'Non spécifié'}</div>
|
<div className="text-sm font-medium text-gray-700 mb-1">Produit {index + 1}</div>
|
||||||
</div>
|
<div className="text-sm space-y-1">
|
||||||
|
<div><span className="font-medium">Type d'article:</span> {product.typeArticle}</div>
|
||||||
|
<div><span className="font-medium">Catégorie:</span> {product.categorie}</div>
|
||||||
|
<div><span className="font-medium">Quantité:</span> {product.quantite}</div>
|
||||||
|
<div><span className="font-medium">Code produit:</span> {product.gencode || 'Non spécifié'}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div className="text-sm text-gray-500">Aucun produit associé</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Customer Information */}
|
{/* Customer Information */}
|
||||||
|
|||||||
@@ -201,6 +201,89 @@ export class DatabaseStorage implements IStorage {
|
|||||||
return salesWithProducts;
|
return salesWithProducts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getAllSales(storeId?: number): Promise<any[]> {
|
||||||
|
// Récupérer les ventes avec leurs produits
|
||||||
|
const query = db
|
||||||
|
.select({
|
||||||
|
// Sale fields
|
||||||
|
id: sales.id,
|
||||||
|
storeId: sales.storeId,
|
||||||
|
userId: sales.userId,
|
||||||
|
timestamp: sales.timestamp,
|
||||||
|
vendeur: sales.vendeur,
|
||||||
|
nom: sales.nom,
|
||||||
|
prenom: sales.prenom,
|
||||||
|
dateNaissance: sales.dateNaissance,
|
||||||
|
lieuNaissance: sales.lieuNaissance,
|
||||||
|
modePaiement: sales.modePaiement,
|
||||||
|
typeIdentite: sales.typeIdentite,
|
||||||
|
numeroIdentite: sales.numeroIdentite,
|
||||||
|
autoriteDelivrance: sales.autoriteDelivrance,
|
||||||
|
dateDelivrance: sales.dateDelivrance,
|
||||||
|
photo_recto: sales.photo_recto,
|
||||||
|
photo_verso: sales.photo_verso,
|
||||||
|
photo_ticket: sales.photo_ticket,
|
||||||
|
// Product fields
|
||||||
|
productId: saleProducts.id,
|
||||||
|
typeArticle: saleProducts.typeArticle,
|
||||||
|
categorie: saleProducts.categorie,
|
||||||
|
quantite: saleProducts.quantite,
|
||||||
|
gencode: saleProducts.gencode
|
||||||
|
})
|
||||||
|
.from(sales)
|
||||||
|
.leftJoin(saleProducts, eq(sales.id, saleProducts.saleId));
|
||||||
|
|
||||||
|
if (storeId) {
|
||||||
|
const results = await query.where(eq(sales.storeId, storeId)).orderBy(desc(sales.timestamp));
|
||||||
|
return this.groupSalesByProducts(results);
|
||||||
|
}
|
||||||
|
|
||||||
|
const results = await query.orderBy(desc(sales.timestamp));
|
||||||
|
return this.groupSalesByProducts(results);
|
||||||
|
}
|
||||||
|
|
||||||
|
private groupSalesByProducts(results: any[]): any[] {
|
||||||
|
const salesMap = new Map();
|
||||||
|
|
||||||
|
results.forEach(row => {
|
||||||
|
if (!salesMap.has(row.id)) {
|
||||||
|
salesMap.set(row.id, {
|
||||||
|
id: row.id,
|
||||||
|
storeId: row.storeId,
|
||||||
|
userId: row.userId,
|
||||||
|
timestamp: row.timestamp,
|
||||||
|
vendeur: row.vendeur,
|
||||||
|
nom: row.nom,
|
||||||
|
prenom: row.prenom,
|
||||||
|
dateNaissance: row.dateNaissance,
|
||||||
|
lieuNaissance: row.lieuNaissance,
|
||||||
|
modePaiement: row.modePaiement,
|
||||||
|
typeIdentite: row.typeIdentite,
|
||||||
|
numeroIdentite: row.numeroIdentite,
|
||||||
|
autoriteDelivrance: row.autoriteDelivrance,
|
||||||
|
dateDelivrance: row.dateDelivrance,
|
||||||
|
photo_recto: row.photo_recto,
|
||||||
|
photo_verso: row.photo_verso,
|
||||||
|
photo_ticket: row.photo_ticket,
|
||||||
|
products: []
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ajouter le produit s'il existe
|
||||||
|
if (row.productId) {
|
||||||
|
salesMap.get(row.id).products.push({
|
||||||
|
id: row.productId,
|
||||||
|
typeArticle: row.typeArticle,
|
||||||
|
categorie: row.categorie,
|
||||||
|
quantite: row.quantite,
|
||||||
|
gencode: row.gencode
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return Array.from(salesMap.values());
|
||||||
|
}
|
||||||
|
|
||||||
async deleteSale(id: number): Promise<void> {
|
async deleteSale(id: number): Promise<void> {
|
||||||
// Delete sale products first (cascade should handle this, but being explicit)
|
// Delete sale products first (cascade should handle this, but being explicit)
|
||||||
await db.delete(saleProducts).where(eq(saleProducts.saleId, id));
|
await db.delete(saleProducts).where(eq(saleProducts.saleId, id));
|
||||||
|
|||||||
Reference in new issue
Block a user