import { CreationOptional, DataTypes, InferAttributes, InferCreationAttributes, Model, Sequelize, } from "sequelize"; export type CustomerCreationAttributes = InferCreationAttributes & {}; export class CustomerModel extends Model< InferAttributes, InferCreationAttributes > { // To avoid table creation /*static async sync(): Promise { return Promise.resolve(); }*/ declare id: string; declare company_id: string; declare reference: CreationOptional; declare is_company: boolean; declare name: string; declare trade_name: CreationOptional; declare tin: CreationOptional; declare street: CreationOptional; declare street2: CreationOptional; declare city: CreationOptional; declare province: CreationOptional; declare postal_code: CreationOptional; declare country: CreationOptional; // Correos electrónicos declare email_primary: CreationOptional; declare email_secondary: CreationOptional; // Teléfonos fijos declare phone_primary: CreationOptional; declare phone_secondary: CreationOptional; // Móviles declare mobile_primary: CreationOptional; declare mobile_secondary: CreationOptional; declare fax: CreationOptional; declare website: CreationOptional; declare legal_record: CreationOptional; declare default_taxes: CreationOptional; declare status: string; declare language_code: CreationOptional; declare currency_code: CreationOptional; declare factuges_id: CreationOptional; static associate(database: Sequelize) {} static hooks(database: Sequelize) {} } export default (database: Sequelize) => { CustomerModel.init( { id: { type: DataTypes.UUID, primaryKey: true, }, company_id: { type: DataTypes.UUID, allowNull: false, }, reference: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, is_company: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: false, }, name: { type: DataTypes.STRING, allowNull: false, }, trade_name: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, tin: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, street: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, street2: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, city: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, province: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, postal_code: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, country: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, email_primary: { type: DataTypes.STRING, allowNull: true, defaultValue: null, validate: { isEmail: true, }, }, email_secondary: { type: DataTypes.STRING, allowNull: true, defaultValue: null, validate: { isEmail: true, }, }, phone_primary: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, phone_secondary: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, mobile_primary: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, mobile_secondary: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, fax: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, website: { type: DataTypes.STRING, allowNull: true, defaultValue: null, validate: { isUrl: true, }, }, legal_record: { type: DataTypes.TEXT, defaultValue: null, allowNull: true, }, default_taxes: { type: DataTypes.STRING, defaultValue: null, allowNull: true, }, status: { type: DataTypes.STRING, allowNull: false, defaultValue: "active", }, language_code: { type: DataTypes.STRING(2), allowNull: false, defaultValue: "es", }, currency_code: { type: new DataTypes.STRING(3), allowNull: false, defaultValue: "EUR", }, factuges_id: { type: DataTypes.STRING, allowNull: true, defaultValue: null, }, }, { sequelize: database, tableName: "customers", underscored: true, paranoid: true, // softs deletes timestamps: true, createdAt: "created_at", updatedAt: "updated_at", deletedAt: "deleted_at", indexes: [ { name: "company_idx", fields: ["company_id"], unique: false }, { name: "idx_company_idx", fields: ["id", "company_id"], unique: true }, { name: "ft_customer", type: "FULLTEXT", fields: ["name", "trade_name", "reference", "tin", "email_primary", "mobile_primary"], }, ], whereMergeStrategy: "and", // <- cómo tratar el merge de un scope defaultScope: {}, scopes: {}, } ); return CustomerModel; };