import { User_Model } from "@/contexts/users"; import { CreationOptional, DataTypes, InferAttributes, InferCreationAttributes, Model, NonAttribute, Op, Sequelize, } from "sequelize"; import { Quote_Model } from "./quote.model"; export type DealerCreationAttributes = InferCreationAttributes< Dealer_Model, { omit: "user" | "quotes" } > & { user_id: string; //quotes?: QuoteCreationAttributes[]; }; export class Dealer_Model extends Model< InferAttributes, InferCreationAttributes > { // To avoid table creation /*static async sync(): Promise { return Promise.resolve(); }*/ // eslint-disable-next-line @typescript-eslint/no-unused-vars static associate(connection: Sequelize) { const { Dealer_Model, User_Model } = connection.models; Dealer_Model.belongsTo(User_Model, { as: "user", foreignKey: "user_id", onDelete: "RESTRICT", }); Dealer_Model.hasMany(Quote_Model, { as: "quotes", foreignKey: "dealer_id", onDelete: "RESTRICT", }); } declare id: string; declare contact_id?: CreationOptional; declare name: CreationOptional; declare contact_information: CreationOptional; declare default_payment_method: CreationOptional; declare default_notes: CreationOptional; declare default_legal_terms: CreationOptional; declare default_quote_validity: CreationOptional; declare status: CreationOptional; declare lang_code: CreationOptional; declare currency_code: CreationOptional; declare user: NonAttribute; declare quotes: NonAttribute; } export default (sequelize: Sequelize) => { Dealer_Model.init( { id: { type: new DataTypes.UUID(), primaryKey: true, }, contact_id: { type: DataTypes.BIGINT().UNSIGNED, allowNull: true, }, name: { type: DataTypes.STRING, allowNull: false, }, contact_information: DataTypes.TEXT, default_payment_method: DataTypes.TEXT, default_notes: DataTypes.TEXT, default_legal_terms: DataTypes.TEXT, default_quote_validity: DataTypes.TEXT, lang_code: { type: DataTypes.STRING(2), allowNull: false, defaultValue: "es", }, currency_code: { type: new DataTypes.STRING(3), allowNull: false, defaultValue: "EUR", }, status: { type: DataTypes.STRING, allowNull: false, }, }, { sequelize, tableName: "dealers", paranoid: true, // softs deletes timestamps: true, //version: true, createdAt: "created_at", updatedAt: "updated_at", deletedAt: "deleted_at", indexes: [ { name: "contact_id_idx", fields: ["contact_id"] }, { name: "status_idx", fields: ["status"] }, ], whereMergeStrategy: "and", // <- cómo tratar el merge de un scope defaultScope: { attributes: { exclude: ["contact_id"], }, }, scopes: { quickSearch(value) { return { where: { [Op.or]: { name: { [Op.like]: `%${value}%`, }, }, }, }; }, }, } ); return Dealer_Model; };