150 lines
3.8 KiB
TypeScript
150 lines
3.8 KiB
TypeScript
import { DataTypes, Model, Optional } from 'sequelize';
|
|
import { sequelize } from '@config/database';
|
|
import { WorkflowRequest } from './WorkflowRequest';
|
|
|
|
interface ClaimInvoiceAttributes {
|
|
invoiceId: string;
|
|
requestId: string;
|
|
invoiceNumber?: string;
|
|
invoiceDate?: Date;
|
|
amount?: number;
|
|
dmsNumber?: string;
|
|
invoiceFilePath?: string;
|
|
status?: string;
|
|
errorMessage?: string;
|
|
generatedAt?: Date;
|
|
description?: string;
|
|
createdAt: Date;
|
|
updatedAt: Date;
|
|
}
|
|
|
|
interface ClaimInvoiceCreationAttributes extends Optional<ClaimInvoiceAttributes, 'invoiceId' | 'invoiceNumber' | 'invoiceDate' | 'amount' | 'dmsNumber' | 'invoiceFilePath' | 'status' | 'errorMessage' | 'generatedAt' | 'description' | 'createdAt' | 'updatedAt'> {}
|
|
|
|
class ClaimInvoice extends Model<ClaimInvoiceAttributes, ClaimInvoiceCreationAttributes> implements ClaimInvoiceAttributes {
|
|
public invoiceId!: string;
|
|
public requestId!: string;
|
|
public invoiceNumber?: string;
|
|
public invoiceDate?: Date;
|
|
public amount?: number;
|
|
public dmsNumber?: string;
|
|
public invoiceFilePath?: string;
|
|
public status?: string;
|
|
public errorMessage?: string;
|
|
public generatedAt?: Date;
|
|
public description?: string;
|
|
public createdAt!: Date;
|
|
public updatedAt!: Date;
|
|
}
|
|
|
|
ClaimInvoice.init(
|
|
{
|
|
invoiceId: {
|
|
type: DataTypes.UUID,
|
|
defaultValue: DataTypes.UUIDV4,
|
|
primaryKey: true,
|
|
field: 'invoice_id',
|
|
},
|
|
requestId: {
|
|
type: DataTypes.UUID,
|
|
allowNull: false,
|
|
unique: true,
|
|
field: 'request_id',
|
|
references: {
|
|
model: 'workflow_requests',
|
|
key: 'request_id',
|
|
},
|
|
onDelete: 'CASCADE',
|
|
onUpdate: 'CASCADE',
|
|
},
|
|
invoiceNumber: {
|
|
type: DataTypes.STRING(100),
|
|
allowNull: true,
|
|
field: 'invoice_number',
|
|
},
|
|
invoiceDate: {
|
|
type: DataTypes.DATEONLY,
|
|
allowNull: true,
|
|
field: 'invoice_date',
|
|
},
|
|
amount: {
|
|
type: DataTypes.DECIMAL(15, 2),
|
|
allowNull: true,
|
|
field: 'invoice_amount',
|
|
},
|
|
dmsNumber: {
|
|
type: DataTypes.STRING(100),
|
|
allowNull: true,
|
|
field: 'dms_number',
|
|
},
|
|
invoiceFilePath: {
|
|
type: DataTypes.STRING(500),
|
|
allowNull: true,
|
|
field: 'invoice_file_path',
|
|
},
|
|
status: {
|
|
type: DataTypes.STRING(50),
|
|
allowNull: true,
|
|
field: 'generation_status',
|
|
},
|
|
errorMessage: {
|
|
type: DataTypes.TEXT,
|
|
allowNull: true,
|
|
field: 'error_message',
|
|
},
|
|
generatedAt: {
|
|
type: DataTypes.DATE,
|
|
allowNull: true,
|
|
field: 'generated_at',
|
|
},
|
|
description: {
|
|
type: DataTypes.TEXT,
|
|
allowNull: true,
|
|
field: 'description',
|
|
},
|
|
createdAt: {
|
|
type: DataTypes.DATE,
|
|
allowNull: false,
|
|
defaultValue: DataTypes.NOW,
|
|
field: 'created_at',
|
|
},
|
|
updatedAt: {
|
|
type: DataTypes.DATE,
|
|
allowNull: false,
|
|
defaultValue: DataTypes.NOW,
|
|
field: 'updated_at',
|
|
},
|
|
},
|
|
{
|
|
sequelize,
|
|
modelName: 'ClaimInvoice',
|
|
tableName: 'claim_invoices',
|
|
timestamps: true,
|
|
createdAt: 'created_at',
|
|
updatedAt: 'updated_at',
|
|
indexes: [
|
|
{ unique: true, fields: ['request_id'], name: 'idx_claim_invoices_request_id' },
|
|
{ fields: ['invoice_number'], name: 'idx_claim_invoices_invoice_number' },
|
|
{ fields: ['dms_number'], name: 'idx_claim_invoices_dms_number' },
|
|
{ fields: ['generation_status'], name: 'idx_claim_invoices_status' },
|
|
],
|
|
}
|
|
);
|
|
|
|
WorkflowRequest.hasOne(ClaimInvoice, {
|
|
as: 'claimInvoice',
|
|
foreignKey: 'requestId',
|
|
sourceKey: 'requestId',
|
|
});
|
|
|
|
ClaimInvoice.belongsTo(WorkflowRequest, {
|
|
as: 'workflowRequest',
|
|
foreignKey: 'requestId',
|
|
targetKey: 'requestId',
|
|
});
|
|
|
|
// Note: hasMany association with ClaimCreditNote is defined in ClaimCreditNote.ts
|
|
// to avoid circular dependency issues
|
|
|
|
export { ClaimInvoice };
|
|
|