const { DataTypes } = require('sequelize'); const bcrypt = require('bcryptjs'); module.exports = (sequelize) => { const Utilisateur = sequelize.define('Utilisateur', { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, nom: { type: DataTypes.STRING(50), allowNull: false, comment: 'Nom de famille' }, prenom: { type: DataTypes.STRING(50), allowNull: false, comment: 'Prénom' }, email: { type: DataTypes.STRING(100), allowNull: false, unique: true, validate: { isEmail: true }, comment: 'Adresse email (unique)' }, mot_de_passe: { type: DataTypes.STRING(255), allowNull: false, comment: 'Mot de passe hashé' }, telephone: { type: DataTypes.STRING(20), allowNull: true, comment: 'Numéro de téléphone' }, role: { type: DataTypes.ENUM('admin', 'manager', 'serveur', 'cuisinier', 'caissier'), allowNull: false, defaultValue: 'serveur', comment: 'Rôle de l\'utilisateur' }, statut: { type: DataTypes.ENUM('actif', 'inactif', 'suspendu'), allowNull: false, defaultValue: 'actif', comment: 'Statut du compte' }, date_embauche: { type: DataTypes.DATE, allowNull: true, comment: 'Date d\'embauche' }, salaire: { type: DataTypes.DECIMAL(10, 2), allowNull: true, comment: 'Salaire de base' }, adresse: { type: DataTypes.TEXT, allowNull: true, comment: 'Adresse complète' }, date_naissance: { type: DataTypes.DATE, allowNull: true, comment: 'Date de naissance' }, photo: { type: DataTypes.STRING(255), allowNull: true, comment: 'Chemin vers la photo de profil' }, derniere_connexion: { type: DataTypes.DATE, allowNull: true, comment: 'Date de dernière connexion' }, token_reset: { type: DataTypes.STRING(255), allowNull: true, comment: 'Token pour réinitialisation mot de passe' }, token_reset_expire: { type: DataTypes.DATE, allowNull: true, comment: 'Expiration du token de reset' }, preferences: { type: DataTypes.JSON, allowNull: true, defaultValue: {}, comment: 'Préférences utilisateur (JSON)' }, est_actif: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: true, comment: 'Utilisateur actif ou non' } }, { tableName: 'utilisateurs', timestamps: true, createdAt: 'cree_le', updatedAt: 'modifie_le', hooks: { // Hash le mot de passe avant création beforeCreate: async (utilisateur) => { if (utilisateur.mot_de_passe) { const salt = await bcrypt.genSalt(10); utilisateur.mot_de_passe = await bcrypt.hash(utilisateur.mot_de_passe, salt); } }, // Hash le mot de passe avant mise à jour beforeUpdate: async (utilisateur) => { if (utilisateur.changed('mot_de_passe')) { const salt = await bcrypt.genSalt(10); utilisateur.mot_de_passe = await bcrypt.hash(utilisateur.mot_de_passe, salt); } } } }); // Méthode pour vérifier le mot de passe Utilisateur.prototype.verifierMotDePasse = async function(motDePasse) { return await bcrypt.compare(motDePasse, this.mot_de_passe); }; // Méthode pour obtenir le nom complet Utilisateur.prototype.getNomComplet = function() { return `${this.prenom} ${this.nom}`; }; // Méthode pour masquer les données sensibles Utilisateur.prototype.toSafeJSON = function() { const values = Object.assign({}, this.get()); delete values.mot_de_passe; delete values.token_reset; return values; }; return Utilisateur; };