From c67542963401f1ca87383d25dcd6c6e34f20a7bf Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Mon, 15 Sep 2025 08:12:18 +0000 Subject: [PATCH] Update storage logic to use database when available Modify server/storage.ts to prioritize DatabaseStorage when DATABASE_URL is set, falling back to MemStorage otherwise. Includes updated logging to reflect this logic. Also adds attached reports detailing PostgreSQL production database schema and contents. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 1e4433b5-47ab-464c-b663-fea2e53367dd Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/1e4433b5-47ab-464c-b663-fea2e53367dd/AVGwNHS --- .replit | 4 + ...RODUCTION--1757923689285_1757923689285.txt | 641 ++++++++++++++++++ ...RODUCTION--1757923704366_1757923704367.txt | 641 ++++++++++++++++++ server/storage.ts | 13 +- 4 files changed, 1293 insertions(+), 6 deletions(-) create mode 100644 attached_assets/Pasted-LOGIFLOW-RAPPORT-SCH-MA-BASE-DE-DONN-ES-PRODUCTION--1757923689285_1757923689285.txt create mode 100644 attached_assets/Pasted-LOGIFLOW-RAPPORT-SCH-MA-BASE-DE-DONN-ES-PRODUCTION--1757923704366_1757923704367.txt diff --git a/.replit b/.replit index f9b73f0..c5423ae 100644 --- a/.replit +++ b/.replit @@ -23,6 +23,10 @@ externalPort = 3002 localPort = 41343 externalPort = 3001 +[[ports]] +localPort = 44301 +externalPort = 3000 + [workflows] runButton = "Project" diff --git a/attached_assets/Pasted-LOGIFLOW-RAPPORT-SCH-MA-BASE-DE-DONN-ES-PRODUCTION--1757923689285_1757923689285.txt b/attached_assets/Pasted-LOGIFLOW-RAPPORT-SCH-MA-BASE-DE-DONN-ES-PRODUCTION--1757923689285_1757923689285.txt new file mode 100644 index 0000000..0f7e1b5 --- /dev/null +++ b/attached_assets/Pasted-LOGIFLOW-RAPPORT-SCH-MA-BASE-DE-DONN-ES-PRODUCTION--1757923689285_1757923689285.txt @@ -0,0 +1,641 @@ +LOGIFLOW - RAPPORT SCHÉMA BASE DE DONNÉES PRODUCTION +=============================================== + +GÉNÉRÉ LE : 2025-09-15T08:08:00.355Z +SERVEUR : Production privé LogiFlow +ENVIRONNEMENT : PostgreSQL Docker +UTILISATEUR : admin + +=============================================== +RÉSUMÉ DU SCAN +=============================================== + +TOTAL DES TABLES TROUVÉES: 37 +========================================== + +TABLE: AVOIRS +============ + + 01. id : integer NOT NULL DEFAULT nextval('avoirs_id_seq'::regclass) + 02. supplier_id : integer NOT NULL + 03. group_id : integer NOT NULL + 04. invoice_reference : character varying(255) NULL + 05. amount : numeric NULL + 06. comment : text NULL + 07. commercial_processed : boolean NULL DEFAULT false + 08. status : character varying(50) NULL DEFAULT 'En attente de demande'::character varying + 09. webhook_sent : boolean NULL DEFAULT false + 10. nocodb_verified : boolean NULL DEFAULT false + 11. nocodb_verified_at : timestamp without time zone NULL + 12. processed_at : timestamp without time zone NULL + 13. created_by : character varying(255) NOT NULL + 14. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 15. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 5 + +TABLE: CALENDAR_EVENTS +===================== + + 01. id : integer NOT NULL DEFAULT nextval('calendar_events_id_seq'::regclass) + 02. title : character varying(255) NOT NULL + 03. description : text NULL + 04. start_date : timestamp without time zone NOT NULL + 05. end_date : timestamp without time zone NOT NULL + 06. event_type : character varying(50) NULL DEFAULT 'custom'::character varying + 07. group_id : integer NULL + 08. created_by : character varying(255) NULL + 09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: CLIENT_ORDERS +=================== + + 01. id : integer NOT NULL DEFAULT nextval('client_orders_id_seq'::regclass) + 02. order_number : character varying(255) NOT NULL + 03. client_name : character varying(255) NOT NULL + 04. client_contact : character varying(255) NULL + 05. product_description : text NOT NULL + 06. quantity : integer NOT NULL DEFAULT 1 + 07. unit_price : numeric NULL + 08. total_amount : numeric NULL + 09. status : character varying(50) NULL DEFAULT 'pending'::character varying + 10. delivery_date : date NULL + 11. notes : text NULL + 12. group_id : integer NULL + 13. created_by : character varying(255) NULL + 14. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 15. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: COMMAND_ITEMS +=================== + + 01. id : integer NOT NULL DEFAULT nextval('command_items_id_seq'::regclass) + 02. command_id : integer NULL + 03. product_name : character varying(255) NOT NULL + 04. product_reference : character varying(255) NULL + 05. quantity : integer NOT NULL + 06. unit_price : numeric NULL + 07. total_price : numeric NULL + 08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: COMMANDS +============== + + 01. id : integer NOT NULL DEFAULT nextval('commands_id_seq'::regclass) + 02. command_number : character varying(255) NOT NULL + 03. supplier_id : integer NULL + 04. group_id : integer NULL + 05. command_date : date NOT NULL + 06. expected_delivery_date : date NULL + 07. status : character varying(50) NULL DEFAULT 'pending'::character varying + 08. total_amount : numeric NULL + 09. notes : text NULL + 10. created_by : character varying(255) NULL + 11. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 12. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: CUSTOMER_ORDERS +===================== + + 01. id : integer NOT NULL DEFAULT nextval('customer_orders_id_seq'::regclass) + 02. order_taker : character varying(255) NOT NULL + 03. customer_name : character varying(255) NOT NULL + 04. customer_phone : character varying(255) NULL + 05. customer_email : character varying(255) NULL + 06. product_designation : text NOT NULL + 07. product_reference : character varying(255) NULL + 08. gencode : character varying(255) NULL + 09. quantity : integer NULL DEFAULT 1 + 10. supplier_id : integer NULL + 11. status : character varying(100) NULL DEFAULT 'En attente de Commande'::character varying + 12. deposit : numeric NULL DEFAULT 0.00 + 13. is_promotional_price : boolean NULL DEFAULT false + 14. customer_notified : boolean NULL DEFAULT false + 15. notes : text NULL + 16. group_id : integer NULL + 17. created_by : character varying(255) NULL + 18. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 19. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 80 + +TABLE: CUSTOMERS +=============== + + 01. id : integer NOT NULL DEFAULT nextval('customers_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. contact_person : character varying(255) NULL + 04. phone : character varying(255) NULL + 05. email : character varying(255) NULL + 06. address : text NULL + 07. city : character varying(255) NULL + 08. postal_code : character varying(20) NULL + 09. notes : text NULL + 10. group_id : integer NULL + 11. created_by : character varying(255) NULL + 12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: DASHBOARD_MESSAGES +======================== + + 01. id : integer NOT NULL DEFAULT nextval('dashboard_messages_id_seq'::regclass) + 02. title : character varying(255) NOT NULL + 03. content : text NOT NULL + 04. type : character varying(50) NOT NULL DEFAULT 'info'::character varying + 05. store_id : integer NULL + 06. created_by : character varying(255) NOT NULL + 07. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 3 + +TABLE: DATABASE_BACKUPS +====================== + + 01. id : character varying(255) NOT NULL + 02. filename : character varying(255) NOT NULL + 03. description : text NULL + 04. size : bigint NULL DEFAULT 0 + 05. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 06. created_by : character varying(255) NOT NULL + 07. tables_count : integer NULL DEFAULT 0 + 08. status : character varying(50) NULL DEFAULT 'creating'::character varying + 09. backup_type : character varying(10) NULL DEFAULT 'manual'::character varying + 📈 Nombre d'enregistrements: 10 + +TABLE: DELIVERIES +================ + + 01. id : integer NOT NULL DEFAULT nextval('deliveries_id_seq'::regclass) + 02. order_id : integer NULL + 03. supplier_id : integer NULL + 04. group_id : integer NULL + 05. scheduled_date : date NOT NULL + 06. delivered_date : timestamp without time zone NULL + 07. quantity : integer NOT NULL + 08. unit : character varying(50) NOT NULL + 09. status : character varying(50) NULL DEFAULT 'pending'::character varying + 10. notes : text NULL + 11. bl_number : character varying(255) NULL + 12. bl_amount : numeric NULL + 13. invoice_reference : character varying(255) NULL + 14. invoice_amount : numeric NULL + 15. reconciled : boolean NULL DEFAULT false + 16. validated_at : timestamp without time zone NULL + 17. created_by : character varying(255) NULL + 18. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 19. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 173 + +TABLE: DELIVERY_ITEMS +==================== + + 01. id : integer NOT NULL DEFAULT nextval('delivery_items_id_seq'::regclass) + 02. delivery_id : integer NULL + 03. product_name : character varying(255) NOT NULL + 04. product_reference : character varying(255) NULL + 05. quantity : integer NOT NULL + 06. unit : character varying(50) NULL + 07. notes : text NULL + 08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: DLC_PRODUCTS +================== + + 01. id : integer NOT NULL DEFAULT nextval('dlc_products_id_seq'::regclass) + 02. product_name : character varying(255) NOT NULL + 03. expiry_date : date NOT NULL + 04. date_type : character varying(50) NOT NULL DEFAULT 'DLC'::character varying + 05. quantity : integer NOT NULL DEFAULT 1 + 06. unit : character varying(50) NOT NULL DEFAULT 'unité'::character varying + 07. supplier_id : integer NOT NULL + 08. location : character varying(255) NOT NULL DEFAULT 'Magasin'::character varying + 09. status : character varying(50) NOT NULL DEFAULT 'active'::character varying + 10. notes : text NULL + 11. alert_threshold : integer NOT NULL DEFAULT 15 + 12. validated_at : timestamp without time zone NULL + 13. validated_by : character varying(255) NULL + 14. group_id : integer NOT NULL + 15. created_by : character varying(255) NOT NULL + 16. created_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP + 17. updated_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP + 18. gencode : character varying(255) NULL + 19. name : character varying(255) NULL + 20. dlc_date : date NULL + 21. product_code : character varying(255) NULL + 22. description : text NULL + 23. stock_epuise : boolean NOT NULL DEFAULT false + 24. stock_epuise_by : character varying(255) NULL + 25. stock_epuise_at : timestamp without time zone NULL + 📈 Nombre d'enregistrements: 592 + +TABLE: GROUPS +============ + + 01. id : integer NOT NULL DEFAULT nextval('groups_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. color : character varying(20) NULL DEFAULT '#1976D2'::character varying + 04. nocodb_config_id : integer NULL + 05. nocodb_table_id : character varying(255) NULL + 06. nocodb_table_name : character varying(255) NULL + 07. invoice_column_name : character varying(255) NULL + 08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 10. nocodb_bl_column_name : character varying(255) NULL + 11. nocodb_amount_column_name : character varying(255) NULL + 12. nocodb_supplier_column_name : character varying(255) NULL + 13. webhook_url : character varying(500) NULL + 📈 Nombre d'enregistrements: 2 + +TABLE: INVOICE_VERIFICATION_CACHE +================================ + + 01. id : integer NOT NULL DEFAULT nextval('invoice_verification_cache_id_seq'::regclass) + 02. cache_key : character varying(255) NOT NULL + 03. group_id : integer NOT NULL + 04. invoice_reference : character varying(255) NOT NULL + 05. supplier_name : character varying(255) NULL + 06. exists : boolean NOT NULL + 07. match_type : character varying(50) NOT NULL + 08. error_message : text NULL + 09. cache_hit : boolean NULL DEFAULT false + 10. api_call_time : integer NULL + 11. expires_at : timestamp without time zone NOT NULL + 12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 14. is_reconciled : boolean NULL DEFAULT false + 📈 Nombre d'enregistrements: 220 + +TABLE: INVOICE_VERIFICATIONS +=========================== + + 01. id : integer NOT NULL DEFAULT nextval('invoice_verifications_id_seq'::regclass) + 02. delivery_id : integer NOT NULL + 03. group_id : integer NOT NULL + 04. invoice_reference : character varying(255) NOT NULL + 05. supplier_name : character varying(255) NULL + 06. exists : boolean NOT NULL + 07. match_type : character varying(50) NULL + 08. verified_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 09. is_valid : boolean NULL DEFAULT true + 10. last_checked_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 15 + +TABLE: INVOICES +============== + + 01. id : integer NOT NULL DEFAULT nextval('invoices_id_seq'::regclass) + 02. invoice_number : character varying(255) NOT NULL + 03. supplier_id : integer NULL + 04. group_id : integer NULL + 05. invoice_date : date NOT NULL + 06. due_date : date NULL + 07. amount : numeric NOT NULL + 08. status : character varying(50) NULL DEFAULT 'pending'::character varying + 09. payment_date : date NULL + 10. notes : text NULL + 11. created_by : character varying(255) NULL + 12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: NOCODB_CONFIG +=================== + + 01. id : integer NOT NULL DEFAULT nextval('nocodb_config_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. base_url : character varying(255) NOT NULL + 04. project_id : character varying(255) NOT NULL + 05. api_token : character varying(255) NOT NULL + 06. description : text NULL + 07. is_active : boolean NULL DEFAULT true + 08. created_by : character varying(255) NULL + 09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 1 + +TABLE: ORDERS +============ + + 01. id : integer NOT NULL DEFAULT nextval('orders_id_seq'::regclass) + 02. supplier_id : integer NULL + 03. group_id : integer NULL + 04. planned_date : date NOT NULL + 05. quantity : integer NULL + 06. unit : character varying(50) NULL + 07. status : character varying(50) NULL DEFAULT 'pending'::character varying + 08. notes : text NULL + 09. created_by : character varying(255) NULL + 10. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 11. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 114 + +TABLE: PERMISSIONS +================= + + 01. id : integer NOT NULL DEFAULT nextval('permissions_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. display_name : character varying(255) NOT NULL + 04. description : text NULL + 05. category : character varying(255) NOT NULL + 06. action : character varying(255) NOT NULL + 07. resource : character varying(255) NOT NULL + 08. is_system : boolean NULL DEFAULT true + 09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 7 + +TABLE: PUBLICITIES +================= + + 01. id : integer NOT NULL DEFAULT nextval('publicities_id_seq'::regclass) + 02. pub_number : character varying(255) NOT NULL + 03. designation : text NOT NULL + 04. start_date : date NOT NULL + 05. end_date : date NOT NULL + 06. year : integer NOT NULL + 07. created_by : character varying(255) NULL + 08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 50 + +TABLE: PUBLICITY_PARTICIPATIONS +============================== + + 01. publicity_id : integer NOT NULL + 02. group_id : integer NOT NULL + 📈 Nombre d'enregistrements: 46 + +TABLE: RECONCILIATION_COMMENTS +============================= + + 01. id : integer NOT NULL DEFAULT nextval('reconciliation_comments_id_seq'::regclass) + 02. content : text NOT NULL + 03. type : character varying(255) NOT NULL + 04. delivery_id : integer NOT NULL + 05. author_id : character varying(255) NOT NULL + 06. group_id : integer NOT NULL + 07. created_at : timestamp without time zone NULL DEFAULT now() + 08. updated_at : timestamp without time zone NULL DEFAULT now() + 📈 Nombre d'enregistrements: 0 + +TABLE: ROLE_PERMISSIONS +====================== + + 01. role_id : integer NOT NULL + 02. permission_id : integer NOT NULL + 📈 Nombre d'enregistrements: 21 + +TABLE: ROLES +=========== + + 01. id : integer NOT NULL DEFAULT nextval('roles_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. display_name : character varying(255) NOT NULL + 04. description : text NULL + 05. color : character varying(7) NULL DEFAULT '#6b7280'::character varying + 06. is_system : boolean NULL DEFAULT false + 07. is_active : boolean NULL DEFAULT true + 08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 4 + +TABLE: SAV_TICKET_HISTORY +======================== + + 01. id : integer NOT NULL DEFAULT nextval('sav_ticket_history_id_seq'::regclass) + 02. ticket_id : integer NOT NULL + 03. action : character varying(100) NOT NULL + 04. description : text NULL + 05. created_by : character varying(255) NOT NULL + 06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 2 + +TABLE: SAV_TICKETS +================= + + 01. id : integer NOT NULL DEFAULT nextval('sav_tickets_id_seq'::regclass) + 02. ticket_number : character varying(50) NOT NULL + 03. supplier_id : integer NOT NULL + 04. group_id : integer NOT NULL + 05. product_gencode : character varying(255) NOT NULL + 06. product_reference : character varying(255) NULL + 07. product_designation : character varying(500) NOT NULL + 08. problem_type : character varying(100) NOT NULL + 09. problem_description : text NOT NULL + 10. resolution_description : text NULL + 11. status : character varying(50) NOT NULL DEFAULT 'nouveau'::character varying + 12. created_by : character varying(255) NOT NULL + 13. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 14. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 15. resolved_at : timestamp without time zone NULL + 16. closed_at : timestamp without time zone NULL + 17. client_name : character varying(255) NULL + 18. client_phone : character varying(255) NULL + 19. priority : character varying(50) NOT NULL DEFAULT 'normale'::character varying + 📈 Nombre d'enregistrements: 1 + +TABLE: SESSION +============= + + 01. sid : character varying NOT NULL + 02. sess : json NOT NULL + 03. expire : timestamp without time zone NOT NULL + 📈 Nombre d'enregistrements: 13 + +TABLE: SESSIONS +============== + + 01. id : integer NOT NULL DEFAULT nextval('sessions_id_seq'::regclass) + 02. user_id : character varying(255) NULL + 03. session_token : character varying(255) NOT NULL + 04. expires_at : timestamp without time zone NOT NULL + 05. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: STORES +============ + + 01. id : integer NOT NULL DEFAULT nextval('stores_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. address : text NULL + 04. city : character varying(255) NULL + 05. postal_code : character varying(20) NULL + 06. phone : character varying(255) NULL + 07. manager_id : character varying(255) NULL + 08. is_active : boolean NULL DEFAULT true + 09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: SUPPLIERS +=============== + + 01. id : integer NOT NULL DEFAULT nextval('suppliers_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. contact : character varying(255) NULL + 04. phone : character varying(255) NULL + 05. has_dlc : boolean NULL DEFAULT false + 06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 07. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 08. automatic_reconciliation : boolean NULL DEFAULT false + 📈 Nombre d'enregistrements: 45 + +TABLE: TASKS +=========== + + 01. id : integer NOT NULL DEFAULT nextval('tasks_id_seq'::regclass) + 02. title : character varying(255) NOT NULL + 03. description : text NULL + 04. status : character varying(50) NOT NULL DEFAULT 'pending'::character varying + 05. priority : character varying(50) NOT NULL DEFAULT 'medium'::character varying + 06. assigned_to : character varying(255) NULL + 07. due_date : date NULL + 08. group_id : integer NOT NULL + 09. created_by : character varying(255) NOT NULL + 10. created_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP + 11. updated_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP + 12. start_date : timestamp without time zone NULL + 13. completed_at : timestamp without time zone NULL + 14. completed_by : character varying(255) NULL + 📈 Nombre d'enregistrements: 76 + +TABLE: USER_GROUPS +================= + + 01. user_id : character varying(255) NOT NULL + 02. group_id : integer NOT NULL + 📈 Nombre d'enregistrements: 7 + +TABLE: USER_ROLES +================ + + 01. user_id : character varying(255) NOT NULL + 02. role_id : integer NOT NULL + 03. assigned_by : character varying(255) NULL + 04. assigned_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 1 + +TABLE: USERS +=========== + + 01. id : character varying(255) NOT NULL + 02. username : character varying(255) NOT NULL + 03. email : character varying(255) NULL + 04. name : character varying(255) NULL + 05. first_name : character varying(255) NULL + 06. last_name : character varying(255) NULL + 07. profile_image_url : text NULL + 08. password : character varying(255) NULL + 09. role : character varying(50) NULL DEFAULT 'employee'::character varying + 10. password_changed : boolean NULL DEFAULT false + 11. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 12. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 8 + +TABLE: WEATHER_DATA +================== + + 01. id : integer NOT NULL DEFAULT nextval('weather_data_id_seq'::regclass) + 02. date : date NOT NULL + 03. location : text NOT NULL + 04. temp_max : text NOT NULL + 05. temp_min : text NOT NULL + 06. icon : text NOT NULL + 07. conditions : text NOT NULL + 08. is_current_year : boolean NOT NULL DEFAULT true + 09. created_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP + 10. updated_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 63 + +TABLE: WEATHER_SETTINGS +====================== + + 01. id : integer NOT NULL DEFAULT nextval('weather_settings_id_seq'::regclass) + 02. api_key : text NOT NULL + 03. location : text NOT NULL DEFAULT 'Paris, France'::text + 04. is_active : boolean NOT NULL DEFAULT true + 05. created_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP + 06. updated_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 1 + +TABLE: WEBHOOK_BAP_CONFIG +======================== + + 01. id : integer NOT NULL DEFAULT nextval('webhook_bap_config_id_seq'::regclass) + 02. name : character varying(100) NOT NULL DEFAULT 'Configuration BAP'::character varying + 03. webhook_url : text NOT NULL + 04. description : text NULL + 05. is_active : boolean NOT NULL DEFAULT true + 06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 07. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 1 + +CONTRAINTES DE CLÉS ÉTRANGÈRES: +=================================== + + avoirs.created_by → users.id + avoirs.group_id → groups.id + avoirs.supplier_id → suppliers.id + calendar_events.created_by → users.id + calendar_events.group_id → groups.id + client_orders.created_by → users.id + client_orders.group_id → groups.id + command_items.command_id → commands.id + commands.created_by → users.id + commands.group_id → groups.id + commands.supplier_id → suppliers.id + customer_orders.created_by → users.id + customer_orders.group_id → groups.id + customer_orders.supplier_id → suppliers.id + customers.created_by → users.id + customers.group_id → groups.id + dashboard_messages.store_id → groups.id + database_backups.created_by → users.id + deliveries.created_by → users.id + deliveries.group_id → groups.id + deliveries.order_id → orders.id + deliveries.supplier_id → suppliers.id + delivery_items.delivery_id → deliveries.id + dlc_products.created_by → users.id + dlc_products.group_id → groups.id + dlc_products.supplier_id → suppliers.id + dlc_products.validated_by → users.id + invoice_verification_cache.group_id → groups.id + invoice_verifications.delivery_id → deliveries.id + invoice_verifications.group_id → groups.id + invoices.created_by → users.id + invoices.group_id → groups.id + invoices.supplier_id → suppliers.id + nocodb_config.created_by → users.id + orders.created_by → users.id + orders.group_id → groups.id + orders.supplier_id → suppliers.id + publicities.created_by → users.id + publicity_participations.group_id → groups.id + publicity_participations.publicity_id → publicities.id + reconciliation_comments.author_id → users.id + reconciliation_comments.delivery_id → deliveries.id + reconciliation_comments.group_id → groups.id + role_permissions.permission_id → permissions.id + role_permissions.role_id → roles.id + sav_ticket_history.ticket_id → sav_tickets.id + sav_tickets.group_id → groups.id + sav_tickets.supplier_id → suppliers.id + sessions.user_id → users.id + stores.manager_id → users.id + tasks.completed_by → users.id + tasks.created_by → users.id + tasks.group_id → groups.id + user_groups.group_id → groups.id + user_groups.user_id → users.id + user_roles.assigned_by → users.id + user_roles.role_id → roles.id + user_roles.user_id → users.id + +=============================================== +FIN DU RAPPORT - 2025-09-15T08:08:00.355Z +=============================================== \ No newline at end of file diff --git a/attached_assets/Pasted-LOGIFLOW-RAPPORT-SCH-MA-BASE-DE-DONN-ES-PRODUCTION--1757923704366_1757923704367.txt b/attached_assets/Pasted-LOGIFLOW-RAPPORT-SCH-MA-BASE-DE-DONN-ES-PRODUCTION--1757923704366_1757923704367.txt new file mode 100644 index 0000000..0f7e1b5 --- /dev/null +++ b/attached_assets/Pasted-LOGIFLOW-RAPPORT-SCH-MA-BASE-DE-DONN-ES-PRODUCTION--1757923704366_1757923704367.txt @@ -0,0 +1,641 @@ +LOGIFLOW - RAPPORT SCHÉMA BASE DE DONNÉES PRODUCTION +=============================================== + +GÉNÉRÉ LE : 2025-09-15T08:08:00.355Z +SERVEUR : Production privé LogiFlow +ENVIRONNEMENT : PostgreSQL Docker +UTILISATEUR : admin + +=============================================== +RÉSUMÉ DU SCAN +=============================================== + +TOTAL DES TABLES TROUVÉES: 37 +========================================== + +TABLE: AVOIRS +============ + + 01. id : integer NOT NULL DEFAULT nextval('avoirs_id_seq'::regclass) + 02. supplier_id : integer NOT NULL + 03. group_id : integer NOT NULL + 04. invoice_reference : character varying(255) NULL + 05. amount : numeric NULL + 06. comment : text NULL + 07. commercial_processed : boolean NULL DEFAULT false + 08. status : character varying(50) NULL DEFAULT 'En attente de demande'::character varying + 09. webhook_sent : boolean NULL DEFAULT false + 10. nocodb_verified : boolean NULL DEFAULT false + 11. nocodb_verified_at : timestamp without time zone NULL + 12. processed_at : timestamp without time zone NULL + 13. created_by : character varying(255) NOT NULL + 14. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 15. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 5 + +TABLE: CALENDAR_EVENTS +===================== + + 01. id : integer NOT NULL DEFAULT nextval('calendar_events_id_seq'::regclass) + 02. title : character varying(255) NOT NULL + 03. description : text NULL + 04. start_date : timestamp without time zone NOT NULL + 05. end_date : timestamp without time zone NOT NULL + 06. event_type : character varying(50) NULL DEFAULT 'custom'::character varying + 07. group_id : integer NULL + 08. created_by : character varying(255) NULL + 09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: CLIENT_ORDERS +=================== + + 01. id : integer NOT NULL DEFAULT nextval('client_orders_id_seq'::regclass) + 02. order_number : character varying(255) NOT NULL + 03. client_name : character varying(255) NOT NULL + 04. client_contact : character varying(255) NULL + 05. product_description : text NOT NULL + 06. quantity : integer NOT NULL DEFAULT 1 + 07. unit_price : numeric NULL + 08. total_amount : numeric NULL + 09. status : character varying(50) NULL DEFAULT 'pending'::character varying + 10. delivery_date : date NULL + 11. notes : text NULL + 12. group_id : integer NULL + 13. created_by : character varying(255) NULL + 14. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 15. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: COMMAND_ITEMS +=================== + + 01. id : integer NOT NULL DEFAULT nextval('command_items_id_seq'::regclass) + 02. command_id : integer NULL + 03. product_name : character varying(255) NOT NULL + 04. product_reference : character varying(255) NULL + 05. quantity : integer NOT NULL + 06. unit_price : numeric NULL + 07. total_price : numeric NULL + 08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: COMMANDS +============== + + 01. id : integer NOT NULL DEFAULT nextval('commands_id_seq'::regclass) + 02. command_number : character varying(255) NOT NULL + 03. supplier_id : integer NULL + 04. group_id : integer NULL + 05. command_date : date NOT NULL + 06. expected_delivery_date : date NULL + 07. status : character varying(50) NULL DEFAULT 'pending'::character varying + 08. total_amount : numeric NULL + 09. notes : text NULL + 10. created_by : character varying(255) NULL + 11. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 12. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: CUSTOMER_ORDERS +===================== + + 01. id : integer NOT NULL DEFAULT nextval('customer_orders_id_seq'::regclass) + 02. order_taker : character varying(255) NOT NULL + 03. customer_name : character varying(255) NOT NULL + 04. customer_phone : character varying(255) NULL + 05. customer_email : character varying(255) NULL + 06. product_designation : text NOT NULL + 07. product_reference : character varying(255) NULL + 08. gencode : character varying(255) NULL + 09. quantity : integer NULL DEFAULT 1 + 10. supplier_id : integer NULL + 11. status : character varying(100) NULL DEFAULT 'En attente de Commande'::character varying + 12. deposit : numeric NULL DEFAULT 0.00 + 13. is_promotional_price : boolean NULL DEFAULT false + 14. customer_notified : boolean NULL DEFAULT false + 15. notes : text NULL + 16. group_id : integer NULL + 17. created_by : character varying(255) NULL + 18. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 19. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 80 + +TABLE: CUSTOMERS +=============== + + 01. id : integer NOT NULL DEFAULT nextval('customers_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. contact_person : character varying(255) NULL + 04. phone : character varying(255) NULL + 05. email : character varying(255) NULL + 06. address : text NULL + 07. city : character varying(255) NULL + 08. postal_code : character varying(20) NULL + 09. notes : text NULL + 10. group_id : integer NULL + 11. created_by : character varying(255) NULL + 12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: DASHBOARD_MESSAGES +======================== + + 01. id : integer NOT NULL DEFAULT nextval('dashboard_messages_id_seq'::regclass) + 02. title : character varying(255) NOT NULL + 03. content : text NOT NULL + 04. type : character varying(50) NOT NULL DEFAULT 'info'::character varying + 05. store_id : integer NULL + 06. created_by : character varying(255) NOT NULL + 07. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 3 + +TABLE: DATABASE_BACKUPS +====================== + + 01. id : character varying(255) NOT NULL + 02. filename : character varying(255) NOT NULL + 03. description : text NULL + 04. size : bigint NULL DEFAULT 0 + 05. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 06. created_by : character varying(255) NOT NULL + 07. tables_count : integer NULL DEFAULT 0 + 08. status : character varying(50) NULL DEFAULT 'creating'::character varying + 09. backup_type : character varying(10) NULL DEFAULT 'manual'::character varying + 📈 Nombre d'enregistrements: 10 + +TABLE: DELIVERIES +================ + + 01. id : integer NOT NULL DEFAULT nextval('deliveries_id_seq'::regclass) + 02. order_id : integer NULL + 03. supplier_id : integer NULL + 04. group_id : integer NULL + 05. scheduled_date : date NOT NULL + 06. delivered_date : timestamp without time zone NULL + 07. quantity : integer NOT NULL + 08. unit : character varying(50) NOT NULL + 09. status : character varying(50) NULL DEFAULT 'pending'::character varying + 10. notes : text NULL + 11. bl_number : character varying(255) NULL + 12. bl_amount : numeric NULL + 13. invoice_reference : character varying(255) NULL + 14. invoice_amount : numeric NULL + 15. reconciled : boolean NULL DEFAULT false + 16. validated_at : timestamp without time zone NULL + 17. created_by : character varying(255) NULL + 18. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 19. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 173 + +TABLE: DELIVERY_ITEMS +==================== + + 01. id : integer NOT NULL DEFAULT nextval('delivery_items_id_seq'::regclass) + 02. delivery_id : integer NULL + 03. product_name : character varying(255) NOT NULL + 04. product_reference : character varying(255) NULL + 05. quantity : integer NOT NULL + 06. unit : character varying(50) NULL + 07. notes : text NULL + 08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: DLC_PRODUCTS +================== + + 01. id : integer NOT NULL DEFAULT nextval('dlc_products_id_seq'::regclass) + 02. product_name : character varying(255) NOT NULL + 03. expiry_date : date NOT NULL + 04. date_type : character varying(50) NOT NULL DEFAULT 'DLC'::character varying + 05. quantity : integer NOT NULL DEFAULT 1 + 06. unit : character varying(50) NOT NULL DEFAULT 'unité'::character varying + 07. supplier_id : integer NOT NULL + 08. location : character varying(255) NOT NULL DEFAULT 'Magasin'::character varying + 09. status : character varying(50) NOT NULL DEFAULT 'active'::character varying + 10. notes : text NULL + 11. alert_threshold : integer NOT NULL DEFAULT 15 + 12. validated_at : timestamp without time zone NULL + 13. validated_by : character varying(255) NULL + 14. group_id : integer NOT NULL + 15. created_by : character varying(255) NOT NULL + 16. created_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP + 17. updated_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP + 18. gencode : character varying(255) NULL + 19. name : character varying(255) NULL + 20. dlc_date : date NULL + 21. product_code : character varying(255) NULL + 22. description : text NULL + 23. stock_epuise : boolean NOT NULL DEFAULT false + 24. stock_epuise_by : character varying(255) NULL + 25. stock_epuise_at : timestamp without time zone NULL + 📈 Nombre d'enregistrements: 592 + +TABLE: GROUPS +============ + + 01. id : integer NOT NULL DEFAULT nextval('groups_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. color : character varying(20) NULL DEFAULT '#1976D2'::character varying + 04. nocodb_config_id : integer NULL + 05. nocodb_table_id : character varying(255) NULL + 06. nocodb_table_name : character varying(255) NULL + 07. invoice_column_name : character varying(255) NULL + 08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 10. nocodb_bl_column_name : character varying(255) NULL + 11. nocodb_amount_column_name : character varying(255) NULL + 12. nocodb_supplier_column_name : character varying(255) NULL + 13. webhook_url : character varying(500) NULL + 📈 Nombre d'enregistrements: 2 + +TABLE: INVOICE_VERIFICATION_CACHE +================================ + + 01. id : integer NOT NULL DEFAULT nextval('invoice_verification_cache_id_seq'::regclass) + 02. cache_key : character varying(255) NOT NULL + 03. group_id : integer NOT NULL + 04. invoice_reference : character varying(255) NOT NULL + 05. supplier_name : character varying(255) NULL + 06. exists : boolean NOT NULL + 07. match_type : character varying(50) NOT NULL + 08. error_message : text NULL + 09. cache_hit : boolean NULL DEFAULT false + 10. api_call_time : integer NULL + 11. expires_at : timestamp without time zone NOT NULL + 12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 14. is_reconciled : boolean NULL DEFAULT false + 📈 Nombre d'enregistrements: 220 + +TABLE: INVOICE_VERIFICATIONS +=========================== + + 01. id : integer NOT NULL DEFAULT nextval('invoice_verifications_id_seq'::regclass) + 02. delivery_id : integer NOT NULL + 03. group_id : integer NOT NULL + 04. invoice_reference : character varying(255) NOT NULL + 05. supplier_name : character varying(255) NULL + 06. exists : boolean NOT NULL + 07. match_type : character varying(50) NULL + 08. verified_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 09. is_valid : boolean NULL DEFAULT true + 10. last_checked_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 15 + +TABLE: INVOICES +============== + + 01. id : integer NOT NULL DEFAULT nextval('invoices_id_seq'::regclass) + 02. invoice_number : character varying(255) NOT NULL + 03. supplier_id : integer NULL + 04. group_id : integer NULL + 05. invoice_date : date NOT NULL + 06. due_date : date NULL + 07. amount : numeric NOT NULL + 08. status : character varying(50) NULL DEFAULT 'pending'::character varying + 09. payment_date : date NULL + 10. notes : text NULL + 11. created_by : character varying(255) NULL + 12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: NOCODB_CONFIG +=================== + + 01. id : integer NOT NULL DEFAULT nextval('nocodb_config_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. base_url : character varying(255) NOT NULL + 04. project_id : character varying(255) NOT NULL + 05. api_token : character varying(255) NOT NULL + 06. description : text NULL + 07. is_active : boolean NULL DEFAULT true + 08. created_by : character varying(255) NULL + 09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 1 + +TABLE: ORDERS +============ + + 01. id : integer NOT NULL DEFAULT nextval('orders_id_seq'::regclass) + 02. supplier_id : integer NULL + 03. group_id : integer NULL + 04. planned_date : date NOT NULL + 05. quantity : integer NULL + 06. unit : character varying(50) NULL + 07. status : character varying(50) NULL DEFAULT 'pending'::character varying + 08. notes : text NULL + 09. created_by : character varying(255) NULL + 10. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 11. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 114 + +TABLE: PERMISSIONS +================= + + 01. id : integer NOT NULL DEFAULT nextval('permissions_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. display_name : character varying(255) NOT NULL + 04. description : text NULL + 05. category : character varying(255) NOT NULL + 06. action : character varying(255) NOT NULL + 07. resource : character varying(255) NOT NULL + 08. is_system : boolean NULL DEFAULT true + 09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 7 + +TABLE: PUBLICITIES +================= + + 01. id : integer NOT NULL DEFAULT nextval('publicities_id_seq'::regclass) + 02. pub_number : character varying(255) NOT NULL + 03. designation : text NOT NULL + 04. start_date : date NOT NULL + 05. end_date : date NOT NULL + 06. year : integer NOT NULL + 07. created_by : character varying(255) NULL + 08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 50 + +TABLE: PUBLICITY_PARTICIPATIONS +============================== + + 01. publicity_id : integer NOT NULL + 02. group_id : integer NOT NULL + 📈 Nombre d'enregistrements: 46 + +TABLE: RECONCILIATION_COMMENTS +============================= + + 01. id : integer NOT NULL DEFAULT nextval('reconciliation_comments_id_seq'::regclass) + 02. content : text NOT NULL + 03. type : character varying(255) NOT NULL + 04. delivery_id : integer NOT NULL + 05. author_id : character varying(255) NOT NULL + 06. group_id : integer NOT NULL + 07. created_at : timestamp without time zone NULL DEFAULT now() + 08. updated_at : timestamp without time zone NULL DEFAULT now() + 📈 Nombre d'enregistrements: 0 + +TABLE: ROLE_PERMISSIONS +====================== + + 01. role_id : integer NOT NULL + 02. permission_id : integer NOT NULL + 📈 Nombre d'enregistrements: 21 + +TABLE: ROLES +=========== + + 01. id : integer NOT NULL DEFAULT nextval('roles_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. display_name : character varying(255) NOT NULL + 04. description : text NULL + 05. color : character varying(7) NULL DEFAULT '#6b7280'::character varying + 06. is_system : boolean NULL DEFAULT false + 07. is_active : boolean NULL DEFAULT true + 08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 4 + +TABLE: SAV_TICKET_HISTORY +======================== + + 01. id : integer NOT NULL DEFAULT nextval('sav_ticket_history_id_seq'::regclass) + 02. ticket_id : integer NOT NULL + 03. action : character varying(100) NOT NULL + 04. description : text NULL + 05. created_by : character varying(255) NOT NULL + 06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 2 + +TABLE: SAV_TICKETS +================= + + 01. id : integer NOT NULL DEFAULT nextval('sav_tickets_id_seq'::regclass) + 02. ticket_number : character varying(50) NOT NULL + 03. supplier_id : integer NOT NULL + 04. group_id : integer NOT NULL + 05. product_gencode : character varying(255) NOT NULL + 06. product_reference : character varying(255) NULL + 07. product_designation : character varying(500) NOT NULL + 08. problem_type : character varying(100) NOT NULL + 09. problem_description : text NOT NULL + 10. resolution_description : text NULL + 11. status : character varying(50) NOT NULL DEFAULT 'nouveau'::character varying + 12. created_by : character varying(255) NOT NULL + 13. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 14. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 15. resolved_at : timestamp without time zone NULL + 16. closed_at : timestamp without time zone NULL + 17. client_name : character varying(255) NULL + 18. client_phone : character varying(255) NULL + 19. priority : character varying(50) NOT NULL DEFAULT 'normale'::character varying + 📈 Nombre d'enregistrements: 1 + +TABLE: SESSION +============= + + 01. sid : character varying NOT NULL + 02. sess : json NOT NULL + 03. expire : timestamp without time zone NOT NULL + 📈 Nombre d'enregistrements: 13 + +TABLE: SESSIONS +============== + + 01. id : integer NOT NULL DEFAULT nextval('sessions_id_seq'::regclass) + 02. user_id : character varying(255) NULL + 03. session_token : character varying(255) NOT NULL + 04. expires_at : timestamp without time zone NOT NULL + 05. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: STORES +============ + + 01. id : integer NOT NULL DEFAULT nextval('stores_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. address : text NULL + 04. city : character varying(255) NULL + 05. postal_code : character varying(20) NULL + 06. phone : character varying(255) NULL + 07. manager_id : character varying(255) NULL + 08. is_active : boolean NULL DEFAULT true + 09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 0 + +TABLE: SUPPLIERS +=============== + + 01. id : integer NOT NULL DEFAULT nextval('suppliers_id_seq'::regclass) + 02. name : character varying(255) NOT NULL + 03. contact : character varying(255) NULL + 04. phone : character varying(255) NULL + 05. has_dlc : boolean NULL DEFAULT false + 06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 07. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 08. automatic_reconciliation : boolean NULL DEFAULT false + 📈 Nombre d'enregistrements: 45 + +TABLE: TASKS +=========== + + 01. id : integer NOT NULL DEFAULT nextval('tasks_id_seq'::regclass) + 02. title : character varying(255) NOT NULL + 03. description : text NULL + 04. status : character varying(50) NOT NULL DEFAULT 'pending'::character varying + 05. priority : character varying(50) NOT NULL DEFAULT 'medium'::character varying + 06. assigned_to : character varying(255) NULL + 07. due_date : date NULL + 08. group_id : integer NOT NULL + 09. created_by : character varying(255) NOT NULL + 10. created_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP + 11. updated_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP + 12. start_date : timestamp without time zone NULL + 13. completed_at : timestamp without time zone NULL + 14. completed_by : character varying(255) NULL + 📈 Nombre d'enregistrements: 76 + +TABLE: USER_GROUPS +================= + + 01. user_id : character varying(255) NOT NULL + 02. group_id : integer NOT NULL + 📈 Nombre d'enregistrements: 7 + +TABLE: USER_ROLES +================ + + 01. user_id : character varying(255) NOT NULL + 02. role_id : integer NOT NULL + 03. assigned_by : character varying(255) NULL + 04. assigned_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 1 + +TABLE: USERS +=========== + + 01. id : character varying(255) NOT NULL + 02. username : character varying(255) NOT NULL + 03. email : character varying(255) NULL + 04. name : character varying(255) NULL + 05. first_name : character varying(255) NULL + 06. last_name : character varying(255) NULL + 07. profile_image_url : text NULL + 08. password : character varying(255) NULL + 09. role : character varying(50) NULL DEFAULT 'employee'::character varying + 10. password_changed : boolean NULL DEFAULT false + 11. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 12. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 8 + +TABLE: WEATHER_DATA +================== + + 01. id : integer NOT NULL DEFAULT nextval('weather_data_id_seq'::regclass) + 02. date : date NOT NULL + 03. location : text NOT NULL + 04. temp_max : text NOT NULL + 05. temp_min : text NOT NULL + 06. icon : text NOT NULL + 07. conditions : text NOT NULL + 08. is_current_year : boolean NOT NULL DEFAULT true + 09. created_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP + 10. updated_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 63 + +TABLE: WEATHER_SETTINGS +====================== + + 01. id : integer NOT NULL DEFAULT nextval('weather_settings_id_seq'::regclass) + 02. api_key : text NOT NULL + 03. location : text NOT NULL DEFAULT 'Paris, France'::text + 04. is_active : boolean NOT NULL DEFAULT true + 05. created_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP + 06. updated_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 1 + +TABLE: WEBHOOK_BAP_CONFIG +======================== + + 01. id : integer NOT NULL DEFAULT nextval('webhook_bap_config_id_seq'::regclass) + 02. name : character varying(100) NOT NULL DEFAULT 'Configuration BAP'::character varying + 03. webhook_url : text NOT NULL + 04. description : text NULL + 05. is_active : boolean NOT NULL DEFAULT true + 06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 07. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP + 📈 Nombre d'enregistrements: 1 + +CONTRAINTES DE CLÉS ÉTRANGÈRES: +=================================== + + avoirs.created_by → users.id + avoirs.group_id → groups.id + avoirs.supplier_id → suppliers.id + calendar_events.created_by → users.id + calendar_events.group_id → groups.id + client_orders.created_by → users.id + client_orders.group_id → groups.id + command_items.command_id → commands.id + commands.created_by → users.id + commands.group_id → groups.id + commands.supplier_id → suppliers.id + customer_orders.created_by → users.id + customer_orders.group_id → groups.id + customer_orders.supplier_id → suppliers.id + customers.created_by → users.id + customers.group_id → groups.id + dashboard_messages.store_id → groups.id + database_backups.created_by → users.id + deliveries.created_by → users.id + deliveries.group_id → groups.id + deliveries.order_id → orders.id + deliveries.supplier_id → suppliers.id + delivery_items.delivery_id → deliveries.id + dlc_products.created_by → users.id + dlc_products.group_id → groups.id + dlc_products.supplier_id → suppliers.id + dlc_products.validated_by → users.id + invoice_verification_cache.group_id → groups.id + invoice_verifications.delivery_id → deliveries.id + invoice_verifications.group_id → groups.id + invoices.created_by → users.id + invoices.group_id → groups.id + invoices.supplier_id → suppliers.id + nocodb_config.created_by → users.id + orders.created_by → users.id + orders.group_id → groups.id + orders.supplier_id → suppliers.id + publicities.created_by → users.id + publicity_participations.group_id → groups.id + publicity_participations.publicity_id → publicities.id + reconciliation_comments.author_id → users.id + reconciliation_comments.delivery_id → deliveries.id + reconciliation_comments.group_id → groups.id + role_permissions.permission_id → permissions.id + role_permissions.role_id → roles.id + sav_ticket_history.ticket_id → sav_tickets.id + sav_tickets.group_id → groups.id + sav_tickets.supplier_id → suppliers.id + sessions.user_id → users.id + stores.manager_id → users.id + tasks.completed_by → users.id + tasks.created_by → users.id + tasks.group_id → groups.id + user_groups.group_id → groups.id + user_groups.user_id → users.id + user_roles.assigned_by → users.id + user_roles.role_id → roles.id + user_roles.user_id → users.id + +=============================================== +FIN DU RAPPORT - 2025-09-15T08:08:00.355Z +=============================================== \ No newline at end of file diff --git a/server/storage.ts b/server/storage.ts index 307f307..8ae08b9 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -4633,18 +4633,19 @@ export class MemStorage implements IStorage { } } -// Use MemStorage in development, DatabaseStorage in production +// Use DatabaseStorage when DATABASE_URL is available, MemStorage as fallback const isProduction = process.env.NODE_ENV === 'production'; +const hasDatabase = !!process.env.DATABASE_URL; console.log('🔗 Database initialization:', { NODE_ENV: process.env.NODE_ENV, isProduction: isProduction, - hasDbUrl: !!process.env.DATABASE_URL, + hasDbUrl: hasDatabase, dbHost: process.env.DATABASE_URL?.split('@')[1]?.split('/')[0] || 'unknown' }); -export const storage: IStorage = isProduction ? new DatabaseStorage() : new MemStorage(); -if (isProduction) { - console.log('✅ Using DatabaseStorage (production PostgreSQL)'); +export const storage: IStorage = hasDatabase ? new DatabaseStorage() : new MemStorage(); +if (hasDatabase) { + console.log('✅ Using DatabaseStorage (PostgreSQL database detected)'); } else { - console.log('🔧 DEV: Using MemStorage (development fallback)'); + console.log('🔧 DEV: Using MemStorage (no database URL found)'); } \ No newline at end of file