import { DataTypes, InferAttributes, InferCreationAttributes, Model, NonAttribute, Sequelize, } from "sequelize"; import { CustomerInvoice } from "../../domain"; export type CustomerInvoiceTaxesCreationAttributes = InferCreationAttributes< CustomerInvoiceTaxesModel, {} >; export class CustomerInvoiceTaxesModel extends Model< InferAttributes, InferCreationAttributes > { declare tax_id: string; declare invoice_id: string; declare tax_code: string; //"iva_21" // Taxable amount (base imponible) // 100,00 € declare taxable_amount_value: number; declare taxable_amount_scale: number; // Total tax amount / taxes total // 21,00 € declare tax_amount_value: number; declare tax_amount_scale: number; // Relaciones declare invoice: NonAttribute; static associate(database: Sequelize) { const { CustomerInvoiceModel } = database.models; CustomerInvoiceTaxesModel.belongsTo(CustomerInvoiceModel, { as: "invoice", targetKey: "id", foreignKey: "invoice_id", onDelete: "CASCADE", }); } static hooks(database: Sequelize) {} } export default (database: Sequelize) => { CustomerInvoiceTaxesModel.init( { tax_id: { type: new DataTypes.UUID(), primaryKey: true, }, invoice_id: { type: DataTypes.UUID, allowNull: false, }, tax_code: { type: new DataTypes.STRING(), allowNull: false, }, taxable_amount_value: { type: new DataTypes.BIGINT(), // importante: evita problemas de precisión con valores grandes allowNull: true, defaultValue: null, }, taxable_amount_scale: { type: new DataTypes.SMALLINT(), allowNull: false, defaultValue: 2, }, tax_amount_value: { type: new DataTypes.BIGINT(), // importante: evita problemas de precisión con valores grandes allowNull: true, defaultValue: null, }, tax_amount_scale: { type: new DataTypes.SMALLINT(), allowNull: false, defaultValue: 2, }, }, { sequelize: database, tableName: "customer_invoices_taxes", underscored: true, indexes: [{ name: "tax_code_idx", fields: ["tax_code"], unique: false }], whereMergeStrategy: "and", // <- cómo tratar el merge de un scope defaultScope: {}, scopes: {}, } ); return CustomerInvoiceTaxesModel; };