import { CreationOptional, DataTypes, InferAttributes, InferCreationAttributes, Model, NonAttribute, Op, Sequelize, } from "sequelize"; import { Dealer_Model } from "./dealer.model"; import { QuoteItemCreationAttributes, QuoteItem_Model } from "./quoteItem.model"; export type QuoteCreationAttributes = InferCreationAttributes< Quote_Model, { omit: "items" | "dealer" } > & { items: QuoteItemCreationAttributes[]; dealer_id: string; }; export class Quote_Model extends Model< InferAttributes, InferCreationAttributes > { static associate(connection: Sequelize) { const { Quote_Model, QuoteItem_Model, Dealer_Model } = connection.models; Quote_Model.hasMany(QuoteItem_Model, { as: "items", foreignKey: "quote_id", onDelete: "CASCADE", }); Quote_Model.belongsTo(Dealer_Model, { foreignKey: "dealer_id", as: "dealer", onDelete: "RESTRICT", }); } declare id: string; declare status: CreationOptional; declare date: CreationOptional; declare reference: CreationOptional; declare lang_code: CreationOptional; declare customer_information: CreationOptional; declare currency_code: CreationOptional; declare payment_method: CreationOptional; declare notes: CreationOptional; declare validity: CreationOptional; declare subtotal_price: CreationOptional; declare discount: CreationOptional; declare total_price: CreationOptional; declare items: NonAttribute; declare dealer: NonAttribute; } export default (sequelize: Sequelize) => { Quote_Model.init( { id: { type: new DataTypes.UUID(), primaryKey: true, }, status: { type: new DataTypes.STRING(), allowNull: false, }, date: { type: new DataTypes.DATE(), allowNull: false, }, reference: { type: new DataTypes.STRING(), }, lang_code: { type: DataTypes.STRING(2), allowNull: false, defaultValue: "es", }, currency_code: { type: new DataTypes.STRING(3), allowNull: false, defaultValue: "EUR", }, customer_information: { type: DataTypes.TEXT, }, payment_method: { type: DataTypes.TEXT, }, notes: { type: DataTypes.TEXT, }, validity: { type: DataTypes.TEXT, }, subtotal_price: { type: new DataTypes.BIGINT(), allowNull: true, }, discount: { type: new DataTypes.BIGINT(), allowNull: true, }, total_price: { type: new DataTypes.BIGINT(), allowNull: true, }, }, { sequelize, tableName: "quotes", paranoid: true, // softs deletes timestamps: true, //version: true, createdAt: "created_at", updatedAt: "updated_at", deletedAt: "deleted_at", indexes: [ { name: "status_idx", fields: ["status"] }, { name: "reference_idx", fields: ["reference"] }, { name: "deleted_at_idx", fields: ["deleted_at"] }, ], whereMergeStrategy: "and", // <- cómo tratar el merge de un scope scopes: { quickSearch(value) { return { where: { [Op.or]: { reference: { [Op.like]: `%${value}%`, }, customer_information: { [Op.like]: `%${value}%`, }, }, }, }; }, }, } ); return Quote_Model; };