Re_Backend/src/models/WorkflowRequest.ts
2025-10-29 19:31:40 +05:30

193 lines
4.5 KiB
TypeScript

import { DataTypes, Model, Optional } from 'sequelize';
import { sequelize } from '@config/database';
import { User } from './User';
import { Priority, WorkflowStatus } from '../types/common.types';
interface WorkflowRequestAttributes {
requestId: string;
requestNumber: string;
initiatorId: string;
templateType: 'CUSTOM' | 'TEMPLATE';
title: string;
description: string;
priority: Priority;
status: WorkflowStatus;
currentLevel: number;
totalLevels: number;
totalTatHours: number;
submissionDate?: Date;
closureDate?: Date;
conclusionRemark?: string;
aiGeneratedConclusion?: string;
isDraft: boolean;
isDeleted: boolean;
createdAt: Date;
updatedAt: Date;
}
interface WorkflowRequestCreationAttributes extends Optional<WorkflowRequestAttributes, 'requestId' | 'submissionDate' | 'closureDate' | 'conclusionRemark' | 'aiGeneratedConclusion' | 'createdAt' | 'updatedAt'> {}
class WorkflowRequest extends Model<WorkflowRequestAttributes, WorkflowRequestCreationAttributes> implements WorkflowRequestAttributes {
public requestId!: string;
public requestNumber!: string;
public initiatorId!: string;
public templateType!: 'CUSTOM' | 'TEMPLATE';
public title!: string;
public description!: string;
public priority!: Priority;
public status!: WorkflowStatus;
public currentLevel!: number;
public totalLevels!: number;
public totalTatHours!: number;
public submissionDate?: Date;
public closureDate?: Date;
public conclusionRemark?: string;
public aiGeneratedConclusion?: string;
public isDraft!: boolean;
public isDeleted!: boolean;
public createdAt!: Date;
public updatedAt!: Date;
// Associations
public initiator?: User;
}
WorkflowRequest.init(
{
requestId: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
field: 'request_id'
},
requestNumber: {
type: DataTypes.STRING(20),
allowNull: false,
unique: true,
field: 'request_number'
},
initiatorId: {
type: DataTypes.UUID,
allowNull: false,
field: 'initiator_id',
references: {
model: 'users',
key: 'user_id'
}
},
templateType: {
type: DataTypes.STRING(20),
defaultValue: 'CUSTOM',
field: 'template_type'
},
title: {
type: DataTypes.STRING(500),
allowNull: false
},
description: {
type: DataTypes.TEXT,
allowNull: false
},
priority: {
type: DataTypes.ENUM('STANDARD', 'EXPRESS'),
defaultValue: 'STANDARD'
},
status: {
type: DataTypes.ENUM('DRAFT', 'PENDING', 'IN_PROGRESS', 'APPROVED', 'REJECTED', 'CLOSED'),
defaultValue: 'DRAFT'
},
currentLevel: {
type: DataTypes.INTEGER,
defaultValue: 1,
field: 'current_level'
},
totalLevels: {
type: DataTypes.INTEGER,
defaultValue: 1,
field: 'total_levels',
validate: {
max: 10
}
},
totalTatHours: {
type: DataTypes.DECIMAL(10, 2),
defaultValue: 0,
field: 'total_tat_hours'
},
submissionDate: {
type: DataTypes.DATE,
allowNull: true,
field: 'submission_date'
},
closureDate: {
type: DataTypes.DATE,
allowNull: true,
field: 'closure_date'
},
conclusionRemark: {
type: DataTypes.TEXT,
allowNull: true,
field: 'conclusion_remark'
},
aiGeneratedConclusion: {
type: DataTypes.TEXT,
allowNull: true,
field: 'ai_generated_conclusion'
},
isDraft: {
type: DataTypes.BOOLEAN,
defaultValue: true,
field: 'is_draft'
},
isDeleted: {
type: DataTypes.BOOLEAN,
defaultValue: false,
field: 'is_deleted'
},
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: 'WorkflowRequest',
tableName: 'workflow_requests',
timestamps: true,
createdAt: 'created_at',
updatedAt: 'updated_at',
indexes: [
{
fields: ['initiator_id']
},
{
fields: ['status']
},
{
unique: true,
fields: ['request_number']
},
{
fields: ['created_at']
}
]
}
);
// Associations
WorkflowRequest.belongsTo(User, {
as: 'initiator',
foreignKey: 'initiatorId',
targetKey: 'userId'
});
export { WorkflowRequest };