feat(construccion): Add HR module entities
- Add Employee entity - Add EmployeeFraccionamiento relationship entity - Add Puesto (position) entity - Add entities index export 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
94371c0e75
commit
d30fe4d644
@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* EmployeeFraccionamiento Entity
|
||||||
|
* Asignación de empleados a obras/fraccionamientos
|
||||||
|
*
|
||||||
|
* @module HR
|
||||||
|
* @table hr.employee_fraccionamientos
|
||||||
|
* @ddl schemas/02-hr-schema-ddl.sql
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {
|
||||||
|
Entity,
|
||||||
|
PrimaryGeneratedColumn,
|
||||||
|
Column,
|
||||||
|
CreateDateColumn,
|
||||||
|
ManyToOne,
|
||||||
|
JoinColumn,
|
||||||
|
Index,
|
||||||
|
} from 'typeorm';
|
||||||
|
import { Tenant } from '../../core/entities/tenant.entity';
|
||||||
|
import { Employee } from './employee.entity';
|
||||||
|
import { Fraccionamiento } from '../../construction/entities/fraccionamiento.entity';
|
||||||
|
|
||||||
|
@Entity({ schema: 'hr', name: 'employee_fraccionamientos' })
|
||||||
|
@Index(['employeeId', 'fraccionamientoId', 'fechaInicio'], { unique: true })
|
||||||
|
export class EmployeeFraccionamiento {
|
||||||
|
@PrimaryGeneratedColumn('uuid')
|
||||||
|
id: string;
|
||||||
|
|
||||||
|
@Column({ name: 'tenant_id', type: 'uuid' })
|
||||||
|
tenantId: string;
|
||||||
|
|
||||||
|
@Column({ name: 'employee_id', type: 'uuid' })
|
||||||
|
employeeId: string;
|
||||||
|
|
||||||
|
@Column({ name: 'fraccionamiento_id', type: 'uuid' })
|
||||||
|
fraccionamientoId: string;
|
||||||
|
|
||||||
|
@Column({ name: 'fecha_inicio', type: 'date' })
|
||||||
|
fechaInicio: Date;
|
||||||
|
|
||||||
|
@Column({ name: 'fecha_fin', type: 'date', nullable: true })
|
||||||
|
fechaFin: Date;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 50, nullable: true })
|
||||||
|
rol: string;
|
||||||
|
|
||||||
|
@Column({ type: 'boolean', default: true })
|
||||||
|
activo: boolean;
|
||||||
|
|
||||||
|
@CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
|
||||||
|
createdAt: Date;
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
@ManyToOne(() => Tenant)
|
||||||
|
@JoinColumn({ name: 'tenant_id' })
|
||||||
|
tenant: Tenant;
|
||||||
|
|
||||||
|
@ManyToOne(() => Employee, (e) => e.asignaciones)
|
||||||
|
@JoinColumn({ name: 'employee_id' })
|
||||||
|
employee: Employee;
|
||||||
|
|
||||||
|
@ManyToOne(() => Fraccionamiento)
|
||||||
|
@JoinColumn({ name: 'fraccionamiento_id' })
|
||||||
|
fraccionamiento: Fraccionamiento;
|
||||||
|
}
|
||||||
@ -0,0 +1,136 @@
|
|||||||
|
/**
|
||||||
|
* Employee Entity
|
||||||
|
* Empleados de la empresa
|
||||||
|
*
|
||||||
|
* @module HR
|
||||||
|
* @table hr.employees
|
||||||
|
* @ddl schemas/02-hr-schema-ddl.sql
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {
|
||||||
|
Entity,
|
||||||
|
PrimaryGeneratedColumn,
|
||||||
|
Column,
|
||||||
|
CreateDateColumn,
|
||||||
|
UpdateDateColumn,
|
||||||
|
ManyToOne,
|
||||||
|
OneToMany,
|
||||||
|
JoinColumn,
|
||||||
|
Index,
|
||||||
|
} from 'typeorm';
|
||||||
|
import { Tenant } from '../../core/entities/tenant.entity';
|
||||||
|
import { User } from '../../core/entities/user.entity';
|
||||||
|
import { Puesto } from './puesto.entity';
|
||||||
|
import { EmployeeFraccionamiento } from './employee-fraccionamiento.entity';
|
||||||
|
|
||||||
|
export type EstadoEmpleado = 'activo' | 'inactivo' | 'baja';
|
||||||
|
export type Genero = 'M' | 'F';
|
||||||
|
|
||||||
|
@Entity({ schema: 'hr', name: 'employees' })
|
||||||
|
@Index(['tenantId', 'codigo'], { unique: true })
|
||||||
|
@Index(['tenantId', 'curp'], { unique: true })
|
||||||
|
export class Employee {
|
||||||
|
@PrimaryGeneratedColumn('uuid')
|
||||||
|
id: string;
|
||||||
|
|
||||||
|
@Column({ name: 'tenant_id', type: 'uuid' })
|
||||||
|
tenantId: string;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 20 })
|
||||||
|
codigo: string;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 100 })
|
||||||
|
nombre: string;
|
||||||
|
|
||||||
|
@Column({ name: 'apellido_paterno', type: 'varchar', length: 100 })
|
||||||
|
apellidoPaterno: string;
|
||||||
|
|
||||||
|
@Column({ name: 'apellido_materno', type: 'varchar', length: 100, nullable: true })
|
||||||
|
apellidoMaterno: string;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 18, nullable: true })
|
||||||
|
curp: string;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 13, nullable: true })
|
||||||
|
rfc: string;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 11, nullable: true })
|
||||||
|
nss: string;
|
||||||
|
|
||||||
|
@Column({ name: 'fecha_nacimiento', type: 'date', nullable: true })
|
||||||
|
fechaNacimiento: Date;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 1, nullable: true })
|
||||||
|
genero: Genero;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 255, nullable: true })
|
||||||
|
email: string;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 20, nullable: true })
|
||||||
|
telefono: string;
|
||||||
|
|
||||||
|
@Column({ type: 'text', nullable: true })
|
||||||
|
direccion: string;
|
||||||
|
|
||||||
|
@Column({ name: 'fecha_ingreso', type: 'date' })
|
||||||
|
fechaIngreso: Date;
|
||||||
|
|
||||||
|
@Column({ name: 'fecha_baja', type: 'date', nullable: true })
|
||||||
|
fechaBaja: Date;
|
||||||
|
|
||||||
|
@Column({ name: 'puesto_id', type: 'uuid', nullable: true })
|
||||||
|
puestoId: string;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 100, nullable: true })
|
||||||
|
departamento: string;
|
||||||
|
|
||||||
|
@Column({ name: 'tipo_contrato', type: 'varchar', length: 50, nullable: true })
|
||||||
|
tipoContrato: string;
|
||||||
|
|
||||||
|
@Column({
|
||||||
|
name: 'salario_diario',
|
||||||
|
type: 'decimal',
|
||||||
|
precision: 10,
|
||||||
|
scale: 2,
|
||||||
|
nullable: true
|
||||||
|
})
|
||||||
|
salarioDiario: number;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 20, default: 'activo' })
|
||||||
|
estado: EstadoEmpleado;
|
||||||
|
|
||||||
|
@Column({ name: 'foto_url', type: 'varchar', length: 500, nullable: true })
|
||||||
|
fotoUrl: string;
|
||||||
|
|
||||||
|
@CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
|
||||||
|
createdAt: Date;
|
||||||
|
|
||||||
|
@UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
|
||||||
|
updatedAt: Date;
|
||||||
|
|
||||||
|
@Column({ name: 'created_by', type: 'uuid', nullable: true })
|
||||||
|
createdById: string;
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
@ManyToOne(() => Tenant)
|
||||||
|
@JoinColumn({ name: 'tenant_id' })
|
||||||
|
tenant: Tenant;
|
||||||
|
|
||||||
|
@ManyToOne(() => Puesto, (p) => p.empleados)
|
||||||
|
@JoinColumn({ name: 'puesto_id' })
|
||||||
|
puesto: Puesto;
|
||||||
|
|
||||||
|
@ManyToOne(() => User)
|
||||||
|
@JoinColumn({ name: 'created_by' })
|
||||||
|
createdBy: User;
|
||||||
|
|
||||||
|
@OneToMany(() => EmployeeFraccionamiento, (ef) => ef.employee)
|
||||||
|
asignaciones: EmployeeFraccionamiento[];
|
||||||
|
|
||||||
|
// Computed property
|
||||||
|
get nombreCompleto(): string {
|
||||||
|
return [this.nombre, this.apellidoPaterno, this.apellidoMaterno]
|
||||||
|
.filter(Boolean)
|
||||||
|
.join(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* HR Entities Index
|
||||||
|
* @module HR
|
||||||
|
*/
|
||||||
|
|
||||||
|
export * from './puesto.entity';
|
||||||
|
export * from './employee.entity';
|
||||||
|
export * from './employee-fraccionamiento.entity';
|
||||||
@ -0,0 +1,68 @@
|
|||||||
|
/**
|
||||||
|
* Puesto Entity
|
||||||
|
* Catálogo de puestos de trabajo
|
||||||
|
*
|
||||||
|
* @module HR
|
||||||
|
* @table hr.puestos
|
||||||
|
* @ddl schemas/02-hr-schema-ddl.sql
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {
|
||||||
|
Entity,
|
||||||
|
PrimaryGeneratedColumn,
|
||||||
|
Column,
|
||||||
|
CreateDateColumn,
|
||||||
|
UpdateDateColumn,
|
||||||
|
ManyToOne,
|
||||||
|
OneToMany,
|
||||||
|
JoinColumn,
|
||||||
|
Index,
|
||||||
|
} from 'typeorm';
|
||||||
|
import { Tenant } from '../../core/entities/tenant.entity';
|
||||||
|
import { Employee } from './employee.entity';
|
||||||
|
|
||||||
|
@Entity({ schema: 'hr', name: 'puestos' })
|
||||||
|
@Index(['tenantId', 'codigo'], { unique: true })
|
||||||
|
export class Puesto {
|
||||||
|
@PrimaryGeneratedColumn('uuid')
|
||||||
|
id: string;
|
||||||
|
|
||||||
|
@Column({ name: 'tenant_id', type: 'uuid' })
|
||||||
|
tenantId: string;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 20 })
|
||||||
|
codigo: string;
|
||||||
|
|
||||||
|
@Column({ type: 'varchar', length: 100 })
|
||||||
|
nombre: string;
|
||||||
|
|
||||||
|
@Column({ type: 'text', nullable: true })
|
||||||
|
descripcion: string;
|
||||||
|
|
||||||
|
@Column({ name: 'nivel_riesgo', type: 'varchar', length: 20, nullable: true })
|
||||||
|
nivelRiesgo: string;
|
||||||
|
|
||||||
|
@Column({
|
||||||
|
name: 'requiere_capacitacion_especial',
|
||||||
|
type: 'boolean',
|
||||||
|
default: false
|
||||||
|
})
|
||||||
|
requiereCapacitacionEspecial: boolean;
|
||||||
|
|
||||||
|
@Column({ type: 'boolean', default: true })
|
||||||
|
activo: boolean;
|
||||||
|
|
||||||
|
@CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
|
||||||
|
createdAt: Date;
|
||||||
|
|
||||||
|
@UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
|
||||||
|
updatedAt: Date;
|
||||||
|
|
||||||
|
// Relations
|
||||||
|
@ManyToOne(() => Tenant)
|
||||||
|
@JoinColumn({ name: 'tenant_id' })
|
||||||
|
tenant: Tenant;
|
||||||
|
|
||||||
|
@OneToMany(() => Employee, (e) => e.puesto)
|
||||||
|
empleados: Employee[];
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user