Some checks failed
ERP Core CI / Backend Lint (push) Has been cancelled
ERP Core CI / Backend Unit Tests (push) Has been cancelled
ERP Core CI / Backend Integration Tests (push) Has been cancelled
ERP Core CI / Frontend Lint (push) Has been cancelled
ERP Core CI / Frontend Unit Tests (push) Has been cancelled
ERP Core CI / Frontend E2E Tests (push) Has been cancelled
ERP Core CI / Database DDL Validation (push) Has been cancelled
ERP Core CI / Backend Build (push) Has been cancelled
ERP Core CI / Frontend Build (push) Has been cancelled
ERP Core CI / CI Success (push) Has been cancelled
Performance Tests / Lighthouse CI (push) Has been cancelled
Performance Tests / Bundle Size Analysis (push) Has been cancelled
Performance Tests / k6 Load Tests (push) Has been cancelled
Performance Tests / Performance Summary (push) Has been cancelled
- HERENCIA-SIMCO.md actualizado con directivas v3.7 y v3.8 - Actualizaciones en modulos CRM y OpenAPI Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
645 lines
25 KiB
Markdown
645 lines
25 KiB
Markdown
# FASE 5: ANALISIS DE DEPENDENCIAS COMPLETO
|
|
|
|
**Fecha:** 2026-01-10
|
|
**Objetivo:** Mapear todas las dependencias para la implementacion de APIs frontend
|
|
**Estado:** COMPLETADO
|
|
**Basado en:** FASE4-VALIDACION-PLAN-VS-REQUISITOS.md
|
|
|
|
---
|
|
|
|
## 1. RESUMEN DE ENDPOINTS DISPONIBLES
|
|
|
|
### 1.1 Estadisticas por Modulo
|
|
|
|
| Modulo | Endpoints | Lines Routes | Controllers | Services |
|
|
|--------|-----------|--------------|-------------|----------|
|
|
| Purchases | 23 | 91 | 1 | 2 |
|
|
| Projects | 24 | 76 | 1 | 3 |
|
|
| CRM | 32 | 145 | 1 | 4 |
|
|
| HR | 62 | 337 | 2 | 8 |
|
|
| **Total** | **141** | **649** | **5** | **17** |
|
|
|
|
---
|
|
|
|
## 2. DEPENDENCIAS PURCHASES API
|
|
|
|
### 2.1 Endpoints Disponibles
|
|
|
|
#### Purchase Orders:
|
|
```
|
|
GET /api/purchases → Lista ordenes de compra
|
|
GET /api/purchases/:id → Obtener orden por ID
|
|
POST /api/purchases → Crear orden
|
|
PUT /api/purchases/:id → Actualizar orden
|
|
POST /api/purchases/:id/confirm → Confirmar orden
|
|
POST /api/purchases/:id/cancel → Cancelar orden
|
|
DELETE /api/purchases/:id → Eliminar orden
|
|
```
|
|
|
|
#### RFQs (Request for Quotation):
|
|
```
|
|
GET /api/purchases/rfqs → Lista RFQs
|
|
GET /api/purchases/rfqs/:id → Obtener RFQ por ID
|
|
POST /api/purchases/rfqs → Crear RFQ
|
|
PUT /api/purchases/rfqs/:id → Actualizar RFQ
|
|
DELETE /api/purchases/rfqs/:id → Eliminar RFQ
|
|
```
|
|
|
|
#### RFQ Lines:
|
|
```
|
|
POST /api/purchases/rfqs/:id/lines → Agregar linea
|
|
PUT /api/purchases/rfqs/:id/lines/:lineId → Actualizar linea
|
|
DELETE /api/purchases/rfqs/:id/lines/:lineId → Eliminar linea
|
|
```
|
|
|
|
#### RFQ Workflow:
|
|
```
|
|
POST /api/purchases/rfqs/:id/send → Enviar RFQ
|
|
POST /api/purchases/rfqs/:id/responded → Marcar como respondido
|
|
POST /api/purchases/rfqs/:id/accept → Aceptar RFQ
|
|
POST /api/purchases/rfqs/:id/reject → Rechazar RFQ
|
|
POST /api/purchases/rfqs/:id/cancel → Cancelar RFQ
|
|
```
|
|
|
|
### 2.2 Estructura Frontend Propuesta
|
|
|
|
```typescript
|
|
// frontend/src/features/purchases/api/purchases.api.ts
|
|
|
|
// Purchase Orders API
|
|
export const purchaseOrdersApi = {
|
|
getAll: (params) => apiClient.get('/api/purchases', { params }),
|
|
getById: (id) => apiClient.get(`/api/purchases/${id}`),
|
|
create: (data) => apiClient.post('/api/purchases', data),
|
|
update: (id, data) => apiClient.put(`/api/purchases/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/purchases/${id}`),
|
|
confirm: (id) => apiClient.post(`/api/purchases/${id}/confirm`),
|
|
cancel: (id) => apiClient.post(`/api/purchases/${id}/cancel`),
|
|
};
|
|
|
|
// RFQs API
|
|
export const rfqsApi = {
|
|
getAll: (params) => apiClient.get('/api/purchases/rfqs', { params }),
|
|
getById: (id) => apiClient.get(`/api/purchases/rfqs/${id}`),
|
|
create: (data) => apiClient.post('/api/purchases/rfqs', data),
|
|
update: (id, data) => apiClient.put(`/api/purchases/rfqs/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/purchases/rfqs/${id}`),
|
|
// Lines
|
|
addLine: (id, data) => apiClient.post(`/api/purchases/rfqs/${id}/lines`, data),
|
|
updateLine: (id, lineId, data) => apiClient.put(`/api/purchases/rfqs/${id}/lines/${lineId}`, data),
|
|
removeLine: (id, lineId) => apiClient.delete(`/api/purchases/rfqs/${id}/lines/${lineId}`),
|
|
// Workflow
|
|
send: (id) => apiClient.post(`/api/purchases/rfqs/${id}/send`),
|
|
markResponded: (id) => apiClient.post(`/api/purchases/rfqs/${id}/responded`),
|
|
accept: (id) => apiClient.post(`/api/purchases/rfqs/${id}/accept`),
|
|
reject: (id) => apiClient.post(`/api/purchases/rfqs/${id}/reject`),
|
|
cancel: (id) => apiClient.post(`/api/purchases/rfqs/${id}/cancel`),
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## 3. DEPENDENCIAS PROJECTS API
|
|
|
|
### 3.1 Endpoints Disponibles
|
|
|
|
#### Projects:
|
|
```
|
|
GET /api/projects → Lista proyectos
|
|
GET /api/projects/:id → Obtener proyecto por ID
|
|
POST /api/projects → Crear proyecto
|
|
PUT /api/projects/:id → Actualizar proyecto
|
|
DELETE /api/projects/:id → Eliminar proyecto
|
|
GET /api/projects/:id/stats → Estadisticas del proyecto
|
|
GET /api/projects/:id/tasks → Tareas del proyecto
|
|
GET /api/projects/:id/timesheets → Hojas de tiempo del proyecto
|
|
```
|
|
|
|
#### Tasks:
|
|
```
|
|
GET /api/projects/tasks/all → Lista todas las tareas
|
|
GET /api/projects/tasks/:id → Obtener tarea por ID
|
|
POST /api/projects/tasks → Crear tarea
|
|
PUT /api/projects/tasks/:id → Actualizar tarea
|
|
DELETE /api/projects/tasks/:id → Eliminar tarea
|
|
POST /api/projects/tasks/:id/move → Mover tarea
|
|
POST /api/projects/tasks/:id/assign → Asignar tarea
|
|
```
|
|
|
|
#### Timesheets:
|
|
```
|
|
GET /api/projects/timesheets/all → Lista todas las hojas
|
|
GET /api/projects/timesheets/me → Mis hojas de tiempo
|
|
GET /api/projects/timesheets/pending → Pendientes de aprobacion
|
|
GET /api/projects/timesheets/:id → Obtener hoja por ID
|
|
POST /api/projects/timesheets → Crear hoja
|
|
PUT /api/projects/timesheets/:id → Actualizar hoja
|
|
DELETE /api/projects/timesheets/:id → Eliminar hoja
|
|
POST /api/projects/timesheets/:id/submit → Enviar para aprobacion
|
|
POST /api/projects/timesheets/:id/approve → Aprobar hoja
|
|
POST /api/projects/timesheets/:id/reject → Rechazar hoja
|
|
```
|
|
|
|
### 3.2 Estructura Frontend Propuesta
|
|
|
|
```typescript
|
|
// frontend/src/features/projects/api/projects.api.ts
|
|
|
|
// Projects API
|
|
export const projectsApi = {
|
|
getAll: (params) => apiClient.get('/api/projects', { params }),
|
|
getById: (id) => apiClient.get(`/api/projects/${id}`),
|
|
create: (data) => apiClient.post('/api/projects', data),
|
|
update: (id, data) => apiClient.put(`/api/projects/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/projects/${id}`),
|
|
getStats: (id) => apiClient.get(`/api/projects/${id}/stats`),
|
|
getTasks: (id) => apiClient.get(`/api/projects/${id}/tasks`),
|
|
getTimesheets: (id) => apiClient.get(`/api/projects/${id}/timesheets`),
|
|
};
|
|
|
|
// Tasks API
|
|
export const tasksApi = {
|
|
getAll: (params) => apiClient.get('/api/projects/tasks/all', { params }),
|
|
getById: (id) => apiClient.get(`/api/projects/tasks/${id}`),
|
|
create: (data) => apiClient.post('/api/projects/tasks', data),
|
|
update: (id, data) => apiClient.put(`/api/projects/tasks/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/projects/tasks/${id}`),
|
|
move: (id, data) => apiClient.post(`/api/projects/tasks/${id}/move`, data),
|
|
assign: (id, data) => apiClient.post(`/api/projects/tasks/${id}/assign`, data),
|
|
};
|
|
|
|
// Timesheets API
|
|
export const timesheetsApi = {
|
|
getAll: (params) => apiClient.get('/api/projects/timesheets/all', { params }),
|
|
getMine: (params) => apiClient.get('/api/projects/timesheets/me', { params }),
|
|
getPending: (params) => apiClient.get('/api/projects/timesheets/pending', { params }),
|
|
getById: (id) => apiClient.get(`/api/projects/timesheets/${id}`),
|
|
create: (data) => apiClient.post('/api/projects/timesheets', data),
|
|
update: (id, data) => apiClient.put(`/api/projects/timesheets/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/projects/timesheets/${id}`),
|
|
submit: (id) => apiClient.post(`/api/projects/timesheets/${id}/submit`),
|
|
approve: (id) => apiClient.post(`/api/projects/timesheets/${id}/approve`),
|
|
reject: (id, data) => apiClient.post(`/api/projects/timesheets/${id}/reject`, data),
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## 4. DEPENDENCIAS CRM API
|
|
|
|
### 4.1 Endpoints Disponibles
|
|
|
|
#### Leads:
|
|
```
|
|
GET /api/crm/leads → Lista leads
|
|
GET /api/crm/leads/:id → Obtener lead por ID
|
|
POST /api/crm/leads → Crear lead
|
|
PUT /api/crm/leads/:id → Actualizar lead
|
|
DELETE /api/crm/leads/:id → Eliminar lead
|
|
POST /api/crm/leads/:id/move → Mover a otra etapa
|
|
POST /api/crm/leads/:id/convert → Convertir a oportunidad
|
|
POST /api/crm/leads/:id/lost → Marcar como perdido
|
|
```
|
|
|
|
#### Opportunities:
|
|
```
|
|
GET /api/crm/opportunities → Lista oportunidades
|
|
GET /api/crm/opportunities/:id → Obtener oportunidad por ID
|
|
POST /api/crm/opportunities → Crear oportunidad
|
|
PUT /api/crm/opportunities/:id → Actualizar oportunidad
|
|
DELETE /api/crm/opportunities/:id → Eliminar oportunidad
|
|
POST /api/crm/opportunities/:id/move → Mover a otra etapa
|
|
POST /api/crm/opportunities/:id/won → Marcar como ganada
|
|
POST /api/crm/opportunities/:id/lost → Marcar como perdida
|
|
POST /api/crm/opportunities/:id/quote → Crear cotizacion
|
|
```
|
|
|
|
#### Pipeline:
|
|
```
|
|
GET /api/crm/pipeline → Vista pipeline
|
|
```
|
|
|
|
#### Lead Stages:
|
|
```
|
|
GET /api/crm/lead-stages → Lista etapas de leads
|
|
POST /api/crm/lead-stages → Crear etapa
|
|
PUT /api/crm/lead-stages/:id → Actualizar etapa
|
|
DELETE /api/crm/lead-stages/:id → Eliminar etapa
|
|
```
|
|
|
|
#### Opportunity Stages:
|
|
```
|
|
GET /api/crm/opportunity-stages → Lista etapas de oportunidades
|
|
POST /api/crm/opportunity-stages → Crear etapa
|
|
PUT /api/crm/opportunity-stages/:id → Actualizar etapa
|
|
DELETE /api/crm/opportunity-stages/:id → Eliminar etapa
|
|
```
|
|
|
|
#### Lost Reasons:
|
|
```
|
|
GET /api/crm/lost-reasons → Lista razones de perdida
|
|
POST /api/crm/lost-reasons → Crear razon
|
|
PUT /api/crm/lost-reasons/:id → Actualizar razon
|
|
DELETE /api/crm/lost-reasons/:id → Eliminar razon
|
|
```
|
|
|
|
#### Tags:
|
|
```
|
|
GET /api/crm/tags → Lista tags
|
|
GET /api/crm/tags/:id → Obtener tag por ID
|
|
POST /api/crm/tags → Crear tag
|
|
PUT /api/crm/tags/:id → Actualizar tag
|
|
DELETE /api/crm/tags/:id → Eliminar tag
|
|
```
|
|
|
|
### 4.2 Estructura Frontend Propuesta
|
|
|
|
```typescript
|
|
// frontend/src/features/crm/api/crm.api.ts
|
|
|
|
// Leads API
|
|
export const leadsApi = {
|
|
getAll: (params) => apiClient.get('/api/crm/leads', { params }),
|
|
getById: (id) => apiClient.get(`/api/crm/leads/${id}`),
|
|
create: (data) => apiClient.post('/api/crm/leads', data),
|
|
update: (id, data) => apiClient.put(`/api/crm/leads/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/crm/leads/${id}`),
|
|
move: (id, data) => apiClient.post(`/api/crm/leads/${id}/move`, data),
|
|
convert: (id) => apiClient.post(`/api/crm/leads/${id}/convert`),
|
|
markLost: (id, data) => apiClient.post(`/api/crm/leads/${id}/lost`, data),
|
|
};
|
|
|
|
// Opportunities API
|
|
export const opportunitiesApi = {
|
|
getAll: (params) => apiClient.get('/api/crm/opportunities', { params }),
|
|
getById: (id) => apiClient.get(`/api/crm/opportunities/${id}`),
|
|
create: (data) => apiClient.post('/api/crm/opportunities', data),
|
|
update: (id, data) => apiClient.put(`/api/crm/opportunities/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/crm/opportunities/${id}`),
|
|
move: (id, data) => apiClient.post(`/api/crm/opportunities/${id}/move`, data),
|
|
markWon: (id) => apiClient.post(`/api/crm/opportunities/${id}/won`),
|
|
markLost: (id, data) => apiClient.post(`/api/crm/opportunities/${id}/lost`, data),
|
|
createQuote: (id) => apiClient.post(`/api/crm/opportunities/${id}/quote`),
|
|
};
|
|
|
|
// Pipeline API
|
|
export const pipelineApi = {
|
|
get: (params) => apiClient.get('/api/crm/pipeline', { params }),
|
|
};
|
|
|
|
// Lead Stages API
|
|
export const leadStagesApi = {
|
|
getAll: () => apiClient.get('/api/crm/lead-stages'),
|
|
create: (data) => apiClient.post('/api/crm/lead-stages', data),
|
|
update: (id, data) => apiClient.put(`/api/crm/lead-stages/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/crm/lead-stages/${id}`),
|
|
};
|
|
|
|
// Opportunity Stages API
|
|
export const opportunityStagesApi = {
|
|
getAll: () => apiClient.get('/api/crm/opportunity-stages'),
|
|
create: (data) => apiClient.post('/api/crm/opportunity-stages', data),
|
|
update: (id, data) => apiClient.put(`/api/crm/opportunity-stages/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/crm/opportunity-stages/${id}`),
|
|
};
|
|
|
|
// Lost Reasons API
|
|
export const lostReasonsApi = {
|
|
getAll: () => apiClient.get('/api/crm/lost-reasons'),
|
|
create: (data) => apiClient.post('/api/crm/lost-reasons', data),
|
|
update: (id, data) => apiClient.put(`/api/crm/lost-reasons/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/crm/lost-reasons/${id}`),
|
|
};
|
|
|
|
// Tags API
|
|
export const tagsApi = {
|
|
getAll: () => apiClient.get('/api/crm/tags'),
|
|
getById: (id) => apiClient.get(`/api/crm/tags/${id}`),
|
|
create: (data) => apiClient.post('/api/crm/tags', data),
|
|
update: (id, data) => apiClient.put(`/api/crm/tags/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/crm/tags/${id}`),
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## 5. DEPENDENCIAS HR API
|
|
|
|
### 5.1 Endpoints Disponibles
|
|
|
|
#### Employees (8 endpoints):
|
|
```
|
|
GET /api/hr/employees → Lista empleados
|
|
GET /api/hr/employees/:id → Obtener empleado por ID
|
|
GET /api/hr/employees/:id/subordinates → Subordinados
|
|
POST /api/hr/employees → Crear empleado
|
|
PUT /api/hr/employees/:id → Actualizar empleado
|
|
POST /api/hr/employees/:id/terminate → Terminar empleado
|
|
POST /api/hr/employees/:id/reactivate → Reactivar empleado
|
|
DELETE /api/hr/employees/:id → Eliminar empleado
|
|
```
|
|
|
|
#### Departments (5 endpoints):
|
|
```
|
|
GET /api/hr/departments → Lista departamentos
|
|
GET /api/hr/departments/:id → Obtener departamento
|
|
POST /api/hr/departments → Crear departamento
|
|
PUT /api/hr/departments/:id → Actualizar departamento
|
|
DELETE /api/hr/departments/:id → Eliminar departamento
|
|
```
|
|
|
|
#### Job Positions (4 endpoints):
|
|
```
|
|
GET /api/hr/positions → Lista posiciones
|
|
POST /api/hr/positions → Crear posicion
|
|
PUT /api/hr/positions/:id → Actualizar posicion
|
|
DELETE /api/hr/positions/:id → Eliminar posicion
|
|
```
|
|
|
|
#### Contracts (8 endpoints):
|
|
```
|
|
GET /api/hr/contracts → Lista contratos
|
|
GET /api/hr/contracts/:id → Obtener contrato
|
|
POST /api/hr/contracts → Crear contrato
|
|
PUT /api/hr/contracts/:id → Actualizar contrato
|
|
POST /api/hr/contracts/:id/activate → Activar contrato
|
|
POST /api/hr/contracts/:id/terminate → Terminar contrato
|
|
POST /api/hr/contracts/:id/cancel → Cancelar contrato
|
|
DELETE /api/hr/contracts/:id → Eliminar contrato
|
|
```
|
|
|
|
#### Leave Types (4 endpoints):
|
|
```
|
|
GET /api/hr/leave-types → Lista tipos de permiso
|
|
POST /api/hr/leave-types → Crear tipo
|
|
PUT /api/hr/leave-types/:id → Actualizar tipo
|
|
DELETE /api/hr/leave-types/:id → Eliminar tipo
|
|
```
|
|
|
|
#### Leaves (10 endpoints):
|
|
```
|
|
GET /api/hr/leaves → Lista permisos
|
|
GET /api/hr/leaves/:id → Obtener permiso
|
|
POST /api/hr/leaves → Crear permiso
|
|
PUT /api/hr/leaves/:id → Actualizar permiso
|
|
POST /api/hr/leaves/:id/submit → Enviar para aprobacion
|
|
POST /api/hr/leaves/:id/approve → Aprobar permiso
|
|
POST /api/hr/leaves/:id/reject → Rechazar permiso
|
|
POST /api/hr/leaves/:id/cancel → Cancelar permiso
|
|
DELETE /api/hr/leaves/:id → Eliminar permiso
|
|
```
|
|
|
|
#### Skills (Skill Types, Skills, Skill Levels, Employee Skills):
|
|
```
|
|
# Skill Types
|
|
GET /api/hr/skill-types → Lista tipos de habilidad
|
|
GET /api/hr/skill-types/:id → Obtener tipo
|
|
POST /api/hr/skill-types → Crear tipo
|
|
PUT /api/hr/skill-types/:id → Actualizar tipo
|
|
DELETE /api/hr/skill-types/:id → Eliminar tipo
|
|
|
|
# Skills
|
|
GET /api/hr/skills → Lista habilidades
|
|
GET /api/hr/skills/:id → Obtener habilidad
|
|
POST /api/hr/skills → Crear habilidad
|
|
PUT /api/hr/skills/:id → Actualizar habilidad
|
|
DELETE /api/hr/skills/:id → Eliminar habilidad
|
|
|
|
# Skill Levels
|
|
GET /api/hr/skill-levels → Lista niveles
|
|
POST /api/hr/skill-levels → Crear nivel
|
|
PUT /api/hr/skill-levels/:id → Actualizar nivel
|
|
DELETE /api/hr/skill-levels/:id → Eliminar nivel
|
|
|
|
# Employee Skills
|
|
GET /api/hr/employee-skills → Lista habilidades de empleados
|
|
GET /api/hr/employees/:employeeId/skills → Habilidades de un empleado
|
|
POST /api/hr/employee-skills → Asignar habilidad
|
|
PUT /api/hr/employee-skills/:id → Actualizar habilidad
|
|
DELETE /api/hr/employee-skills/:id → Eliminar habilidad
|
|
```
|
|
|
|
#### Expenses (Expense Sheets, Expenses):
|
|
```
|
|
# Expense Sheets
|
|
GET /api/hr/expense-sheets → Lista hojas de gastos
|
|
GET /api/hr/expense-sheets/:id → Obtener hoja
|
|
POST /api/hr/expense-sheets → Crear hoja
|
|
PUT /api/hr/expense-sheets/:id → Actualizar hoja
|
|
POST /api/hr/expense-sheets/:id/submit → Enviar para aprobacion
|
|
POST /api/hr/expense-sheets/:id/approve → Aprobar hoja
|
|
POST /api/hr/expense-sheets/:id/reject → Rechazar hoja
|
|
DELETE /api/hr/expense-sheets/:id → Eliminar hoja
|
|
|
|
# Expenses
|
|
GET /api/hr/expenses → Lista gastos
|
|
GET /api/hr/expenses/:id → Obtener gasto
|
|
POST /api/hr/expenses → Crear gasto
|
|
PUT /api/hr/expenses/:id → Actualizar gasto
|
|
DELETE /api/hr/expenses/:id → Eliminar gasto
|
|
```
|
|
|
|
#### Payslips (Structures, Payslips, Lines):
|
|
```
|
|
# Payslip Structures
|
|
GET /api/hr/payslip-structures → Lista estructuras
|
|
GET /api/hr/payslip-structures/:id → Obtener estructura
|
|
POST /api/hr/payslip-structures → Crear estructura
|
|
PUT /api/hr/payslip-structures/:id → Actualizar estructura
|
|
DELETE /api/hr/payslip-structures/:id → Eliminar estructura
|
|
|
|
# Payslips
|
|
GET /api/hr/payslips → Lista nominas
|
|
GET /api/hr/payslips/:id → Obtener nomina
|
|
GET /api/hr/payslips/:id/lines → Lineas de nomina
|
|
POST /api/hr/payslips → Crear nomina
|
|
PUT /api/hr/payslips/:id → Actualizar nomina
|
|
POST /api/hr/payslips/:id/verify → Verificar nomina
|
|
POST /api/hr/payslips/:id/confirm → Confirmar nomina
|
|
POST /api/hr/payslips/:id/cancel → Cancelar nomina
|
|
DELETE /api/hr/payslips/:id → Eliminar nomina
|
|
|
|
# Payslip Lines
|
|
POST /api/hr/payslips/:id/lines → Agregar linea
|
|
PUT /api/hr/payslips/:id/lines/:lineId → Actualizar linea
|
|
DELETE /api/hr/payslips/:id/lines/:lineId → Eliminar linea
|
|
```
|
|
|
|
### 5.2 Estructura Frontend Propuesta
|
|
|
|
```typescript
|
|
// frontend/src/features/hr/api/hr.api.ts
|
|
|
|
// Employees API
|
|
export const employeesApi = {
|
|
getAll: (params) => apiClient.get('/api/hr/employees', { params }),
|
|
getById: (id) => apiClient.get(`/api/hr/employees/${id}`),
|
|
getSubordinates: (id) => apiClient.get(`/api/hr/employees/${id}/subordinates`),
|
|
create: (data) => apiClient.post('/api/hr/employees', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/employees/${id}`, data),
|
|
terminate: (id, data) => apiClient.post(`/api/hr/employees/${id}/terminate`, data),
|
|
reactivate: (id) => apiClient.post(`/api/hr/employees/${id}/reactivate`),
|
|
delete: (id) => apiClient.delete(`/api/hr/employees/${id}`),
|
|
getSkills: (id) => apiClient.get(`/api/hr/employees/${id}/skills`),
|
|
};
|
|
|
|
// Departments API
|
|
export const departmentsApi = {
|
|
getAll: (params) => apiClient.get('/api/hr/departments', { params }),
|
|
getById: (id) => apiClient.get(`/api/hr/departments/${id}`),
|
|
create: (data) => apiClient.post('/api/hr/departments', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/departments/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/hr/departments/${id}`),
|
|
};
|
|
|
|
// Job Positions API
|
|
export const positionsApi = {
|
|
getAll: (params) => apiClient.get('/api/hr/positions', { params }),
|
|
create: (data) => apiClient.post('/api/hr/positions', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/positions/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/hr/positions/${id}`),
|
|
};
|
|
|
|
// Contracts API
|
|
export const contractsApi = {
|
|
getAll: (params) => apiClient.get('/api/hr/contracts', { params }),
|
|
getById: (id) => apiClient.get(`/api/hr/contracts/${id}`),
|
|
create: (data) => apiClient.post('/api/hr/contracts', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/contracts/${id}`, data),
|
|
activate: (id) => apiClient.post(`/api/hr/contracts/${id}/activate`),
|
|
terminate: (id, data) => apiClient.post(`/api/hr/contracts/${id}/terminate`, data),
|
|
cancel: (id) => apiClient.post(`/api/hr/contracts/${id}/cancel`),
|
|
delete: (id) => apiClient.delete(`/api/hr/contracts/${id}`),
|
|
};
|
|
|
|
// Leave Types API
|
|
export const leaveTypesApi = {
|
|
getAll: () => apiClient.get('/api/hr/leave-types'),
|
|
create: (data) => apiClient.post('/api/hr/leave-types', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/leave-types/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/hr/leave-types/${id}`),
|
|
};
|
|
|
|
// Leaves API
|
|
export const leavesApi = {
|
|
getAll: (params) => apiClient.get('/api/hr/leaves', { params }),
|
|
getById: (id) => apiClient.get(`/api/hr/leaves/${id}`),
|
|
create: (data) => apiClient.post('/api/hr/leaves', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/leaves/${id}`, data),
|
|
submit: (id) => apiClient.post(`/api/hr/leaves/${id}/submit`),
|
|
approve: (id) => apiClient.post(`/api/hr/leaves/${id}/approve`),
|
|
reject: (id, data) => apiClient.post(`/api/hr/leaves/${id}/reject`, data),
|
|
cancel: (id) => apiClient.post(`/api/hr/leaves/${id}/cancel`),
|
|
delete: (id) => apiClient.delete(`/api/hr/leaves/${id}`),
|
|
};
|
|
|
|
// Skills APIs
|
|
export const skillTypesApi = {
|
|
getAll: () => apiClient.get('/api/hr/skill-types'),
|
|
getById: (id) => apiClient.get(`/api/hr/skill-types/${id}`),
|
|
create: (data) => apiClient.post('/api/hr/skill-types', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/skill-types/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/hr/skill-types/${id}`),
|
|
};
|
|
|
|
export const skillsApi = {
|
|
getAll: () => apiClient.get('/api/hr/skills'),
|
|
getById: (id) => apiClient.get(`/api/hr/skills/${id}`),
|
|
create: (data) => apiClient.post('/api/hr/skills', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/skills/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/hr/skills/${id}`),
|
|
};
|
|
|
|
export const skillLevelsApi = {
|
|
getAll: () => apiClient.get('/api/hr/skill-levels'),
|
|
create: (data) => apiClient.post('/api/hr/skill-levels', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/skill-levels/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/hr/skill-levels/${id}`),
|
|
};
|
|
|
|
export const employeeSkillsApi = {
|
|
getAll: (params) => apiClient.get('/api/hr/employee-skills', { params }),
|
|
create: (data) => apiClient.post('/api/hr/employee-skills', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/employee-skills/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/hr/employee-skills/${id}`),
|
|
};
|
|
|
|
// Expenses APIs
|
|
export const expenseSheetsApi = {
|
|
getAll: (params) => apiClient.get('/api/hr/expense-sheets', { params }),
|
|
getById: (id) => apiClient.get(`/api/hr/expense-sheets/${id}`),
|
|
create: (data) => apiClient.post('/api/hr/expense-sheets', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/expense-sheets/${id}`, data),
|
|
submit: (id) => apiClient.post(`/api/hr/expense-sheets/${id}/submit`),
|
|
approve: (id) => apiClient.post(`/api/hr/expense-sheets/${id}/approve`),
|
|
reject: (id, data) => apiClient.post(`/api/hr/expense-sheets/${id}/reject`, data),
|
|
delete: (id) => apiClient.delete(`/api/hr/expense-sheets/${id}`),
|
|
};
|
|
|
|
export const expensesApi = {
|
|
getAll: (params) => apiClient.get('/api/hr/expenses', { params }),
|
|
getById: (id) => apiClient.get(`/api/hr/expenses/${id}`),
|
|
create: (data) => apiClient.post('/api/hr/expenses', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/expenses/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/hr/expenses/${id}`),
|
|
};
|
|
|
|
// Payslips APIs
|
|
export const payslipStructuresApi = {
|
|
getAll: (params) => apiClient.get('/api/hr/payslip-structures', { params }),
|
|
getById: (id) => apiClient.get(`/api/hr/payslip-structures/${id}`),
|
|
create: (data) => apiClient.post('/api/hr/payslip-structures', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/payslip-structures/${id}`, data),
|
|
delete: (id) => apiClient.delete(`/api/hr/payslip-structures/${id}`),
|
|
};
|
|
|
|
export const payslipsApi = {
|
|
getAll: (params) => apiClient.get('/api/hr/payslips', { params }),
|
|
getById: (id) => apiClient.get(`/api/hr/payslips/${id}`),
|
|
getLines: (id) => apiClient.get(`/api/hr/payslips/${id}/lines`),
|
|
create: (data) => apiClient.post('/api/hr/payslips', data),
|
|
update: (id, data) => apiClient.put(`/api/hr/payslips/${id}`, data),
|
|
verify: (id) => apiClient.post(`/api/hr/payslips/${id}/verify`),
|
|
confirm: (id) => apiClient.post(`/api/hr/payslips/${id}/confirm`),
|
|
cancel: (id) => apiClient.post(`/api/hr/payslips/${id}/cancel`),
|
|
delete: (id) => apiClient.delete(`/api/hr/payslips/${id}`),
|
|
// Lines
|
|
addLine: (id, data) => apiClient.post(`/api/hr/payslips/${id}/lines`, data),
|
|
updateLine: (id, lineId, data) => apiClient.put(`/api/hr/payslips/${id}/lines/${lineId}`, data),
|
|
removeLine: (id, lineId) => apiClient.delete(`/api/hr/payslips/${id}/lines/${lineId}`),
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## 6. RESUMEN DE DEPENDENCIAS
|
|
|
|
### 6.1 Matriz de Dependencias
|
|
|
|
| API Frontend | Backend Module | Services | Endpoints | Lineas Est. |
|
|
|--------------|----------------|----------|-----------|-------------|
|
|
| purchases.api.ts | purchases | 2 | 23 | ~200 |
|
|
| projects.api.ts | projects | 3 | 24 | ~180 |
|
|
| crm.api.ts | crm | 4 | 32 | ~250 |
|
|
| hr.api.ts | hr | 8 | 62 | ~400 |
|
|
| **Total** | **4 modulos** | **17 services** | **141 endpoints** | **~1,030** |
|
|
|
|
### 6.2 Dependencias Externas
|
|
|
|
Todas las APIs dependen de:
|
|
- `@/lib/api-client` - Cliente HTTP base
|
|
- Tipos TypeScript (opcionales pero recomendados)
|
|
|
|
### 6.3 Orden de Implementacion Sugerido
|
|
|
|
1. **purchases.api.ts** - Menor complejidad, patron claro
|
|
2. **projects.api.ts** - Complejidad media, estructura similar
|
|
3. **crm.api.ts** - Complejidad media, multiples sub-APIs
|
|
4. **hr.api.ts** - Mayor complejidad, mas sub-APIs
|
|
|
|
---
|
|
|
|
**Generado por:** Claude Code - Opus 4.5
|
|
**Fase CAPVED:** Analisis de Dependencias
|
|
**Documento:** FASE5-ANALISIS-DEPENDENCIAS-COMPLETO.md
|