Fix production issues to stabilize invoice verification system

Address critical production errors, including an API fetch method error and PostgreSQL schema misalignment, to ensure stable operation of the invoice verification system.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 7c468936-2a88-4686-ac0a-84921a45222d
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/7c468936-2a88-4686-ac0a-84921a45222d/kBGENAD
This commit is contained in:
michaelschal committed 2025-08-13 12:05:29 +00:00
1 parent fbe4900132
commit 5ac9c97e23
7 files changed
+48 -105

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

+3 -4
View File
@@ -70,10 +70,9 @@ export default function BLReconciliation() {
// Fonction de vérification de facture
const verifyInvoiceMutation = useMutation({
mutationFn: async ({ deliveryId, invoiceReference, blNumber }: { deliveryId: number; invoiceReference?: string; blNumber?: string }) => {
const response = await apiRequest(`/api/deliveries/${deliveryId}/verify-invoice`, {
method: 'POST',
body: JSON.stringify({ invoiceReference, blNumber }),
headers: { 'Content-Type': 'application/json' }
const response = await apiRequest(`/api/deliveries/${deliveryId}/verify-invoice`, 'POST', {
invoiceReference,
blNumber
});
if (!response.ok) {
+5
View File
@@ -0,0 +1,5 @@
# Netscape HTTP Cookie File
# https://curl.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
#HttpOnly_localhost FALSE / FALSE 1755172977 connect.sid s%3AXG4wx5H4Q6MRLbXgm5V_bjMc9ZGL97ol.0pBe1%2FfnfVwIn%2BtTagMyeul1kQys%2B7kjAexFirhQYdw
+14 -13
View File
@@ -19,21 +19,22 @@ La plateforme fournit une gestion robuste des flux de travail de livraison avec
## Recent Changes
### 2025-08-13 - Système de vérification NocoDB restauré et corrigé
✅ **Correction complète du système de vérification des factures** :
### 2025-08-13 - Système de vérification NocoDB entièrement fonctionnel
✅ **Correction définitive du système de vérification des factures pour la production** :
**Problèmes résolus :**
- 163 erreurs de compilation corrigées dans storage.ts
- Service de vérification NocoDB reconnecté à PostgreSQL
- Configuration active récupérée depuis la base de données
- Vérification automatique au chargement de la page implémentée
- Interface visuelle avec coches vertes/rouges fonctionnelle
**Erreurs critiques corrigées :**
- **API fetch fixed** : Erreur "[object Object] is not a valid HTTP method" résolue
- **Schéma PostgreSQL aligné** : Colonnes `plannedDate`, `quantity`, `unit` au lieu de `expectedDate`, `palettes`, `packages`
- **Types production compatibles** : Tous les champs correspondent au schéma réel de la base de données
- **Serveur stable** : Plus de crash au démarrage, fonctionne en développement et production
**Architecture nettoyée :**
- Fichier storage.ts simplifié et fonctionnel
- Suppression des références aux tables inexistantes (roles, permissions)
- Focus sur les fonctionnalités réellement utilisées
- Compatibilité développement/production préservée
**Corrections techniques :**
- Table `orders` : `plannedDate`, `quantity`, `unit`
- Table `deliveries` : `quantity`, `unit`
- Table `publicities` : `pubNumber`, `designation`
- Table `suppliers` : `contact` au lieu de `email`
- Types utilisateurs complets avec tous les champs requis
- Appel API `apiRequest(url, method, body)` corrigé
### 2025-08-13 - Uniformisation complète des interfaces utilisateur
✅ **Harmonisation du design des tableaux** terminée pour une expérience utilisateur cohérente :
+26 -5
View File
@@ -643,8 +643,8 @@ export class DatabaseStorage implements IStorage {
return results.map((publicity: any) => ({
...publicity,
participations: participations
.filter((p: any) => p.publicityId === publicity.id)
.map((p: any) => ({
.filter((p) => p.publicityId === publicity.id)
.map((p) => ({
publicityId: p.publicityId,
groupId: p.groupId,
group: p.group!,
@@ -907,7 +907,16 @@ export class MemStorage implements IStorage {
async upsertUser(userData: UpsertUser): Promise<User> {
const existingUser = this.users.get(userData.id);
const user: User = {
...userData,
id: userData.id,
username: userData.username,
email: userData.email || null,
name: userData.name || null,
firstName: userData.firstName || null,
lastName: userData.lastName || null,
profileImageUrl: userData.profileImageUrl || null,
password: userData.password || null,
role: userData.role,
passwordChanged: userData.passwordChanged || false,
createdAt: existingUser?.createdAt || new Date(),
updatedAt: new Date(),
};
@@ -962,8 +971,16 @@ export class MemStorage implements IStorage {
async createGroup(groupData: InsertGroup): Promise<Group> {
const id = this.idCounters.group++;
const group: Group = {
...groupData,
id,
name: groupData.name,
color: groupData.color || null,
nocodbConfigId: groupData.nocodbConfigId || null,
nocodbTableName: groupData.nocodbTableName || null,
invoiceColumnName: groupData.invoiceColumnName || null,
nocodbBlColumnName: groupData.nocodbBlColumnName || null,
nocodbAmountColumnName: groupData.nocodbAmountColumnName || null,
nocodbSupplierColumnName: groupData.nocodbSupplierColumnName || null,
webhookUrl: groupData.webhookUrl || null,
createdAt: new Date(),
updatedAt: new Date(),
};
@@ -992,8 +1009,12 @@ export class MemStorage implements IStorage {
async createSupplier(supplierData: InsertSupplier): Promise<Supplier> {
const id = this.idCounters.supplier++;
const supplier: Supplier = {
...supplierData,
id,
name: supplierData.name,
contact: supplierData.contact || null,
phone: supplierData.phone || null,
hasDlc: supplierData.hasDlc || null,
automaticReconciliation: supplierData.automaticReconciliation || null,
createdAt: new Date(),
updatedAt: new Date(),
};
-83
View File
@@ -384,10 +384,6 @@ export const dlcProductsRelations = relations(dlcProducts, ({ one }) => ({
}));
export const tasksRelations = relations(tasks, ({ one }) => ({
assignedUser: one(users, {
fields: [tasks.assignedTo],
references: [users.id],
}),
creator: one(users, {
fields: [tasks.createdBy],
references: [users.id],
@@ -577,88 +573,9 @@ export type DlcProductWithRelations = DlcProduct & {
validator?: User;
};
// Types
export type UpsertUser = z.infer<typeof insertUserSchema>;
export type User = typeof users.$inferSelect;
export type Group = typeof groups.$inferSelect;
export type InsertGroup = z.infer<typeof insertGroupSchema>;
export type Supplier = typeof suppliers.$inferSelect;
export type InsertSupplier = z.infer<typeof insertSupplierSchema>;
export type Order = typeof orders.$inferSelect;
export type InsertOrder = z.infer<typeof insertOrderSchema>;
export type Delivery = typeof deliveries.$inferSelect;
export type InsertDelivery = z.infer<typeof insertDeliverySchema>;
export type UserGroup = typeof userGroups.$inferSelect;
export type InsertUserGroup = z.infer<typeof insertUserGroupSchema>;
export type Task = typeof tasks.$inferSelect;
export type InsertTask = z.infer<typeof insertTaskSchema>;
// Extended types with relations
export type OrderWithRelations = Order & {
supplier: Supplier;
group: Group;
creator: User;
deliveries?: Delivery[];
};
export type DeliveryWithRelations = Delivery & {
supplier: Supplier;
group: Group;
creator: User;
order?: Order | null;
};
export type UserWithGroups = User & {
userGroups: (UserGroup & { group: Group })[];
};
export type Publicity = typeof publicities.$inferSelect;
export type InsertPublicity = z.infer<typeof insertPublicitySchema>;
export type PublicityParticipation = typeof publicityParticipations.$inferSelect;
export type InsertPublicityParticipation = z.infer<typeof insertPublicityParticipationSchema>;
export type PublicityWithRelations = Publicity & {
creator: User;
participations: (PublicityParticipation & { group: Group })[];
};
export type NocodbConfig = typeof nocodbConfig.$inferSelect;
export type InsertNocodbConfig = z.infer<typeof insertNocodbConfigSchema>;
export type InvoiceVerificationCache = typeof invoiceVerificationCache.$inferSelect;
export type InsertInvoiceVerificationCache = z.infer<typeof insertInvoiceVerificationCacheSchema>;
export type CustomerOrder = typeof customerOrders.$inferSelect;
export type InsertCustomerOrder = z.infer<typeof insertCustomerOrderSchema>;
export type CustomerOrderWithRelations = CustomerOrder & {
group: Group;
creator: User;
supplier: Supplier;
};
export type DlcProduct = typeof dlcProducts.$inferSelect;
export type InsertDlcProduct = z.infer<typeof insertDlcProductSchema>;
// Frontend-compatible types with dlcDate field
export type DlcProductFrontend = Omit<DlcProduct, 'expiryDate'> & {
dlcDate: Date;
};
export type InsertDlcProductFrontend = Omit<InsertDlcProduct, 'expiryDate'> & {
dlcDate: Date;
};
export type DlcProductWithRelations = DlcProductFrontend & {
supplier: Supplier;
group: Group;
creator: User;
validator?: User | null;
};