API Endpoints (resumen)
Ejemplos de entrada y salida para los endpoints principales.
Authorization / Flujo por Usuario
Crear Usuario
POST /api/register
Content-Type: application/json
{
"name" : "Administrador SSPRO",
"role" : "admin", // "admin, user, ct, supervisor"
"tipo_vendedor": "campo", // requerido solo si role = "user"
"supervisor_id": 3, // requerido solo si role = "user", id del supervisor al que reporta el usuario
"email" : "administrador@gmail.com",
"password" : "adminadmin123",
"password_confirmation" : "adminadmin123"
}
Response 201
{
"message": "User added successfuly"
}
Login
POST /api/login
Content-Type: application/json
{
"email" : "administrador@gmail.com",
"password" : "adminadmin123"
}
Response 200
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwMDAvYXBpL2xvZ2luIiwiaWF0IjoxNzc0NDc1ODM0LCJleHAiOjE3NzQ0Nzk0MzQsIm5iZiI6MTc3NDQ3NTgzNCwianRpIjoiRnRuaFhSR3hOQ0hEcXdYVyIsInN1YiI6IjEiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3Iiwicm9sZSI6ImFkbWluIn0.KXCdSShxxQnMqPrXuiZgO7xdswI5MxAssFk3c8FeL64",
"user": {
"name": "Administrador SSPRO",
"email": "administrador@gmail.com",
"role": "admin",
"tipo_vendedor": null,
"supervisor_id": null
}
}
Actualizar Usuarios (Administrador)
PATCH /api/users/{id}
Content-Type: application/json
{
"email" : "administrador@gmail.com",
"password" : "adminadmin123",
"is_active" : 0
}
Response 200
{
"email" : "administrador@gmail.com",
"password" : "adminadmin123",
"is_active": 0
}
Listar Usuarios (Administrador)
GET /api/users? (filtro por name, email, role y supervisor)
Accept: application/json
Response 200
{
"current_page": 1,
"data": [
{
"id": 1,
"name": "Administrador CJMC",
"role": "admin",
"tipo_vendedor": null,
"supervisor_id": null,
"email": "administradorcjmc@gmail.com",
"email_verified_at": null,
"is_active": 1,
"created_at": null,
"updated_at": null
},
{
"id": 2,
"name": "Area Técnica CJMC",
"role": "ct",
"tipo_vendedor": null,
"supervisor_id": null,
"email": "areatecnicacjmc@gmail.com",
"email_verified_at": null,
"is_active": 1,
"created_at": null,
"updated_at": null
},
{
"id": 3,
"name": "Supervisor CJMC",
"role": "supervisor",
"tipo_vendedor": null,
"supervisor_id": null,
"email": "supervisorcjmc@gmail.com",
"email_verified_at": null,
"is_active": 1,
"created_at": null,
"updated_at": null
},
{
"id": 4,
"name": "Usuario CJMC",
"role": "user",
"tipo_vendedor": "campo",
"supervisor_id": 3,
"email": "usuariocjmc@gmail.com",
"email_verified_at": null,
"is_active": 1,
"created_at": null,
"updated_at": null
}
],
"first_page_url": "http://localhost:8000/api/users?page=1",
"from": 1,
"last_page": 1,
"last_page_url": "http://localhost:8000/api/users?page=1",
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "http://localhost:8000/api/users?page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": null,
"label": "Next »",
"page": null,
"active": false
}
],
"next_page_url": null,
"path": "http://localhost:8000/api/users",
"per_page": 15,
"prev_page_url": null,
"to": 4,
"total": 4
}
Clients
Crear cliente (autenticado)
POST /api/clients
Accept: application/json
{
"name": "Juan", //*
"lastName": "Perez", //*
"dni": "12345678", //*
"dni_emission_date": "2015-06-20",
"job_title": "Ingeniero",
"income": 2500.50, //salario *
"work_area": "Tecnología",
"phone": "912345678",
"email": "juan@example.com",
"address": "Calle Falsa 123"
}
Response 200
{
"id": 1,
"name": "Juan", //*
"lastName": "Perez", //*
"dni": "12345678", //*
"dni_emission_date": "2015-06-20",
"job_title": "Ingeniero",
"income": 2500.50, //salario *
"work_area": "Tecnología",
"phone": "912345678",
"email": "juan@example.com",
"address": "Calle Falsa 123"
}
Listar clientes (autenticado)
GET /api/clients?per_page=25
Accept: application/json
Response 200
{
"current_page": 1,
"data": [
{ "id": 1,
"name": "Juan",
"phone": "912345678"
"lastName": "Perez", //*
"dni": "12345678", //*
"dni_emission_date": "2015-06-20",
"job_title": "Ingeniero",
"income": 2500.50, //salario *
"work_area": "Tecnología",
"phone": "912345678",
"email": "juan@example.com",
"address": "Calle Falsa 123"
}
],
"per_page": 25
}
Ver cliente
GET /api/clients/{id}
Accept: application/json
Response 200
{
"id": 1,
"dni": "71258748",
"dni_emission_date": null,
"name": "Juan",
"lastName": "Perez",
"phone": "+56912345678",
"email": "juan@example.com",
"address": "Calle Falsa 123",
"created_at": "2026-03-25T20:50:57.000000Z",
"updated_at": "2026-03-25T20:50:57.000000Z",
"job_title": null,
"income": "2000.00",
"work_area": null
}
Actualizar cliente (admin)
PATCH /api/clients/{id}
Content-Type: application/json
{
"phone": "987654321",
"address": "Nueva direccion 45"
}
Response 200
{
"id": 1,
"phone": "987654321",
"address": "Nueva direccion 45"
}
Projects y Etapas
Crear proyecto asociado a un cliente
POST /api/projects
Content-Type: application/json
{
"client_id": 1
}
Response 201
{
"id": 10,
"client_id": 1,
"current_stage": "captacion",
"status": "en_proceso",
"created_by": 5,
"updated_at": "2026-04-01T22:20:54.000000Z",
"created_at": "2026-04-01T22:20:54.000000Z",
"id": 2
}
Obtener proyecto (con etapas)
GET /api/projects/{id}
Response 200
{
"id": 10,
"client_id": 1,
"current_stage": "captacion",
"captacion": { ... },
"filtro": { ... },
"visitaComercial": { ... },
"visitaTecnica": { ... },
"evaluacionTecnica": { ... },
"evaluacionFinanciera": { ... },
"contrato": { ... }
}
Obtener montos de proyecto por supervisor
GET /api/projects?group_by=supervisor
Response 200
[
{
"supervisor_id": 3,
"supervisor_name": "Supervisor CJMC",
"total_monto": 35000,
"projects_count": 1
}
]
Captación
Crear / actualizar captación
POST /api/projects/{project}/captacion
Content-Type: application/json
{
"nombre_producto": "fmv",
"estado_construccion": "terreno", //opcional, requerido si nombre_producto = "fmv"
"nombre_proyecto": "Proyecto 1",
"observacion": "esto es una observacion",
"status": "pendiente", //por defecto "pendiente", se actualiza a "aprobado" o "rechazado" al avanzar a la siguiente etapa
"property_number": "Lt 3 Mz A" //opcional, requerido si nombre_producto = "fmv"
}
Response 200
{
"id": 1,
"project_id": 1,
"nombre_producto": "fmv",
"estado_construccion": "terreno",
"nombre_proyecto": "Proyecto 1",
"observacion": "esto es una observacion",
"status": "pendiente",
"property_number": "Lt 3 Mz A",
"created_at": "2026-03-25T21:01:43.000000Z",
"updated_at": "2026-03-25T21:34:13.000000Z"
}
GET /api/projects/{project}/captacion
PATCH /api/projects/{project}/captacion
Filtro
Crear / actualizar filtro
POST /api/projects/{project}/filtro
Content-Type: application/json
{
"filtro_financiero": "normal",
"num_predio": "Predio 1",
"tiene_colindancia": true,
"tiene_carga": true,
"bono_previo": true,
"tipo_bono": "bono verde",
"observaciones": "esto es una observacion"
}
Response 200
Visita comercial
Crear / actualizar visita Comercial(admite archivos)
POST /api/projects/{project}/vcomercial
Content-Type: multipart/form-data
Form fields:
{
"fecha_visita": "2026-03-10",
"hora_visita": "08:30:00",
"ubicacion": "mi direccion",
"estado_visita": "programado",
"evaluacion_cliente": "no procede", //por defecto "no procede" se actualiza a "procede"
"dependiente": 0,
"observacion": "esto es una observacion"
}
Files (Obligatorio si evaluacion_cliente = procede): file_titulo, file_copia_dni, file_recibo_servicio, file_autovaluo, file_copia_literal, file_ingreso
Response 200
{
"id": 1,
"project_id": 1,
"fecha_visita": "2026-03-10",
"hora_visita": "08:30:00",
"ubicacion": "mi direccion",
"estado_visita": "programado",
"evaluacion_cliente": "no procede",
"file_titulo": null,
"file_copia_dni": null,
"file_recibo_servicio": null,
"file_autovaluo": null,
"file_copia_literal": null,
"dependiente": 0,
"file_ingreso": null,
"observacion": "esto es una observacion",
"status": "pendiente",
"created_at": "2026-03-25T21:57:24.000000Z",
"updated_at": "2026-03-25T21:57:24.000000Z"
}
GET /api/projects/{project}/vcomercial
PATCH /api/projects/{project}/vcomercial
Visita Técnica
Crear / actualizar visita técnica
POST /api/projects/{project}/vtecnica
Content-Type: multipart/form-data
Form fields:
{
"fecha_visita": "2026-03-10",
"hora_visita": "08:30:00",
"estado_visita": "realizado", //por defecto "programado", se actualiza a "realizado" al completar la visita técnica
"monto_credito": 120000.5, //requerido si estado_visita = "realizado"
"bono_estado": 20000, //requerido si estado_visita = "realizado"
"efectivo_ahorro": 15000, //requerido si estado_visita = "realizado"
"monto_total": 155000.5, //requerido si estado_visita = "realizado"
"tiene_planos": 0, //requerido si estado_visita = "realizado"
"observacion": "esto es una observacion"
}
Files (Obligatorio si estado_visita = realizado y evaluacion_cliente = procede): file_etecnia, file_presupuesto
Content-Type: application/json
{
"fecha_visita": "2026-03-10",
"hora_visita": "08:30:00",
"estado_visita": "realizado",
"monto_credito": 120000.5,
"bono_estado": 20000,
"efectivo_ahorro": 15000,
"monto_total": 155000.5,
"tiene_planos": 0,
"observacion": "esto es una observacion"
}
Response 201
{
"id": 1,
"project_id": 1,
"fecha_visita": "2026-03-10",
"hora_visita": "08:30:00",
"estado_visita": "realizado",
"monto_credito": 120000.5,
"bono_estado": 20000,
"efectivo_ahorro": 15000,
"monto_total": 155000.5,
"tiene_planos": 0,
"observacion": "esto es una observacion",
"status": "pendiente",
"created_at": "2026-03-25T22:06:58.000000Z",
"updated_at": "2026-03-25T22:12:43.000000Z"
}
GET /api/projects/{project}/vtecnica
PATCH /api/projects/{project}/vtecnica
Evaluación tecnica
Crear / actualizar evaluación tecnica
POST /api/projects/{project}/evaltecnica
Content-Type: application/json
{
"fecha_visita": "2026-03-12",
"hora_visita": "08:30:00",
"estado_visita": "programado", //por defecto "programado", se actualiza a "realizado" al completar la evaluación técnica
"file_etecnica": null, //*requerido si estado_visita = "realizado"
"evaluacion_cliente": "no apto", //por defecto apto, se actualiza a "apto" o "no apto" al completar la evaluación técnica
"file_presupuesto": null, //*requerido si evaluacion_cliente = "apto"
"monto_credito": null, //*requerido si evaluacion_cliente = "apto"
"monto_bono": null, //*requerido si evaluacion_cliente = "apto"
"monto_efectivo": null, //*requerido si evaluacion_cliente = "apto"
"monto_total": null, //*requerido si evaluacion_cliente = "apto"
"observacion": null, //*requerido si evaluacion_cliente = "apto"
"status": "pendiente", //por defecto "pendiente", se actualiza a "aprobado" si cliente apto o "rechazado" si cliente no apto al avanzar a la siguiente etapa
}
Response 201
{
"id": 1,
"project_id": 1,
"fecha_visita": "2026-03-12",
"hora_visita": "08:30:00",
"estado_visita": "programado",
"file_etecnica": null,
"evaluacion_cliente": "no apto",
"file_presupuesto": null,
"monto_credito": null,
"monto_bono": null,
"monto_efectivo": null,
"monto_total": null,
"observacion": null,
"status": "pendiente",
"created_at": "2026-03-26T20:13:45.000000Z",
"updated_at": "2026-03-26T20:13:45.000000Z"
}
GET /api/projects/{project}/evaltecnica
PATCH /api/projects/{project}/evaltecnica
Evaluación financiera
Crear / actualizar evaluación financiera
POST /api/projects/{project}/evalfinanciera
Content-Type: application/json
{
"fecha_visita": "2026-03-12",
"hora_visita": "08:30:00",
"estado_visita": "programado", //por defecto "programado", se actualiza a "realizado" al completar la evaluación técnica
"entidad_financiera": null, //*requerido
"analista_financiero": null, //*requerido
"evaluacion_cliente": "no apto", //por defecto no apto, se actualiza a "apto" o "no apto" al completar la evaluación técnica
"file_pagado": null, //*requerido si evaluacion_cliente = "apto" recibe solo img
"file_memo_descriptiva": null, //*requerido si evaluacion_cliente = "apto" recibe solo pdf
"file_info_tasacion": null, //*requerido si evaluacion_cliente = "apto" recibe solo pdf
"observacion": null, //*requerido si evaluacion_cliente = "apto"
"status": "pendiente" //por defecto "pendiente", se actualiza a "aprobado" si cliente apto o "rechazado" si cliente no apto al avanzar a la siguiente etapa
}
Response 201
{
"fecha_visita": "2026-03-12",
"hora_visita": "08:30:00",
"estado_visita": "programado",
"entidad_financiera": "banco bcp",
"analista_financiero": "sara sarita",
"evaluacion_cliente": "no apto",
"file_memo_descriptiva": null,
"file_info_tasacion": null,
"observacion": null,
"status": "pendiente"
"created_at": "2026-03-26T20:13:45.000000Z",
"updated_at": "2026-03-26T20:13:45.000000Z"
}
GET /api/projects/{project}/evalfinanciera
PATCH /api/projects/{project}/evalfinanciera
Contrato
Crear / actualizar contrato
POST /api/projects/{project}/contrato
Content-Type: multipart/form-data
Form fields:
{
"fecha_firma": "2026-03-26", //requerido
"estado_firma": "pendiente", //por defecto "pendiente", se actualiza a "realizado" al completar el contrato
"fecha_notaria": null, // requerido si estado_firma = "realizado"
"kardex_hipoteca": null, // requerido si estado_firma = "realizado"
"estado_notaria": "pendiente", // requerido si estado_firma = "realizado"
"fecha_desembolso": null, // requerido si estado_firma = "realizado"
"estado_desembolso": "pendiente", // requerido si estado_firma = "realizado"
"fecha_transferencia": null, // requerido si estado_firma = "realizado"
"estado_transferencia": "pendiente", // requerido si estado_firma = "realizado"
"fecha_inicio_obra": null, // requerido si estado_firma = "realizado"
"cs_conformidad": null, // requerido si estado_firma = "realizado"
"observacion": null,
"status": "en_proceso", //por defecto "en_proceso", se actualiza a "aprobado" al completar el contrato
}
Files (Obligatorio si estado_firma = realizado):
file_mem_desciptiva, file_proforma, file_cto_contado,
file_soli_licencia, file_aper_cuenta, file_dj, file_pago_notaria,
file_plano_obra
Response 201
{
"id": 1,
"project_id": 1,
"fecha_firma": "2026-03-26",
"estado_firma": "pendiente",
"file_mem_desciptiva": null,
"file_proforma": null,
"file_cto_contado": null,
"file_soli_licencia": null,
"file_aper_cuenta": null,
"file_dj": null,
"fecha_notaria": null,
"kardex_hipoteca": null,
"estado_notaria": "pendiente",
"file_pago_notaria": null,
"fecha_desembolso": null,
"estado_desembolso": "pendiente",
"fecha_transferencia": null,
"estado_transferencia": "pendiente",
"fecha_inicio_obra": null,
"cs_conformidad": null,
"file_plano_obra": null,
"observacion": null,
"status": "en_proceso",
"created_at": "2026-03-26T20:55:57.000000Z",
"updated_at": "2026-03-26T20:55:57.000000Z"
}
GET /api/projects/{project}/contrato
PATCH /api/projects/{project}/contrato
Cierre
Crear / actualizar cierre (admite archivos)
POST /api/projects/{project}/cierre
Content-Type: multipart/form-data
Form fields:
- notaria_fecha_prog, notaria_hipoteca, fecha_desembolso, fecha_transferencia, fecha_obra, cs_conformidad (0-100), observacion
Files (opcionales): file_contrato_cofide, file_contrato_memoria, file_contrato_proforma, file_contrato_contado, file_contrato_licencia, file_contrato_cuenta, file_contrato_dj, file_notaria_pago, file_obra_contrato, file_obra_planos
Response 201
{
"id": 9,
"project_id": 10,
"status": "aprobado"
}
GET /api/projects/{project}/cierre
PATCH /api/projects/{project}/cierre
Nota: Los ejemplos muestran los campos principales. Reglas clave: - Si `nombre_producto` = "fmv" en Captación, se requieren `estado_financiero`, `carga`, `gravamen` y `bono_previo`. - Si `visita_tecnica` = true en Evaluación técnica, `fecha_visita` y `hora_visita` son obligatorios. - No se puede avanzar a la siguiente etapa hasta que la etapa actual tenga `status` = "aprobado".