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".