You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

163 lines
4.9 KiB

const { DataTypes } = require('sequelize');
module.exports = (sequelize) => {
const Ticket = sequelize.define('Ticket', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
numero_ticket: {
type: DataTypes.STRING(50),
allowNull: false,
unique: true,
comment: 'Numéro unique du ticket'
},
commande_id: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: 'commandes',
key: 'id'
},
comment: 'ID de la commande associée'
},
table_id: {
type: DataTypes.INTEGER,
allowNull: true,
references: {
model: 'tables',
key: 'id'
},
comment: 'ID de la table (optionnel)'
},
// Informations du serveur directement dans le ticket
serveur_nom: {
type: DataTypes.STRING(100),
allowNull: true,
comment: 'Nom du serveur'
},
serveur_prenom: {
type: DataTypes.STRING(100),
allowNull: true,
comment: 'Prénom du serveur'
},
// Données client directement dans le ticket (optionnel)
client_nom: {
type: DataTypes.STRING(100),
allowNull: true,
comment: 'Nom du client (optionnel)'
},
client_prenom: {
type: DataTypes.STRING(100),
allowNull: true,
comment: 'Prénom du client (optionnel)'
},
client_telephone: {
type: DataTypes.STRING(20),
allowNull: true,
comment: 'Téléphone du client (optionnel)'
},
client_email: {
type: DataTypes.STRING(100),
allowNull: true,
comment: 'Email du client (optionnel)'
},
client_adresse: {
type: DataTypes.TEXT,
allowNull: true,
comment: 'Adresse du client (optionnel)'
},
montant_ht: {
type: DataTypes.DECIMAL(10, 2),
allowNull: false,
defaultValue: 0.00,
comment: 'Montant hors taxes'
},
montant_tva: {
type: DataTypes.DECIMAL(10, 2),
allowNull: false,
defaultValue: 0.00,
comment: 'Montant de la TVA'
},
montant_ttc: {
type: DataTypes.DECIMAL(10, 2),
allowNull: false,
defaultValue: 0.00,
comment: 'Montant toutes taxes comprises'
},
remise: {
type: DataTypes.DECIMAL(10, 2),
allowNull: false,
defaultValue: 0.00,
comment: 'Montant de la remise appliquée'
},
taux_tva: {
type: DataTypes.DECIMAL(5, 2),
allowNull: false,
defaultValue: 20.00,
comment: 'Taux de TVA en pourcentage'
},
mode_paiement: {
type: DataTypes.ENUM('especes', 'carte', 'cheque', 'virement', 'mobile', 'autre'),
allowNull: false,
defaultValue: 'especes',
comment: 'Mode de paiement'
},
statut: {
type: DataTypes.ENUM('brouillon', 'emis', 'paye', 'rembourse', 'annule'),
allowNull: false,
defaultValue: 'brouillon',
comment: 'Statut du ticket'
},
type_service: {
type: DataTypes.ENUM('sur_place', 'emporter', 'livraison'),
allowNull: false,
defaultValue: 'sur_place',
comment: 'Type de service'
},
date_emission: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW,
comment: 'Date d\'émission du ticket'
},
date_paiement: {
type: DataTypes.DATE,
allowNull: true,
comment: 'Date de paiement'
},
notes: {
type: DataTypes.TEXT,
allowNull: true,
comment: 'Notes sur le ticket'
},
facture_pdf: {
type: DataTypes.STRING(500),
allowNull: true,
comment: 'Chemin vers le PDF généré'
},
donnees_supplementaires: {
type: DataTypes.JSON,
allowNull: true,
comment: 'Données supplémentaires en JSON'
}
}, {
tableName: 'tickets',
timestamps: true,
createdAt: 'created_at',
updatedAt: 'updated_at',
indexes: [
{ fields: ['numero_ticket'], unique: true },
{ fields: ['commande_id'] },
{ fields: ['table_id'] },
{ fields: ['statut'] },
{ fields: ['date_emission'] },
{ fields: ['client_email'] },
{ fields: ['client_telephone'] },
{ fields: ['serveur_nom'] }
]
});
return Ticket;
};